一、MySQL主從複製的原理
1、mysql的複製過程:每執行一個寫操作,它都會往自己的資料庫中存一份,與此同時這個寫操作也會儲存在二進位記錄檔中一份,並且把它們儲存為事件,所以在這個資料庫上,前端資料每執行一個寫操作或者有可能引起修改的操作,都會儲存一個事件,我們就把這個事件通過mysql伺服器3306連接埠發送給另外一台伺服器,另外一台伺服器把這個事件接收下來,接受下來以後先儲存在本地的記錄檔中,而後從這個記錄檔中一次讀一個事件並且在本地執行一下,然後儲存在資料庫裡面,這個過程就叫mysql的複製。如所示:
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image002[6]" border="0" alt="clip_image002[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0293294-0.jpg" width="468" height="331" />
2、在這樣一個模型當中,我們把允許來自外部操作記錄下來記錄到資料庫中,並儲存至二進位檔案中的這台伺服器叫做複製架構中主伺服器(master)。主伺服器中的記錄檔叫二進位日誌。
3、slave:從伺服器中的記錄檔是從主伺服器中複製過來的,叫做中繼日誌,主要目的是複製下來,再在本地用一遍,相當於產生一個接力的過程。
4、主伺服器允許並存執行,主伺服器上若有多個CPU,它允許多個伺服器並存執行。但是我們寫到二進位檔案中,只能一條一條的寫,從伺服器只能一條一條的執行。從伺服器預設情況下也只能是一個進程,讀一條執行一個,所以從伺服器慢於主伺服器。
二、MySQL主從複製實現的過程
1、主伺服器的配置過程
1)添加系統使用者並修改許可權
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image004[6]" border="0" alt="clip_image004[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0292264-1.jpg" width="633" height="88" />
2)下載mysql軟體包解壓後並建立連結
[root@node1 ~]# lftp 172.16.0.1/pub/Sources/mysql-5.5/ 下載mysql-5.5包
cd ok, cwd=/pub/Sources/mysql-5.5
lftp 172.16.0.1:/pub/Sources/mysql-5.5> ls
...
lftp 172.16.0.1:/pub/Sources/mysql-5.5> get mysql-5.5.28-linux2.6-i686.tar.gz
179907710 bytes transferred in 25 seconds (6.89M/s)
lftp 172.16.0.1:/pub/Sources/mysql-5.5> bye
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image006[6]" border="0" alt="clip_image006[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0295058-2.jpg" width="752" height="136" />
3)初始化資料庫並複製檔案
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image008[6]" border="0" alt="clip_image008[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0295947-3.jpg" width="686" height="281" />
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image010[6]" border="0" alt="clip_image010[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0294205-4.jpg" width="648" height="57" />
4)修改設定檔並複製到從伺服器
[root@node1 mysql]# vim /etc/my.cnf 修改設定檔內容如下:
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image012[6]" border="0" alt="clip_image012[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P029BC-5.jpg" width="435" height="56" />
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image014[6]" border="0" alt="clip_image014[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0294102-6.jpg" width="626" height="82" />
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image016[6]" border="0" alt="clip_image016[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0291015-7.jpg" width="526" height="64" />
[root@node1 ~]# scp /etc/my.cnf node2:/etc/ 把設定檔複製到從伺服器
my.cnf 100% 4746
5)啟動mysql,測試能否串連到mysql
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image018[6]" border="0" alt="clip_image018[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P029C36-8.jpg" width="604" height="37" />
[root@node1 mysql]# vim /etc/profile.d/mysql.sh 為了以下命令用起來方便,編輯設定檔
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image020[6]" border="0" alt="clip_image020[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P02910E-9.jpg" width="527" height="55" />
[root@node1 mysql]# . /etc/profile.d/mysql.sh 執行一下指令碼
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image022[6]" border="0" alt="clip_image022[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P02953Z-10.jpg" width="669" height="244" />
6)複製mysql軟體包到從伺服器,然後串連到mysql建立使用者
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image024[6]" border="0" alt="clip_image024[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0295K1-11.jpg" width="661" height="91" />
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image026[6]" border="0" alt="clip_image026[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0292454-12.jpg" width="634" height="134" />
2、配置從伺服器
1)建立使用者修改許可權並解壓軟體包串連到資料庫
[root@node2 ~]# mkdir -pv /mydata/data
mkdir: created directory `/mydata'
mkdir: created directory `/mydata/data'
[root@node2 ~]# useradd -r mysql
[root@node2 ~]# chown -R mysql.mysql /mydata/data/
[root@node2 ~]# tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/
[root@node2 ~]# cd /usr/local/
[root@node2 local]# ls
bin etc games include lib libexec mysql-5.5.28-linux2.6-i686 sbin share src
[root@node2 local]# ln -sv mysql-5.5.28-linux2.6-i686 mysql
create symbolic link `mysql' to `mysql-5.5.28-linux2.6-i686'
[root@node2 local]# cd mysql
[root@node2 mysql]# chown -R root.mysql 改變屬主屬組
[root@node2 mysql]# ll
[root@node2 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ 初始化資料庫
2)複製指令碼內容並修改所需設定檔
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image028[6]" border="0" alt="clip_image028[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0296242-13.jpg" width="678" height="42" />
[root@node2 mysql]# vim /etc/my.cnf 修改設定檔內容如下:
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image030[6]" border="0" alt="clip_image030[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0291W5-14.jpg" width="391" height="38" />
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image032[6]" border="0" alt="clip_image032[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0291O4-15.jpg" width="641" height="164" />
3)啟動mysql
[root@node2 mysql]# service mysqld start
Starting MySQL.... [ OK ]
[root@node2 mysql]# vim /etc/profile.d/mysql.sh 編輯設定檔的內容如下:
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image034[6]" border="0" alt="clip_image034[6]" src="http://www.bkjia.com/uploads/allimg/131229/1P0295092-16.jpg" width="509" height="35" />
[root@node2 mysql]# . !$ 讀一下上面的指令碼
. /etc/profile.d/mysql.sh
4)在主節點上即HA1上查看從哪個節點開始複製
[root@node1 ~]# mysql
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image036" border="0" alt="clip_image036" src="http://www.bkjia.com/uploads/allimg/131229/1P0293N3-17.jpg" width="640" height="391" />
5)修改主伺服器的一些屬性
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image038" border="0" alt="clip_image038" src="http://www.bkjia.com/uploads/allimg/131229/1P0294A1-18.jpg" width="640" height="270" />
6)查看從伺服器啟動前後的狀態
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image040" border="0" alt="clip_image040" src="http://www.bkjia.com/uploads/allimg/131229/1P02950R-19.jpg" width="617" height="575" />
mysql> start slave; 啟動從伺服器
Query OK, 0 rows affected (0.00 sec)
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image042" border="0" alt="clip_image042" src="http://www.bkjia.com/uploads/allimg/131229/1P02a005-20.jpg" width="531" height="413" />
到這裡主從複製架構依然完成。
3、主伺服器上建立資料,從伺服器上是否會出現
1)在主伺服器串連到資料庫並建立資料庫
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image044" border="0" alt="clip_image044" src="http://www.bkjia.com/uploads/allimg/131229/1P0295316-21.jpg" width="329" height="229" />
2)查看從伺服器的狀態,並查看資料庫
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image046" border="0" alt="clip_image046" src="http://www.bkjia.com/uploads/allimg/131229/1P02a3a-22.jpg" width="536" height="494" />
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image048" border="0" alt="clip_image048" src="http://www.bkjia.com/uploads/allimg/131229/1P0294413-23.jpg" width="303" height="190" />
4)讓從伺服器變成唯讀
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image050" border="0" alt="clip_image050" src="http://www.bkjia.com/uploads/allimg/131229/1P0293110-24.jpg" width="522" height="160" />
[root@node2 mysql]# vim /etc/my.cnf 修改設定檔,讓read_only = ON永久有效
650) this.width=650;" style="background-image:none;margin:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image052" border="0" alt="clip_image052" src="http://www.bkjia.com/uploads/allimg/131229/1P02910Q-25.jpg" width="544" height="90" />
5)重啟伺服器,查看read_only是否啟動
650) this.width=650;" style="background-image:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-left:0px;padding-right:0px;padding-top:0px;" title="clip_image054" border="0" alt="clip_image054" src="http://www.bkjia.com/uploads/allimg/131229/1P02953Z-26.jpg" width="645" height="374" />
(read-only = YES 對具有SUPER許可權的使用者不生效)
mysql> show slave status\G 查看複製線程能否自動運行
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.66.6
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 430
Relay_Log_File: relay-log.000004
Relay_Log_Pos: 254
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes 當使用change master to之後
Slave_SQL_Running: Yes 就算重啟伺服器複製線程也會自動啟動
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 430
Relay_Log_Space: 404
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
6)查看/mydata/data/下的檔案
[root@node2 mysql]# cd /mydata/data/ 切換到/mydata/data目錄下
[root@node2 data]# ls 查看檔案
ibdata1 master-bin.000001 master-bin.index node2.magedu.com.pid relay-log.index
ib_logfile0 master-bin.000002 master.info performance_schema relay-log.info
ib_logfile1 master-bin.000003 mysql relay-log.000003 test
magedudb master-bin.000004 node2.magedu.com.err relay-log.000004
[root@node2 data]# file master.info 查看master.info
master.info: ASCII text 純ASCII碼的檔案
[root@node2 data]# file relay-log.info
relay-log.info: ASCII text 純ASCII碼的檔案
[root@node2 data]# cat relay-log.info 查看一下relay-log.info裡面的內容
./relay-log.000004 當前使用的relay-log檔案事件位置
254
master-bin.000001 正在讀取的主伺服器上的二進位檔案事件位置
430
read-only = YES 唯讀,在從伺服器上,但對具有SUPER許可權的使用者不生效;所以管理員照樣能寫;
sync-binlog = ON 在主伺服器上設定,用於事務安全; 】
7、有沒有這樣一個問題呢?在主伺服器上某個事物已經提交了,而有些事務仍然在緩衝區內,萬一這個時候主伺服器崩潰了,從伺服器上能否得到複件?如何降低主從不一致的可能性呢?應該配置主伺服器同步二進位日誌。
配置主伺服器同步二進位日誌
mysql> show global variables like '%log%'; 查看跟日誌相關的內容
8、我們的從伺服器啟動起來後會自動連接主伺服器,如果主伺服器崩潰了,從伺服器啟動後還會自動連接到主伺服器複製二進位日誌,一般來講不應該讓從伺服器從複製線程自動啟動,怎麼讓從伺服器不會自動啟動?
1)首先串連到mysql查看從伺服器相關的內容
mysql>show global variables like '%slave%';
2)如果想徹底的重新定義mysql從伺服器的話,執行mysql伺服器線程了可以手動停掉;具體過程如下:
mysql> stop slave IO_THREAD; 停掉線程服務
mysql> show slave status/G 查看狀態
補充:也可以一個一個的停掉線程服務
mysql> start slave IO_THREAD;
mysql> show slave status/G
mysql> start slave SQL_THREAD;
mysql> show slave status/G
mysql> \q
所有跟從伺服器相關的內容都會儲存在資料庫服務的錯誤記錄檔當中
[root@node2 mysql]# tail /mydata/data/node2.magedu.com.err
三、如何?mysql的半同步複製
1、在主伺服器和從伺服器上各自安裝一個外掛程式,這個外掛程式是google提供的。
[root@node2 data]# cd /usr/local/mysql 切換到mysql路徑下
[root@node2 mysql]# ls
[root@node2 mysql]# cd lib/plugin
(semisync_master.so是半同步的主伺服器上安裝的外掛程式,semisync_slave.so是半同步的從伺服器上安裝的外掛程式)
1)主伺服器上的配置:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; 裝載模組
rpl_semi_sync_master是模組(外掛程式)名稱、semisync_master.so是模組檔案名稱
mysql> show global variables like '%rpl%';
2)從伺服器上的配置:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; 裝載模組
mysql> show variables like 'rpl%'; 查看rpl開頭的
2、啟用rpl_semi_sync_master_enabled模組
1)主伺服器上:
mysql> set global rpl_semi_sync_master_enabled=1; 啟用rpl_semi_sync_master_enabled
mysql> show global varitables like '%rpl%'; rpl_semi_sync_master_enabled 顯示為ON了
2)從伺服器上:
mysql> set global rpl_semi_sync_master_enabled=1; 啟用rpl_semi_sync_master_enabled
mysql> show global varitables like '%rpl%'; rpl_semi_sync_master_enabled 顯示為ON了
mysql> show global status like 'rpl%'; 查看全域狀態變數
mysql> stop slave IO_THREAD; 停掉IO線程
mysql> start slave IO_THREAD; 啟用IO線程
mysql> show global status like 'rpl%';
到此,半同步複製就結束了。
本文出自 “show_only” 部落格,請務必保留此出處http://10240214.blog.51cto.com/6634068/1216339