Mysql主從複制(Replication)
主從複制的原理:
分為同步複制和異步複制,實際複制架構中大部分為異步複制。
複制的基本過程如下: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端真實執行時候的那些可執行的内容,并在自身執行。
Mysql為了解決這個風險并提高複制的性能,将Slave端的複制改為兩個程序來完成。提出這個改進方案的人是Yahoo!的一位工程師“Jeremy Zawodny”。這樣既解決了性能問題,又縮短了異步的延時時間,同時也減少了可能存在的資料丢失量。當然,即使是換成了現在這樣兩個線程處理以後,同樣也還是存在slave資料延時以及資料丢失的可能性的,畢竟這個複制是異步的。隻要資料的更改不是在一個事物中,這些問題都是會存在的。如果要完全避免這些問題,就隻能用mysql的cluster來解決了。不過mysql的cluster是記憶體資料庫的解決方案,需要将所有資料都load到記憶體中,這樣就對記憶體的要求就非常大了,對于一般的應用來說可實施性不是太大。
複制常用架構Mysql複制環境90%以上都是一個Master帶一個或者多個Slave的架構模式,主要用于讀壓力比較大的應用的資料庫端廉價擴充解決方案。因為隻要master和slave的壓力不是太大(尤其是slave端壓力)的話,異步複制的延時一般都很少很少。尤其是自slave端的複制方式改成兩個程序處理之後,更是減小了slave端的延時。而帶來的效益是,對于資料實時性要求不是特别的敏感度的應用,隻需要通過廉價的pc server來擴充slave的數量,将讀壓力分散到多台slave的機器上面,即可解決資料庫端的讀壓力瓶頸。這在很大程度上解決了目前很多中小型網站的資料庫壓力瓶頸問題,甚至有些大型網站也在使用類似方案解決資料庫瓶頸。
Mysql主從複制配置過程:
環境:master: 192.168.0.3
Slave: 192.168.0.4
Mysql版本為5.0.67(編譯安裝)
database: eric
1.Master伺服器啟動mysql,
a)#mysql –uroot –proot
b)建立一個有複制權限的使用者,隻限slave遠端連接配接通路.
i.mysql>grant replication slave on *.* [email protected] by ‘password’;
ii.mysql>flush privileges;
c)mysql>flush tables with read lock; #鎖定master伺服器所有表的寫入。
d)重新打開一終端,備份要複制的資料庫。
i.Var]#tar zcvf eric.tar.gz eric///eric所在路徑/opt/mysql/var/eric/即一個庫。
ii.]#scp eric.tar.gz 192.168.0.4:/opt/mysql/var///将主伺服器的庫傳到slave相應路徑下。
e)傳回上一終端。
i.Mysql>show master status;
+------------------+----------+--------------+------------------+
| File| Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000014 |98 | eric||
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)
其中mysql-bin.000014和98二個值将是slave與master的同步點。
f)給資料庫解鎖(當備份完成後)mysql>unlock tables;
g)編輯mysql的配置檔案。Vim /etc/my.cnf設定這三個參數,沒有的添加,有的直接更改即可。
log-bin=mysql-bin
server-id= 1
binlog-do-db=eric
儲存退出。
2.Slave伺服器配置
a)将從master中備份的庫解壓到相應路徑下(退庫的導入)
i.Var]#tar zxvf eric.tar.gz ./
b)修改my.cnf
server-id=2
master-host=192.168.0.3
master-user= replication
master-password= password
log-bin=
3.重新開機master, slave的mysql服務
a)注意順序,先重新開機master-à然後是slave.
b)Slave伺服器重新開機後,登入mysql
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to
-> master_host='192.168.0.3',
-> master_user='replication',
-> master_password='password',
-> master_log_file='mysql-bin.000014',
-> master_log_pos=98;
Query OK, 0 rows affected (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.3
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000014
Read_Master_Log_Pos: 98
Relay_Log_File: alan-relay-bin.000002
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000014
Slave_IO_Running: Yes
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: 98
Relay_Log_Space: 235
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
1 row in set (0.01 sec)
ERROR: No query specified
當這個參數都為yes時,證明主從複制成功
Slave_IO_Running: Yes Slave_SQL_Running: Yes
故障解決,可參考博友的相關文章