mysql主從復(fù)制架構(gòu)及實現(xiàn)

MySQL復(fù)制:

  • 擴(kuò)展方式:
    • Scale up场勤,向上擴(kuò)展鹰椒;使用更好更高級性能的硬件稍途;
    • Scale Out劫瞳,向外擴(kuò)展倘潜;增加更多的主機(jī)
  • MySQL的擴(kuò)展:
    • 復(fù)制:復(fù)制是mysql向外擴(kuò)展的解決方案,每個節(jié)點都有相同的數(shù)據(jù)集志于;結(jié)構(gòu)通常是主從復(fù)制結(jié)構(gòu)涮因;工作方式就是讓從節(jié)點通過向主節(jié)點請求二進(jìn)制日志中的事件于本地,并執(zhí)行replay完成伺绽;復(fù)制默認(rèn)是單向進(jìn)行的养泡;
    • 主從復(fù)制:mysql的從節(jié)點不接收任何修改操作的請求,而僅僅把自己扮演成客戶端奈应,向主服務(wù)器請求主服務(wù)器上所有的數(shù)據(jù)修改澜掩,并在本地replay一遍,從而實現(xiàn)跟主服務(wù)器一模一樣的數(shù)據(jù)集杖挣;在這個數(shù)據(jù)集上可以接受其他用戶的讀請求肩榕;但不接收寫請求,這就叫做mysql的主從復(fù)制惩妇;
  • 為什么要做mysql復(fù)制株汉?完成數(shù)據(jù)分布的目的;例如歌殃,更多用戶查詢乔妈;
    • 冗余:既然能完成冗余就能提升高可用性能,可寫腳本檢測主從節(jié)點當(dāng)中挺份,主節(jié)點的可靠性褒翰,一旦發(fā)現(xiàn)主節(jié)點故障,將主節(jié)點下線匀泊,自動提升從節(jié)點為主節(jié)點,所以就完成了故障切換朵你,從而實現(xiàn)高可用功能各聘;
      市面有很多實現(xiàn)高可用解決方案,就是通過這種方式實現(xiàn)的抡医;
    • 負(fù)載均衡:主節(jié)點接受所有的寫操作躲因,并且把寫操作又同步給從節(jié)點一份早敬,所以,從節(jié)點也必須要完成同樣多的寫操作大脉;因此搞监,只能負(fù)載均衡讀請求;
    • 支援安全的備份操作:當(dāng)主節(jié)點掛了镰矿,從節(jié)點迅速提升為主節(jié)點琐驴;這是一種冗余功能;復(fù)制還能幫助完成備份秤标;數(shù)據(jù)做冷備是最可靠的绝淡,冷備不可能在線上做但是最可靠的;而有了復(fù)制結(jié)構(gòu)以后苍姜,可以給主服務(wù)器配置一個從節(jié)點牢酵,當(dāng)需要做備份時,只需將從節(jié)點從主復(fù)制上給它下線衙猪,停止服務(wù)馍乙,然后直接復(fù)制數(shù)據(jù)副本就ok了;輔助完成備份的垫释;
    • 測試:通過備份的方式潘拨,把數(shù)據(jù)放到新版的msyql服務(wù)器上測試;

MySQL主從復(fù)制

mysql主從復(fù)制.png
工作模式:

主節(jié)點(master)必須啟用二進(jìn)制日志饶号,所有的寫操作除了保存在數(shù)據(jù)中一份之外铁追,還會在本地的二進(jìn)制日志中將能夠修改數(shù)據(jù)或潛在有可能修改數(shù)據(jù)的語句記錄在二進(jìn)制日志文件中一份;
從節(jié)點(slave)啟動一個專門的線程茫船,把自己扮演成mysql客戶端琅束,通過mysql協(xié)議向mysql服務(wù)器請求讀取對方二進(jìn)制日志中的事件,服務(wù)器端會檢查自己二進(jìn)制日志中的事件跟對方請求的位置(對方會指明請求二進(jìn)制日志中的事件)算谈,于是服務(wù)器會從自己的二進(jìn)制日志中根據(jù)請求者指定的位置涩禀,如果請求者不能指定就從第一個文件的最開始處開始,把一個個事件發(fā)送給從節(jié)點然眼。
從節(jié)點收到后艾船,每讀到一個事件,先保存在中繼日志中高每,保存完成后還會用一個文件記錄已經(jīng)讀到了主節(jié)點哪個二進(jìn)制日志的哪個位置屿岂,索引下次請求時,就會告訴主節(jié)點自己讀到哪個位置了鲸匿,從該位置之后是否產(chǎn)生新事件爷怀,如果有,主節(jié)點又會繼續(xù)發(fā)送事件給從節(jié)點带欢。
從節(jié)點不斷的向主節(jié)點發(fā)送這種請求运授,讓主節(jié)點檢索有沒有新事件烤惊,如果有的話,主節(jié)點需要啟動一個叫做mysqldump線程吁朦,dump它能夠從二進(jìn)制日志文件中柒室,把事件讀出來,并響應(yīng)給從節(jié)點逗宜;
從節(jié)點得到事件后保存在中繼日志中雄右,目的是在本地replay一遍,因此锦溪,在本地還要啟動一個叫sql thread 的線程不脯,負(fù)責(zé)從中級日志中讀一個事件然后在本地執(zhí)行一遍,最終數(shù)據(jù)就保存在數(shù)據(jù)文件中刻诊;而負(fù)責(zé)從節(jié)點向主節(jié)點請求數(shù)據(jù)的線程叫做IO thread防楷。

主從架構(gòu)類型:
  • 異步復(fù)制:主節(jié)點收到寫操作后,只需要保證本地寫入完成则涯,那么就立即返回給客戶端寫入操作完成复局,不用等待從服務(wù)器反饋寫入完成并在本地重放完成。
  • 半同步復(fù)制:一個主節(jié)點有多個從節(jié)點粟判,主節(jié)點接收到請求以后亿昏,要至少等待一個從節(jié)點同步完成并告訴主節(jié)點數(shù)據(jù)存儲完成,主節(jié)點才返回客戶端結(jié)果档礁,但從節(jié)點可有n個角钩,給余的從節(jié)點異步;一旦主節(jié)點掉線呻澜,至少能夠有一個從節(jié)點數(shù)據(jù)是完整的
  • 一主多從
  • 一主一從
  • 級聯(lián)復(fù)制:一個節(jié)點首先是主節(jié)點的從递礼,同時又是其它節(jié)點的主:
  • 循環(huán)復(fù)制:每一個服務(wù)器都是下家的主服務(wù)器同時又是上家的從服務(wù)器;
  • 雙柱復(fù)制
  • 一從多主: 每個主服務(wù)器提供不同的數(shù)據(jù)庫
主從復(fù)制的落后原因:

事實上落后也有很大的好處羹幸,有時甚至需要專門落后一些時間脊髓;例如,一不小心刪除了數(shù)據(jù)庫栅受,這樣将硝,從服務(wù)器落后主服務(wù)器就不用擔(dān)心,趕緊斷開從服務(wù)器屏镊,所有數(shù)據(jù)仍然不受影響依疼,把從服務(wù)器切換為線上的主節(jié)點就OK了;
所以在有些場景中有意讓專門一臺從服務(wù)器落后與主服務(wù)器一段時間闸衫;

對非常繁忙的主節(jié)點涛贯,由于主節(jié)點事務(wù)是可以并行的,就意味著很多事務(wù)是并行提交的蔚出,對數(shù)據(jù)庫本身沒什么問題弟翘,因為本地有內(nèi)存,本地數(shù)據(jù)文件有可能是分散的骄酗,因為本地還有可能有多個數(shù)據(jù)庫稀余,所以IO可以分散出去;但是趋翻,無論有多少本地事務(wù)提交的操作睛琳,有多少個寫語句,這些寫語句只能一個一個寫進(jìn)二進(jìn)制日志中踏烙;從這個角度認(rèn)為师骗,一個非常繁忙的主節(jié)點必然的其本地的執(zhí)行速度要快于往二進(jìn)制日志中寫入的速度;這樣就可認(rèn)為從節(jié)點在復(fù)制的過程就更慢了讨惩,因此辟癌,這種落后也是必然的;有時從節(jié)點落后于主節(jié)點一兩個小時都很常見荐捻;

主從配置過程:

(1) 時間同步黍少;
(2)復(fù)制的開始位置;
從0開始处面;
從備份中恢復(fù)從節(jié)點后啟動的復(fù)制厂置,復(fù)制的起始點是備份操作時主節(jié)點所處的日志文件及其事件位置
(3) 中從服務(wù)器mysqld程序版本
從服務(wù)器版本號可以高于主的版本號
(4) 主節(jié)點配置

在mysql配置文件中添加:
[mysqld]
log_bin=mysql-bin    #開啟二進(jìn)制日志
server_id=#       #為當(dāng)前節(jié)點設(shè)置一個全局唯一的ID號

啟動服務(wù)并創(chuàng)建有復(fù)雜權(quán)限的用戶賬號:
需要有`REPLICATION SLAVE, REPLICATION CLIENT `兩種權(quán)限


mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'USERNAME'@'HOST' IDENTIFIED BY 'PASSWORD';
mysql> FLUSH PRIVILEGES;

(5) 從節(jié)點配置

配置文件my.cnf
[mysqld]
server_id=#
relay_log=relay_log
read_only=ON

啟動服務(wù):
mysql> CHANGE MASTER TO MASTER_HOST='HOST',MASTER_USER='USERNAME',MASTER_PASSWORD='PASSWORD',MASTER_LOG_FILE='BINLOG',MASTER_LOG_POS=#;
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
mysql> SHOW SLAVE STATUS;

練習(xí):基于SSL復(fù)制的實現(xiàn)示例:

啟用ssl功能可以參考:http://www.reibang.com/p/eb9d4ab3991e 最后一個練習(xí)

此處創(chuàng)建CA server端ssl不在贅述,直接創(chuàng)建client的ssl開始
CA服務(wù)和mysql的主節(jié)點安裝在192.168.43.13
從節(jié)點為192.168.43.14
在主節(jié)點創(chuàng)建從節(jié)點ssl認(rèn)證所需的key:
[root@node3 ~]# cd /var/lib/mysql/.ssl
[root@node3 .ssl]# (umask 077;openssl genrsa -out client.key 2048)
[root@node3 .ssl]# openssl req -new -key client.key -out client.crt -days 365
[root@node3 .ssl]# openssl ca -in client.crt -out client.pem -days 365
[root@node3 .ssl]# openssl rsa -in client.key -out client-key.pem
[root@node3 .ssl]# scp client* root@192.168.43.14:/var/lib/mysql/.ssl/

[root@node3 .ssl]# mysql   
登錄mysql并創(chuàng)建基于ssl的具有復(fù)制權(quán)限的用戶和密碼
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'inspur'@'192.168.43.%' IDENTIFIED BY 'inspur' REQUIRE SSL;
MariaDB [(none)]> FLUSH PRIVILEGES;

在從節(jié)點登錄測試:
[root@node4 .ssl]# mysql --ssl-cert=/var/lib/mysql/.ssl/client.pem --ssl-key=/var/lib/mysql/.ssl/client-key.pem -uinspur -h192.168.43.13 -pinspur
配置從節(jié)點配置文件
[root@node4 .ssl]# vim /etc/my.cnf
    ssl     
    ssl_cert=/var/lib/mysql/.ssl/client.pem
    ssl_key=/var/lib/mysql/.ssl/client-key.pem
[root@node4 .ssl]# systemctl start mariadb.service
[root@node4 .ssl]# mysql 
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.43.13',MASTER_USER='inspur',MASTER_PASSWORD='inspur',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=245,MASTER_SSL=1,MASTER_SSL_CERT='/var/lib/mysql/.ssl/client.pem',MASTER_SSL_KEY='/var/lib/mysql/.ssl/client-key.pem';
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.43.13
                  Master_User: inspur
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 409
               Relay_Log_File: relay-log.000004
                Relay_Log_Pos: 693
        Relay_Master_Log_File: mysql-bin.000005
             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: 409
              Relay_Log_Space: 1873
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /etc/pki/CA/cacert.pem
           Master_SSL_CA_Path: 
              Master_SSL_Cert: /var/lib/mysql/.ssl/client.pem
            Master_SSL_Cipher: 
               Master_SSL_Key: /var/lib/mysql/.ssl/client-key.pem
        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)

ERROR: No query specified

主主復(fù)制:

  • 互為主從:兩個節(jié)點各自都要開啟binlog和relay log;
    (1) 數(shù)據(jù)不一致魂角;因此昵济,慎用;無論主從還是主主野揪,只能選擇一個并備份出來访忿,刪除另一個;
    (2) 自動增長id囱挑;

    • 定義一個節(jié)點使用奇數(shù)id
      auto_increment_offset=1
      auto_increment_increment=2
    • 另一個節(jié)點使用偶數(shù)id:
      auto_increment_offset=2
      auto_increment_increment=2
  • 配置步驟:

    • (1) 各節(jié)點使用唯一的server_id醉顽;
    • (2) 都啟動binary log和relay log;
    • (3) 創(chuàng)建擁有復(fù)制權(quán)限的用戶賬號平挑;
    • (4) 定義自動增長id字段的數(shù)值范圍為奇偶游添;
    • (5) 均把對方指定為主節(jié)點,并啟動復(fù)制線程通熄;
  • 復(fù)制時應(yīng)該注意的問題:

    •   1唆涝、從服務(wù)設(shè)定為“只讀”;
        在從服務(wù)器啟動read_only唇辨,但僅對非SUPER權(quán)限的用戶有效廊酣;          
        阻止所有用戶:
            `mysql> FLUSH TABLES WITH READ LOCK;    `           
      
    •   2、盡量確保復(fù)制時的事務(wù)安全
        在master節(jié)點啟用參數(shù):
            `sync_binlog = ON `:當(dāng)遇到事務(wù)提交時赏枚,必須將binlog緩沖區(qū)中(內(nèi)存中)記錄的事件立即刷新到磁盤上的二進(jìn)制日志文件中區(qū)亡驰;
            如果用到的是InnoDB存儲引擎:
                `innodb_flush_logs_at_trx_commit=ON`:事務(wù)提交時晓猛,立即將事務(wù)緩沖區(qū)中與事務(wù)相關(guān)的數(shù)據(jù)刷寫到磁盤上的事務(wù)日志中區(qū)
                `innodb_support_xa=ON   `:xa為分布式事務(wù),是否讓innodb支持分布式事務(wù);        
      
    •   3、從服務(wù)器意外中止時盡量避免自動啟動復(fù)制線程
        `skip_slave_start=ON`:      是否自動啟動復(fù)制線程方援;默認(rèn)是自動啟動的送丰,建議關(guān)閉,手動啟動復(fù)制功能;
      
    •   4、從節(jié)點:設(shè)置參數(shù)
        `sync_master_info=ON`:每一次當(dāng)給從節(jié)點dump一些event之后,本地對應(yīng)的master_info信息是否會立即同步到磁盤上讓從節(jié)點能夠獲取到或讓本地立即記錄下來捧韵;啟動為ON,但會增加磁盤IO壓力汉操;
      
      sync_relay_log_info=ON
演示示例:
節(jié)點1:192.168.43.13
節(jié)點2:192168.43.14

停止msyql服務(wù)再来,清除此前實驗;
[root@node3 ~]# systemctl stop mariadb
[root@node3 ~]# rm -rf /var/lib/mysql/*
修改節(jié)點1的配置文件:
[root@node3 ~]# vim /etc/my.cnf
    [mysqld]
    ...
    log_bin=mysql-bin
    server_id=1
    relay_log=relay-bin
    
    auto_increment_offset=1
    auto_increment_increment=2
修改節(jié)點2的配置文件:
[root@node4 ~]# vim /etc/my.cnf
    [mysqld]
    ...
    log_bin=mysql-bin
    server_id=2
    relay_log=relay-bin
    
    auto_increment_offset=2
    auto_increment_increment=2

分別啟動mysql服務(wù):
[root@node3 ~]# systemctl start mariadb
Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.   #此處因為前面直接rm刪除了數(shù)據(jù)庫文件客情,因此需要使用`mysql_install_db --datadir=/var/lib/mysql`   重新初始化其弊,并修改`/var/lib/mysql的屬主屬組為mysql

然后重新啟動:
[root@node3 ~]# systemctl start mariadb

連接到mysql服務(wù)器上查看二進(jìn)制日志和中繼日志是否都啟動
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'relay_log';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| relay_log     | relay-bin |
+---------------+-----------+

在兩節(jié)點上:設(shè)置復(fù)制權(quán)限的賬號:
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'192.168.43.14' IDENTIFIED BY 'slave';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

在節(jié)點1上:
MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      503 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.43.14',MASTER_USER='slave',MASTER_PASSWO
RD='slave',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=501;
Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
在節(jié)點2上:
MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      501 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.43.13',MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=503;
Query OK, 0 rows affected (0.03 sec)

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.43.14
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 501
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.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: 501
              Relay_Log_Space: 817
              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: 3
1 row in set (0.00 sec)
    
測試:
在節(jié)點1上創(chuàng)建一個數(shù)據(jù)庫:
MariaDB [(none)]> CREATE DATABASE mydb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| #mysql50#.ssl      |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
在節(jié)點2上查看:
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| #mysql50#.ssl      |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+


至此雙主模式配置完成

半同步復(fù)制:

一個個主節(jié)點有多個從節(jié)點,主節(jié)點接收到請求以后膀斋,要至少等待一個從節(jié)點同步完成并告訴主節(jié)點數(shù)據(jù)存儲完成梭伐,主節(jié)點才返回客戶端結(jié)果,但從節(jié)點可有n個仰担,給余的從節(jié)點異步糊识;一旦主節(jié)點掉線,至少能夠有一個從節(jié)點數(shù)據(jù)是完整的摔蓝,把這種模型叫半同步復(fù)制模型赂苗;
這個半同步的服務(wù)器應(yīng)該與主節(jié)點在同一機(jī)架或同一機(jī)房內(nèi)的有著充分帶寬的節(jié)點;其它節(jié)點可以是跨機(jī)房或跨互聯(lián)網(wǎng)的贮尉;
支持多種插件:插件路徑為/usr/lib64/mysql/plugins/
需要安裝方可使用拌滋,安裝方法:`mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';

  • 半同步復(fù)制所需插件:
    semisync_master.so
    semisync_slave.so
半同步復(fù)制示例:
清除此前主主模型的實驗:
 ~]# systemctl stop mariadb.service
 ~]# rm -rf /var/lib/mysql/*
重啟配置為主從復(fù)制模型后再主節(jié)點安裝相應(yīng)插件并配置:
[root@node3 ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> SHOW PLUGINS;
+--------------------------------+----------+--------------------+--------------------+---------+
| Name                           | Status   | Type               | Library            | License |
+--------------------------------+----------+--------------------+--------------------+---------+
| binlog                         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password          | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| mysql_old_password             | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| MEMORY                         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| CSV                            | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MyISAM                         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MRG_MYISAM                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| Aria                           | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| BLACKHOLE                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| FEDERATED                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| ARCHIVE                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_RSEG                    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_UNDO_LOGS               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TRX                     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCKS                   | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCK_WAITS              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP                     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_RESET               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM                  | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM_RESET            | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_TABLES              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_TABLESTATS          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_INDEXES             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_COLUMNS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FIELDS              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FOREIGN             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FOREIGN_COLS        | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_STATS               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLE_STATS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_INDEX_STATS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_PAGES       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_PAGES_INDEX | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_PAGES_BLOB  | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| XTRADB_ADMIN_COMMAND           | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CHANGED_PAGES           | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE_LRU         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_STATS       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| PERFORMANCE_SCHEMA             | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| FEEDBACK                       | DISABLED | INFORMATION SCHEMA | NULL               | GPL     |
| partition                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| rpl_semi_sync_master           | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
+--------------------------------+----------+--------------------+--------------------+---------+
43 rows in set (0.00 sec)

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
4 rows in set (0.00 sec)

MariaDB [(none)]> SET @@GLOBAL.rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> 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    |
+------------------------------------+-------+


從節(jié)點安裝插件并配置:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.02 sec)    

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)

MariaDB [(none)]> SET @@GLOBAL.rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
    
MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.03 sec)

主節(jié)點查看:
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

注意:使用INSTALL PLUGIN plugin_name SONAME 'shared_library_name時,可以在配置文件中[mysqld]段中添加:
plugin_dir=/path/to/plugin/directory;不指明則默認(rèn)在/usr/lib64/mysql/pligin/目錄下猜谚;
plugin_name:為插件的名字败砂;
shared_library_name:為插件文件的名字;

插件安裝后會生成很多服務(wù)器變量:

rpl_semi_sync_master_enabled:是否啟用自己為半同步節(jié)點
rpl_semi_sync_master_timeout:等待從節(jié)點超時時間魏铅;單位毫秒昌犹,默認(rèn)10秒;
rpl_semi_sync_master_trace_level:跟蹤級別览芳;使用默認(rèn)值即可
rpl_semi_sync_master_wait_no_slave:沒有從節(jié)點是否等待斜姥;
rpl_semi_sync_master_clients:對于當(dāng)前主節(jié)點,有多少個半同步節(jié)點;
Rpl_semi_sync_master_net_avg_wait_time:網(wǎng)絡(luò)平均等待時間铸敏;
rpl_semi_sync_master_net_wait_time:網(wǎng)絡(luò)等待時間缚忧;
rpl_semi_sync_master_net_waits:網(wǎng)絡(luò)等待次數(shù);
rpl_semi_sync_master_tx_avg_wait_time:事務(wù)的平均等待時間搞坝;
rpl_semi_sync_master_tx_wait_time:事務(wù)的等待時間搔谴;
rpl_semi_sync_master_tx_waits:事務(wù)的等待次數(shù)魁袜;
rpl_semi_sync_slave_enabled:是否啟用為半同步節(jié)點
rpl_semi_sync_slave_trace_level:跟蹤級別

復(fù)制過濾器:

僅復(fù)制有限一個或幾個數(shù)據(jù)庫相關(guān)的數(shù)據(jù)桩撮,而非所有;由復(fù)制過濾器進(jìn)行峰弹;

  • 有兩種實現(xiàn)方式:
    • (1) 主服務(wù)器僅向二進(jìn)制日志中記錄與特定數(shù)據(jù)庫(特定表)相關(guān)的事件
      使用方法:
      • binlog_do_db=:數(shù)據(jù)庫白名單列表店量,使用逗號分隔;只記錄哪些數(shù)據(jù)看相關(guān)的寫入操作到二進(jìn)制文件中鞠呈;
      • binlog_ingore_db=:數(shù)據(jù)庫黑名單列表融师,使用逗號分隔;僅忽略哪些數(shù)據(jù)庫相關(guān)的寫入操作到而鍵值文件中
    • 注意:二者不能同時使用蚁吝;還有此方法時間點還原無法實現(xiàn)旱爆,不建議使用;
    • (2) 從服務(wù)器SQL_THREDA在replay中繼日志中的事件時窘茁,僅讀取特定數(shù)據(jù)庫(特定表)相關(guān)的事件并應(yīng)用于本地怀伦;
      使用方法:
      • reolicate_do_db=:僅復(fù)制指定的數(shù)據(jù)庫,要復(fù)制數(shù)據(jù)庫的白名單山林;
      • replicate_ingore_db=:忽略復(fù)制指定的數(shù)據(jù)庫房待,黑名單;
      • replicate_do_table=:表的白名單
      • replicate_ingore_table=:表的黑名單
      • replicate_wild_do_table=:使用通配符的表的白名單
      • replicate_wild_ingore_table=:使用通配符的表的黑名單

復(fù)制的監(jiān)控和維護(hù):

  • (1) 清理日志:PURGE
    PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
  • (2) 復(fù)制監(jiān)控
    • MASTER:
      SHOW MASTER STATUS;
      SHOW BINLOG EVENTS;
      SHOW BINARY LOGS;
      -SLAVE:
      SHOW SLAVE STATUS;
      判斷從服務(wù)器是否落后于主服務(wù)器的變量:Seconds_Behind_Master:0
  • (3) 如何確定主從節(jié)點數(shù)據(jù)是否一致驼抹?
    通過表的CHECKSUM檢查桑孩;
    使用percona-tools中pt-table-checksum;
  • (4) 主從數(shù)據(jù)不一致時的修復(fù)方法框冀?
    重新復(fù)制流椒;選擇一個認(rèn)為比較完整的數(shù)據(jù)庫,重新備份導(dǎo)入到從節(jié)點上明也;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诡右,隨后出現(xiàn)的幾起案子安岂,更是在濱河造成了極大的恐慌,老刑警劉巖帆吻,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件域那,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)次员,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門败许,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淑蔚,你說我怎么就攤上這事市殷。” “怎么了刹衫?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵醋寝,是天一觀的道長。 經(jīng)常有香客問我带迟,道長音羞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任仓犬,我火速辦了婚禮嗅绰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搀继。我一直安慰自己窘面,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布叽躯。 她就那樣靜靜地躺著财边,像睡著了一般。 火紅的嫁衣襯著肌膚如雪险毁。 梳的紋絲不亂的頭發(fā)上制圈,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音畔况,去河邊找鬼鲸鹦。 笑死,一個胖子當(dāng)著我的面吹牛跷跪,可吹牛的內(nèi)容都是我干的馋嗜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼吵瞻,長吁一口氣:“原來是場噩夢啊……” “哼葛菇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起橡羞,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眯停,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卿泽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莺债,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了齐邦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椎侠。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖措拇,靈堂內(nèi)的尸體忽然破棺而出我纪,到底是詐尸還是另有隱情,我是刑警寧澤丐吓,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布浅悉,位于F島的核電站,受9級特大地震影響汰蜘,放射性物質(zhì)發(fā)生泄漏仇冯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一族操、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧比被,春花似錦色难、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尺迂,卻和暖如春笤妙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背噪裕。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工蹲盘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膳音。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓召衔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親祭陷。 傳聞我的和親對象是個殘疾皇子苍凛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容