[MGR-Mysql的組複製集羣]詳細搭建部署過程

[MGR-Mysql的組複製集羣]詳細搭建部署過程
1,關於MySQL Group Replication
 
基於組的複製(Group-basedReplication)是一種被使用在容錯系統中的技術。Replication-group(複製組)是由能夠相互通信的多個服務器(節點)組成的。
 
在通信層,Groupreplication實現了一系列的機制:比如原子消息(atomicmessage delivery)和全序化消息(totalorderingof messages)。
 
這些原子化,抽象化的機制,爲實現更先進的數據庫複製方案提供了強有力的支持。
  
MySQL Group Replication正是基於這些技術和概念,實現了一種多主全更新的複製協議。

簡而言之,一個Replication-group就是一組節點,每個節點都可以獨立執行事務,而讀寫事務則會在於group內的其他節點進行協調之後再commit。
 
因此,當一個事務準備提交時,會自動在group內進行原子性的廣播,告知其他節點變更了什麼內容/執行了什麼事務。
 
這種原子廣播的方式,使得這個事務在每一個節點上都保持着同樣順序。
 
這意味着每一個節點都以同樣的順序,接收到了同樣的事務日誌,所以每一個節點以同樣的順序重演了這些事務日誌,最終整個group保持了完全一致的狀態。
 
然而,不同的節點上執行的事務之間有可能存在資源爭用。這種現象容易出現在兩個不同的併發事務上。
 
假設在不同的節點上有兩個併發事務,更新了同一行數據,那麼就會發生資源爭用。
 
面對這種情況,GroupReplication判定先提交的事務爲有效事務,會在整個group裏面重演,後提交的事務會直接中斷,或者回滾,最後丟棄掉。
 
因此,這也是一個無共享的複製方案,每一個節點都保存了完整的數據副本。這個複製方案,在某種程度上,和數據庫狀態機(DBSM)的Replication方法比較類似。
 
 MGR的限制
僅支持InnoDB表,並且每張表一定要有一個主鍵,用於做write set的衝突檢測;
必須打開GTID特性,二進制日誌格式必須設置爲ROW,用於選主與write set
COMMIT可能會導致失敗,類似於快照事務隔離級別的失敗場景
目前一個MGR集羣最多支持9個節點
不支持外鍵於save point特性,無法做全局間的約束檢測與部分部分回滾
二進制日誌不支持binlog event checksum
 

2,安裝mysql 5.7.18
 
在三臺db服務器上面設置/etc/hosts映射,如下:
 
192.168.117.129  mgr1
192.168.117.130  mgr2
192.168.117.131  mgr3
 
安裝的數據庫服務器:

在每個節點上執行安裝:

1、下載二進制軟件包:
  mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

2、添加MySQL用戶和組:
  [root@localhost ~]# userdel mysql  (因爲是新系統,所以就把現有的MySQL用戶給刪除了)
  [root@localhost ~]# groupadd mysql
  [root@localhost ~]# useradd -g mysql mysql
  [root@localhost ~]# passwd mysql     (MySQL密碼要設置的複雜一點,或者在創建用戶的時候設置不讓登陸系統)

3、創建安裝MySQL目標,並解壓軟件到指定目錄
  [root@localhost ~]# mkdir -p /data/mysql/db_file  在mysql 下創建bin_log  relay_log(從節點) log 目錄
  [root@localhost ~]# chown -R mysql:mysql /data
  [root@localhost ~]# tar -xvf  mysql-5.7.18-linux-glibc2.5-x86_64 
  [root@localhost ~]# mv mysql-5.7.18-linux-glibc2.5-x86_64/ /usr/local/mysql
  [root@localhost ~]# chown -R mysql:mysql /usr/local/mysql

4、切換MySQL用戶,並初始化數據庫
  [root@localhost ~]# su - mysql
  [mysql@localhost ~]$/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/db_file/

my.cnf的詳細配置:

[root@localhost ~]# cat /etc/my.cnf 
[client]
port = 3306
socket = /tmp/mysql.sock
 
[mysqld]
port = 3306
socket = /tmp/mysql.sock
back_log = 80
basedir = /usr/local/mysql
datadir = /data/mysql/db_file
#skip-grant-tables
#-------------------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
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.117.129:33061'
loose-group_replication_group_seeds ='192.168.117.133:33061,192.168.117.129:33061,192.168.117.130:33061'
loose-group_replication_bootstrap_group = off
loose-group_replication_single_primary_mode = true (單主:true 多主:false)
loose-group_replication_enforce_update_everywhere_checks = false
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 = 512M
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 = 128M
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 = /data/mysql/bin_log/mysql-bin3306
binlog_format = row
sync_binlog = 1
expire_logs_days = 15
max_binlog_cache_size = 128M
max_binlog_size = 256M
binlog_cache_size = 64k
slow_query_log
log-slow-admin-statements
log_warnings = 1
long_query_time = 2
 
#---------------replicate--------------#
relay_log = /data/mysql/bin_log/relay_bin
server-id = 1
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 = /data/mysql/log/mysqld_error.log


複製代碼
注意每個節點的server_id、loose-group_replication_local_address、loose-group_replication_group_seeds都配置成自己的相印的參數
 


[mysql@localhost ~]$ /usr/local/mysql/support-files/mysql.server start 
[mysql@localhost ~]$ /usr/local/mysql/bin/mysqld_safe --defaults-file=/ect/my.cnf  --user=mysql & (效果一樣)

6、進入數據庫檢查:
[mysql@localhost ~]$  /usr/local/mysql/bin/mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.18-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, 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> set password='root';  (因爲剛纔使用的密碼是個默認的登錄密碼,所以我們要修改)
mysql> flush privileges;

然後再重新登錄MySQL即可,進行檢查

3,創建複製環境
 
在mgr1/mgr2/mgr3上建立複製賬號:
 
mysql>  GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'repl';   
 
 
4,安裝group replication插件
 
在mgr1、mgr2、mgr3上依次安裝group replication插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';  
 
 
5,配置group replication參數
 
確保binlog_format是row格式。
mysql> show variables like 'binlog_format';                                              
+---------------+-------+  
| Variable_name | Value |  
+---------------+-------+  
| binlog_format | ROW   |  
+---------------+-------+  
1 row in set (0.00 sec)  
   
配置文件配置

(1)  mgr1上的my.cnf配置:

server-id=20

transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off (單主時作爲主節點,建議修改爲on,以後重啓不用在set)
loose-group_replication_local_address = '192.168.117.129:33061'
loose-group_replication_group_seeds ='192.168.117.133:33061,192.168.117.129:33061,192.168.117.130:33061'
loose-group_replication_bootstrap_group = off
loose-group_replication_single_primary_mode = true (單主:true 多主:false)
loose-group_replication_enforce_update_everywhere_checks = false

 
(2)mgr2上的my.cnf配置:

server-id=21
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = "ce9be252-2b71-11e6-b8f4-00212844f856"
loose-group_replication_start_on_boot = off

loose-group_replication_local_address = '192.168.117.129:33061'
loose-group_replication_group_seeds ='192.168.117.133:33061,192.168.117.129:33061,192.168.117.130:33061'
loose-group_replication_bootstrap_group = off
loose-group_replication_single_primary_mode = true (單主:true 多主:false)
loose-group_replication_enforce_update_everywhere_checks = false


(3)mgr3上的my.cnf配置:

server-id=22
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = "ce9be252-2b71-11e6-b8f4-00212844f856"
loose-group_replication_start_on_boot = off

loose-group_replication_local_address = '192.168.117.129:33061'
loose-group_replication_group_seeds ='192.168.117.133:33061,192.168.117.129:33061,192.168.117.130:33061'
loose-group_replication_bootstrap_group = off
loose-group_replication_single_primary_mode = true (單主:true 多主:false)
loose-group_replication_enforce_update_everywhere_checks = false
 
 
配置完後,重啓3個db上的mysql服務
 
 
6,啓動mgr集羣
 
開始構建group replication集羣,通常操作命令
在mgr1、mgr2、mgr3上依次執行
mysql>  CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';  
Query OK, 0 rows affected, 2 warnings (0.02 sec)  
 
mgr1上建立基本主庫master庫:
# 設置group_replication_bootstrap_group爲ON是爲了標示以後加入集羣的服務器以這臺服務器爲基準,以後加入的就不需要設置。  
mysql> SET GLOBAL group_replication_bootstrap_group = ON;  
Query OK, 0 rows affected (0.00 sec)  
   
mysql>  START GROUP_REPLICATION;  
Query OK, 0 rows affected (1.03 sec)  
   
mysql> select * from performance_schema.replication_group_members; 

 
 
mgr2上啓動group_replication: 
mgr2上mysql命令行上執行啓動:
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON; (該參數也可以直接寫入my.cnf)
 
mysql> start group_replication;
 
mysql> select * from performance_schema.replication_group_members;

 
mgr3上啓動group_replication:
-- mgr3命令行上執行:  
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;  (該參數也可以直接寫入my.cnf)
   
mysql> start group_replication;  
   
-- 再去master庫mgr1上,查看group_replication成員,會有mgr3的顯示,而且已經是ONLINE了  
mysql> select * from performance_schema.replication_group_members;

   
 
最後查看集羣狀態,都爲ONLINE就表示OK:
mysql> select * from performance_schema.replication_group_members;  

    
 
7,驗證集羣複製功能
 
查看那個是主節點
mysql> select variable_value from performance_schema.global_status where variable_name="group_replication_primary_member";

 
在master庫mgr1上建立測試庫mgr1,測試表t1,錄入一條數據
mysql> create database mgr1;  
Query OK, 1 row affected (0.00 sec)  
   
mysql> create table mgr1.t1(id int,cn varchar(32));  
Query OK, 0 rows affected (0.02 sec)  
   
mysql> insert into t1(id,cn)values(1,'a');  
ERROR 3098 (HY000): The table does notcomply with the requirements by an external plugin.   
-- # 這裏原因是group_replaction環境下面,表必須有主鍵不然不允許往裏insert值。所以修改表t1,將id字段設置程主鍵即可。  
mysql> alter table t1 add primary key(id); 
   
mysql> insert into t1(id,cn)values(1,'a');    
 
 
去mgr2/mgr3上可以看到數據已經同步過去
mysql> select * from mgr1.t1;  
+----+------+  
| id | cn  |  
+----+------+  
|  1| a    |  
+----+------+  
1 row in set (0.00 sec)  
   
 
然後在mgr2/mgr3上執行inert操作,則拒絕,因爲mgr2、mgr3爲readonly
mysql> insert into t1 select 2,'b';  
ERROR 1290 (HY000): The MySQL server isrunning with the --super-read-only option so it cannot execute this statement  
 
 
8,問題記錄
 
8.1問題記錄一
 
MySQL窗口報錯:
 
ERROR 3092 (HY000): The server is notconfigured properly to be an active member of the group. Please see moredetails on error log.
 
後臺ERROR LOG報錯:
 
[ERROR] Plugin group_replication reported:'This member has more executed transactions than those present in the group.Local transactions: f16f7f74-c283-11e6-ae37-fa163ee40410:1 > Grouptransactions: 3c992270-c282-11e6-93bf-fa163ee40410:1,
 
 aaaaaa:1-5'
 
 [ERROR]Plugin group_replication reported: 'The member contains transactions notpresent in the group. The member will now exit the group.'
 
 [Note] Plugin group_replication reported: 'Toforce this member into the group you can use the group_replication_allow_local_disjoint_gtids_joinoption'
 
 
 
【解決辦法】:
 
根據提示打開group_replication_allow_local_disjoint_gtids_join選項,mysql命令行執行:
 
mysql> set globalgroup_replication_allow_local_disjoint_gtids_join=ON;
 
 
 
再執行開啓組複製:
 
mysql> start group_replication;
 
Query OK, 0 rows affected (7.89 sec)
 
 
8.2 問題記錄二RECOVERING  
 
在mgr1上查詢集羣組成員
mysql> SELECT * FROM performance_schema.replication_group_members;  
+---------------------------+--------------------------------------+----------------------+-------------+--------------+  
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST          | MEMBER_PORT | MEMBER_STATE |  
+---------------------------+--------------------------------------+----------------------+-------------+--------------+  
| group_replication_applier | 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c  |  |         3306 | ONLINE        
| group_replication_applier | ef8ac2de-d671-11e6-9ba4-18a99b763071 |  |        3306 | RECOVERING   |  
| group_replication_applier | fdf2b02e-d66f-11e6-98a8-18a99b76310d  |  |        3306 | RECOVERING   |  
+---------------------------+--------------------------------------+----------------------+-------------+--------------+  
3 rows in set (0.00 sec) 
 
 
【解決辦法】:
 
看報錯[ERROR] Slave I/O for channel'group_replication_recovery': error connecting to master 'repl@:3306'- retry-time: 60  retries: 1, Error_code:2005,連接master庫不上,所以問題在這裏,我們賦予的複製賬號是ip的repl@'192.168.%',所以還需要做一個hostname()和mgr1的ip地址192.168.1.20的映射關係。
 
 
 
建立hostname和ip映射
vim /etc/hosts  
192.168.1.20 mgr1                                             
192.168.1.21 mgr2   
192.168.1.22 mgr3   
 
然後在mgr2上執行如下命令後重新開啓group_replication即可。
mysql> stop group_replication;  
Query OK, 0 rows affected (0.02 sec)                                                   
   
mysql> start group_replication;  
Query OK, 0 rows affected (5.68 sec)  
   
 
再去master庫mgr1上,查看group_replication成員,會有mgr2的顯示
mysql>  SELECT * FROM performance_schema.replication_group_members;  
+---------------------------+--------------------------------------+----------------------+-------------+--------------+  
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST          | MEMBER_PORT | MEMBER_STATE 
+---------------------------+--------------------------------------+----------------------+-------------+--------------+  
| group_replication_applier | 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c |  |        3306 | ONLINE        
| group_replication_applier | fdf2b02e-d66f-11e6-98a8-18a99b76310d |           |        3306 | ONLINE       |  
+---------------------------+--------------------------------------+----------------------+-------------+--------------+  
2 rows in set (0.00 sec)  
   
 
 
8.3問題記錄三
 
操作問題
 
 
mysql> START GROUP_REPLICATION;
 
ERROR 3092 (HY000): The server is notconfigured properly to be an active member of the group. Please see moredetails on error log.
 
 
【解決辦法】:
 
mysql> SET GLOBALgroup_replication_bootstrap_group = ON;
 
mysql> START GROUP_REPLICATION;
 
9,日常維護步驟:
 
1、如果從庫某一節點關閉
 
    stop group_replication;
 
2、如果所有的庫都關閉後,第一個庫作爲主庫首先執行
 
    set global group_replication_bootstrap_group=ON;
 
    start group_replication;
 
剩下的庫直接執行即可!
 
    start group_replication;
 
3、如果主庫故障,會自動從兩個從庫選出一個主庫,主庫啓動後再次執行如下命令後會變成從庫
 
    start group_replication;


重點參數詳解

 

MGR一定要開啓GTID功能gtid_mode = ON,enforce_gtid_consistency = ON

MGR在當前MySQL版本中,必須要設置binlog_checksum=none,並且binlog_format=row

MGR需要多源複製功能,所以需要將主從庫之間的信息記錄到表中。設置master_info_repository = TABLE和relay_log_info_repository = TABLE

MGR中開啓主鍵信息採集功能:

transaction_write_set_extraction= XXHASH64

MGR中需要設置組的名字,該group_replication_group_name是通過select uuid()來生成的。

MGR中本地成員的地址由該參數group_replication_local_address決定,本例中當前節點是node2。後面的端口是每個節點都需要一個獨立的TCP端口號,節點之間通過這個端口號進行通信。

MGR中其他成員的地址由這個參數group_replication_group_seeds決定

MGR採取多主模式時,需要讓該參數:

group_replication_single_primary_mode=off(默認是單主模式)。

於此同時,還需要將該參數:group_replication_enforce_update_everywhere_checks=true,目的則是爲了做多主模式限制檢測。

 

注:加載到參數文件裏面,需要在每個參數的前面加loose。

 

這裏再強調一個參數:group_replication_auto_increment_increment

該參數代表自增屬性,默認值爲7。我們要保證每個成員的該值相同,並且建議該參數的設置儘量比組內成員的個數大一些,方便後期集羣的擴展。

該文章是我在參考網上資料後,自己部署時實際情況,優化了參數

如有問題探討,請加QQ羣:695182221

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章