1. 程式人生 > >實現MySQL半同步架構

實現MySQL半同步架構

MySQL半同步架構

默認情況下,MySQL的復制功能是異步的,異步復制可以提 供最佳的性能,主庫把binlog日誌發送給從庫即結束,並不驗 證從庫是否接收完畢。這意味著當主服務器或從服務器端發生 故障時,有可能從服務器沒有接收到主服務器發送過來的 binlog日誌,這就會造成主服務器和從服務器的數據不一致, 甚至在恢復時造成數據的丟失。
而半同步架構就是什麽工作機制呢?當用戶寫數據時master服務器會馬上把數據復制到一臺slave服務器上,才會提示用戶寫入成功。而後再慢慢把數據復制到其他的slave服務器上,這樣的好處就是可以提高數據安全性,和容錯性

實現方法:

一,配置master服務器

1,修改主配置文件

    vim /etc/my.cnf
      在[mysql]配置塊下添加如下兩行配置
       [mysql]
       log_bin          #開啟二進制日誌功能
       server_id=1      #為當前節點設置一個全局惟一的ID號 
       innodb_file_per_table #數據於表結構分離,存放在兩個不同文件

2,重啟mysql服務,使配置生效

    systemctl restart mairadb

3,創建有復制權限的用戶賬號

    登入mysql終端執行

    GRANT REPLICATION SLAVE  ON *.* TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘; 

    命令解析:
        ‘repluser‘@‘HOST‘ :設置用戶名即主機ip或網段,網段用%表示 例如10.0.0.%
        IDENTIFIED BY:設置密碼
        *.* :表示所有數據庫,所有表
        GRANT REPLCATION SLAVE:就是允許該用戶復制數據

    該命令作用就是授權repluser能拷貝數據庫的所有內容

4,在master裝一個插件"semisync_master.so",這個插件mariadb默認就有

    登入mysql終端執行

    1,安裝插件
    INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘; 
    2,加載插件
    SET GLOBAL VARIABLES rpl_semi_sync_master_enabled=1; 
        3,查看狀態
         SHOW GLOBAL VARIABLES LIKE ‘%semi%‘;

        rpl_semi_sync_master_enabled             ON     #NO表示開啟半同步功能,OFF表示關閉
        rpl_semi_sync_master_timeout             10000 #超時時間微秒為單位
        rpl_semi_sync_master_trace_level        32    
        rpl_semi_sync_master_wait_no_slave   ON    

二,作為半同步的slave配置

1,修改配置文件

    vim /etc/my.cnf
        在[mysql]配置塊中添加如下兩行配置
            [mysqld]   
            server_id=3     #為當前節點設置一個全局惟一的ID號
            read_only=ON #限制從服務器為只讀."註意:此限制對擁有SUPER權限的用戶均無效"
            innodb_file_per_table #數據於表結構分離,存放在兩個不同文件

2,重啟mysql服務,使配置生效

    systemctl restart mariadb

3,登入mysql終端安裝插件"semisync_slave.so"

    1,安裝插件
     INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘; 
    2,加載插件
    SET GLOBAL  rpl_semi_sync_slave_enabled=1; 
        3,查看狀態
            SHOW GLOBAL VARIABLES LIKE ‘%semi%‘;
             rpl_semi_sync_slave_enabled        ON  
             rpl_semi_sync_slave_trace_level    32   

3,使用有復制權限的用戶賬號連接至主服務器,並啟動復制線程

    CHANGE MASTER TO 
         MASTER_HOST=‘master_host‘,        #指定中繼master主機IP
         MASTER_USER=‘repluser‘,    #指定master被授權的用戶名
         MASTER_PASSWORD=‘replpass‘,#指定被master授權的用戶密碼 MASTER_LOG_FILE=‘mysql-bin.xxxxx‘, #指定master服務器的哪個二進制日誌開始復制
         MASTER_LOG_POS=#;          #二進制日誌位置,可以在master服務器上執行該命令查看,show master logs;

         啟動復制線程IO_THREAD和SQL_THREAD
         START SLAVE; 

4,查看slave服務器線程狀態

    MariaDB [(none)]> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.68.17
                      Master_User: repluser
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mariadb-bin.000001
              Read_Master_Log_Pos: 557
                   Relay_Log_File: mariadb-relay-bin.000002
                    Relay_Log_Pos: 843
            Relay_Master_Log_File: mariadb-bin.000001
                 Slave_IO_Running: Yes  "重點關註如果是NO表示線程沒起來"
                Slave_SQL_Running: Yes "重點關註 如果是NO表示該線程沒起來"
                  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: 557
                  Relay_Log_Space: 1139
                  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 "該項表示同步時間 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

總結:

半同步與主從架構基本相似就是就差在一個插件上

實現MySQL半同步架構