MySQL5.6主從複製最佳實踐

MySQL5.6主從複製最佳實踐

 
MySQL5.6     主從複製的配置
 環境
操做系統:CentOS-6.6-x86_64
MySQL 版本:mysql-5.6.26.tar.gz
主節點 IP:192.168.31.57        主機名:edu-mysql-01
從節點 IP:192.168.31.59        主機名:edu-mysql-02
 
MySQL 主從複製官方文檔
MySQL 主從複製(也稱 A/B 複製)的原理
  1.  Master 將數據改變記錄到二進制日誌(binary  log)中,也就是配置文件 log-bin 指定的文件,這些記錄叫作二進制日誌事件(binary  log  events);
  2.  Slave 經過 I/O 線程讀取 Master 中的 binary  log  events 並寫入到它的 中繼日誌(relay  log);
  3.  Slave 重作中繼日誌中的事件,把中繼日誌中的事件信息一條一條的在 本地執行一次,完成數據在本地的存儲,從而實現將改變反映到它本身的 數據(數據重放)。
主從配置須要注意的點
  1. 主從服務器操做系統版本和位數一致;主從服務器的 hostname 不要一致。
  2. Master 和 Slave 數據庫的版本要一致;
  3. Master 和 Slave 數據庫中的數據要一致;
  4. Master 開啓二進制日誌,Master 和 Slave 的 server_id 在局域網內必 須惟一;
  5. Master 和 Slave  都建立數據庫 mbank,表 testuser  ;
Master 配置
  一、Master(192.168.31.57)和 Slave(192.168.31.59) 注意:兩臺數據庫服務器的的 selinux 都要 disable(永久關閉 selinux,請 修改/etc/selinux/config,將 SELINUX 改成 disabled)
  二、修改 Master 的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/etc/my .cnf [root@edu-mysql-01  ~] # vi  /etc/my.cnf
# 在 [mysqld] 中增長如下配置項
# 設置 server_id,通常設置爲 IP
  server_id=57
# 複製過濾:須要備份的數據庫,輸出 binlog
  binlog- do -db=mbank
# 複製過濾:不須要備份的數據庫,不輸出(mysql 庫通常不一樣步)
  binlog-ignore-db=mysql
# 開啓二進制日誌功能,能夠隨便取,最好有含義
  log-bin=edu-mysql-bin
# 爲每一個 session 分配的內存,在事務過程當中用來存儲二進制日誌的緩存
  binlog_cache_size=1M
# 主從複製的格式(mixed,statement,row,默認格式是 statement)
  binlog_format=mixed
# 二進制日誌自動刪除/過時的天數。默認值爲 0,表示不自動刪除。
  expire_logs_days=7
# 跳過主從複製中遇到的全部錯誤或指定類型的錯誤,避免 slave 端複製中斷。
# 如:1062 錯誤是指一些主鍵重複,1032 錯誤是由於主從數據庫數據不一 致
  slave_skip_errors=1062
# 若是須要同步函數或者存儲過程
  log_bin_trust_function_creators= true

  (如想了解以上參數的更多詳細解析,能夠直接百度參數名)html

  2.1 複製過濾可讓你只複製服務器中的一部分數據,有兩種複製過濾:
  1. 在 Master 上過濾二進制日誌中的事件;
  2. 在 Slave 上過濾中繼日誌中的事件。
2.2    MySQL 對於二進制日誌 (binlog)的複製類型
  1. 基於語句的複製:在 Master 上執行的 SQL 語句,在 Slave 上執行一樣的語句。MySQL 默認採用基於語句的複製,效率比較高。一旦發現無法精 確複製時,會自動選着基於行的複製。
  2. 基於行的複製:把改變的內容複製到 Slave,而不是把命令在 Slave 上 執行一遍。從 MySQL5.0 開始支持。
  3. 混合類型的複製:默認採用基於語句的複製,一旦發現基於語句的沒法 精確的複製時,就會採用基於行的複製。
 三、啓動/重啓 Master 數據庫服務,登陸數據庫,建立數據同步用戶,並授予相應的權限
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@edu-mysql-01  ~] # service  mysql  restart
  Shutting  down  MySQL..[  OK  ] Starting  MySQL..[  OK  ]
[root@edu-mysql-01  ~] # mysql  -uroot  -p
  Enter  password:
  Welcome  to  the  MySQL  monitor.   Commands  end  with  ;  or  \g. Your  MySQL  connection  id  is  1
Server  version:  5.6.26-log  Source  distribution
Copyright  (c)  2000,  2015, Oracle and /or  its  affiliates.  All  rights  reser ved.
  Oracle  is  a  registered  trademark  of  Oracle  Corporation  and /or  its affiliates.  Other  names  may  be  trademarks  of  their  respective owners.
  Type  'help;'  or  '\h'  for  help.  Type  '\c'  to  clear  the  current  input  stat ement.
#建立數據同步用戶,並授予相應的權限
mysql> grant  replication  slave,  replication  client  on  *.*  to  'repl' @ '192. 168.31.59'  identified  by  '123456' ;
Query  OK,  0  rows  affected  (0.00  sec)
# 刷新受權表信息
  mysql> flush  privileges;
  Query  OK,  0  rows  affected  (0.00  sec)
# 查看 MySQL 如今有哪些用戶及對應的 IP 權限
  mysql> select  user,host  from  mysql.user;
  # 查看 position 號,記下 position 號(從機上須要用到這個 position 號和現 在的日誌文件)
  mysql> show  master  status;
   Master 重啓後會修改 mysql-bin 文件名(序號加 1)   
 四、接下來處理 Slave(192.168.31.59),配置文件只需修改一項,其他配 置用命令來操做 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@edu-mysql-02  ~] # vi  /etc/my.cnf
## 在 [mysqld] 中增長如下配置項
# 設置 server_id,通常設置爲 IP
  server_id=59
# 複製過濾:須要備份的數據庫,輸出 binlog
  binlog- do -db=mbank
#複製過濾:不須要備份的數據庫,不輸出(mysql 庫通常不一樣步)
  binlog-ignore-db=mysql
# 開啓二進制日誌,以備 Slave 做爲其它 Slave 的 Master 時使用
  log-bin=edu-mysql-slave1-bin
# 爲每一個 session 分配的內存,在事務過程當中用來存儲二進制日誌的緩存
  binlog_cache_size  =  1M
# 主從複製的格式(mixed,statement,row,默認格式是 statement)
binlog_format=mixed
# 二進制日誌自動刪除/過時的天數。默認值爲 0,表示不自動刪除。
expire_logs_days=7
# 跳過主從複製中遇到的全部錯誤或指定類型的錯誤,避免 slave 端複製中 斷。
# 如:1062 錯誤是指一些主鍵重複,1032 錯誤是由於主從數據庫數據不一 致
  slave_skip_errors=1062
#  relay_log 配置中繼日誌
  relay_log=edu-mysql-relay-bin
#  log_slave_updates 表示 slave 將複製事件寫進本身的二進制日誌
  log_slave_updates=1
# 防止改變數據(除了特殊的線程)
  read_only=1

    若是 Slave 爲其它 Slave 的 Master 時,必須設置 bin_log。在這裏,咱們 開啓了二進制日誌,並且顯式的命名(默認名稱爲 hostname,可是,若是 h ostname 改變則會出現問題)。mysql

relay_log 配置中繼日誌,log_slave_updates 表示 slave 將複製事件寫進自 己的二進制日誌。
當設置 log_slave_updates 時,你可讓 slave 扮演其它 slave 的 master。 此時,slave 把 SQL 線程執行的事件寫進行本身的二進制日誌 (binary  log), 而後,它的 slave 能夠獲取這些事件並執行它.
 
五、保存後重啓 MySQL 服務,還原備份數據
1
2
[root@edu-mysql-02  ~] # service  mysql  restart
  Shutting  down  MySQL..[  OK  ] Starting  MySQL..[  OK  ]  
六、登陸 Slave 數據庫,添加相關參數
###Master 的 IP、端口、同步用戶、密碼、position 號、讀取哪一個日誌文件
1
2
3
4
5
6
7
8
9
[root@edu-mysql-02  ~] # mysql  -uroot  -p
Enter  password:
  Welcome  to  the  MySQL  monitor.   Commands  end  with  ;  or  \g. Your  MySQL  connection  id  is  3
Server  version:  5.6.26-log  Source  distribution
  Copyright  (c)  2000,  2015,  Oracle  and /or  its  affiliates.  All  rights  rese rved.
  Oracle  is  a  registered  trademark  of  Oracle  Corporation  and /or  its affiliates.  Other  names  may  be  trademarks  of  their  respective owners.
Type  'help;'  or  '\h'  for  help.  Type  '\c'  to  clear  the  current  input  stat ement.
mysql> change  master  to  master_host= '192.168.31.57' ,  master_user= ' repl' ,  master_password= '123456' ,  master_port=3306,  master_log_file= ' edu-mysql-bin.000001' ,  master_log_pos=429,  master_connect_retry=3 0;
Query  OK,  0  rows  affected,  2  warnings  (0.01  sec)
上面執行的命令的解釋:
master_host='192.168.31.57'                        ##  Master 的 IP 地址
master_user='repl'                 ## 用於同步數據的用戶(在 Master 中受權的用戶)
master_password='123456'                          ## 同步數據用戶的密碼
master_port=3306                   ##  Master 數據庫服務的端口
master_log_file='edu-mysql-bin.000001'     ##指定 Slave 從哪一個日誌文 件開始讀複製數據(可在 Master 上使用 show  master  status 查看到日誌 文件名)
master_log_pos=429                                  ## 從哪一個 POSITION 號開始讀
master_connect_retry=30                          ##當從新創建主從鏈接時,若是鏈接 創建失敗,間隔多久後重試。單位爲秒,默認設置爲 60 秒,同步延遲調優 參數。
 
 ## 查看主從同步狀態 
1
mysql> show  slave  status\G;
可看到 Slave_IO_State 爲空, Slave_IO_Running 和 Slave_SQL_Runnin g 是 No,代表 Slave 尚未開始複製過程。
 ## 開啓主從同步
1
2
mysql> start  slave;
Query  OK,  0  rows  affected  (0.00  sec)
## 再查看主從同步狀態
1
mysql> show  slave  status\G;
 主要看如下兩個參數,這兩個參數若是是 Yes 就表示主從同步正常
Slave_IO_Running:  Yes Slave_SQL_Running:  Yes
由截圖中的主從同步狀態信息能夠看出,咱們配置的主從同步是正常的。
 可查看 master 和 slave 上線程的狀態。在 master 上,能夠看到 slave 的 I/O 線程建立的鏈接:
 Master  :  mysql> show  processlist\G;
  (1)row 爲處理 slave 的 I/O 線程的鏈接。
  (2)row 爲處理 MySQL 客戶端鏈接線程。
  (3)row 爲處理本地命令行的線程。
Slave  :
1
mysql> show  processlist\G;
   (1) row 爲 I/O 線程狀態。
   (2) row 爲 SQL 線程狀態。
     (3) row 爲處理本地命令行的線程。
七、主從數據複製同步測試
(1) 在 Master 中的 mbank 庫上變動數據的同步測試;
1
mysql> INSERT  INTO  `testuser`(`usercode`,`username`)  VALUES  (`1`, '同步測試 1' ),(  `2`, '同步測試 2' );
Master 中添加完以後,登陸 Slave 中查看數據是否已同步。
八、測試過程當中,若是遇到同步出錯,可在 Slave 上重置主從複製設置(選 操做): 
1
2
3
4
mysql> reset  slave;
mysql> change  master  to  master_host= '192.168.31.57' , master_user= 'repl' ,
master_password= '123456' , master_port=3306,
master_log_file= 'edu-mysql-bin.00000x' , master_log_pos=xx, master_connect_retry=30;
(此時,master_log_file 和 master_log_pos 要在 Master 中用 show  master  status 命令查看)
 注意:若是在 Slave 沒作只讀控制的狀況下,千萬不要在 Slave 中手動插 入數據,那樣數據就會不一致,主從就會斷開,就須要從新配置了。
  上面所搭建的是單向複製的主從,也是用的比較多的,而雙向主從其實 就是 Master 和 Slave 都開啓日誌功能,而後在 Master 執行受權用戶
(這 裏受權的是本身做爲從服務器,也就是這裏的 IP 地址是 Master 的 IP 地址), 而後再在 Master 上進行 chang  master 操做。 
基於局域網的 Master/Slave 機制在一般狀況下已經能夠知足「實時」備份 的要求了。若是延遲比較大,能夠從如下幾個因素進行排查:
  1. 網絡延遲;
  2. Master 負載太高;
  3. Slave 負載太高;
  通常的作法是使用多臺 Slave 來分攤讀請求,再單獨配置一臺 Slave 只做 爲備份用,不進行其餘任何操做,就能相對最大限度地達到「實時」的要 求了。
我在部署的時候遇到的問題: 因爲個人從服務器是主服務器複製過來的,mysql 的 server_id 同樣,在同步的時候出錯了:
Fatal error: The slave I/O thread stops because master and slave have equal MySQ L server UUIDs; these UUIDs must be different for replication to work.
 (1)首先檢查:
 
1
2
3
4
5
6
mysql> show variables like ‘server_id';
  +—————+——-+
  | Variable_name | Value |
  +—————+——-+
  | server_id | 3 |
  +—————+——-+
主從不能不同。
 (2)若是還不行,繼續排查。進入 mysql 的 data 目錄,打開 auto.cnf 文件,裏面記錄了 數據庫的 uuid,每一個庫的 uuid 應該是不同的。
 [auto] 
server-uuid=6dcee5be-8cdb-11e2-9408-90e2ba2e2ea6
解決辦法,按照這個 16 進制格式,隨便改下,重啓 mysql 便可。
相關文章
相關標籤/搜索