1. 程式人生 > >[Linux]Day34-20180615【MySQL主從復制】

[Linux]Day34-20180615【MySQL主從復制】

從庫 day3 grant pro datadir gpg 級聯 ransac 建議

```
【本節主題: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主從復制】