MySQL主從複製的原理及實現過程(mysql-5.5的同步、半步複製過程)

1、MySQL主從複製的原理前端

一、mysql的複製過程:每執行一個寫操做,它都會往本身的數據庫中存一份,與此同時這個寫操做也會存儲在二進制日誌文件中一份,而且把它們保存爲事件,因此在這個數據庫上,前端數據每執行一個寫操做或者有可能引發修改的操做,都會保存一個事件,咱們就把這個事件經過mysql服務器3306端口發送給另一臺服務器,另一臺服務器把這個事件接收下來,接受下來之後先保存在本地的日誌文件中,然後從這個日誌文件中一次讀一個事件而且在本地執行一下,而後保存在數據庫裏面,這個過程就叫mysql的複製。以下圖所示:node

clip_p_w_picpath002[6]

二、在這樣一個模型當中,咱們把容許來自外部操做記錄下來記錄到數據庫中,並保存至二進制文件中的這臺服務器叫作複製架構中主服務器(master)。主服務器中的日誌文件叫二進制日誌。mysql

三、slave:從服務器中的日誌文件是從主服務器中複製過來的,叫作中繼日誌,主要目的是複製下來,再在本地用一遍,至關於產生一個接力的過程。linux

四、主服務器容許並行執行,主服務器上如有多個CPU,它容許多個服務器並行執行。可是咱們寫到二進制文件中,只能一條一條的寫,從服務器只能一條一條的執行。從服務器默認狀況下也只能是一個進程,讀一條執行一個,因此從服務器慢於主服務器。sql

2、MySQL主從複製實現的過程數據庫

一、主服務器的配置過程vim

1)添加系統用戶並修改權限安全

clip_p_w_picpath004[6]

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

clip_p_w_picpath006[6]

3)初始化數據庫並複製文件

clip_p_w_picpath008[6]

clip_p_w_picpath010[6]

4)修改配置文件並複製到從服務器

[root@node1 mysql]# vim /etc/my.cnf 修改配置文件內容以下:

clip_p_w_picpath012[6]

clip_p_w_picpath014[6]

clip_p_w_picpath016[6]

[root@node1 ~]# scp /etc/my.cnf node2:/etc/ 把配置文件複製到從服務器

my.cnf 100% 4746

5)啓動mysql,測試可否鏈接到mysql

clip_p_w_picpath018[6]

[root@node1 mysql]# vim /etc/profile.d/mysql.sh 爲了如下命令用起來方便,編輯配置文件

clip_p_w_picpath020[6]

[root@node1 mysql]# . /etc/profile.d/mysql.sh 執行一下腳本

clip_p_w_picpath022[6]

6)複製mysql軟件包到從服務器,而後鏈接到mysql建立用戶

clip_p_w_picpath024[6]

clip_p_w_picpath026[6]

二、配置從服務器

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)複製腳本內容並修改所需配置文件

clip_p_w_picpath028[6]

[root@node2 mysql]# vim /etc/my.cnf 修改配置文件內容以下:

clip_p_w_picpath030[6]

clip_p_w_picpath032[6]

3)啓動mysql

[root@node2 mysql]# service mysqld start

Starting MySQL.... [ OK ]

[root@node2 mysql]# vim /etc/profile.d/mysql.sh 編輯配置文件的內容以下:

clip_p_w_picpath034[6]

[root@node2 mysql]# . !$ 讀一下上面的腳本

. /etc/profile.d/mysql.sh

4)在主節點上即HA1上查看從哪一個節點開始複製

[root@node1 ~]# mysql

clip_p_w_picpath036

5)修改主服務器的一些屬性

clip_p_w_picpath038

6)查看從服務器啓動先後的狀態

clip_p_w_picpath040

mysql> start slave; 啓動從服務器

Query OK, 0 rows affected (0.00 sec)

clip_p_w_picpath042

到這裏主從複製架構依然完成。

三、主服務器上建立數據,從服務器上是否會出現

1)在主服務器鏈接到數據庫並建立數據庫

clip_p_w_picpath044

2)查看從服務器的狀態,並查看數據庫

clip_p_w_picpath046

clip_p_w_picpath048

4)讓從服務器變成只讀的

clip_p_w_picpath050

[root@node2 mysql]# vim /etc/my.cnf 修改配置文件,讓read_only = ON永久有效

clip_p_w_picpath052

5)重啓服務器,查看read_only是否啓動

clip_p_w_picpath054

(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 在主服務器上設定,用於事務安全; 】

七、有沒有這樣一個問題呢?在主服務器上某個事物已經提交了,而有些事務仍然在緩衝區內,萬一這個時候主服務器崩潰了,從服務器上可否獲得復件?如何下降主從不一致的可能性呢?應該配置主服務器同步二進制日誌。

配置主服務器同步二進制日誌

mysql> show global variables like '%log%'; 查看跟日誌相關的內容

八、咱們的從服務器啓動起來後會自動鏈接主服務器,若是主服務器崩潰了,從服務器啓動後還會自動鏈接到主服務器複製二進制日誌,通常來說不該該讓從服務器從複製線程自動啓動,怎麼讓從服務器不會自動啓動?

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

3、如何實現mysql的半同步複製

一、在主服務器和從服務器上各自安裝一個插件,這個插件是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開頭的

二、啓用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%';

到此,半同步複製就結束了。

相關文章
相關標籤/搜索