[Linux]Day34-20180615【MySQL主從復制】
```
【本節主題:MySQL主從復制】
回顧:
備份還原
mysqldump:僅適用於小數據量的場景
XtraBackup:基於數據塊的復制,適用於大數據量的場景
兩個線程
??線程
io線程
sql進程
從服務器:不需要啟用二進制日誌
添加read-only:防止從服務器數據被普通用戶更改(無法阻止管理員的寫操作)
級聯復制:降低主服務器的壓力
從服務器啟用級聯復制:log_slave_updates
實驗:實現從服務器的級聯復制
(一)主服務器
1、修改主服務器配置文件
vim /etc/my.cnf
[mysqld] server_id=1 log_bin innodb_file_per_table datadir = /data/mysql
systemctl restart mariadb
2、授權
--
grant replication slave on *.* to repluser@‘192.168.30.%‘ identified by ‘centos‘ ;
3、
--
show masterid;
(二)級聯服務器
1、修改級聯服務器配置文件
vim /etc/my.cnf
[mysqld]
server_id=1;
read-only
#
systemctl restart mariadb
2、開啟級聯服務器中繼日誌
vim /etc/my.cnf
[mysqld] server-id=2 log_bin log_slave_updates read-only
#
systemctl restart mariadb
#
mysql
3、開啟從服務器
--
start slave;
--
show slave status;
4、清除中繼日誌,重新從頭開始復制
--
reset slave all;
(三)從服務器
1、修改從服務器的配置文件
vim /etc/my.cnf
[mysqld]
server_id=2
resd-only
systemctl restart mariadb
建議:
級聯服務器和從服務器都添加read-only,
讓數據庫的更改只發生在主服務器上!
sync_binlog
設為0:先將數據寫到buffer,操作系統會找一個空閑的時間,將buffer中的數據批量寫入磁盤
設為1:只要數據發生更改(哪怕是一個字節的更改),立即寫入磁盤;效率最低,但是可以保證數據安全
先把事務日誌寫入buffer,等待1s後寫入磁盤
1、主
#
mysqldump -A -F --single-transaction --master-data=1 > /backup/all.sql
#
scp /backup/all.sql 192.168.30.27:/backup/
2、從
vim /backup/all.sql
CHANGE MASTER TO
MASTER_HOST=‘192.168.30.17‘ ,
MASTER_USER=‘repluser‘ ,
MASTER_PASSWORD=‘centos‘ ,
MASTER_PORT=3306 ,
MASTER_LOG_FILE=‘mariadb-bin.000003‘ ,
MASTER_LOG_POS=245 ;
3、主
-- 刪除3之前的二進制日誌,即:刪除1和2
purge binary log to ‘mariadb-bin.000003‘;
主主復制
半同步復制
實驗:實現半同步復制
(一)主
1、安裝插件
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘ ;
2、啟用變量
set global rpl_semi_master_enable=1;
(二)從
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘ ;
2、啟用變量
set global rpl_semi_slave_enable=1;
從庫設置過濾
--
show variables like ‘replicate_ignore_db‘;
--
stop slave;
--
set global replicate_ignore_db=1;
服務器選項:
帶 -- ;
服務器變量:
不帶 -- ;
可以在命令行中設置,也可以在my.cnf配置文件中設置
從庫設置過濾器
vim /etc/my.cnf
[mysqld]
binlog_ignore_db=mysql
binlog_format=row
statement-base logging :基於語句的日誌記錄
row-base logging :基於行的日誌記錄
默認不啟用SSL
--
show variable like ‘%ssl%‘;
如果顯示DISABLE則表示未啟用SSL功能
如果顯示NO則表示不支持,需要重新用源碼編譯安裝!
CA證書、CA私鑰
Master證書、Master私鑰
Slave證書、Slave私鑰
【重要】實戰:實現主從SSL加密復制
(一)在CA上執行
1、在CA上生成私鑰
openssl genrsa 2048 > cakey.pem
2、生成CA自簽名證書
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650
CN
beijing
beijing
magedu.com
opt
ca.magedu.com
3、生成Master私鑰和請求文件
openssl req -newkey rsa:2048 -days 365 -nodes -keyout master.key > master.csr
CN
beijing
beijing
magedu.com
opt
master.magedu.com
4、為Master頒發證書
openssl x509 -req -in master.csr -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt
5、生成Slave私鑰和請求文件
openssl req -newkey rsa:2048 -days 365 -nodes -keyout slave.key > slave.csr
CN
beijing
beijing
magedu.com
opt
slave.magedu.com
6、為Slave頒發證書
openssl x509 -req -in slave.csr -CA cacert.pem CAkey cacert.pem -set_serial 02 > slave.crt
7、驗證生成的證書
openssl verify -CAfile cacert.pem master.crt slave.crt
8、復制文件
scp -r /etc/my.cnf.d/ssl/ 192.168.30.17:/etc/my.cnf.d
scp -r /etc/my.cnf.d/ssl/ 192.168.30.27:/etc/my.cnf.d
(二)在Master上執行
1、只保留需要的文件
# 在主服務器上
cd /etc/my.cnf.d/ssl/
rm -rf cakey.pem slave.* master.csr
2、修改主庫配置文件
# 在主服務器上
vim /etc/my.cnf
[mysqld]
log_bin
server_id=1
innodb_file_per_table
# 在主服務器上
systemctl start mariadb
#
mysql
3、查看ssl變量是否為YES
--
show variables like ‘%ssl%‘;
4、創建用戶,並強制要求以SSL加密連接
-- 切記:一定要指明 require ssl “強制要求以SSL方式進行連接”!
grant replication slave on *.* to repluser@‘192.168.30.%‘ identified ‘centos‘ require ssl;
(三)在Slave上執行
1、只保留需要的文件
# 在從服務器上
cd /etc/my.cnf.d/ssl/
rm -rf cakey.pem master.* slave.csr
2、修改從庫配置文件
# 在從服務器上
vim /etc/my.cnf
[mysqld]
server_id=2
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/slave.crt
ssl-key=/etc/my.cnf.d/ssl/slave.key
# 在從服務器上
systemctl start mariadb
#
mysql
3、Change Master
--
CHANGE MASTER TO
MASTER_HOST=‘192.168.30.17‘ ,
MASTER_USER=‘repluser‘ ,
MASTER_PASSWORD=‘centos‘ ,
MASTER_PORT=3306 ,
MASTER_LOG_FILE=‘mariadb-bin.000002‘ ,
MASTER_LOG_POS=412 ,
MASTER_CONNECT_RETRY=10 ,
MASTER_SSL=1 ,
MASTER_SSL_CA=‘/etc/my.cnf.d/ssl/cacert.pem‘ ,
MASTER_SSL_CERT=‘/etc/my.cnf.d/slave.crt‘ ,
MASTER_SSL_KEY=‘/etc/my.cnf.d/ssl/slave.key‘ ;
4、開啟同步
--
start slave;
【重要】實戰:實現MHA(Master High Avarible)
(一)準備
1、改主機名
Manager:7
Master:17
Slave1:27
Slave2:37
2、所有服務器保證時間同步
vim /etc/ntp.conf
server 172.20.0.1 iburst
systemctl start ntpd
systemctl enable ntpd
3、關閉SELINUX,清空iptables規則
???
(二)主
1、修改配置文件
vim /etc/my.cnf
[mysqld]
server_id=1
log_bin
binlog_format=row
skip_name_resolve
systemctl start mariadb
mysql
2、建賬號
grant replication slave on *.* to repluser
(三)從一
1、修改配置文件
vim /etc/my.cnf
[mysqld]
server_id=2
read_only
relay_log_purge-0
skip_name_resolve=1
log_bin
systemctl start mariadb
mysql
2、CHANGE MASTER
CHANGE MASTER TO
MASTER_HOST=‘192.168.30.17‘ ,
MASTER_USER=‘repluser‘ ,
MASTER_PASSWORD=‘centos‘ ,
MASTER_PORT=3306 ,
MASTER_LOG_FILE=‘mariadb-bin.000001‘ ,
MASTER_LOG_POS=245 ;
3、開啟slave
--
start slave;
--
show slave status;
(四)從二
1、修改配置文件
vim /etc/my.cnf
[mysqld]
server_id=3
read_only
relay_log_purge-0
skip_name_resolve=1
log_bin
systemctl start mariadb
mysql
2、CHANGE MASTER
CHANGE MASTER TO
MASTER_HOST=‘192.168.30.17‘ ,
MASTER_USER=‘repluser‘ ,
MASTER_PASSWORD=‘centos‘ ,
MASTER_PORT=3306 ,
MASTER_LOG_FILE=‘mariadb-bin.000001‘ ,
MASTER_LOG_POS=245 ;
3、開啟slave
--
start slave;
--
show slave status;
(五)主
1、導入hellodb.sql腳本生成數據庫
mysql < hellodb.sql
2、查看兩個從庫和主庫是否已經同步
???
(六)管理節點
1、生成key
cd
ssh-keygen
2、添加當前主機私鑰到key公鑰
ssh-copy-id 192.168.30.7
3、將key公鑰拷貝分發到三個服務器上(Master、Slave1、Slave2)
#
scp -pr .ssh 192.168.30.17:/root/
#
scp -pr .ssh 192.168.30.27:/root/
#
scp -pr .ssh 192.168.30.37:/root/
(七)主
1、授權賬號
mysql
grant all on *.* to mhauser@‘192.168.30.%‘ identified by ‘centos‘;
(八)從一
1、檢查賬號是否已經復制
select user,host from mysql.user;
2、確認授權
show grants for mhauser@‘192.168.30.%‘ ;
(九)在管理節點上安裝MHA
1、下載MHA的rpm包
需要下載兩個文件:
(1)mha4mysql-manager-0,56-0.rl6.noarch.rpm
(2)mha4mysql-node-0.56-0.el6.noarch.rpm
2、安裝MHA
yum -y install mha4mysql*
註意:安裝過程依賴epel源
3、將node包拷貝分發到三個服務器上()
# Master
scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.30.17;
# Slave1
scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.30.27;
# Slave2
scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.30.37;
(十)在三個服務器上安裝node包(Master、Slave1、Slave2)
yum -y install mha
(十一)管理節點
1、建目錄
#
mkdir /etc/mha/
#
vim /etc/mha/app1.conf
2、修改配置文件
[server default]
user=mhauser
password=centos
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1
[server1]
hostname=192.168.30.17
candidate_master=1
[server2]
hostname=192.168.30.27
candidate_master=1
[server3]
hostname=192.168.30.37
candidate_master=1
3、探測(基於key驗證)SSL連接是否有問題
masterha_check_ssh --conf=/etc/mha/app1.conf
4、開啟MHA
前臺執行:可以使用screen或者nohup
masterha_manager --conf=/etc/mha/app1.conf
(十二)
???
實驗:實現Gelera Cluster
1、添加yum源【在三個服務器上(7、17、27)】
vim /etc/yum.repos.d/base.repo
[base]
name=CentOS DVD
baseurl=file://misc/cd
gpgcheck=0
[epel]
name=Aliyun EPEL
baseurl=http://mirrors.aliyun.com/epel/$releasever/$basearch
gpgcheck=0
enabled=0
[mariadb]
name=MariaDB
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/
gpgcheck=0
2、裝包【在三個服務器上(7、17、27)】
yum install MariaDB-Galera-server
3、尋找三個文件的位置
#
rpm -ql MariaDB-Galera-server
# (1) /etc/init.d/mysql
# (2) /etc/my.cnf.d/server.cnf
#
rpm -ql galera
# (3) /usr/lib64/galera/libgalera_smm.so
4、修改server配置文件【在三個服務器上(7、17、27)】
vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.30.7,192.168.30.17,192.168.30.27"
binlog_format=row
5、在第一個節點上執行
/etc/init.d/mysql start --wsrep-new-cluster
6、其他兩個節點的
/etc/init.d/mysql start
7、
???
```
[Linux]Day34-20180615【MySQL主從復制】