一、喜迎 mysql-5.7.20
事實上mysql-group-replication 功能是在mysql-5.7.17這個版本上引入的,它實現了mysql各個結點間數據強一致性,
這個也成為了我心目中mysql的殺手級功能。 同樣在它前期也是深深的傷害了我,先從官方文檔上說起。官方文檔上對
mysql-group-replication環境的搭建demo是在一台機器上安裝三個mysql數據結點來講解的,但是在我想把mysql-gro
up-replication安裝到三台主機上時就出現了許多的問題。
1、 如果三台主機之間沒有做dns解析的話,mysql-group-replication 會搭建不起來,這個問題我想哭的心都有了,因為
我在配置文件中填的是ip地址呀! 但是為何還要去走一遍dns我也是太陽了dog了。 這個問題可以通過配置好dns解決,
mysql后面的版本也把這個bug給修了。
2、mysql-group-replication 還有一個最讓我受不了的問題就是、就在是你建好環境之后、把環境中的一台mysql數據庫(master)
給它kill 掉、這種情況下mysql會把master切到uuid排第二的主機上去;但是之前的master再也加不進集群了,你說這集群還能用嗎?
當然是不能!
3、mysql-5.7.20 終於、終於、王者歸來! 上面的問題它都沒有了、對於這個已經基本可用的版本、表現出了無限的崇拜、於是
第一時間把mysql-group-replication的自動化安裝整合到了mysqltools(下載地址https://github.com/Neeky/mysqltools)這個工具中。
二、環境規划
主機名 ip地址 在mgr中的角色
mgr17 10.186.19.17 primary
mgr18 10.186.19.18 seconde
mgr19 10.186.19.19 seconde
三、使用mysqltools自動化安裝mysql-group-replication:
ansible-playbook install_group_replication.yaml PLAY [mgr1] ******************************************************************** TASK [Gathering Facts] ********************************************************* ok: [mrg17] ok: [mrg19] ok: [mrg18] TASK [create mysql user] ******************************************************* ok: [mrg19] ok: [mrg18] ok: [mrg17] TASK [create and config /etc/my.cnf] ******************************************* changed: [mrg17] changed: [mrg19] changed: [mrg18] TASK [transfer mysql install package to remote host and unarchive to /usr/local/] *** changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [change owner to mysql user] ********************************************** changed: [mrg17] changed: [mrg19] changed: [mrg18] TASK [make link /usr/local/mysql-xx.yy.zz to /usr/local/mysql] ***************** changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [export mysql share object (*.os)] **************************************** ok: [mrg18] ok: [mrg17] ok: [mrg19] TASK [load share object] ******************************************************* changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [export path env variable] ************************************************ ok: [mrg17] ok: [mrg18] ok: [mrg19] TASK [export path env to /root/.bashrc] **************************************** ok: [mrg17] ok: [mrg18] ok: [mrg19] TASK [make link /usr/local/mysql-xx.yy.zz to /usr/local/mysql] ***************** ok: [mrg17] ok: [mrg18] ok: [mrg19] TASK [create libmysqlclient_r.so file for php-5.6] ***************************** changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [create datadir] ********************************************************** changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [initialize-insecure] ***************************************************** changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [create systemd config file] ********************************************** ok: [mrg18] ok: [mrg19] ok: [mrg17] TASK [enable mysqld service] *************************************************** changed: [mrg19] changed: [mrg18] changed: [mrg17] TASK [start mysql(sytemctl)] *************************************************** changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [config mysql.service start up on boot] *********************************** changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [config sysv start script] ************************************************ skipping: [mrg17] skipping: [mrg18] skipping: [mrg19] TASK [start mysql(service)] **************************************************** skipping: [mrg17] skipping: [mrg18] skipping: [mrg19] TASK [config mysql.service start up on boot] *********************************** skipping: [mrg17] skipping: [mrg18] skipping: [mrg19] TASK [transfer sql statement to remonte] *************************************** changed: [mrg17] changed: [mrg18] changed: [mrg19] TASK [config mysql group replication] ******************************************************* changed: [mrg17] changed: [mrg19] changed: [mrg18] TASK [remove temp file /tmp/config_mysql_group_replication.sql] **************** changed: [mrg17] changed: [mrg18] changed: [mrg19] PLAY RECAP ********************************************************************* mrg17 : ok=21 changed=14 unreachable=0 failed=0 mrg18 : ok=21 changed=14 unreachable=0 failed=0 mrg19 : ok=21 changed=14 unreachable=0 failed=0
看樣子、mysql-group-replication集群是安裝成功了、下面我給出mysql-5.7.20 在可用性方面的表現。
四、測試一下mysql-group-replication中各個成員的狀態是否正常
select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 8cd24f4c-c51c-11e7-85a8-9a17854b700d | mtls17 | 3306 | ONLINE | | group_replication_applier | 8d6dd76f-c51c-11e7-bff6-1e1b3511358e | mtsl18 | 3306 | ONLINE | | group_replication_applier | 8fc1d79a-c51c-11e7-b9f1-8a7c439b72d9 | mtls19 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 3 rows in set (0.00 sec)
結論: 各個成員狀態正常
五、測試primary成員是否能寫入
mysql> create database tempdb char set utf8; Query OK, 1 row affected (0.18 sec) mysql> mysql> use tempdb; Database changed mysql> mysql> create table person( -> id int not null auto_increment primary key, -> name varchar(4), -> v int -> ) char set utf8; Query OK, 0 rows affected (0.02 sec) mysql> mysql> insert into person(name,v) values('張三',100),('李四',200),('王五',300); Query OK, 3 rows affected (0.21 sec) Records: 3 Duplicates: 0 Warnings: 0
結論: primary 能正常寫入
六、測試seconde結點是否正常的同步到了數據
[root@actionsky18 ~]# mysql tempdb Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 34 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> select * from person; +----+--------+------+ | id | name | v | +----+--------+------+ | 7 | 張三 | 100 | | 14 | 李四 | 200 | | 21 | 王五 | 300 | +----+--------+------+ 3 rows in set (0.01 sec)
結論:seconde 成員能正常同步到數據
七、kill 掉primary 成員、觀察剩余成員的狀態是否正常
在mtls17上執行(當前的primary在mtls17主機上)
[root@mtls17 mysql]# ps -ef | grep mysql mysql 27928 1 0 02:07 ? 00:00:09 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf root 29030 15848 0 02:24 pts/0 00:00:00 grep --color=auto mysql [root@mtls17 mysql]# kill -9 27928
在mtls18上剩余成員是否正常
select * from replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 8d6dd76f-c51c-11e7-bff6-1e1b3511358e | mtsl18 | 3306 | ONLINE | | group_replication_applier | 8fc1d79a-c51c-11e7-b9f1-8a7c439b72d9 | mtls19 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 2 rows in set (0.01 sec)
結論:kill 掉primary 成員后、剩余的成員狀態都正常;
在這里還是補充一下技術上的細節、在安裝mysql-group-replication的時候mysqltools默認為會把第一個主機配置成primary,
在primary 宕機后、默認情況下mysql-group-replication會把存活着的mysql中member_id 最小的主機設置為新的primary,
由上面的select語句可知mtls18的member_id是小於mtls19的、所以在mtls17宕機之后新的primary就是mtls18。
八、測試新的primary是否支持寫入
mysql> use tempdb; 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_tempdb | +------------------+ | person | +------------------+ 1 row in set (0.00 sec) mysql> insert into person(name,v) values('趙六',100); Query OK, 1 row affected (0.01 sec)
結論:新選出的primary 支持寫入
九、 測試之前的primary重啟后能否正常加入高可用組
[root@mtls17 ~]# systemctl start mysql [root@mtls17 ~]# 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> start group_replication; Query OK, 0 rows affected (3.39 sec) mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 8cd24f4c-c51c-11e7-85a8-9a17854b700d | mtls17 | 3306 | ONLINE | | group_replication_applier | 8d6dd76f-c51c-11e7-bff6-1e1b3511358e | mtsl18 | 3306 | ONLINE | | group_replication_applier | 8fc1d79a-c51c-11e7-b9f1-8a7c439b72d9 | mtls19 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 3 rows in set (0.00 sec) mysql> select * from tempdb.person; +----+--------+------+ | id | name | v | +----+--------+------+ | 7 | 張三 | 100 | | 14 | 李四 | 200 | | 21 | 王五 | 300 | | 24 | 趙六 | 100 | +----+--------+------+ 4 rows in set (0.00 sec)
結論:老的primary可以正常恢復
十、我寫的關於mysql group replication 的相關文章
1、mysql group replication 安裝與配置詳解:http://www.cnblogs.com/JiangLe/p/6727281.html#3849996
2、mysql group replication 在mysql-5.7.20版本下的可用性報告:http://www.cnblogs.com/JiangLe/p/7809229.html
3、mysql group replication 主節宕機點恢復 https://i.cnblogs.com/EditPosts.aspx?postid=7941929
4、mysql group replication 多數據結點丟失情況下的恢復
5、我寫的全自動化安裝mysql-group-replication 開源工具在我的測試環境下安裝mysql group replication 只要72秒 https://github.com/Neeky/mysqltools