MySQL復制

jopen 10年前發布 | 14K 次閱讀 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;

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!