負載均衡mysql集群實現數據同步


負載均衡mysql集群實現數據同步

大家都知道當網站的訪問並發量比較高的時候,一般的公司都采用lvs負載均衡,mysql讀寫分離,集群等方式降低服務器壓力,數據庫讀寫壓力,假設公司采用了mysql集群,此時就會有數據同步的問題,我們怎么實現mysql集群的數據同步呢?

mysql四種常見日志類型

  1. errot log 錯誤日志
  2. general query log 查詢日志
  3. slow query log 慢查詢日志
  4. binary log 二進制日志

其中第四種binary log,主要記錄了mysql數據更改記錄,就是我們將要用來實現主從復制的條件。

通過 binary log 實現數據同步

我們已經知道mysql的binary log會記錄數據更改的sql,我們只要做到在多台服務器中監聽這個日志變化,主動讀取binary log,將binary log內容轉成本身的relay log,然后自身通過relay log實現數據的同步改動即可實現數據同步。現在讓我們看下具體原理和操作:

mysql數據復制原理

主要是mysql的三個線程的分工合作。

  1. binlog線程:記錄所有涉及到mysql數據變化的sql語句,將sql語句寫入binlog中。
  2. io線程:當我們開啟slave之后,slave服務器就監聽從master服務器獲取binlog內容,將獲取的數據放進自己的relay log。
  3. sql執行線程:執行relay log里的sql語句,完成數據同步。
mysql主主服務器架構數據同步

顧名思義,mysql主主服務器指的就是mysql集群,mysql多台服務器同時對外提供完整的增刪改查服務,此時我們只需要讓這多台mysql服務器互相監聽binary log變化,同步到自己的mysql服務器即可實現數據同步。
假設我們的主主服務器有兩台:

# 第一步、my.cnf 修改以下配置
# server1 
server-id=1
log-bin=mysql-bin
binlog-format=mixed
relay-log=mysql-relay

# server2
server-id=2
log-bin=mysql-bin
binlog-format=mixed
relay-log=mysql-relay

# 第二步、建立mysql的監聽賬號
# server1
grant replication client,replication slave on *.* to 'user'@'server1 ip' identified by '密碼';

# server2
grant replication client,replication slave on *.* to 'user'@'server2 ip' identified by '密碼';

# 第三步、實現binary log監聽
# master_log_file 和 master_log_pos 用來確定slave的io線程下次開始執行時從master開始讀取的位置坐標
# server1
change master to master_host='server1 ip',master_user='用戶名',master_password='用戶名@密碼',master_log_file='mysql-bin.000001',master_log_pos=746;

# server2
change master to master_host='server2 ip',master_user='用戶名',master_password='用戶名@密碼',master_log_file='mysql-bin.000001',master_log_pos=746;

# 查看監聽狀態 並且啟動 slave
show slave status \G
start slave

到這里,我們的mysql主主服務器數據同步就完成了。

mysql集群常見問題

  1. 主主復制自增主鍵沖突
    通過以上介紹我們知道mysql主主復制時,多台mysql同時提供服務,如果我們表中含有自增主鍵,此時我們就會遇見server1寫入了,但是binary log還沒同步到server2,此時server2也寫入了數據。自增主鍵相同,當binary log同步的時候,就會產生沖突。
    那么如何解決呢?可以通過修改 mysql的my.cnf 配置文件。
server-id=11   #任意自然數n,只要保證兩台MySQL主機不重復就可以了。
log-bin=mysql-bin   #開啟二進制日志
auto_increment_increment=2   #步進值auto_imcrement。一般有n台主MySQL就填n
auto_increment_offset=1   #起始值。一般填第n台主MySQL。此時為第一台主MySQL
...

通過以上配置,每一台mysql自增的步長就會不同,如此便可以解決自增主鍵沖突問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM