天天看點

MySQL資料庫主從同步實作使用RDS不得不知的注意事項MySQL資料庫的主從同步實作及應用

mysql 是全球最受歡迎的開源資料庫,作為開源軟體組合 lamp(linux + apache + mysql + perl/php/python)中的重要一環,廣泛應用于各類應用。web2.0 時代,風靡全網的社群論壇軟體系統 discuz 和部落格平台 wordpress 均基于 mysql 實作底層架構。web3.0 時代,阿裡巴巴、facebook、google 等大型網際網路公司都采用更為靈活的 mysql 建構了成熟的大規模資料庫叢集。阿裡雲資料庫 mysql 版基于 alibaba 的 mysql 源碼分支,經過雙 11 高并發、大資料量的考驗,擁有優良的性能和吞吐量。除此之外,阿裡雲資料庫 mysql 版還擁有經過優化的讀寫分離、資料壓縮、智能調優等進階功能。

讀寫分離(read/write splitting)讓主資料庫處理事務性增、改、删操作(insert、update、delete),從資料庫處理select查詢操作,在大規模高并發的系統中,讀寫分離是提高性能很重要的手段。讀寫分離實作的基礎就是mysql的主從同步,是以對于主從同步的管理也就顯得非常重要。

<b>rds for mysql資料同步模式:</b>

rds for mysql 5.1主備之間的資料同步采用的是異步的模式,異步模式下性能高,但是缺點是有一定的機率會出現主備之間資料不一緻。

rds for mysql 5.5主備之間資料同步采用的是半同步的模式,該模式下寫性能會有下降,但是優點是主備資料不一緻的機率極大的降低了。如果您對資料可靠性要求非常高(比如金融系統),則建議您購買5.5以上(含)版本的rds for mysql。

rds for mysql 5.6主備之間資料同步采用的是mysql 5.6的新特性gtid,該特性即能保證性能,又能保證主備資料一緻。

<b>mysql主從同步的作用:</b>

1.資料分布

2.負載平衡(load balancing)

3.備份(copy)

4.高可用性(high availability)和容錯

<b>主從同步的詳細過程如下:</b>

1. 主伺服器驗證連接配接。

2. 主伺服器為從伺服器開啟一個線程。

3. 從伺服器将主伺服器日志的偏移位告訴主伺服器。

4. 主伺服器檢查該值是否小于目前二進制日志偏移位。

5. 如果小于,則通知從伺服器來取資料。

6. 從伺服器持續從主伺服器取資料,直至取完,這時,從伺服器線程進入睡眠,主伺服器線程同時進入睡眠。

7. 當主伺服器有更新時,主伺服器線程被激活,并将二進制日志推送給從伺服器,并通知從伺服器線程進入工作狀态。

8. 從伺服器sql線程執行二進制日志,随後進入睡眠狀态。

<b>mysql主從同步的搭建過程:</b>

(1)主從同步環境介紹

作業系統環境:centos 64 bit

mysql版本:mysql 5.1

主伺服器的ip:192.168.106.1

從伺服器的ip:192.168.106.2

(2)在主伺服器上建立同步帳号

在設定權限的時候不要将密碼設定過于簡單:

1

2

grant replication slave,file on *.* to 'replication'@'192.168.106.%' identified by 'mysqlpassword';

flush privileges;  

(3)從伺服器配置檔案的更改

server-id = 2

replicate-wild-ignore-table=mysql.%

log-slave-updates #這個有需要可以開啟

(4)從主伺服器得到一個快照版本

如果你的是myisam或者既有myisam又有innodb的話就在主伺服器上使用如下指令導出伺服器的一個快照:

mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases test &gt; db.sql

隻有innodb的話就是用如下指令:

mysqldump -uroot -p --single-transaction --events --triggers --routines --flush-logs --master-data=2 --databases test &gt; db.sql

<b>這裡需要注意幾個參數的使用:</b>

--single-transaction 這個參數隻對innodb适用。

--databases 後面跟除mysql以後的其他所有資料庫的庫名,我這裡隻有一個test庫。

--master-data 參數會記錄導出快照時候的mysql二進制日志位置,一會會用到。

(5)将快照版本還原到從伺服器上

mysqldump -uroot -p -h 192.168.106.2 test &lt; db.sql

将快照版本還原到從伺服器上以後,此時從伺服器上的資料和主伺服器的資料是一緻的。

(6)在從伺服器上使用change master從主伺服器上同步

使用grep指令查找到二進制日志的名稱以及位置

# grep -i "change master" db.sql

-- change master to master_log_file='mysql-bin.000006', master_log_pos=106;

<b>生成change master語句,然後在從上執行</b>

stop slave; 

change  master  to

master_host='192.168.106.1',master_user='replication',master_password='123456',master_log_file='mysql-bin.000006',

master_log_pos=106;

start slave;

(7)這樣就完成了主從同步的搭建,最後使用

show slave status;

檢視slave_io_running和slave_sql_running的狀态,如果都為yes,那麼就成功了。

<b>注意:不要将同步的資訊寫入配置檔案中,這樣不友善管理,尤其是有變動需要重新開機。</b>

<b>參考:</b>