負載均衡mysql集群實現數據同步
大家都知道當網站的訪問並發量比較高的時候,一般的公司都采用lvs負載均衡,mysql讀寫分離,集群等方式降低服務器壓力,數據庫讀寫壓力,假設公司采用了mysql集群,此時就會有數據同步的問題,我們怎么實現mysql集群的數據同步呢?
mysql四種常見日志類型
- errot log 錯誤日志
- general query log 查詢日志
- slow query log 慢查詢日志
- binary log 二進制日志
其中第四種binary log,主要記錄了mysql數據更改記錄,就是我們將要用來實現主從復制的條件。
通過 binary log 實現數據同步
我們已經知道mysql的binary log會記錄數據更改的sql,我們只要做到在多台服務器中監聽這個日志變化,主動讀取binary log,將binary log內容轉成本身的relay log,然后自身通過relay log實現數據的同步改動即可實現數據同步。現在讓我們看下具體原理和操作:
mysql數據復制原理
主要是mysql的三個線程的分工合作。
- binlog線程:記錄所有涉及到mysql數據變化的sql語句,將sql語句寫入binlog中。
- io線程:當我們開啟slave之后,slave服務器就監聽從master服務器獲取binlog內容,將獲取的數據放進自己的relay log。
- 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集群常見問題
- 主主復制自增主鍵沖突
通過以上介紹我們知道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自增的步長就會不同,如此便可以解決自增主鍵沖突問題。