[MGR——Mysql的組復制之多主模式 ] 詳細搭建部署過程
阿新 • • 發佈:2017-07-20
狀態 eve 語句 star mysql命令行 password 是否 集合 功能 組復制可以在兩種模式下運行。
1.在單主模式下,組復制具有自動選主功能,每次只有一個 server成員接受更新。
2.在多主模式下,所有的 server 成員都可以同時接受更新. 組復制與異步主從復制區別.
1.傳統mysql主從復制,是在主節點執行和提交事務,然後把他們異步的發送到從節點,行復制的重新執行主節點的SQL語句,這是一個 shared-nothing 的系統,默認情況下所有 server 成員都有一個完整的數據副本。
2.半同步復制,它在協議中添加了一個同步步驟。 這意味著主節點在提交時需要等待從節點確認它已經接收到事務。只有這樣,主節點才能繼續提交操作。
3.MySQL 組復制實現了基於復制協議的多主更新。
1)復制組由多個 server成員構成,並且組中的每個 server 成員可以獨立地執行事務。但所有讀寫(RW)事務只有在沖突檢測成功後才會提交。只讀(RO)事務不需要在沖突檢測,可以立即提交。
2)換句話說,對於任何 RW 事務,提交操作並不是由始發 server 單向決定的,而是由組來決定是否提交。準確地說,在始發 server 上,當事務準備好提交時,該 server 會廣播寫入值(已改變的行)和對應的寫入集(已更新的行的唯一標識符)。然後會為該事務建立一個全局的順序。最終,這意味著所有 server 成員以相同的順序接收同一組事務。因此,所有 server 成員以相同的順序應用相同的更改,以確保組內一致。
3)組復制使您能夠根據在一組 server 中復制系統的狀態來創建具有冗余的容錯系統。因此,只要它不是全部或多數 server 發生故障,即使有一些 server 故障,系統仍然可用,最多只是性能和可伸縮性降低,但它仍然可用。server 故障是孤立並且獨立的。它們由組成員服務來監控,組成員服務依賴於分布式故障檢測系統,其能夠在任何 server 自願地或由於意外停止而離開組時發出信號。
4)他們是由一個分布式恢復程序來確保當有 server 加入組時,它們會自動更新組信息到最新。並且多主更新確保了即使在單個服務器故障的情況下也不會阻止更新,不必進行 server故障轉移。因此,MySQL 組復制保證數據庫服務持續可用。
5)值得註意的一點是,盡管數據庫服務可用,但當有一個 server 崩潰時,連接到它的客戶端必須定向或故障轉移到不同的 server。
這不是組復制要解決的問題。連接器,負載均衡器,路由器或其他形式的中間件更適合處理這個問題。
總之,MySQL 組復制提供了高可用性,高彈性,可靠的 MySQL 服務。
下面展示,Mysql組復制之多主模式
安裝mysql 5.7.18
在三臺db服務器上面設置/etc/hosts映射,如下:
cat /etc/hosts
192.168.1.88 mgr88
192.168.1.89 mgr89
192.168.1.90 mgr90
server*:
組內每臺主機,都需要先安裝組復制插件.否則會導致啟動失敗.
mysql>INSTALL PLUGIN group_replication SONAME ‘group_replication.so‘;
server* (88,89,90)
server88: mysql>SET GLOBAL group_replication_bootstrap_group=ON; #這句只有server88,在第一次執行引導組的時候執行. mysql>GRANT REPLICATION SLAVE ON *.* TO [email protected]%‘ IDENTIFIED BY ‘repl‘; Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CHANGE MASTER TO MASTER_USER=‘repl‘,MASTER_PASSWORD=‘repl‘ FOR CHANNEL ‘group_replication_recovery‘;
Query OK, 0 rows affected, 2 warnings (0.27 sec)
mysql> set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,192.168.1.0/24";
Query OK, 0 rows affected (0.00 sec)
mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (1.32 sec)
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 715e9af4-6c93-11e7-aabf-000c291abb1f | mgr88 | 3306 | ONLINE +---------------------------+--------------------------------------+-------------+-------------+--------------+ 1 row in set (0.05 sec)
配置 group_replication_recovery 通道的恢復憑據 server 89,90: mysql> CHANGE MASTER TO MASTER_USER=‘repl‘,MASTER_PASSWORD=‘repl‘ FOR CHANNEL ‘group_replication_recovery‘;
Query OK, 0 rows affected, 2 warnings (0.56 sec)
mysql> set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,192.168.1.0/24";
Query OK, 0 rows affected (0.01 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.02 sec)
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 715e9af4-6c93-11e7-aabf-000c291abb1f | mgr88 | 3306 | ONLINE | group_replication_applier | f308d2d6-6c93-11e7-a5b1-000c2979c7bf | mgr90 | 3306 | ONLINE | group_replication_applier | f39c169e-6c93-11e7-a550-000c291d7bdb | mgr89 | 3306 | ONLINE +---------------------------+--------------------------------------+-------------+-------------+--------------+ 3 rows in set (0.00 sec)
檢驗 1: server88、89、90(分別創建test1、test2和test3,t1、t2、t3測試)
mysql> create database test;
Query OK, 1 row affected (0.15 sec)
mysql> use test;
Database changed mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 varchar(20)); Query OK, 0 rows affected (0.94 sec)
mysql> INSERT INTO t1 VALUES (1, ‘lalala‘);
Query OK, 1 row affected (0.46 sec)
mysql> select * from t1;
+----+--------+
| c1 | c2 |
+----+--------+
| 1 | lalala |
+----+--------+
1 row in set (0.00 sec) 在server89,90 可以看見組復制,同步過來的數 可以在performance_schema中看見組成員
排錯
1:沒有設置白名單網段:需要添加自己所在網段.
報錯:‘[GCS] The member is leaving a group without being on one.‘ 解決:set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,192.168.1.0/24"; START GROUP_REPLICATION; 2:ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.1 解決方案: 根據提示打開group_replication_allow_local_disjoint_gtids_join選項,mysql命令行執行: mysql> set global group_replication_allow_local_disjoint_gtids_join=ON; 再次啟動組復制 mysql> START GROUP_REPLICATION;
1.在單主模式下,組復制具有自動選主功能,每次只有一個 server成員接受更新。
2.在多主模式下,所有的 server 成員都可以同時接受更新. 組復制與異步主從復制區別.
1.傳統mysql主從復制,是在主節點執行和提交事務,然後把他們異步的發送到從節點,行復制的重新執行主節點的SQL語句,這是一個 shared-nothing 的系統,默認情況下所有 server 成員都有一個完整的數據副本。
2.半同步復制,它在協議中添加了一個同步步驟。 這意味著主節點在提交時需要等待從節點確認它已經接收到事務。只有這樣,主節點才能繼續提交操作。
3.MySQL 組復制實現了基於復制協議的多主更新。
1)復制組由多個 server成員構成,並且組中的每個 server 成員可以獨立地執行事務。但所有讀寫(RW)事務只有在沖突檢測成功後才會提交。只讀(RO)事務不需要在沖突檢測,可以立即提交。
2)換句話說,對於任何 RW 事務,提交操作並不是由始發 server 單向決定的,而是由組來決定是否提交。準確地說,在始發 server 上,當事務準備好提交時,該 server 會廣播寫入值(已改變的行)和對應的寫入集(已更新的行的唯一標識符)。然後會為該事務建立一個全局的順序。最終,這意味著所有 server 成員以相同的順序接收同一組事務。因此,所有 server 成員以相同的順序應用相同的更改,以確保組內一致。
3)組復制使您能夠根據在一組 server 中復制系統的狀態來創建具有冗余的容錯系統。因此,只要它不是全部或多數 server 發生故障,即使有一些 server 故障,系統仍然可用,最多只是性能和可伸縮性降低,但它仍然可用。server 故障是孤立並且獨立的。它們由組成員服務來監控,組成員服務依賴於分布式故障檢測系統,其能夠在任何 server 自願地或由於意外停止而離開組時發出信號。
4)他們是由一個分布式恢復程序來確保當有 server 加入組時,它們會自動更新組信息到最新。並且多主更新確保了即使在單個服務器故障的情況下也不會阻止更新,不必進行 server故障轉移。因此,MySQL 組復制保證數據庫服務持續可用。
5)值得註意的一點是,盡管數據庫服務可用,但當有一個 server 崩潰時,連接到它的客戶端必須定向或故障轉移到不同的 server。
這不是組復制要解決的問題。連接器,負載均衡器,路由器或其他形式的中間件更適合處理這個問題。
MGR的限制 僅支持InnoDB表,並且每張表一定要有一個主鍵,用於做write set的沖突檢測; 必須打開GTID特性,二進制日誌格式必須設置為ROW,用於選主與write set COMMIT可能會導致失敗,類似於快照事務隔離級別的失敗場景 目前一個MGR集群最多支持9個節點 不支持外鍵於save point特性,無法做全局間的約束檢測與部分部分回滾 二進制日誌不支持binlog event checksum
下面展示,Mysql組復制之多主模式
server*:
組內每臺主機,都需要先安裝組復制插件.否則會導致啟動失敗.
mysql>INSTALL PLUGIN group_replication SONAME ‘group_replication.so‘;
server* (88,89,90)
[client] port = 3306 socket = /usr/local/mysql/tmp/mysql.sock [mysqld] port = 3306 socket = /usr/local/mysql/tmp/mysql.sock back_log = 80 basedir = /usr/local/mysql tmpdir = /tmp datadir = /usr/local/mysql/data #-------------------gobal variables------------# gtid_mode = ON enforce_gtid_consistency = ON master_info_repository = TABLE relay_log_info_repository = TABLE binlog_checksum = NONE log_slave_updates = ON log-bin = /usr/local/mysql/log/mysql-bin transaction_write_set_extraction = XXHASH64 #以便在server收集寫集合的同時將其記錄到二進制日誌。寫集合基於每行的主鍵,並且是行更改後的唯一標識此標識將用於檢測沖突。 loose-group_replication_group_name = ‘ce9be252-2b71-11e6-b8f4-00212889f856‘ #組的名字可以隨便起,但不能用主機的GTID loose-group_replication_start_on_boot = off #為了避免每次啟動自動引導具有相同名稱的第二個組,所以設置為OFF。 loose-group_replication_bootstrap_group = off #同上 loose-group_replication_local_address = ‘192.168.1.88:33061‘ #寫自己主機所在IP loose-group_replication_group_seeds =‘192.168.1.88:33061,192.168.1.89:33061,192.168.1.90:33061‘ loose-group_replication_single_primary_mode = off #關閉單主模式的參數 loose-group_replication_enforce_update_everywhere_checks = on #開啟多主模式的參數 max_connect_errors = 20000 max_connections = 2000 wait_timeout = 3600 interactive_timeout = 3600 net_read_timeout = 3600 net_write_timeout = 3600 table_open_cache = 1024 table_definition_cache = 1024 thread_cache_size = 512 open_files_limit = 10000 character-set-server = utf8 collation-server = utf8_bin skip_external_locking performance_schema = 1 user = mysql myisam_recover_options = DEFAULT skip-name-resolve local_infile = 0 lower_case_table_names = 0 #--------------------innoDB------------# innodb_buffer_pool_size = 2000M innodb_data_file_path = ibdata1:200M:autoextend innodb_flush_log_at_trx_commit = 1 innodb_io_capacity = 600 innodb_lock_wait_timeout = 120 innodb_log_buffer_size = 8M innodb_log_file_size = 200M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 85 innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_support_xa = 1 innodb_thread_concurrency = 32 innodb_file_per_table innodb_rollback_on_timeout #------------session variables-------# join_buffer_size = 8M key_buffer_size = 256M bulk_insert_buffer_size = 8M max_heap_table_size = 96M tmp_table_size = 96M read_buffer_size = 8M sort_buffer_size = 2M max_allowed_packet = 64M read_rnd_buffer_size = 32M #------------MySQL Log----------------# log-bin = my3306-bin binlog_format = row #組復制依賴基於行的復制格式 sync_binlog = 1 expire_logs_days = 15 max_binlog_cache_size = 128M max_binlog_size = 500M binlog_cache_size = 64k slow_query_log log-slow-admin-statements log_warnings = 1 long_query_time = 0.25 #---------------replicate--------------# relay-log-index = relay3306.index relay-log = relay3306 server-id =88 #每個db的id唯一 init_slave = ‘set sql_mode=STRICT_ALL_TABLES‘ log-slave-updates [myisamchk] key_buffer = 512M sort_buffer_size = 512M read_buffer = 8M write_buffer = 8M [mysqlhotcopy] interactive-timeout [mysqld_safe] open-files-limit = 8192 log-error = /usr/local/mysql/log/mysqld_error.logmy.cnf
server88: mysql>SET GLOBAL group_replication_bootstrap_group=ON; #這句只有server88,在第一次執行引導組的時候執行. mysql>GRANT REPLICATION SLAVE ON *.* TO [email protected]%‘ IDENTIFIED BY ‘repl‘; Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CHANGE MASTER TO MASTER_USER=‘repl‘,MASTER_PASSWORD=‘repl‘ FOR CHANNEL ‘group_replication_recovery‘;
Query OK, 0 rows affected, 2 warnings (0.27 sec)
mysql> set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,192.168.1.0/24";
Query OK, 0 rows affected (0.00 sec)
mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (1.32 sec)
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 715e9af4-6c93-11e7-aabf-000c291abb1f | mgr88 | 3306 | ONLINE +---------------------------+--------------------------------------+-------------+-------------+--------------+ 1 row in set (0.05 sec)
配置 group_replication_recovery 通道的恢復憑據 server 89,90: mysql> CHANGE MASTER TO MASTER_USER=‘repl‘,MASTER_PASSWORD=‘repl‘ FOR CHANNEL ‘group_replication_recovery‘;
Query OK, 0 rows affected, 2 warnings (0.56 sec)
mysql> set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,192.168.1.0/24";
Query OK, 0 rows affected (0.01 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.02 sec)
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 715e9af4-6c93-11e7-aabf-000c291abb1f | mgr88 | 3306 | ONLINE | group_replication_applier | f308d2d6-6c93-11e7-a5b1-000c2979c7bf | mgr90 | 3306 | ONLINE | group_replication_applier | f39c169e-6c93-11e7-a550-000c291d7bdb | mgr89 | 3306 | ONLINE +---------------------------+--------------------------------------+-------------+-------------+--------------+ 3 rows in set (0.00 sec)
檢驗 1: server88、89、90(分別創建test1、test2和test3,t1、t2、t3測試)
mysql> create database test;
Query OK, 1 row affected (0.15 sec)
mysql> use test;
Database changed mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 varchar(20)); Query OK, 0 rows affected (0.94 sec)
mysql> INSERT INTO t1 VALUES (1, ‘lalala‘);
Query OK, 1 row affected (0.46 sec)
mysql> select * from t1;
+----+--------+
| c1 | c2 |
+----+--------+
| 1 | lalala |
+----+--------+
1 row in set (0.00 sec) 在server89,90 可以看見組復制,同步過來的數 可以在performance_schema中看見組成員
2:模擬宕機一個節點驗證
(1)關閉88的數據庫實例
(2)在89節點操作
查詢組成員,發現88已不在組中
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | f308d2d6-6c93-11e7-a5b1-000c2979c7bf | mgr90 | 3306 | ONLINE |
| group_replication_applier | f39c169e-6c93-11e7-a550-000c291d7bdb | mgr89 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)
(3)寫入數據
mysql> insert into t1 values(2,‘Mr.Li‘);
Query OK, 1 row affected (0.02 sec)
mysql> select * from t1;
+----+----------+
| c1 | c2 |
+----+----------+
| 1 | lalala |
| 2 | Mr.Li | +----+----------+ 5 rows in set (0.00 sec) (4)啟動88的數據庫 修改配置文件,自動啟動組復制 loose-group_replication_start_on_boot = on group_replication_allow_local_disjoint_gtids_join = on (5)再次查看組成員,發現88已重新加入組 mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 715e9af4-6c93-11e7-aabf-000c291abb1f | mgr88 | 3306 | ONLINE | | group_replication_applier | f308d2d6-6c93-11e7-a5b1-000c2979c7bf | mgr90 | 3306 | ONLINE | | group_replication_applier | f39c169e-6c93-11e7-a550-000c291d7bdb | mgr89 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 3 rows in set (0.00 sec) (6)查看數據,發現數據已同步 mysql> use test1; 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 t1; +----+----------+ | c1 | c2 | +----+----------+ | 1 | lalala | | 2 | Mr.Li | +----+----------+ 5 rows in set (0.00 sec) |
1:沒有設置白名單網段:需要添加自己所在網段.
報錯:‘[GCS] The member is leaving a group without being on one.‘ 解決:set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,192.168.1.0/24"; START GROUP_REPLICATION; 2:ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.1 解決方案: 根據提示打開group_replication_allow_local_disjoint_gtids_join選項,mysql命令行執行: mysql> set global group_replication_allow_local_disjoint_gtids_join=ON; 再次啟動組復制 mysql> START GROUP_REPLICATION;
[MGR——Mysql的組復制之多主模式 ] 詳細搭建部署過程