• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • mysql主從復制,基于GTID主從復制,并行復制,半同步復制

    復制功能:

    數據分布:負載均衡(讀)
    備份:高可用和故障切換

    復制方式:

    主–從復制(A-B一主一從或者A-BC一主多從)
    基于GTID復制
    異步復制
    半同步復制

    復制原理:

    Mysql中有一種日志叫做bin日志(二進制日志)。
    這個日志會記錄下所有修改了數據庫的SQL語句
    (insert,update,delete,ALTER TABLE,grant等等)。
    主從復制的原理其實就是把主服務器上的bin日志復制到從服務器上
    執行一遍,這樣從服務器上的數據就和主服務器上的數據相同了。

    Mysql復制特點:

    異步復制:主節點中一個用戶請求一個寫操作時,主接點不需要把寫的
    數據在本地操作完成同時就響應用戶。但是,從節點中的數據有可能會
    落后主服務,可以使用(很多軟件來檢查是否落后)
    主從數據不一致

    主從復制:

    這里寫圖片描述
    mysql主從復制原理:
    這里寫圖片描述

    從庫生成兩個線程,一個I/O線程,一個SQL線程;
    i/o線程去請求主庫 的binlog,并將得到的binlog日志寫到
    relay log(中繼日志) 文件中;
    主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;
    SQL 線程,會讀取relay log文件中的日志,并解析成具體操作,來實現
    主從的操作一致,而最終數據一致;

    AB機的主從復制:

    如果想要配置一主多從,從節點配置相同,server-id不同即可

    **主節點:**
        啟用二進制日志。
        為當前節點設置一個全局唯一的server_id。
        創建有復制權限的用戶賬號 REPLIACTION SLAVE ,REPLIATION CLIENT。
    
    **從節點:**
        啟動中繼日志。
        為當前節點設置一個全局唯一的server_id。
        使用有復制權限的用戶賬號連接至主節點,并啟動復制線程。

    實驗環境:

    主端:172.25.254.1  server1
    從端:172.25.254.2  server2

    主端:

    [root@server1 ~]# ls
    mysql-community-client-5.7.17-1.el6.x86_64.rpm
    mysql-community-common-5.7.17-1.el6.x86_64.rpm
    mysql-community-libs-5.7.17-1.el6.x86_64.rpm
    mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
    mysql-community-server-5.7.17-1.el6.x86_64.rpm
    [root@server1 ~]# yum install -y *  安裝服務

    這里寫圖片描述

    [root@server1 ~]# /etc/init.d/mysqld start  開啟服務
    Initializing MySQL database:                               [  OK  ]
    Installing validate password plugin:                       [  OK  ]
    Starting mysqld:                                           [  OK  ]
    [root@server1 ~]# vim /etc/my.cnf  編輯my.cnf常用參數配置
    [root@server1 ~]# cat /etc/my.cnf | tail -n 2
    啟用二進制日志文件
        添加:log-bin = mysql-bin
        添加 :server-id =1
    server-id=1   
    log-bin=mysql-bin
    [root@server1 ~]# /etc/init.d/mysqld restart  重啟服務文件內容生效
    Stopping mysqld:                                           [  OK  ]
    Starting mysqld:                                           [  OK  ]
    [root@server1 ~]# grep password /var/log/mysqld.log   查看日志會看到出是密碼
    2018-08-08T12:25:20.167210Z 1 [Note] A temporary password is generated for root@localhost: jdomj?l:W2yp
    root@localhost:后面的就是密碼

    這里寫圖片描述
    從端:

    [root@server2 ~]# ls
    mysql-community-client-5.7.17-1.el6.x86_64.rpm
    mysql-community-common-5.7.17-1.el6.x86_64.rpm
    mysql-community-libs-5.7.17-1.el6.x86_64.rpm
    mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
    mysql-community-server-5.7.17-1.el6.x86_64.rpm
    [root@server2 ~]# yum install -y *  安裝服務

    這里寫圖片描述

    [root@server2 ~]# vim /etc/my.cnf   編輯my.cnf常用參數配置
    [root@server2 ~]# cat /etc/my.cnf | tail -n 1
    server-id=2   填寫server-id和主端不同即可
    [root@server2 ~]# /etc/init.d/mysqld start  開啟服務
    Initializing MySQL database:                               [  OK  ]
    Installing validate password plugin:                       [  OK  ]
    Starting mysqld:                                           [  OK  ]
    [root@server2 ~]# grep password /var/log/mysqld.log  過濾密碼
    2018-08-08T12:27:29.954223Z 1 [Note] A temporary password is generated for root@localhost: srpy%>EUr5rA
    root@localhost:后面的就是密碼

    這里寫圖片描述
    主端初始化完成:

    [root@server1 ~]# mysql_secure_installation  進入初始化安裝
    
    Securing the MySQL server deployment.
    
    Enter password for user root:   輸入默認的初始化密碼
    
    The existing password for the user account root has expired. Please set a new password.
    
    New password:   輸入新密碼:要求大小寫字母數字和字符
    
    Password updated successfully!  密碼配置成功
    Reloading privilege tables..
     ... Success!
    Remove anonymous users? [Y/n]   詢問是否不允許匿名用戶登錄
    Disallow root login remotely? [Y/n]   詢問是否不允許遠程連接
    Remove test database and access to it? [Y/n]  詢問是否刪除測試數據庫并訪問它
    Reload privilege tables now? [Y/n]   詢問是否重新加載權限表

    這里寫圖片描述
    主端添加授權:

    mysql> show databases;  顯示所有數據庫
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    mysql> grant replication slave on *.* to repl@'172.25.254.%' identified by 'Yakexi+007';  在主節點上創建有復制權限的用戶,網段為另外一臺虛擬機的IP
    Query OK, 0 rows affected, 1 warning (0.17 sec)
    
    mysql> show master status;  查看狀態
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |     1428 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    圖文Position應該是一致的,因為每次作會有變化。
    這里寫圖片描述
    從端可以登陸主端

    [root@server2 ~]# mysql -u repl -p -h 172.25.254.1  登陸主端輸入主端設置的密碼即可登陸
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 11
    Server version: 5.7.17-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> quit
    Bye

    這里寫圖片描述
    從端初始化:

    [root@server2 ~]# mysql_secure_installation
    Securing the MySQL server deployment.
    
    Enter password for user root:   輸入默認的初始化密碼
    
    The existing password for the user account root has expired. Please set a new password.
    
    New password:   輸入新密碼:要求大小寫字母數字和字符
    
    Password updated successfully!  密碼配置成功
    Reloading privilege tables..
     ... Success!
    Remove anonymous users? [Y/n]   詢問是否不允許匿名用戶登錄
    Disallow root login remotely? [Y/n]   詢問是否不允許遠程連接
    Remove test database and access to it? [Y/n]  詢問是否刪除測試數據庫并訪問它
    Reload privilege tables now? [Y/n]   詢問是否重新加載權限表

    這里寫圖片描述

    從端可以連接并查看slave信息:

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    
    mysql> change master to master_host='172.25.254.1',master_user='repl',master_password='Yakexi+007',master_log_file='mysql-bin.000001',master_log_pos=1428;   在從節點配置訪問主節點的參數信息,對應寫即可
    Query OK, 0 rows affected, 2 warnings (1.38 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.15 sec)
    
    mysql> show slave status\G   查看從節點的狀態信息看是否連接成功
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.25.254.1
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 1428
                   Relay_Log_File: server2-relay-bin.000002
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes     ##這兩個參數變為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: 1428
                  Relay_Log_Space: 529
                  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
                      Master_UUID: 1d70d2c8-9b06-11e8-ac6a-525400f867b2
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
    1 row in set (0.00 sec)

    這里寫圖片描述
    主端建立數據庫數據表插入字段用于測試 :

    mysql> create database love;  創建數據庫
    Query OK, 1 row affected (0.21 sec)
    
    mysql> use love;  
    Database changed
    mysql> create table ours(
        -> username varchar(10) not null,
        -> password varchar(10) not null);  創建數據表
    Query OK, 0 rows affected (1.21 sec)
    
    mysql> desc ours;  查看數據表結構
    +----------+-------------+------+-----+---------+-------+
    | Field    | Type        | Null | Key | Default | Extra |
    +----------+-------------+------+-----+---------+-------+
    | username | varchar(10) | NO   |     | NULL    |       |
    | password | varchar(10) | NO   |     | NULL    |       |
    +----------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    mysql> insert into ours values('xfl','123');  插入字段
    Query OK, 1 row affected (0.30 sec)
    
    mysql> insert into ours values('xyy','456');  插入字段
    Query OK, 1 row affected (0.26 sec)
    
    mysql> select * from ours;  顯示字段信息
    +----------+----------+
    | username | password |
    +----------+----------+
    | xfl      | 123      |
    | xyy      | 456      |
    +----------+----------+
    2 rows in set (0.00 sec)

    這里寫圖片描述
    從端可以查看數據表字段信息:

    mysql> use love;  使用數據庫
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from ours;  查看字段信息已經復制成功
    +----------+----------+
    | username | password |
    +----------+----------+
    | xfl      | 123      |
    | xyy      | 456      |
    +----------+----------+
    2 rows in set (0.00 sec)

    Mysql-5.7 基于GTID的主從復制

    從 MySQL 5.6.5 開始新增了一種基于 GTID 的復制方式。通過 GTID 保證了
    每個在主庫上提交的事務在集群中有一個唯一的ID。這種方式強化了數據庫的主備
    一致性,故障恢復以及容錯能力。

    實驗環境在上一個實驗基礎上進行配置:
    從端修改my.cnf文件并停止slave:

    [root@server2 ~]# vim /etc/my.cnf
    [root@server2 ~]# cat /etc/my.cnf | tail -n 4
    server-id=2
    
    gtid_mode=ON  開啟gtid模式
    enforce-gtid-consistency=true   強制gtid一直性,用于保證啟動gitd后事務的安全;
    [root@server2 ~]# /etc/init.d/mysqld restart  重啟服務
    Stopping mysqld:                                           [  OK  ]
    Starting mysqld:                                           [  OK  ]

    這里寫圖片描述
    主端修改配置文件重啟服務:

    [root@server1 ~]# cat /etc/my.cnf |tail -n 5
    server-id=1   
    log-bin=mysql-bin
    
    gtid_mode=ON
    enforce-gtid-consistency=true
    [root@server1 ~]# /etc/init.d/mysqld restart
    Stopping mysqld:                                           [  OK  ]
    Starting mysqld:                                           [  OK  ]

    這里寫圖片描述

    [root@server2 ~]# mysql -p  登陸數據庫
    mysql> show slave status\G  查看slave狀態信息
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.25.254.1
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000002
              Read_Master_Log_Pos: 154
                   Relay_Log_File: server2-relay-bin.000005
                    Relay_Log_Pos: 367
            Relay_Master_Log_File: mysql-bin.000002
                 Slave_IO_Running: Yes   ##這兩行為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: 154
                  Relay_Log_Space: 742
                  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
                      Master_UUID: 1d70d2c8-9b06-11e8-ac6a-525400f867b2
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
    1 row in set (0.00 sec)

    這里寫圖片描述

    mysql> stop slave;  停止slave
    Query OK, 0 rows affected (0.17 sec)

    這里寫圖片描述
    主端查看狀態:

    [root@server1 ~]# /etc/init.d/mysqld restart  重啟服務
    Stopping mysqld:                                           [  OK  ]
    Starting mysqld:                                           [  OK  ]
    [root@server1 ~]# mysql -p
    
    mysql> show master status;  查看master狀態
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 |      154 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    這里寫圖片描述
    從端重新建立連接:

    MASTER_AUTO_POSITION:參數意思
    該參數在mysql5.6.5版本引入,如果進行change master to時使用MASTER_AUTO_POSITION = 1,
    slave連接master將使用基于GTID的復制協議。
    使用基于GTID協議的復制,slave會告訴master它已經接收到或執行了哪些事務。
    使用基于GTID的復制時(MASTER_AUTO_POSITION = 1),首先要開啟gtid_mode(在my.cnf中設置gtid-mode = ON),
    mysql> change master to master_host='172.25.254.1',master_user='repl',master_password='Yakexi+007',MASTER_AUTO_POSITION = 1;
    Query OK, 0 rows affected, 2 warnings (0.37 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.11 sec)

    這里寫圖片描述
    主端在表中插入字段:

    mysql> use love;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +----------------+
    | Tables_in_love |
    +----------------+
    | ours           |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> insert into ours values('xxx','789');  插入字段
    Query OK, 1 row affected (0.12 sec)

    這里寫圖片描述
    從端可以復制字段信息實時查看:

    mysql> use love;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from ours;
    +----------+----------+
    | username | password |
    +----------+----------+
    | xfl      | 123      |
    | xyy      | 456      |
    | xxx      | 789      |
    +----------+----------+
    3 rows in set (0.00 sec)

    這里寫圖片描述
    mysql主從復制存在的問題:

    主庫宕機后,數據可能丟失
    從庫只有一個sql Thread,主庫寫壓力大,復制很可能延時
    解決方法:
    半同步復制---解決數據丟失的問題
    并行復制----解決從庫復制延遲的問題

    并行復制:

    MySQL從5.6開始有了SQL Thread多個的概念,可以并發還原數據,
    即并行復制技術。MySQL 5.6中,設置參數slave_parallel_workers = 4(>1),
    即可有4個SQL Thread(coordinator線程)來進行并行復制,其狀態為:
    Waiting for an evant from Coordinator。
    在MySQL 5.7中,引入了基于組提交的并行復制(Enhanced Multi-threaded Slaves),
    設置參數slave_parallel_workers>0并且global.slave_parallel_type=‘LOGICAL_CLOCK’,
    即可支持一個schema下,slave_parallel_workers個的worker線程
    并發執行relay log中主庫提交的事務。其核心思想:一個組提交的事務
    都是可以并行回放(配合binary log group commit);
    slave機器的relay log中 last_committed相同的事務(sequence_num不同)
    可以并發執行。
    其中,變量slave-parallel-type可以有兩個值:DATABASE 默認值,
    基于庫的并行復制方式;LOGICAL_CLOCK:基于組提交的并行復制方式
    MySQL 5.7開啟Enhanced Multi-Threaded Slave配置

    這里寫圖片描述
    添加參數永久生效:

    [root@server2 ~]# cat /etc/my.cnf | tail -n 10
    log-slave-updates
    
    gtid_mode=ON
    enforce-gtid-consistency=true
    
    slave-parallel-type=LOGICAL_CLOCK
    
    slave-parallel-workers=16
    
    若將slave_parallel_workers設置為0,則MySQL 5.7退化為原單線程復制,
    但將slave_parallel_workers設置為1,則SQL線程功能轉化為coordinator線程,
    但是只有1個worker線程進行回放,也是單線程復制。然而,這兩種性能卻又有一些
    的區別,因為多了一次coordinator線程的轉發,因此slave_parallel_workers=1
    的性能反而比0還要差
    
    **master_info_repository=TABLE**
    
    開啟MTS功能后,務必將參數master_info_repostitory設置為TABLE,
    這樣性能可以有50%~80%的提升。這是因為并行復制開啟后對于元master.info
    這個文件的更新將會大幅提升,資源的競爭也會變大。在之前InnoSQL的版本中,
    添加了參數來控制刷新master.info這個文件的頻率,甚至可以不刷新這個文件。
    因為刷新這個文件是沒有必要的,即根據master-info.log這個文件恢復本身就是
    不可靠的。在MySQL 5.7中,Inside君推薦將master_info_repository設置為
    TABLE,來減小這部分的開銷。
    relay_log_info_repository=TABLE
    relay_log_recovery=ON

    這里寫圖片描述
    顯示哪些線程正在運行

    mysql> show processlist;
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    | Id | User        | Host      | db   | Command | Time | State                                                  | Info             |
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    | 28 | root        | localhost | test | Query   |    0 | starting                                               | show processlist |
    | 30 | system user |           | NULL | Connect | 1301 | Slave has read all relay log; waiting for more updates | NULL             |
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    2 rows in set (0.00 sec)
    參數
    id       #ID標識,要kill一個語句的時候很有用
    use      #當前連接用戶
    host     #顯示這個連接從哪個ip的哪個端口上發出
    db       #數據庫名
    command  #連接狀態,一般是休眠(sleep),查詢(query),連接(connect)
    time     #連接持續時間,單位是秒
    state    #顯示當前sql語句的狀態
    info     #顯示這個sql語句

    這里寫圖片描述
    當打開16個線程再次查看哪些線程正在運行:

    mysql> show processlist;  設置了16個線程的結果
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    | Id | User        | Host      | db   | Command | Time | State                                                  | Info             |
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    |  1 | system user |           | NULL | Connect | 3748 | Slave has read all relay log; waiting for more updates | NULL             |
    |  3 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    |  4 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    |  5 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    |  6 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    |  7 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    |  8 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    |  9 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    | 10 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    | 12 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    | 13 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    | 14 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    | 15 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    | 16 | system user |           | NULL | Connect | 3988 | Waiting for an event from Coordinator                  | NULL             |
    | 17 | system user |           | NULL | Connect | 3987 | Waiting for an event from Coordinator                  | NULL             |
    | 18 | system user |           | NULL | Connect | 3987 | Waiting for an event from Coordinator                  | NULL             |
    | 19 | system user |           | NULL | Connect | 3987 | Waiting for an event from Coordinator                  | NULL             |
    | 23 | system user |           | NULL | Connect | 3749 | Waiting for master to send event                       | NULL             |
    | 24 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist |
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    19 rows in set (0.00 sec)

    半同步復制:

    默認情況下,MySQL的復制功能是異步的,異步復制可以提供最佳的性能, 
    主庫把binlog日志發送給從庫,這一動作就結束了,并不會驗證從庫是
    否接收完畢,這一過程,也就意味著有可能出現當主服務器或從服務
    器端發生故障的時候,有可能從服務器沒有接收到主服務器發送過來的
    binlog日志,這就會造成主服務器和從服務器的數據不一致,甚至在恢
    復時造成數據的丟失。注意:半同步復制模式必須在主服務器和從服務器
    端同時開啟,否則主服務器默認使用異步復制模式。

    這里寫圖片描述
    在主端:

    mysql> show global variables like 'have_dynamic_loading';
    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | have_dynamic_loading | YES   |
    +----------------------+-------+
    1 row in set (0.00 sec)
    
    mysql> show global variables like 'plugin_dir';
    +---------------+--------------------------+
    | Variable_name | Value                    |
    +---------------+--------------------------+
    | plugin_dir    | /usr/lib64/mysql/plugin/ |
    +---------------+--------------------------+
    1 row in set (0.00 sec)
    
    mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';  安裝服務插件
    Query OK, 0 rows affected (0.11 sec)
    rpl_semi_sync_master_enabled 參數控制主節點是否開啟半同步復制;rpl_semi_sync_master_timeout 
    參數控制主節點等待備節點返回確認信息的超時時間,單位為毫秒,超過這個時間后半同步復制轉變成異步復制,
    mysql> set global rpl_semi_sync_master_enabled = 1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> set global rpl_semi_sync_master_enabled = ON;
    Query OK, 0 rows affected (0.00 sec)

    這里寫圖片描述
    在從端:

    mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';  安裝插件
    Query OK, 0 rows affected (0.14 sec)
    
    mysql> set global rpl_semi_sync_slave_enabled=ON;  rpl_semi_sync_master_enabled 參數控制主節點是否開啟半同步復制
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show 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)

    這里寫圖片描述
    主端查看參數:

    mysql> show status like '%rpl_semi_sync%';  
    +--------------------------------------------+-------+
    | Variable_name                              | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients               | 0     |
    | 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)

    從端關閉io_thread:

    mysql> stop slave io_thread;  
    Query OK, 0 rows affected (0.06 sec)

    這里寫圖片描述
    主端修改數據表字段:

    mysql> use love;
    Database changed
    mysql> insert into ours values('ss','3');  插入字段會有卡頓默認時間是10s,10s過后會自動變成異步復制
    Query OK, 1 row affected (10.83 sec)
    
    mysql> show status like '%rpl_semi_sync%';  一些參數的值也會變化
    +--------------------------------------------+-------+
    | Variable_name                              | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients               | 0     |
    | 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              | 1     |
    | Rpl_semi_sync_master_no_tx                 | 1     |
    | Rpl_semi_sync_master_status                | OFF   |
    | 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)

    這里寫圖片描述
    從端打開查看io_thread

    mysql> start slave io_thread;  打開slave io_thread
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> use love;
    Database changed
    mysql> select * from ours;  數據已經同步
    +----------+----------+
    | username | password |
    +----------+----------+
    | xfl      | 123      |
    | xyy      | 456      |
    | xxx      | 789      |
    | ss       | 3        |
    +----------+----------+
    4 rows in set (0.00 sec)

    這里寫圖片描述

    版權聲明:本文為aaaaaab_原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/aaaaaab_/article/details/81515111

    智能推薦

    mysql的主從復制、基于gtid的主從復制和半同步復制

    主從復制 在官網上下載mysql的安裝包mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar 在server1,2中均做以下動作 主節點上: mysql -p mysql> grant replication slave on . to repl@’172.25.11.%’ identified by ‘WDd12345.&rs...

    mysql的主從復制、基于Gtid的主從復制、半同步復制

    1.mysql主從復制的作用: (1)實時災備,用于故障切換 (2) 讀寫分離,提供查詢服務 (3) 備份,避免影響業務 2.主從部署必要條件: (1) 主庫開啟binlog日志(設置log-bin參數) (2) 主從server-id不同 (3)從庫服務器能連通主庫 3.主從復制實驗: 實驗環境:mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar server2:主...

    mysql主從復制、基于GTID的主從、半同步

    使用的mysql版本5.7.17 一、主從復制 原理: 主從復制一共有三個進程,從庫生成兩個線程,一個I/O線程,一個SQL線程; i/o線程去請求主庫的binlog,并將得到的binlog日志寫到relay log(中繼日志) 文件中; 主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog; SQL 線程,會讀取relay log文件中的日志,并解析成具體操作,來實現主從...

    mysql主從復制及半同步(基于gtid)

    1.MySQL主從復制(基于GTID) Mysql主庫(master):server2 —>172.25.155.2 Mysql從庫( slave ):server3 —>172.25.155.3 下載安裝包 mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-...

    基于gtid的半同步mysql主從復制

    此篇博客的是在上一篇博客(mysql主從復制)的基礎上寫的 https://blog.csdn.net/weixin_40543283/article/details/87911286  此篇博客寫的是基于gtid的半同步mysql主從復制 一、gtid的半同步mysql主從復制的原理介紹 1.什么是gtid? GTID (Global Transaction ID) 是對于一個已提交事...

    猜你喜歡

    Mysql的主從復制以及基于gtid的主從復制、半同步復制、組復制

    前言: Mysql是現在普遍使用的數據庫,但是如果宕機了必然會造成數據丟失。為了保證mysql數據庫的可靠性。就要會一些提高可靠性的技術。因此,一般來說都是通過 主從復制(Master-Slave)的方式來同步數據提高可靠性,再通過讀寫分離(MySQL-Proxy)來提升數據庫的并發負載能力。 本文我們將會詳細給大家介紹在Redhat7環境下Mysql的主從復制以及基于gtid的主從復制、半同步復...

    基于gtid實現的mysql主從復制,半同步復制,組復制

    MySQL主從復制 1.mysql主從復制原理: 從庫有兩個線程IO線程和SQL線程 1.從庫的IO線程向主庫的主進程發送請求,主庫驗證從庫,交給主庫IO線程負責數據傳輸; 2.主庫IO線程對比從庫發送過來的master.info里的信息,將binlog文件信息,偏移量和binlog文件名等發送給從庫 3.從庫接收到信息后,將binlog信息保存到relay-bin中,同時更新master.inf...

    linux mysql的主從復制(GTID)/并行復制/無損復制

    安裝mysql 本次使用五個rpm包安裝   安裝后修改密碼即可 密碼默認在log中   初始化修改即可   開啟mysql二進制日志 可以設定徐亞同步的數據庫或不需要的數據庫 進入mysql創建備份賬戶 查看日至位置以及pos在備份機使用 grant replication slave on  *.* to  'bobo'@'172.25.15....

    MySQL5.7主從復制,基于GTID主從復制、半同步、組復制、全同步解析

    一、主從復制 1.環境 系統:redhat6.5 防火墻:保持關閉 selinux=disabled mysql主機:server1 172.25.32.4/24 mysql從機:server2 172.25.32.5/24 2.MySQL5.7安裝啟動(server4和server5同樣操作) 1.下載并安裝(下載地址:www.mysql.com) 2.開啟MySQL并安全初始化 3.配置主從復...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    精品国产乱码久久久久久蜜桃不卡