1. 程式人生 > 實用技巧 >MySQL的3節點主從同步複製方案

MySQL的3節點主從同步複製方案

上篇文章《為什麼要對MySQL做主從同步複製》我們說明了MySQL主從同步的作用,主從同步的原理和主從同步的缺點。下面我們介紹下3節點中:2個節點互為主從,1個節點作為前2個節點的從,用於實現MySQL5.6的3節點主從同步複製方案。

主要步驟如下:

1.配置MasterA端同步複製時所需要的選項

2.在MasterA主庫上建立同步複製時的使用者並授權

3.MasterA主庫鎖表

4.記錄MasterA主庫的binlog以及pos位置節點

5.匯出MasterA主庫m_s_rep資料庫

6.配置MasterB端同步複製時所需要的選項

7.在MasterB上建立資料庫m_s_rep並匯入主庫備份

8.在MasterB上建立同步複製時的使用者並授權

9.記錄MasterB從庫的binlog以及pos位置節點

10.配置MasterA和MasterB互為主從並開啟從庫同步

11.檢視MasterB的relay-log以及master.info

12.MasterA主庫解鎖

13.配置Slave端同步複製時所需要的選項

14.在Slave端上建立資料庫m_s_rep並匯入主庫備份

15.配置Salve端為MasterA和MasterB同步並開啟同步

一.環境配置說明

1.IP地址分配

Hostname IP地址 節點

MYSQL01 10.62.83.201 MasterA

MYSQL02 10.62.83.202 MasterB

MYSQL03 10.62.83.203 Slave

2.協議和埠

節點 服務 埠

MasterA mysqld 3306

MasterB mysqld 3306

Slave mysqld 3306

3.軟體包版本

軟體 版本號

OS CentOSrelease 6.7 (Final)

MySQL MySQL-5.6.27-1.el6.x86_64.rpm-bundle.tar

JDK java-1.8.0-openjdk-1.8.0.20-3.b26.el6.x86_64

二.安裝MySQL前準備

在3個節點中,分別安裝如下MySQL5.6.27依賴包,執行步驟如下:

1.依賴包安裝

 # yum install -y openssl* openssl-devel zlib-devel gcc gcc-c++make autoconf readline-devel curl-devel expat-devel gettext-devel ruby

2.解除安裝OS預設低版本的openjdk

  # rpm-qa | grep jdk
  # yum-y remove java-1.6.0 java-1.7.0

3.安裝java執行環境openjdk-1.8.0

 # yum-y install java-1.8.0

4.配置JDK環境變數$JAVA_HOME

  # vim/etc/profile
 exportJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.20-3.b26.el6.x86_64/bin/java#new add content

5.配置DNS本地域名解析

  # vim/etc/hosts
  10.62.83.201     MYSQL01 #new add content
  10.62.83.202     MYSQL02
  10.62.83.203     MYSQL03

6.解除安裝OS中舊版本的mysql-libs

  # cd / && rpm-qa |grep mysql*
  # yum -y removemysql-libs-5.1.73-3.el6_5.x86_64

7.防火牆配置

你可以選擇關閉iptables,或者配置iptables規則。

三.安裝MySQL程式包

在3個節點分別安裝MySQL5.6.27如下軟體包,執行步驟如下:

1.解壓tar包

  # cd /usr/local/data
  # tar xfMySQL-5.6.27-1.el6.x86_64.rpm-bundle.tar

2.安裝rpm包

  # yum -y installMySQL-client-5.6.27-1.el6.x86_64.rpm MySQL-server-5.6.27-1.el6.x86_64.rpm

四.主從關係配置準備

MySQL5.6.27初始登陸的密碼是一串salt密碼,為了便於登入MySQL,在3個節點分別執行如下配置:

1.登入MySQL配置

啟動mysql服務:

  # service mysql start
  Starting MySQL. SUCCESS!

檢視各個節點的mysql初始金鑰檔案:

  # cat/root/.mysql_secret
  # The random passwordset for the root user at Thu Nov  511:12:13 2015 (local time): MzmPQ1uPJ0Sgyki4

登入mysql:

  # mysql -u root –p                  # 複製貼上或手動輸入金鑰

登入後,設定mysql登入的新密碼:

  mysql > SET PASSWORDFOR 'root'@'localhost' = PASSWORD('mysql');
  mysql > flushprivileges;
  mysql > exit;

2.配置允許Client遠端登陸Server

  mysql> use mysql;
  Database changed
  mysql> selecthost,user,password from user; #預設只允許本地client遠端登入

mysql> update user set host='%' where user='root' andhost='localhost';
mysql> flush privileges;
mysql> exit;

注意:

另外一種修改user密碼的方法是:

mysql> update user setpassword=password('PASSWORD') where user='USER';

3.在MasterA上建立資料庫m_s_rep

在MasterA上建立資料庫m_s_rep,為主從節點之間同步複製資料做準備。

在masterA上建立資料庫和表:

  mysql> createdatabase m_s_rep;

五.主從同步複製配置

首先,配置MasterA端和MasterB端互為主從,最後實現Slave端為從。

配置MasterA端同步複製時所需要的選項

1.複製模板檔案

  # cp /usr/share/mysql/my-default.cnf  /etc/my.cnf
  # vim /etc/my.cnf

2.MasterA 節點的配置/etc/my.cnf檔案如下

[mysqld]
user=mysql
server-id=1 #表示mysql伺服器ID,該ID必須在該主從中是唯一的,預設是1,該ID可以自行自定義,但必須為數字。
log-bin=mysql-bin #表示啟用mysql二進位制日誌,該項必須要啟用,否則mysql主從不會生效
log-bin-index=mysql-bin.index
relay-log=mysql-relay
relay-log-index=mysql-relay.index
expire-logs-days=10
max-binlog-size=100M #表示每個binlog檔案最大大小,當此檔案大小等於100M時,會自動生成一個新的日誌檔案。注意:一條記錄不會寫在2個日誌檔案中,所以有時日誌檔案會超過此大小。
log-slave-updates=1
binlog-do-db=m_s_rep #表示需要同步的資料庫名字,如果是多個數據庫,就以此格式再寫一行即可。
 replicate-do-db= m_s_rep 
  binlog-ignore-db=mysql #表示不需要同步的資料庫名字,如果是多個數據庫,就以此格式再寫一行即可。
replicate-ignore-db=mysql
sync-binlog=1
auto-increment-increment=2
auto-increment-offset=1
# Remove leading # and set to the amount of RAM for the mostimportant data
# cache in MySQL. Start at 70% of total RAM for dedicatedserver, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrityoption: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reportingservers.
# The server defaults are faster for transactions and fastSELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
 
# Disabling symbolic-links is recommended to prevent assortedsecurity risks
symbolic-links=0
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #預設mysql mode
lower_case_table_names=1
explicit_defaults_for_timestamp=true
skip-character-set-client-handshake
collation-server=utf8_general_ci
character-set-server=utf8

注意:

如果binlog-do-db和binlog-ignore-db不加的話,那麼預設是同步複製整個mysql資料庫。

通過設定sql模式配置多種伺服器操作特徵:

指定mysql對接受輸入資料的寬容度

設定與其他資料庫系統的相容性

控制查詢處理

--僱用或禁用與sql符合性相關的行為。

覆蓋sql的”空“預設模式

--空模式不僱用限制或符合性行為

預設的sql模式為no_engine_substitution

預設的配置檔案會新增STRICT_TRANS_TABLES

在MasterA主庫上建立同步複製時的使用者並授權

1. 在masterA上新建2個賬戶,用於masterB和slave同步資料

mysql>  GRANTREPLICATION SLAVE ON *.* TO 'rep201'@'10.62.83.%' IDENTIFIED BY 'rep201';   
mysql> GRANTREPLICATION SLAVE ON *.* TO 'rep203'@'10.62.83.%' IDENTIFIED BY 'rep202';   
mysql> FLUSH PRIVILEGES;

mysql> select user,repl_slave_priv from user ; #檢視授權的replication slave的使用者;

2.授權完畢後,我們需要在MasterB和Slave測試rep201和rep203使用者是否可以連線master。如下:

# mysql -h 10.62.83.201 -umysql01 –p

MasterA主庫鎖表

先鎖住主庫MasterA的表,防止資料再寫入,導致主從資料庫不一致。

mysql> FLUSH TABLES WITH READ LOCK; #主庫master鎖表;
mysql> insert into TABLE values(6); #測試是否表被鎖;

注意:鎖表命令視窗不要退出,退出後鎖表無效。

記錄MasterA 主庫的binlog以及pos位置節點

mysql> show master status;
mysql> show master status\G

注意:這個時候資料庫仍然是被鎖定的,不要退出這個視窗,退出鎖表就無效了;

匯出MasterA主庫m_s_rep資料庫

  # mysqldump -u root -p --databases m_s_rep > /tmp/m_s_rep.sql
  Enter password:
  # scp /tmp/m_s_rep.sql  [email protected]:/tmp

配置MasterB端同步複製時所需要的選項

1.複製模板檔案

  # cp /usr/share/mysql/my-default.cnf  /etc/my.cnf
  # vim /etc/my.cnf

2.MasterB 節點配置/etc/my.cnf檔案如下 :

[mysqld]
 
user=mysql
server-id=2
log-bin=mysql-bin
log-bin-index=mysql-bin.index
relay-log=mysql-relay
relay-log-index=mysql-relay.index
expire-logs-days=10
max-binlog-size=100M
log-slave-updates
skip-slave-start
slave-skip-errors=all
binlog-do-db=m_s_rep
replicate-do-db= m_s_rep
binlog-ignore-db=mysql
replicate-ignore-db=mysql
sync-binlog=1
auto-increment-increment=2
auto-increment-offset=2
 
#
# Remove leading # and set to the amount of RAM for the mostimportant data
# cache in MySQL. Start at 70% of total RAM for dedicatedserver, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrityoption: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reportingservers.
# The server defaults are faster for transactions and fastSELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
 
# Disabling symbolic-links is recommended to prevent assortedsecurity risks
symbolic-links=0
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names=1
explicit_defaults_for_timestamp=true
skip-character-set-client-handshake
collation-server=utf8_general_ci
character-set-server=utf8

在MasterB上建立資料庫m_s_rep並匯入主庫備份

1.在MasterA上覆制資料庫備份

# scp /tmp/m_s_rep.sql [email protected]:/tmp/

2. 在MasterB上建立資料庫m_s_rep並匯入資料庫備份

在MasterB上建立同步複製時的使用者並授權

1.在masterB建立授權賬戶,用於開啟同步

mysql> GRANTREPLICATION SLAVE ON *.* TO 'rep202'@'10.62.83.%' IDENTIFIED BY 'rep202';

mysql> select user,repl_slave_priv from user ; #檢視授權的replication slave的使用者;

2.授權完畢後,我們需要在MasterA和Slave測試rep202使用者是否可以連線MasterB。

記錄MasterB 從庫的binlog以及pos位置節點

1.記錄主庫masterB的binlog檔名以及pos位置節點:

mysql> show master status;
mysql> show master status\G;

配置MasterA和MasterB互為主從並開啟從庫同步

1.在MasterB 10.62.83.202上配置MasterA的從庫,並開啟從庫同步

mysql> 
CHANGE MASTER TO MASTER_HOST='10.62.83.201',MASTER_USER='rep201', MASTER_PASSWORD='rep201', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=1544, MASTER_CONNECT_RETRY=10;
mysql> start slave;

2. 在MasterA 10.62.83.201上配置MasterB的從庫,並開啟從庫同步

mysql> 
CHANGE MASTER TO MASTER_HOST='10.62.83.202', MASTER_USER='rep202',MASTER_PASSWORD='rep202', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=1691, MASTER_CONNECT_RETRY=10;
mysql> start slave;

注意:

我們檢視同步是否主要是檢視Slave_IO_Running與Slave_SQL_Running選項。如果正常同步,這兩選項必須同時為YES。

如果Slave_IO_Running為NO,說明可能是從庫與主庫的網路不通。

如果Slave_SQL_Running為NO,說明很可能是從庫與主庫的資料不一致。

通過上圖,我們可以看到目前Slave_IO_Running和Slave_SQL_Running都為YES。說明現在主從同步是正常的。

並且通過上圖,我們也可以看到從庫slave與主庫master剛開始同步時的binlog檔名以及開始同步時的pos位置節點。

檢視MasterB的relay-log以及master.info

1. 檢視MasterB的relay-log

現在我們來檢視MasterB的relay-log以及master.info資訊,我們首先看relay-log資訊,如下:

# mysqlbinlog mysql-relay-bin.000002|more

通過這張圖,我們可以在relay-log日誌中看到,從庫MasterB開始同步主庫MasterA的binlog檔名以及同步複製時的pos位置節點。

2.現在我們來檢視MasterB的master.info,如下:

# cat master.info |more

可以看到這個檔案儲存了從庫MasterB同步主庫MasterA時的相關資訊:IP、使用者、密碼、binlog檔名、pos位置節點、同步週期。

3.檢視MasterB的程序狀態

mysql> SHOW PROCESSLIST\G

注意:

檢視狀態, 其中第1 、第2 和第3程序上是此伺服器做為從開始的3個執行緒;第4的BinlogDump程序做為主提供給從的發生binlog的執行緒;

4.檢視MasterA的程序狀態

注意:

檢視狀態, 其中第3 、第4 和第5程序上是此伺服器做為從開始的3個執行緒;第1和第2的Binlog Dump程序做為主提供給從的發生binlog的執行緒;

MasterA主庫解鎖

mysql> UNLOCK TABLES;

配置Slave端同步複製時所需要的選項

1.複製模板檔案

  # cp /usr/share/mysql/my-default.cnf  /etc/my.cnf
  # vim /etc/my.cnf

2.Slave端配置/etc/my.cnf檔案如下:

[mysqld]
user=mysql
 
server-id=3
log-bin=mysql-bin
log-bin-index=mysql-bin.index
relay-log=mysql-relay
relay-log-index=mysql-relay.index
expire-logs-days=10
max-binlog-size=100M
log-slave-updates
skip-slave-start
slave-skip-errors=all
binlog-do-db= m_s_rep
replicate-do-db= m_s_rep
binlog-ignore-db=mysql
replicate-ignore-db=mysql
sync-binlog=1
 
#
# Remove leading # and set to the amount of RAM for the mostimportant data
# cache in MySQL. Start at 70% of total RAM for dedicatedserver, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrityoption: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reportingservers.
# The server defaults are faster for transactions and fastSELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
 
# Disabling symbolic-links is recommended to prevent assortedsecurity risks
symbolic-links=0
 
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names=1
explicit_defaults_for_timestamp=true
skip-character-set-client-handshake
collation-server=utf8_general_ci
character-set-server=utf8

注意:修改檔案/etc/my.cnf後重新啟動mysql服務;

在Slave端上建立資料庫m_s_rep並匯入主庫備份

1.在Slave端建立資料庫m_s_rep

2.在MasterA上覆制資料庫備份

# scp /tmp/m_s_rep.sql [email protected]:/tmp/

3.匯入主庫資料備份

注意:匯入資料之前,確保資料的一致性;

配置Salve端為MasterA和MasterB同步並開啟同步

1. 在Slave 10.62.83.203上配置MasterA的從庫,並開啟從庫同步

mysql> 
CHANGE MASTER TO MASTER_HOST='10.62.83.201',MASTER_USER='rep203', MASTER_PASSWORD='root', MASTER_PORT=3306,   MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=1544,MASTER_CONNECT_RETRY=10;
mysql> start slave;

下接《MySQL的3節點主從同步複製方案測試

from:https://blog.51cto.com/zkhylt/1775381