天天看點

mysql主從複制 ack_Mysql主從複制(Replication)

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

故障解決,可參考博友的相關文章