MySQL Replication(Master與Slave基本原理及配置)
主從mysql工作原理:

1:過程:
(1)Mysql的復制(replication)是一個異步的復制,從一個Mysql節點復制到另一個Mysql節點。實現整個復制操作主要由三個進程完成的,其中兩個進程在Slave(Sql進程和IO進程)另外一個進程在 Master(IO進程)上。
(2)要實施復制,首先必須打開Master端的binary log功能,否則無法實現。因為整個復制過程實際上就是Slave從Master端獲取該日志然后再在自己身上完全順序的執行日志中所記錄的各種操作。
2:復制的基本過程如下:
(1)Slave上面的IO進程連接上Master,並請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內容;
(2)Master接收到來自Slave的IO進程的請求后,通過負責復制的IO進程根據請求信息讀取制定日志指定位置之后的日志信息,返回給Slave 的IO進程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經到Master端的bin-log文件的名稱以及bin-log的位置;
(3)Slave的IO進程接收到信息后,將接收到的日志內容依次添加到Slave端的relay-log文件的最末端,並將讀取到的Master端的 bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的高速Master“我需要從某個bin-log的哪個位置開始往后的日志內容,請發給我”;
(4)Slave的Sql進程檢測到relay-log中新增加了內容后,會馬上解析relay-log的內容成為在Master端真實執行時候的那些可執行的內容,並在自身執行。
3:主從結論
(1)主從間的數據庫不是實時同步,就算網絡連接正常,也存在瞬間,主從數據不一致。
(2)如果主從的網絡斷開,從會在網絡正常后,批量同步。
(3)如果對從進行修改數據,那么很可能從在執行主的bin-log時出現錯誤而停止同步,這個是很危險的操作。所以一般情況下,非常小心的修改從上的數據。
(4)還有一個mysql配置是雙主,互為主從配置,只要雙方的修改不沖突,可以工作良好。
(5)如果需要多主的話,可以用環形配置,這樣任意一個節點的修改都可以同步到所有節點。
(2)如果主從的網絡斷開,從會在網絡正常后,批量同步。
(3)如果對從進行修改數據,那么很可能從在執行主的bin-log時出現錯誤而停止同步,這個是很危險的操作。所以一般情況下,非常小心的修改從上的數據。
(4)還有一個mysql配置是雙主,互為主從配置,只要雙方的修改不沖突,可以工作良好。
(5)如果需要多主的話,可以用環形配置,這樣任意一個節點的修改都可以同步到所有節點。
4:搭建mysql主從服務器 (1)實驗環境 操作系統:Red Hat Enterprise Linux Server release 6.4 數據庫版本: 5.6.21 (2)主機地址: master:192.168.10.130 slave:192.168.10.120 (3)安裝數據mysql數據庫 略 (4)配置master的my.cnf文件 [mysqld] log_bin = mysql-bin #開啟binlog日志 basedir = /usr/local/mysql #指定mysql的安裝目錄 datadir = /data/mysql #指定mysql數據庫的數據存放位置 port = 3306 #指定端口,默認是3306,如果一個主機有兩個數據庫需指定不同端口 server_id = 1 #指定server-id,必須與slave端的server-id不同 bind-address = 0.0.0.0 #默認是127.0.0.1,更改為0.0.0.0,否則Slave將無法鏈接到 Master expire_logs_days = 10 #終止日志的時間,以天為單位,默認是30天 max_binlog_size = 100M #存放日志最大容量 sync-binlog=1 #允許日志同步 (5)重啟mysql服務 [root@localhost ~]# service mysqld restart (6)本地登錄mysql數據庫,向slave授權並查看當前使用的binlog日志與偏移量 mysql> grant replication client,replication slave on *.* to 'repluser'@'192.168.10.120' identified by '123456'; 語意:允許用戶repluser以密碼123456在192.168.10.120主機,登陸本機數據庫同步數據; (7)查看master狀態 mysql> show master status \G; *************************** 1. row *************************** File: mysql-bin.000015 #binlog日志 Position: 211 #偏移量 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec) ERROR: No query specified 錯誤顯示: mysql>show master status; Empty set (0.02 sec) 查詢如果出現以上提示表示配置有問題; (8)配置slave服務器my.cnf文件 [mysqld] basedir = /usr/local/mysql datadir = /data/mysql port = 3306 server_id = 2 #指定server-id,必須與master端的server-id不同 sync-binlog=1 #允許日志同步 read-only=1 #設置只讀 (9)重啟mysql服務 [root@localhost ~]# service mysqld restart (10)本地登錄mysql數據庫,指定從服務器的主服務器並開啟slave功能 執行以下操作必須關閉slave功能 mysql> stop slave; Query OK, 0 rows affected (0.00 sec) mysql> change master to -> master_host='192.168.10.130', #指定主服務器地址 -> master_port=3306, #指定端口,默認是3306,不需要指定 -> master_user='repluser', #指定同步時使用的用戶名 -> master_password='123456', #指定同步用戶的密碼 -> master_log_file='mysql-bin.000015', #指定當前的主服務器使用的binlog日志 -> master_log_pos=120; #指定當前主服務器上的位偏移量 Query OK, 0 rows affected (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) (11)查看slave是否正常工作 mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.10.130 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000015 Read_Master_Log_Pos: 120 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000015 Slave_IO_Running: Yes Slave_SQL_Running: Yes (12)測試 在master創建wql數據 mysql> create database wql; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | wordpress | | wql | +--------------------+ 6 rows in set (0.00 sec) 在slave數據查看是否有該數據庫 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | wql | +--------------------+ 5 rows in set (0.00 sec)
Mysql主從同步搭建完成且可以正常工作,但其中有幾點需要注意:
(1)設置slave服務器時在指定其主服務器時要在每個項目后面加逗號分隔
(2)如需更改slave服務器的主服務器的設置需要先停止slave服務,然后再更改,使用命令stop slave可以停止slave服務
(3)只有Slave_IO_Running與Slave_SQL_Running兩個進程的狀態全為Yse時才表明slave服務正常工作,否則都表示其工作異常。
Slave_IO_Running進程狀態為NO的原因:
(1)連接不上主數據庫服務器(物理線路,安全設置問題,授權問題)
(2)當前binlog日志名和pos點和主服務器的不一致
Slave_SQL_Running進程狀態為NO的原因:從服務器本機沒有主數據庫上的庫和表或者表結構不一致。
13:主從復制如何提高可靠性
(2)如需更改slave服務器的主服務器的設置需要先停止slave服務,然后再更改,使用命令stop slave可以停止slave服務
(3)只有Slave_IO_Running與Slave_SQL_Running兩個進程的狀態全為Yse時才表明slave服務正常工作,否則都表示其工作異常。
Slave_IO_Running進程狀態為NO的原因:
(1)連接不上主數據庫服務器(物理線路,安全設置問題,授權問題)
(2)當前binlog日志名和pos點和主服務器的不一致
Slave_SQL_Running進程狀態為NO的原因:從服務器本機沒有主數據庫上的庫和表或者表結構不一致。
13:主從復制如何提高可靠性
(1)主從單向復制,從服務器只是實時的保存了主服務器的一個副本。當主服務器發生故障時,可以切換到從服務器繼續做查詢,但不能更新。
(2)如果采用雙向復制,即兩台mysql服務器即作為主服務器,又作為從服務器。那么兩者都可以執行更新操作並能實現負載均衡,當一方出現故障時,另一方不受影響。但是,除非能保證任何更新操作順序都是安全的,否則雙向復制會導致失敗。
希望瀆者多提意見,
聯系方式QQ:1486483698
QQ交流群:431392633