MySQL復制
MySQL的復制支持故障恢復,也頻繁用于讀操作的橫向擴展(scale out)。復制允許在出現不可避免的故障的情況下提供高可用服務。故障的原因很多,磁盤、服務器、數據中心的損耗以及人為因素等。MySQL支持冗余和備份,可以保證從故障中恢復。MySQL可以實現大量服務器的高效復制,對于讀頻繁的應用,是支持大量查詢的有效策略。
什么是復制
復制就是同步,將主節點(服務器)的所有改變復制到從節點(服務器),復制用來創建主節點的一個可靠副本。
常用復制例子:
1-創建一個主節點的備份,以避免主節點崩潰時丟失數據
2-擁有一份主節點的副本,從而在不干擾其他業務情況下執行報表和分析工作等
我們使用復制,是為了減少主節點上的負載,通過橫向擴展,實現高讀寫比。負載均衡器會將讀請求放在從節點上,而寫請求交給主節點服務器。
復制的基本步驟
1-配置Master
添加選項到my.cnf
log-bin=master-bin log-bin-index=master-bin.index server-id=1 binlog-do-db=mydatabase binlog-ignore-db=mysql
在Master上創建一個復制用戶
mysql> create user repl_user; mysql> grant replication slave on *.* to repl_user indentified by 'ya0';
2-配置Slave
添加選項到my.cnf
server-id=2 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin
3-連接Master和Slave
將Slave指向Master,讓它知道從哪里復制,需要知道Master的4個信息:
* 主機名
* 端口號
* Master上擁有 replication slave 權限的用戶賬號
* 該用戶的秘密
連接Master的Slave執行sql腳本
mysql> change master to master_host='master-1', master_port=3306, master_user='repl_user', master_password='ya0'; mysql> start slave;
克隆Slave
通常的做法從一個Slave(目前連在Master)創建新的Slave,這樣不用離線Master。
以下使用old_slave和new_slave。
1-old_slave
mysql> stop slave; mysql> show slave status\G
記錄
...
Master_Log_File: master-bin.000042
Exec_Master_Log_Pos: 141476830
...
2-new_slave
從old_slave導出數據
mysqldump -hold_slave_host -uuser -ppassword --default-character-set=utf8 mydatabases > /home/xl/mydatabase-utf8-time.sql
數據導入到new_slave
mysql> use mydatabase; mysql> source /home/xl/mydatabase-utf8-time.sql;
連接到Master
mysql> stop slave; mysql> change master to master_host='master-1', master_port=3306, master_user='repl_user', master_password='ya0', master_log_file='master-bin.000042', master_log_pos=141476830; mysql> start slave;
重啟old_slave的slave
mysql> start slave;
故障恢復
1-從節點服務器故障可以采用克隆Slave方法。
2-Slave停機處理辦法
檢查停機前位置 show slave status\G
...
Master_Log_File: master-bin.000040
Read_Master_Log_Pos: 141901565
...
Relay_Master_Log_File: master-bin.000040
Exec_Master_Log_Pos: 141901565
...
調查問題,并且如果需要,在數據庫中刪除幾行。
mysql> stop slave; mysql> set sql_slave_skip_counter=1; mysql> start slave;