1、原起:html
以前也有寫過mysql-group-replication (mgr) 相關的文章、那時也沒有什麼特別的動力要寫好它、主要是由於在mysql
mysql-5.7.20 以前的版本的mgr都有着各類各樣的問題、感受像是一個半成品、可是5.7.20這個版本的mgr已經基本linux
可用了。因此接下來打算把整個mgr系列寫完。git
2、mysql-group-replication 安裝環境規劃:github
主名 ip地址 在mgr中的角色sql
mtls17 10.186.19.17 primary數據庫
mtls18 10.186.19.18 secondebootstrap
mtls19 10.186.19.19 secondeapp
也就是說我打算在mtls17\18\19這三臺主機上安裝一套mgr數據集羣環境、我打算用mtls17主機作主庫(primary)socket
另外兩臺主機作從庫(seconde)
別外、還有一件事我想了好久、就是要不要不mysql的安裝過程也加到博客裏面、若是加的話就會顯得博客特別長、
沒有辦法凸出重點;但是若是隻寫mgr相關內容的話、一來讀者可能不必定能把環境搭建起來、二來影響博客的質量
思量再三仍是決定把mysql安裝的相應步驟寫進來。
3、下載mysql-5.7.20社區版:
因爲三臺機器上都要安裝、下面的命令要在三臺主機上執行
cd /tmp/ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
4、安裝mysql:
因爲三臺主機上都要安裝、下面的命令要在三臺主機上執行
cd /tmp/ tar -xvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ cd /usr/local/ ln -s mysql-5.7.20-linux-glibc2.12-x86_64 mysql
注意這裏並無完成mysql的安裝、更準確的說、這裏只是把mysql安裝包解壓到了/usr/local而已 。要完成mysql
的安裝還有一系列的步驟。
5、建立mysql數據目錄 與 增長系統用戶mysql:
因爲三臺主機上都要安裝、下面的命令要在三臺主機上執行
mkdir -p /database/mysql/data/3306 useradd mysql chown -R mysql:mysql /database/mysql/data/3306 chown -R mysql:mysql /usr/local/mysql*
6、增長mysql的配置文件:
因爲三臺主機上都要安裝、因此每臺主機上都要加
touch /etc/my.cnf
一、mtls17的配置文件內容以下
[mysqld] basedir=/usr/local/mysql/ datadir=/database/mysql/data/3306 port=3306 socket=/tmp/mysql.sock server_id=17 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=mysql-bin binlog_format=row transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address= "10.186.19.17:33060" loose-group_replication_group_seeds= "10.186.19.17:33060,10.186.19.18:33060,10.186.19.19:33060" loose-group_replication_bootstrap_group= off
二、mtls18的配置文件的內容以下
[mysqld] basedir=/usr/local/mysql/ datadir=/database/mysql/data/3306 port=3306 socket=/tmp/mysql.sock server_id=18 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=mysql-bin binlog_format=row transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address= "10.186.19.18:33060" loose-group_replication_group_seeds= "10.186.19.17:33060,10.186.19.18:33060,10.186.19.19:33060" loose-group_replication_bootstrap_group= off
三、mtls19的配置文件以下
[mysqld] basedir=/usr/local/mysql/ datadir=/database/mysql/data/3306 port=3306 socket=/tmp/mysql.sock server_id=19 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=mysql-bin binlog_format=row transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address= "10.186.19.19:33060" loose-group_replication_group_seeds= "10.186.19.17:33060,10.186.19.18:33060,10.186.19.19:33060" loose-group_replication_bootstrap_group= off
在這裏有一些技術細節要說明一下:
上面的三個配置文件省略了全部沒必要要的配置項、可是看起來仍是有點多、這些都是mgr環境要求的。
server_id 每一個實例都要不要樣
loose-group_replication_group_name:爲mgr高可用組起一個名字,這個名字必定要是uuid格式的。
loose-group_replication_local_address:mgr各實例以前都是要進行通訊的、這個配置項設置的就是本
實例所監聽的ip:端口
loose-group_replication_group_seeds:各mgr實例所監聽的ip:端口信息
7、初始化mysql數據庫:
這個在三臺主機上都要執行
cd /usr/local/mysql/ ./bin/mysqld --defaults-file=/etc/my.cnf --datadir=/database/mysql/data/3306/ --user=mysql --initialize-insecure
8、配置mysql與systemd結合:
在redhat-7.x 與服務啓動相關的腳本、不在是以前的/etc/init.d/目錄的下腳本。而是一個/usr/lib/systemd/system/目錄
下配置文件。因爲三臺主機上的mysql都要開機啓動、因此三臺主機上都要執行以下的操做。
一、增長systemd相關的配置文件/usr/lib/systemd/system/mysql.service
touch /usr/lib/systemd/system/mysql.service
mysql.service 的內容以下
[Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf #LimitNOFILE = 5000 #Restart=on-failure #RestartPreventExitStatus=1
二、設置mysql開機啓動
systemctl enable mysql
三、若是你使用的是redhat-6.x 那麼上面的兩步能夠用如下命令來完成
#配置開機啓動 cd /usr/local/mysql/ cp support-files/mysql.server /etc/init.d/mysqld chkconfig mysqld on #啓動mysql服務 service mysqld start
9、啓動mysql:
systemctl start mysql
10、爲了方便使用從新設置一下PATH環境變量:
echo 'PATH=/usr/local/mysql/bin/:$PATH' >>/etc/profile source /etc/profile
11、配置mgr的第一個結點:
mgr中全部的結點都屬於一個邏輯上的組、這個組就像是QQ羣同樣、是由羣主建起來的、有了這個上組以後、
其它的結點就能夠加入到這個組中來了。 mtls17來建羣
如下步驟在mtls17主機上的mysql中執行
第一步:建立用於複製的用戶
set sql_log_bin=0; create user mgruser@'%' identified by 'mtls@352'; grant replication slave,replication client on *.* to mgruser@'%'; create user mgruser@'127.0.0.1' identified by 'mtls@352'; grant replication slave,replication client on *.* to mgruser@'127.0.0.1'; create user mgruser@'localhost' identified by 'mtls@352'; grant replication slave,replication client on *.* to mgruser@'localhost'; set sql_log_bin=1;
第二步:配置複製所使用的用戶
change master to master_user='mgruser', master_password='mtls@352' for channel 'group_replication_recovery';
第三步:安裝mysql group replication 這個插件
install plugin group_replication soname 'group_replication.so';
第四步:建個羣(官方點的說法就是初始化一個複製組)
set global group_replication_bootstrap_group=on; start group_replication; set global group_replication_bootstrap_group=off;
如下是我完成這四步的過程:
[root@mtls17 mysql]# mysql -uroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20-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 sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'%' identified by 'mtls@352'; Query OK, 0 rows affected (0.01 sec) mysql> grant replication slave,replication client on *.* to mgruser@'%'; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'127.0.0.1' identified by 'mtls@352'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave,replication client on *.* to mgruser@'127.0.0.1'; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'localhost' identified by 'mtls@352'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave,replication client on *.* to mgruser@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> set sql_log_bin=1; Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> change master to -> master_user='mgruser', -> master_password='mtls@352' -> for channel 'group_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.10 sec) mysql> mysql> mysql> install plugin group_replication soname 'group_replication.so'; Query OK, 0 rows affected (0.01 sec) mysql> mysql> 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 (2.11 sec) mysql> set global group_replication_bootstrap_group=off; Query OK, 0 rows affected (0.00 sec)
12、配置mgr的第二個結點:
第二個結點和第一個結點惟一的不一樣在於它不在要本身去建一個羣了、它只要加入第一個結點建的羣就能夠了
第一步:建立用於複製的用戶
set sql_log_bin=0; create user mgruser@'%' identified by 'mtls@352'; grant replication slave,replication client on *.* to mgruser@'%'; create user mgruser@'127.0.0.1' identified by 'mtls@352'; grant replication slave,replication client on *.* to mgruser@'127.0.0.1'; create user mgruser@'localhost' identified by 'mtls@352'; grant replication slave,replication client on *.* to mgruser@'localhost'; set sql_log_bin=1;
第二步:配置複製所要的用戶
change master to master_user='mgruser', master_password='mtls@352' for channel 'group_replication_recovery';
第三步:安裝組複製插件
install plugin group_replication soname 'group_replication.so';
第四步:加入前面建立好的複製組
start group_replication;
如下是我完成這四步的過程
[root@mtsl18 mysql]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20-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 sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'%' identified by 'mtls@352'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave,replication client on *.* to mgruser@'%'; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'127.0.0.1' identified by 'mtls@352'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave,replication client on *.* to mgruser@'127.0.0.1'; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'localhost' identified by 'mtls@352'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave,replication client on *.* to mgruser@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> set sql_log_bin=1; Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> change master to -> master_user='mgruser', -> master_password='mtls@352' -> for channel 'group_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> mysql> mysql> install plugin group_replication soname 'group_replication.so'; Query OK, 0 rows affected (0.01 sec) mysql> mysql> start group_replication; Query OK, 0 rows affected (6.60 sec)
十3、配置mgr的其它結點:
邏輯上第二個結點與第3、第4、第五 ... 等等結點有着同樣的邏輯角色、就也是說它們都不是羣主;因此它們的配置
方式和第二個結點是同樣的。
如下是我配置第三個結點時的過程
[root@mtls19 mysql]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20-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 sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'%' identified by 'mtls@352'; Query OK, 0 rows affected (0.01 sec) mysql> grant replication slave,replication client on *.* to mgruser@'%'; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'127.0.0.1' identified by 'mtls@352'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave,replication client on *.* to mgruser@'127.0.0.1'; Query OK, 0 rows affected (0.00 sec) mysql> create user mgruser@'localhost' identified by 'mtls@352'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave,replication client on *.* to mgruser@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> set sql_log_bin=1; Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> change master to -> master_user='mgruser', -> master_password='mtls@352' -> for channel 'group_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.12 sec) mysql> mysql> mysql> install plugin group_replication soname 'group_replication.so'; Query OK, 0 rows affected (0.02 sec) mysql> mysql> start group_replication; Query OK, 0 rows affected (3.23 sec)
十4、驗證mgr各個結點是否正常:
mysql> select * from performance_schema.replication_group_members ; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 34760575-c607-11e7-96e3-9a17854b700d | mtls17 | 3306 | ONLINE | | group_replication_applier | 8816fee3-c77d-11e7-832c-1e1b3511358e | mtsl18 | 3306 | ONLINE | | group_replication_applier | 8dfc74c1-c77d-11e7-9447-8a7c439b72d9 | mtls19 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 3 rows in set (0.00 sec)
結論:3個結點的狀態都是online 說明它們是正常的、進一步說明mgr的安裝成功了。
十5、對於mgr配置過程當中一些要點問題的回答:
一、官方說mgr是與mysql replication 徹底不一樣的一種數據同步技術、爲何還要加一個複製用戶?
(這個上問題針對的是第十二節的第一步&第二步)
答:
一個節點在加入mgr組時、這個加入的過程在邏輯上能夠分紅兩個階段、第一個階段基於傳統的gtid的複製
方式把這個上結點落下的數據補上去;假設這個階段用時30分鐘、這30分鐘內mgr集羣仍是能夠接受數據寫入的。
那這30分鐘的數據經過什麼方式補呢?答案就是這30分鐘的數據在第二階段補、第二階段就是用的mgr的方式同步
的了、在把數據補上以後就個結點就成功的加入的mgr集羣、併爲online狀態。
二、爲何要安裝插件
答:
由於mgr功能是一個插件實現的。
十6、更多:
一、若是你感受手動安裝配置mgr比較費事、我作了一個mysql dba的工具、它能完成myql-group-replication的自動
安裝配置 工具的地址:https://github.com/Neeky/mysqltools#mysql-group-replication環境的安裝
二、這裏只介紹了mgr的安裝與配置、並無對mgr的功能進行測試、是由於我已經寫了一份關於mgr功能的測試的報告
測試報告地址:http://www.cnblogs.com/JiangLe/p/7809229.html
----