MySQL的異步復制和半同步復制

SHFFlorenci 9年前發布 | 17K 次閱讀 MySQL 數據庫服務器

實驗拓撲

MySQL主從復制

主機名 主機地址 角色
node1 192.168.2.201 Master
node2 192.168.2.202 Slave
node3 192.168.2.203 Slave

本文使用CentOS7.1,數據庫:MariaDB-5.5.50
注意:本文關閉了selinux,以及iptables。

一、異步復制:

相關知識點:

  • MySQL的異步復制是MySQL自帶的數據同步功能,在公司里面也是也就最為常見的。
  • Master服務器中需要開啟二進制日志 binlog ,從服務器需要開啟中繼日志 relay-log 。
  • 二進制日志 binlog 的主要功能是:記錄令數據庫內容產生改變的語句,如 insert 語句;二進制日志在備份還原的時候至關重要。
  • 中繼日志 relay-log 則是從服務器中開啟,作用是從主服務器的二進制日志中復制,并在在從服務器本地執行一次,達到與主服務器內容一致的效果。
  • 一般MySQL復制是放在內網中進行的,因為MySQL的同步并沒有進行加密。而且相比較于在公網傳輸,在內網中丟包的概率較低,帶寬也高。

Master節點:Node1

(1) 啟動二進制日志;
    [mysqld]
    log_bin=mysql-bin
(2) 為當前節點設置一個全局唯一的ID號;
    [mysqld]
    server_id=1
(3) 授權創建僅有復制權限的用戶賬號;
    mysql> GRANT REPLCATION SLAVE, REPLICATION CLIENT ON . TO 'repuser'@'192.168.2.%' IDENTIFIED BY 'repuser';

(4)查看Master端的二進制日志記錄到哪里,用于決定Slave復制的起始位置 MariaDB [(none)]> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | Master-log.000001 | 245 | | | +-------------------+----------+--------------+------------------+

 #Slave服務器如果是一個空的數據庫而主服務器不為空:
 #在同步之前可以先用Master的全量備份,恢復到Slave數據庫中。
 #然后再從備份那一刻記錄的Position開始復制。
 #假設Master和Slave都為空,上面的情況就表示Slave從二進制日志Master-log.000001的245開始復制</code></pre> 

從節點:Node2設置

(1) 啟動中繼日志;
    [mysqld]
    relay_log=relay-log
    relay_log_index=relay-log.index
(2) 為當前節點設置一個全局惟的ID號;
    [mysqld]
    server_id=2
    #node3把這里改為3
(3) Slave服務器打開只讀模式;
    [mysqld]
    read_only = 1
(4) 使用有復制權限的用戶賬號連接至主服務器,并啟動復制線程;
     #注意:上面的是在/etc/my.cnf的配置文件中添加,下面mysql>的則是在mysql服務器中運行的命令
    mysql> CHANGE MASTER TO 
    MASTER_HOST='192.168.2.201', 
    MASTER_USER='repuser', 
    MASTER_PASSWORD='repuser', 
    MASTER_LOG_FILE='Master-log.000001', 
    MASTER_LOG_POS=245;

(5)在從服務器中開啟復制線程
   mysql> START SLAVE;

查看從服務器的狀態信息

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.201
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: Master-log.000003
          Read_Master_Log_Pos: 1379
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 1414
        Relay_Master_Log_File: Master-log.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1379
              Relay_Log_Space: 1702
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
1 row in set (0.00 sec)

插入幾條命令之后,從以上的狀態信息中可以看得到我們的Master服務器是192.168.2.201
擁有復制功能的賬號是repuser,現在復制到Master-log.000003的Position 1379這個位置;
上面的輸出結果中,我在復制完成之后使用了flush logs手動地滾動了二進制日志,所以二進制去到000003

二、半同步復制

相關知識點:

  • 半同步復制是由谷歌研發的一種數據庫主從復制方式。
  • 與傳統的異步復制相比,半同步復制在多個Slave節點中會選取一個節點進行半同步復制。也就是說,當Master提交一個事務的時候,在這個半同步復制的Slave端返回一個同步完成的Ack包之后,服務器才會向用戶返回事務提交成功,而其他的節點則是采用傳統的異步復制方式進行同步。
  • 半同步是復制是基于異步復制之上進行的,也就是說配置半同步復制之前需要先配置到異步復制。
  • 半同步復制可以保證在主節點發生故障的時候,總有一個節點的數據與主節點一樣。這樣在進行切換的時候,可以更加快速地把這個Slave節點設置成主節點來使用。

    Master節點:Node1

    由于上面已經進行了異步復制的配置,下面僅進行半同步復制的操作。
    (1)Master安裝插件并修改變量:
    mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    插件的文件名字和路徑一般在rpm -ql mariadb-server那里查看。
    這個插件的庫文件是安裝好之后就直接有的,只是沒有默認安裝。
    (2)啟用選項
    mysql> SET GLOBAL VARIABLES rpl_semi_sync_master_enabled=1;

Slave節點:Node2

(1)slave安裝插件并修改變量:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL VARIABLES rpl_semi_sync_slave_enabled=1;

這里需要注意的是,node1作為主節點使用的是master模塊。node2,node3作為從節點使用slave模塊

(2)查看半同步復制的全局變量

mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+

設置rpl_semi_sync_master_enabled=1的效果
第一行是ON則表示半同步復制已經開啟。

(3)查看半同步復制的全局變量

mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 645   |
| Rpl_semi_sync_master_net_wait_time         | 645   |
| Rpl_semi_sync_master_net_waits             | 1     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 5     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 783   |
| Rpl_semi_sync_master_tx_wait_time          | 783   |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+

第一行Rpl_semi_sync_master_clients顯示1,表示有一臺主機是半同步復制的狀態。

最后需要說明的是,semi復制的MySQL5.7中性能有明顯的改善。

假如真的需要使用半同步復制,建議使用5.7的版本。

下一篇文章,我們將會講怎么使用MHA配合半同步復制高可用MariaDB

 

來自:http://www.jianshu.com/p/d877cbe9f0f0

 

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