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