1. 程式人生 > >MySQL5.7主從複製,基於GTID主從複製、半同步、組複製、全同步解析

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)

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@server4 ~]# yum install -y 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

2.開啟MySQL並安全初始化

[root@server4 ~]# /etc/init.d/mysqld start
Initializing MySQL database:                               [  OK  ]
Installing validate password plugin:                       [  OK  ]
Starting mysqld:                                           [  OK  ]

[root@server4 ~]# mysql_secure_installation 
Securing the MySQL server deployment. Enter password for user root: ## ##輸入檢視/var/log/mysqld.log的裡的密碼 ## 修改密碼 New password: Re-enter new password:

3.配置主從複製

mysql主庫(master):server4

1).配置主配置檔案(/etc/my.cnf)

[root@server4 ~]# vim /etc/my.cnf
[mysqld]
server-id=4          ## #伺服器id
log-bin=mysql-bin      ##開啟二進位制日誌
binlog-do-db=test      ##需要同步的資料庫名
binlog-ignore-db=mysql     ## ##禁止同步的資料庫名
enforce_gtid_consistency=on     ## #強制gtid一致性,開啟後對於特定create table不被支援
## 重啟服務
[root@server4 ~]# /etc/init.d/mysqld restart

2).配置資料庫

在主庫上建立帳戶並授權
mysql> create user 'server4'@'172.25.32.5' identified by 'WESTOSlj@007';
Query OK, 0 rows affected (0.06 sec)

mysql> grant replication slave on *.* to 'server4'@'172.25.32.5' identified by 'WESTOSlj@007';
Query OK, 0 rows affected, 1 warning (0.08 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.04 sec)
檢視二進位制日誌是否開啟
mysql>  show variables like 'log_%';
+----------------------------------------+--------------------------------+
| Variable_name                          | Value                          |
+----------------------------------------+--------------------------------+
| log_bin                                | ON                             |
| log_bin_basename                       | /var/lib/mysql/mysql-bin       |
| log_bin_index                          | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators        | OFF                            |
| log_bin_use_v1_row_events              | OFF                            |
| log_builtin_as_identified_by_password  | OFF                            |
| log_error                              | /var/log/mysqld.log            |
| log_error_verbosity                    | 3                              |
| log_output                             | FILE                           |
| log_queries_not_using_indexes          | OFF                            |
| log_slave_updates                      | OFF                            |
| log_slow_admin_statements              | OFF                            |
| log_slow_slave_statements              | OFF                            |
| log_statements_unsafe_for_binlog       | ON                             |
| log_syslog                             | OFF                            |
| log_syslog_facility                    | daemon                         |
| log_syslog_include_pid                 | ON                             |
| log_syslog_tag                         |                                |
| log_throttle_queries_not_using_indexes | 0                              |
| log_timestamps                         | UTC                            |
| log_warnings                           | 2                              |
+----------------------------------------+--------------------------------+
21 rows in set (0.00 sec)
檢視主庫的狀態
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      860 | test         | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql從庫(slave):server5

1).配置檔案(/etc/my.cnf)
[root@server5 ~]# vim /etc/my.cnf
[mysqld]
server-id=5
log-bin=mysql-bin
enforce_gtid_consistency=on 

## 重啟服務
[root@server5 ~]# /etc/init.d/mysqld restart
2).配置資料庫
[root@server5 ~]# mysql -p

mysql> change master to master_host='172.25.32.4',master_user='server4',master_password='WESTOSlj@007',master_log_file='mysql-bin.000001',master_log_pos=860;
Query OK, 0 rows affected, 2 warnings (0.34 sec)

mysql> start slave;
Query OK, 0 rows affected (0.07 sec)

mysql> show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.32.4
                  Master_User: server4
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 860
               Relay_Log_File: server5-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             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: 860
              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: 4
                  Master_UUID: 38eaae01-7ec6-11e8-8ddb-525400cbb7a9
             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)

當看到Slave_IO_Running: Yes以及Slave_SQL_Running: Yes,則表示slave庫已經正常運行了
當出現Slave_IO_Running: Connecting的提示時,說明主庫和從庫沒有連線上,有以下三點原因:
1.網路問題:檢查網路連線是否能夠連線上
2.密碼或POS號錯誤:檢視pos號和主庫的號是否對應

3.防火牆的問題:檢視主庫防火牆的策略,資料庫是否拒絕外來連線,然後做相應的改動

4.主從測試

1).主庫:

建立資料庫並新增資料:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database test;
Query OK, 1 row affected (0.04 sec)

mysql> use test;
Database changed
mysql> create table usertable (
    -> username varchar(10) not null,
    -> password varchar(16) not null);
Query OK, 0 rows affected (0.51 sec)

mysql> insert into usertable values('mark','westos');
Query OK, 1 row affected (0.05 sec)

mysql> insert into usertable values('harry','redhat');
Query OK, 1 row affected (0.10 sec)

mysql> select * from usertable;
+----------+----------+
| username | password |
+----------+----------+
| mark     | westos   |
| harry    | redhat   |
+----------+----------+
2 rows in set (0.00 sec)

2).從庫:

檢視資料庫:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test;
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_test |
+----------------+
| usertable      |
+----------------+
1 row in set (0.00 sec)

mysql> select * from usertable;
+----------+----------+
| username | password |
+----------+----------+
| mark     | westos   |
| harry    | redhat   |
+----------+----------+
2 rows in set (0.00 sec)

檢視到的資料庫與主庫所建立的相同,則主從複製設定成功

二、基於GTID的主從複製

mysql主庫(master):server4

1.配置主配置檔案(/etc/my.cnf)
[root@server4 ~]# vim /etc/my.cnf
[mysqld]
server-id=4      ## 伺服器id
log-bin=mysql-bin    ## 二進位制日誌檔案
gtid_mode=ON       ## 開啟gtid模式
enforce-gtid-consistency=true     ## 強制gtid複製

## 重啟服務
[root@server4 ~]# /etc/init.d/mysqld restart

2.配置資料庫

在主庫上建立帳戶並授權
mysql> create user 'server4'@'172.25.32.5' identified by 'WESTOSlj@007';
Query OK, 0 rows affected (0.06 sec)

mysql> grant replication slave on *.* to 'server4'@'172.25.32.5' identified by 'WESTOSlj@007';
Query OK, 0 rows affected, 1 warning (0.08 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.04 sec)
檢視二進位制日誌是否開啟
mysql>  show variables like 'log_%';
+----------------------------------------+--------------------------------+
| Variable_name                          | Value                          |
+----------------------------------------+--------------------------------+
| log_bin                                | ON                             |
| log_bin_basename                       | /var/lib/mysql/mysql-bin       |
| log_bin_index                          | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators        | OFF                            |
| log_bin_use_v1_row_events              | OFF                            |
| log_builtin_as_identified_by_password  | OFF                            |
| log_error                              | /var/log/mysqld.log            |
| log_error_verbosity                    | 3                              |
| log_output                             | FILE                           |
| log_queries_not_using_indexes          | OFF                            |
| log_slave_updates                      | OFF                            |
| log_slow_admin_statements              | OFF                            |
| log_slow_slave_statements              | OFF                            |
| log_statements_unsafe_for_binlog       | ON                             |
| log_syslog                             | OFF                            |
| log_syslog_facility                    | daemon                         |
| log_syslog_include_pid                 | ON                             |
| log_syslog_tag                         |                                |
| log_throttle_queries_not_using_indexes | 0                              |
| log_timestamps                         | UTC                            |
| log_warnings                           | 2                              |
+----------------------------------------+--------------------------------+
21 rows in set (0.00 sec)
檢視主庫的狀態
mysql> show  master status;
+---------------+----------+--------------+------------------+------------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+---------------+----------+--------------+------------------+------------------------------------------+
| binlog.000002 |      860 |              |                  | 2fa61e32-8132-11e8-97a3-525400663b39:1-6 |
+---------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

mysql從庫(slave):server5

1.配置檔案(/etc/my.cnf)
[root@server5 ~]# vim /etc/my.cnf
[mysqld]
server-id=5      ### 伺服器id
gtid_mode=ON
enforce-gtid-consistency=true

## 重啟服務
[root@server5 ~]# /etc/init.d/mysqld restart
2.配置資料庫
[root@server5 ~]# mysql -p
#### 指定主庫(之前需要關閉主從複製)
mysql> change master to master_host='172.25.32.4',master_user='server4',master_password='WESTOSlj@007',master_log_file='mysql-bin.000001',MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.34 sec)

mysql> start slave;
Query OK, 0 rows affected (0.07 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.32.4
                  Master_User: server4
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 860
               Relay_Log_File: server5-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             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: 860
              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: 4
                  Master_UUID: 38eaae01-7ec6-11e8-8ddb-525400cbb7a9
             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)

當看到Slave_IO_Running: Yes以及Slave_SQL_Running: Yes,則表示slave庫已經正常運行了
當出現Slave_IO_Running: Connecting的提示時,說明主庫和從庫沒有連線上,有以下三點原因:
1.網路問題:檢查網路連線是否能夠連線上
2.密碼或POS號錯誤:檢視pos號和主庫的號是否對應
3.防火牆的問題:檢視主庫防火牆的策略,資料庫是否拒絕外來連線,然後做相應的改動

主從測試

1.主庫:

建立資料庫並新增資料:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys  
+--------------------+
4 rows in set (0.00 sec)

mysql> create database test;
Query OK, 1 row affected (0.04 sec)

mysql> use test;
Database changed
mysql> create table usertable (
    -> username varchar(10) not null,
    -> password varchar(16) not null);
Query OK, 0 rows affected (0.51 sec)

mysql> insert into usertable values('mark','westos');
Query OK, 1 row affected (0.05 sec)

mysql> insert into usertable values('harry','redhat');
Query OK, 1 row affected (0.10 sec)

mysql> select * from usertable;
+----------+----------+
| username | password |
+----------+----------+
| mark     | westos   |
| harry    | redhat   |
+----------+----------+
2 rows in set (0.00 sec)
2.從庫:

檢視資料庫:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test;
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_test |
+----------------+
| usertable      |
+----------------+
1 row in set (0.00 sec)

mysql> select * from usertable;
+----------+----------+
| username | password |
+----------+----------+
| mark     | westos   |
| harry    | redhat   |
+----------+----------+
2 rows in set (0.00 sec)

檢視到的資料庫與主庫所建立的相同,則主從複製設定成功

三、半同步複製

環境:mysql5.7以上
selinux關閉
防火牆關閉

修改配置檔案:/etc/my.cnf
## 主(server4):
[mysqld]
server-id=4
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=true

## 從(server5):
[mysqld]
server-id=5
gtid_mode=ON
enforce-gtid-consistency=true
## 連線成功(即基於gtid的主從複製搭建成功)後關閉slave,
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.32.4
                  Master_User: server4
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 860
               Relay_Log_File: server5-relay-bin.0000011
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000006
             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: 860
              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: 4
                  Master_UUID: 38eaae01-7ec6-11e8-8ddb-525400cbb7a9
             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;
Query OK, 0 rows affected (0.07 sec)

1.主庫端載入mater模組:

mysql> install  plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.05 sec)

mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)

2.從庫端配置:

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.04 sec)

## 啟動半同步複製,也可寫到配置檔案中
mysql> set global rpl_semi_sync_slave_enabled=1;   
Query OK, 0 rows affected (0.00 sec)

## 重啟從上的IO執行緒,如果沒有重啟,則預設還是非同步複製,重啟後,slave會在master上註冊為半同步複製的slave角色。
mysql> stop slave io_thread;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> start slave io_thread;
Query OK, 0 rows affected (0.00 sec)

3.主庫端檢視配置情況:

## 環境變數
mysql> show 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_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
| rpl_semi_sync_slave_enabled               | OFF        |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.00 sec)

rpl_semi_sync_master_wait_for_slave_count

MySQL 5.7.3引入的,該變數設定主需要等待多少個slave應答,才能返回給客戶端,預設為1。


rpl_semi_sync_master_wait_no_slave

ON

預設值,當狀態變數Rpl_semi_sync_master_clients中的值小於rpl_semi_sync_master_wait_for_slave_count時,Rpl_semi_sync_master_status依舊顯示為ON。

OFF

當狀態變數Rpl_semi_sync_master_clients中的值於rpl_semi_sync_master_wait_for_slave_count時,Rpl_semi_sync_master_status立即顯示為OFF,即非同步複製。
## 狀態變數
mysql> show 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             | 1     |
| 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      | 277   |
| Rpl_semi_sync_master_tx_wait_time          | 277   |
| 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_slave_status                 | OFF   |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)

Rpl_semi_sync_master_clients

當前半同步複製從的個數,如果是一主多從的架構,並不包含非同步複製從的個數。

4.檢視半同步是否在執行

## 主:
mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+
1 row in set (0.00 sec)

## 從:
mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)

這兩個變數常用來監控主從是否執行在半同步複製模式下。value為ON,
至此,MySQL半同步複製搭建完畢~

事實上,半同步複製並不是嚴格意義上的半同步複製

當半同步複製發生超時時(由rpl_semi_sync_master_timeout引數控制,單位是毫秒,預設為10000,即10s),會暫時關閉半同步複製,轉而使用非同步複製。當master dump執行緒傳送完一個事務的所有事件之後,如果在rpl_semi_sync_master_timeout內,收到了從庫的響應,則主從又重新恢復為半同步複製。

5.測試:

## 測試一:

## 主:
mysql> insert into test.usertable values('user2','123');
Query OK, 1 row affected (0.08 sec)

mysql> select * from test.usertable;
+----------+----------+
| username | password |
+----------+----------+
| mark     | westos   |
| harry    | redhat   |
| user1    | 1234     |
| user2    | 123      |
+----------+----------+
4 rows in set (0.00 sec)

## 從:  主的操作很快就能返回
mysql> select * from test.usertable;
+----------+----------+
| username | password |
+----------+----------+
| mark     | westos   |
| harry    | redhat   |
| user1    | 1234     |
| user2    | 123      |
+----------+----------+
4 rows in set (0.00 sec)
## 測試二:

## 先操作從:執行stop slave
mysql> stop slave;
Query OK, 0 rows affected (0.02 sec)

mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF   |
+----------------------------+-------+
1 row in set (0.00 sec)

## 主:
mysql> insert into test.usertable values('user3','456');
Query OK, 1 row affected (10.08 sec)

mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF   |
+-----------------------------+-------+
1 row in set (0.00 sec)
## insert操作需要10.08s才返回,而這與rpl_semi_sync_master_timeout引數的時間相吻合。
此時,兩個狀態的值,均為“OFF”。
## 測試三:

##從:開啟slave,則主和從會快速恢復到半同步複製
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)

## 主:
mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+
1 row in set (0.00 sec)

6.檢視環境變數和狀態變數

mysql> show 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_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
| rpl_semi_sync_slave_enabled               | OFF        |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.00 sec)

mysql> show 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             | 3     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 4476  |
| Rpl_semi_sync_master_tx_wait_time          | 8952  |
| Rpl_semi_sync_master_tx_waits              | 2     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 3     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)
Rpl_semi_sync_master_no_tx

The number of commits that were not acknowledged successfully by a slave.

具體到上面的測試中,指的是insert into test.usertable values('user3','456');這個事務。



Rpl_semi_sync_master_yes_tx

The number of commits that were acknowledged successfully by a slave.

具體到上面的測試中,指的是以下三個事務

insert into test.usertable values ('user1','1234');

insert into test.usertable values('user2','123');

insert into test.usertable values('user4','235');

錯誤一:

問題及解決方案:

mysql> set global rpl_semi_sync_master_enabled=1;
ERROR 1193 (HY000): Unknown system variable 'rpl_semi_sync_master_enabled'
## 出現此錯誤,因為skip-grant-tables 引數把mysql的系統表都給跳過了,自然mysql就不認識半同步的配置引數了
## 解決辦法:
第一種辦法:
[root@server4 ~]#  /etc/init.d/mysqld restart --skip-grant-tables --skip_slave_start  --plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so";
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

第二種方法:
## 寫入到/etc/my.cnf裡[mysqld]下,多個.so 可使用;隔開
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
#### 資料庫操作儲存日誌
**檢視主庫,從庫的二進位制檔案**
**主庫進行以下操作:[root@server4 ~]# cd /var/lib/mysql**
**主庫每次操作都會重新整理以下的檔案**
![這裡寫圖片描述](https://img-blog.csdn.net/20180707105505465?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
**我們在主庫那邊插入一條使用者,主庫的日誌會產生變化**
![這裡寫圖片描述](https://img-blog.csdn.net/20180707105513242?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
**主庫的操作會先同步到relay-log.info,然後再往從庫中複製;**
![這裡寫圖片描述](https://img-blog.csdn.net/20180707105522428?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

####半同步複製技術優化
每次主庫寫檔案的時候都會重新整理檔案,為了減少對IO的消耗,我們可以進行優化,把此檔案改成從庫當中的表;

MySQL5.7 對半同步複製的改進:
通過rpl_semi_sync_master_wait_point引數
有兩種選擇:
AFTER_SYNC (the default): 
master寫每一個事務到binlog並同時傳送給slave,且sync binlog到磁碟。
mater sync完成後,開始等待slave的確認。
確認後,master commit事務到儲存引擎,並返回結果給客戶端,客戶端才可繼續。

AFTER_COMMIT: 
master寫每一個事務到binlog並同時傳送給slave,且sync binlog到磁碟,並且commit事務到儲存引擎裡。
master commit完成後,開始等待slave確認。
確認後,master返回結果給客戶端,客戶端才可繼續。

**並行複製配置與調優**
修改從庫虛擬機器的配置檔案,開啟enhanced multi-threaded slave
[root@server4 mysql]# vim /etc/my.cnf
![這裡寫圖片描述](https://img-blog.csdn.net/20180707125050943?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
前兩行為並行複製,3,4行為優化成為表,最後一行是開啟……
LOGICAL_CLOCK:基於組提交的並行複製方式
slave_parallel_workers=16   執行緒設定為16
引數master_info_repostitory設定為TABLE    效能可以有50%~80%的提升,這是因為並行複製開啟後對於元master.info這個檔案的更新將會大幅提升,資源的競爭也會變大。

寫完之後重新啟動mysql   

此時可以看到下面的表
![這裡寫圖片描述](https://img-blog.csdn.net/20180707125100963?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
剛才的兩個file檔案被存成了表,放在資料庫當中,可以減少對IO的消耗
![這裡寫圖片描述](https://img-blog.csdn.net/20180707125106793?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
檢視剛才主庫存下的表
![這裡寫圖片描述](https://img-blog.csdn.net/20180707125111377?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![這裡寫圖片描述](https://img-blog.csdn.net/20180707125116902?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

###四、組複製,實現讀寫分離
環境:
關閉selinux和防火牆
三臺虛擬機器:
server3:主庫
server4:從庫
server5:代理伺服器
####1.重新開啟一個虛擬機器server5,拷貝一個壓縮包mysql-proxy(需要下載)
![這裡寫圖片描述](https://img-blog.csdn.net/2018070714423749?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
####2.解壓,移動到/usr/local下,建立軟連線
![這裡寫圖片描述](https://img-blog.csdn.net/20180707144241878?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
####3.找到存放lua指令碼的位置,並且編輯rw指令碼
![這裡寫圖片描述](https://img-blog.csdn.net/20180707144247686?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqXzExMTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
**檔案中最小/最大連線數預設為4和8min/max_idle_connections,即連線數達到8臺,會開啟讀寫分離,為了簡單的看到實驗效果,我們將其改成1和2;**
![這裡寫圖片描述](
            
           

相關推薦

MySQL5.7主從複製基於GTID主從複製同步複製同步解析

一、主從複製 1.環境 系統:redhat6.5 防火牆:保持關閉 selinux=disabled mysql主機:server1 172.25.32.4/24 mysql從機:server2 172.25.32.5/24 2.MySQL

mysql主從複製基於GTID主從複製並行複製同步複製

複製方式: 主–從複製(A-B一主一從或者A-BC一主多從) 基於GTID複製 非同步複製 半同步複製 複製原理: Mysql中有一種日誌叫做bin日誌(二進位制日誌)。這個日誌會記錄下所有修改了資料庫的SQL語句 主從複製的原理其實就是把主伺服器上的bin日

運維筆記36 mysql的一主多從模型(原始主從複製基於GTID主從複製

概述: mysql的主從複製是十分經典的一個應用,但是主從之間總會有資料一致性(data consistency )的問題,一般情況從庫會落後主庫幾個小時,而且在傳統一主多從(mysql5.6之前)的模型中當master down掉後,我們不只是需要將一個sl

mysql5.7主從複製基於GTID複製並行複製同步複製

一 最簡單的AB主從複製 MySQL之間資料複製的基礎是二進位制日誌檔案(binary log file)。一臺MySQL資料庫一旦啟用二進位制日誌後,其作為master,它的資料庫中所有操作都會以“事件”的方式記錄在二進位制日誌中,其他資料庫作為slave通

mysql主從複製基於gtid主從複製

MySQL複製原理,其通過三個執行緒來完成,在master節點上執行的binlogdump執行緒以及在slave節點上執行的I/O執行緒和SQL執行緒。 1. master節點上的binlogdump執行緒,在slave與其正常連線的情況下,將binlog傳送到slave上。

mysql主從複製基於GTID主從同步複製並行複製

環境: 實驗環境: rhel6.5 , selinux和iptables均為disabled狀態,mysql均為5.7.17,或者slave比master版本高 實驗主機: 172.25.254.2 server2:master 172.25.254.3 server3:s

MySQL5.7安裝+基於GTID主從複製+並行複製+增強同步複製+讀寫分離+M-S-S架構(聯級複製

實驗環境: Centos7.2 角色 主機IP server_id 資料狀態 Proxysql 192.168.148.62 nul

CentOS6.8下MySQL5.6.40基於GTID主從及多線程復制

GTID 復制 mysql大綱 一 GTID簡介 二 環境準備 三 數據庫的安裝 四 基於GTID主從配置步驟 五 驗證GTID復制功能 一 GTID簡介 GTID(Global Transaction ID)是對於一個已提交事務的編號,並且是一個全局唯一的編號。GTID實際上是由UUID+TID組成的。

mysql 5.7 基於GTID 主從同步的1236故障處理(其它事務故障等同)

其它 top 處理 set tid gtid stop eve 1-1 登錄從庫 stop slave; 查看執行事務 show slave status\G Retrieved_Gtid_Set: ee3bdb44-f6a1-11e7-b194-005056a35fd4

Centos7.5安裝mysql5.7.24二進位制包方式部署(主從複製)

一、環境準備: 作業系統:CentOS Linux release 7.5.1804 (Core) mysql版本:mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz主庫:172.16.8.247從庫:172.16.8.249主機名:172.16.8.247 qas-zab

CentOS7通過yum安裝Mysql5.7+修改預設密碼+遠端登入+主從複製+keepalive高可用

CentOS7通過yum安裝Mysql5.7+修改預設密碼+遠端登入+主從複製+keepalive高可用 環境設定 mysql-mater 192.168.20.51 mysql-slave 192.168.20.52 vip:192.168.20.91 vim /etc/hos

mysql主從複製基於gtid

mysql的主從複製 主伺服器將更新寫入二進位制日誌檔案,並維護檔案的一個索引以跟蹤日誌迴圈。這些日誌可以記錄傳送到從伺服器的更新.當一個從伺服器連線主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主

MySQL主從複製基於GTID及多執行緒

一、Mysql 5.6 複製管理工具 官方下載:http://dev.mysql.com/downloads/tools/utilities/#downloads mysqlreplicate 快速啟動複製 mysqlrplcheck 快速檢查複製環境

Centos7 下Mysql5.7.18的安裝和簡單主從

mysql centos7 安裝 Mysql5.7.18的安裝#下載解壓tar包wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gztar -zxvf mysql-5.

配置MYSQL基於GTID 主從復制詳細解析及步驟

spec sys tran allow ... ext mat mar 安裝 GTID的概念 全局事務標識:global transaction identifiers GTID是一個事務一一對應,並且全局唯一ID GTID在一個服務器上只執行一次,避免重復執行導致數據混

MySQL5.7 傳統復制到GTID復制

gtid當前場景:某些業務場景還未開啟GTID服務組,在最新版本中,BINLOG組提交也基於GTID方式,因此如何檢測是否符合開啟GTID條件,在線切換使用GTID,以及如何快速回滾:gtid_mode參數新選項:MySQL提供兩個額外的選項off_permissive和on_permissive gt

MySQL主從復制與GTID主從復制

楓雨1.主從復制1.1原理 主庫開啟binlog功能並授權從庫連接主庫,從庫通過change master得到主庫的相關同步信息,然後連接主庫進行驗證,主庫IO線程根據從庫slave線程的請求,從master.info開始記錄的位置點向下開始取信息,同時把取到的位置點和最新的位置與binlog信息一同發給從

MySQL5.7.11版本報錯Cannot proceed because system tables used by Event Scheduler were found damaged at server start

解決思路: 1. 在MySQL安裝目錄下執行./mysql_upgrade -uroot -p,此處是為了更新MySQL的系統表,在5.6之前的版本上,更新系統表的命令是mysql_fix_privilege_tables(注意MySQL版本); 2.執行完之後重啟mysql服務  

ubuntu 16.04安裝mysql5.7.17後登入時出現ERROR 1045 (28000): Access denied for user 'root'@'localhost' 問題解決!

一、問題描述     今天,筆者為了練習sql,在ubuntu16.04上安裝了mysql。筆者在網上搜索了在ubuntu16.04安裝mysql的步驟,並跟著步驟一步步操作,然而,讓筆者無法明白的是,網上說在安裝mysql的過程會彈出輸入密碼的視窗,然而筆者在安裝的過程中

linux+mysql5.7安裝時沒有設定登入密碼

如果安裝過程中,沒有設定密碼,輸入$mysql -u root -p,會顯示 ERROR 1698 (28000): Access denied for user 'root'@'localhost' 因此,需要設定root密碼 1.cat /etc/mydql/debi