MySQL主從複製的配置

環境html

操做系統:CentOS-6.6-x86_64-bin-DVD1.isomysql

MySQL版本:mysql-5.6.26.tar.gzlinux

主節點IP:192.168.1.205     主機名:edu-mysql-01sql

從節點IP:192.168.1.206     主機名:edu-mysql-02數據庫

主機配置:4CPU4G內存緩存

 

MySQL主從複製官方文檔服務器

http://dev.mysql.com/doc/refman/5.6/en/replication.html網絡

 

MySQL主從複製的方式session

MySQL5.6開始主從複製有兩種方式:基於日誌(binlog)、基於GTID(全局事務標示符)。架構

本教程主要講基於日誌(binlog)的複製。

 

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)主從服務器操做系統版本和位數一致;

(2) Master和Slave數據庫的版本要一致

(3) Master和Slave數據庫中的數據要一致

(4) Master開啓二進制日誌,Master和Slave的server_id在局域網內必須惟一

 

主從配置的簡要步驟

一、Master上的配置

(1) 安裝數據庫;

(2) 修改數據庫配置文件,指明server_id,開啓二進制日誌(log-bin);

(3) 啓動數據庫,查看當前是哪一個日誌,position號是多少;

(4) 登陸數據庫,受權數據複製用戶(IP地址爲從機IP地址,若是是雙向主從,這裏的還須要受權本機的IP地址,此時本身的IP地址就是從IP地址);

(5) 備份數據庫(記得加鎖和解鎖);

(6) 傳送備份數據到Slave上;

(7) 啓動數據庫;

如下步驟,爲單向主從搭建成功,想搭建雙向主從須要的步驟:

(1) 登陸數據庫,指定Master的地址、用戶、密碼等信息(此步僅雙向主從時須要);

(2) 開啓同步,查看狀態;

二、Slave上的配置

(1) 安裝數據庫;

(2) 修改數據庫配置文件,指明server_id(若是是搭建雙向主從的話,也要開啓二進制日誌log-bin);

(3) 啓動數據庫,還原備份;

(4) 查看當前是哪一個日誌,position號是多少(單向主今後步不須要,雙向主從須要);

(5) 指定Master的地址、用戶、密碼等信息;

(6) 開啓同步,查看狀態。

 

單向主從環境(也稱MySQL A/B複製)的搭建

一、Master(192.168.1.205)和Slave(192.168.1.206)上都安裝了相同版本的數據庫(mysql-5.6.26.tar.gz),參考《高可用架構篇--第13節--MySQL源碼編譯安裝(CentOS6.6+MySQL5.6)》。

注意:兩臺數據庫服務器的的selinux都要disable(永久關閉selinux,請修改/etc/selinux/config,將SELINUX改成disabled

 

二、修改Master的配置文件/etc/my.cnf

[root@edu-mysql-01 ~]# vi /etc/my.cnf

## 在 [mysqld] 中增長如下配置項

## 設置server_id,通常設置爲IP

server_id=205

## 複製過濾:須要備份的數據庫,輸出binlog

#binlog-do-db=roncoo

## 複製過濾:不須要備份的數據庫,不輸出(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

 

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

 

2.1 複製過濾可讓你只複製服務器中的一部分數據,有兩種複製過濾:

  1. 在Master上過濾二進制日誌中的事件;
  2. 在Slave上過濾中繼日誌中的事件。以下:

 

2.2 MySQL對於二進制日誌 (binlog)的複製類型

(1) 基於語句的複製:在Master上執行的SQL語句,在Slave上執行一樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現無法精確複製時,會自動選着基於行的複製。    

(2) 基於行的複製:把改變的內容複製到Slave,而不是把命令在Slave上執行一遍。從MySQL5.0開始支持。

(3) 混合類型的複製:默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製。

 

三、啓動/重啓Master數據庫服務,登陸數據庫,建立數據同步用戶,並授予相應的權限

[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 reserved.

 

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 statement.

##建立數據同步用戶,並授予相應的權限

mysql> grant replication slave, replication client on *.* to 'repl'@'192.168.1.206' identified by 'roncoo.123';

Query OK, 0 rows affected (0.00 sec)

## 刷新受權表信息

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

## 查看position號,記下position號(從機上須要用到這個position號和如今的日誌文件)

mysql> show master status;

 

四、建立roncoo庫、表,並寫入必定量的數據,用於模擬現有的業務系統數據庫

create database if not exists roncoo default charset utf8 collate utf8_general_ci;

use roncoo;

DROP TABLE IF EXISTS `edu_user`;

CREATE TABLE `edu_user` (

  `Id` int(11) NOT NULL AUTO_INCREMENT,

  `userName` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶名',

  `pwd` varchar(255) NOT NULL DEFAULT '' COMMENT '密碼',

  PRIMARY KEY (`Id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用戶信息表';

INSERT INTO `edu_user` VALUES (1,'吳水成','123456'),(2,'清風','123456'),(3,'龍果','roncoo.com');

 

五、爲保證Master和Slave的數據一致,咱們採用主備份,從還原來實現初始數據一致

## 先臨時鎖表

mysql> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)

## 這裏咱們實行全庫備份,在實際中,咱們可能只同步某一個庫,那也能夠只備份一個庫

 [root@edu-mysql-01 ~]# mysqldump -p3306 -uroot -p --add-drop-table roncoo > /tmp/edu-master-roncoo.sql;

Warning: Using a password on the command line interface can be insecure.

Enter password:

[root@edu-mysql-01 ~]# cd /tmp

[root@edu-mysql-01 tmp]# ll

total 644

-rw-r--r--  1 root root 644266 Dec 20 04:10 edu-master-roncoo.sql

## 注意:實際生產環境中大數據量(超2G數據)的備份,建議不要使用mysqldump進行比分,由於會很是慢。此時推薦使用 XtraBackup 進行備份。

 

## 解鎖表

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)

 

將Master上備份的數據遠程傳送到Slave上,以用於Slave配置時恢復數據

[root@edu-mysql-01 ~]# scp /tmp/edu-master-roncoo.sql root@192.168.1.206:/tmp/

root@192.168.1.206's password:

edu-master-roncoo.sql                        100%  629KB 629.2KB/s   00:00   

[root@edu-mysql-01 ~]#

 

六、接下來處理Slave(192.168.1.206),配置文件只需修改一項,其他配置用命令來操做

[root@edu-mysql-02 ~]# vi /etc/my.cnf

## 在 [mysqld] 中增長如下配置項

## 設置server_id,通常設置爲IP

server_id=206

## 複製過濾:須要備份的數據庫,輸出binlog

#binlog-do-db=roncoo

##複製過濾:不須要備份的數據庫,不輸出(mysql庫通常不一樣步)

binlog-ignore-db=mysql

## 開啓二進制日誌,以備Slave做爲其它SlaveMaster時使用

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,可是,若是hostname改變則會出現問題)。

relay_log配置中繼日誌,log_slave_updates表示slave將複製事件寫進本身的二進制日誌。

當設置log_slave_updates時,你可讓slave扮演其它slave的master。此時,slave把SQL線程執行的事件寫進行本身的二進制日誌(binary log),而後,它的slave能夠獲取這些事件並執行它。以下圖所示(發送複製事件到其它Slave):

 

七、保存後重啓MySQL服務,還原備份數據

[root@edu-mysql-02 ~]# service mysql restart

Shutting down MySQL..[  OK  ]

Starting MySQL..[  OK  ]

 

Slave上建立相同庫:

create database if not exists roncoo default charset utf8 collate utf8_general_ci;

use roncoo;

 

導入數據

[root@edu-mysql-02 ~]# mysql -uroot -p roncoo < /tmp/edu-master-roncoo.sql

Enter password:

[root@edu-mysql-02 ~]#

 

八、登陸Slave數據庫,添加相關參數

MasterIP、端口、同步用戶、密碼、position號、讀取哪一個日誌文件)

[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 reserved.

 

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 statement.

 

mysql> change master to master_host='192.168.1.205', master_user='repl', master_password='roncoo.123', master_port=3306, master_log_file='edu-mysql-bin.000001', master_log_pos=1389, master_connect_retry=30;

Query OK, 0 rows affected, 2 warnings (0.01 sec)

 

上面執行的命令的解釋:

master_host='192.168.1.205'                  ## MasterIP地址

master_user='repl'                             ## 用於同步數據的用戶(在Master中受權的用戶)

master_password='roncoo.123'     ## 同步數據用戶的密碼

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秒,同步延遲調優參數。

 

## 查看主從同步狀態

mysql> show slave status\G;

可看到Slave_IO_State爲空, Slave_IO_Running和Slave_SQL_Running是No,代表Slave尚未開始複製過程。

 

## 開啓主從同步

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

## 再查看主從同步狀態

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 : mysql> show processlist\G;

1.row 爲I/O線程狀態。

2.row 爲SQL線程狀態。

3.row 爲處理本地命令行的線程。

 

九、主從數據複製同步測試

(1) 在Master中的roncoo庫上變動數據的同步測試;

mysql> INSERT INTO `edu_user` VALUES (4,'同步測試1','123456'),(5,'同步測試2','123456');

 

Master中添加完以後,登陸Slave中查看數據是否已同步。

 

(2) 在Master上新建一個ron庫

mysql> create database if not exists ron default charset utf8 collate utf8_general_ci;

在Slave中查看數據庫

mysql> show databases;

最終的測試結果是,在Master中的操做,都成功同步到了Slave。

 

十、測試過程當中,若是遇到同步出錯,可在Slave上重置主從複製設置(選操做):

(1) mysql> reset slave;

(2) mysql> change master to master_host='192.168.1.205',

master_user='repl',

master_password='roncoo.123',

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操做。

 

MySQL主從數據同步延遲問題的調優

基於局域網的Master/Slave機制在一般狀況下已經能夠知足「實時」備份的要求了。若是延遲比較大,能夠從如下幾個因素進行排查:

(1) 網絡延遲;

(2) Master負載太高;

(3) Slave負載太高;

通常的作法是使用多臺Slave來分攤讀請求,再單獨配置一臺Slave只做爲備份用,不進行其餘任何操做,就能相對最大限度地達到「實時」的要求了。

 

兩個能夠減小主從複製延遲的參數(按需配置)

MySQL能夠指定3個參數,用於複製線程重連主庫:--master-retry-count--master-connect-retry--slave-net-timeout 。其中 master-connect-retry master-retry-count 須要在 Change Master 搭建主備複製時指定,而 slave-net-timeout 是一個全局變量,能夠在 MySQL 運行時在線設置。具體的重試策略爲:備庫過了 slave-net-timeout 秒尚未收到主庫來的數據,它就會開始第一次重試。而後每過 master-connect-retry 秒,備庫會再次嘗試重連主庫。直到重試了 master-retry-count 次,它纔會放棄重試。若是重試的過程當中,連上了主庫,那麼它認爲當前主庫是好的,又會開始 slave-net-timeout 秒的等待。slave-net-timeout 的默認值是 3600 秒,master-connect-retry 默認爲 60 秒,master-retry-count 默認爲 86400 次。也就是說,若是主庫一個小時都沒有任何數據變動發送過來,備庫纔會嘗試重連主庫。這就是爲何在咱們模擬的場景下,一個小時後,備庫纔會重連主庫,繼續同步數據變動的緣由。

這樣的話,若是你的主庫上變動比較頻繁,能夠考慮將 slave-net-timeout 設置的小一點,避免主庫 Binlog dump 線程終止了,沒法將最新的更新推送過來。固然 slave-net-timeout 設置的太小也有問題,這樣會致使若是主庫的變動確實比較少的時候,備庫頻繁的從新鏈接主庫,形成資源浪費。

 

slave-net-timeout=seconds

參數說明:當Slave從Master數據庫讀取log數據失敗後,等待多久從新創建鏈接並獲取數據,單位爲秒,默認設置爲3600秒。

 

在作MySQL Slave的時候常常會遇到不少錯誤,須要根據具體緣由跨過錯誤繼續同步,但有時候是由於網絡不穩定、網絡閃斷形成同步不正常,若是Slave機器很是多的狀況下,一個一個登陸服務器去stop slave、start slave變得無聊並且重複。從MySQL5.1開始支持的解決方案配置:

master-connect-retry=seconds

參數說明:在主服務器宕機或鏈接丟失的狀況下,從服務器線程從新嘗試鏈接主服務器以前睡眠的秒數。若是主服務器.info文件中的值能夠讀取則優先使用。若是未設置,默認值爲60。

一般配置以上2個參數能夠減小網絡問題致使的主從數據同步延遲。

通常網絡問題的錯誤是:

[ERROR] Error reading packet from server: Lost connection to MySQL server during query (server_errno=xxxx)

[ERROR] Slave I/O thread: Failed reading log event, reconnecting to retry, log ‘edu-mysql-bin.000256’  position 23456

相關文章
相關標籤/搜索