Mysql Mgr(MySQL Group Replication)集群部署
環境:
OS:Centos 7
Mysql版本:社區版 5.7.22
1.安裝步驟
1.1 環境部署
節點角色 |
ip |
節點1 |
192.168.1.134 |
節點2 |
192.168.1.135 |
節點3 |
192.168.1.136 |
1.2 下載安裝介質
可以到mysql官網下載,我這里下載的版本是:5.7.27
1.3 節點1(192.168.1.134)安裝
1.3.1 解壓安裝
[root@localhost soft]# tar -xvf mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz
轉移到安裝目錄
[root@localhost soft]# mv mysql-5.7.27-linux-glibc2.12-x86_64 /opt/mysql_mgr
1.3.2 創建相應的目錄
[root@localhost mysql_mgr]# cd /opt/mysql_mgr
[root@localhost mysql_mgr]# mkdir data ##數據文件目錄
[root@localhost mysql_mgr]# mkdir conf ## 配置文件目錄
[root@localhost mysql_mgr]# mkdir -p mysqllog/relaylog ##主從環境relaylog
[root@localhost mysql_mgr]# mkdir -p mysqllog/logfile ##錯誤日志文件
[root@localhost mysql_mgr]# mkdir -p mysqllog/binlog ##binlog文件
修改目錄權限給到mysql用戶(若系統沒有該用戶的話,可以創建)
[root@localhost mysql_mgr]# cd /opt
[root@localhost opt]# chown -R mysql:mysql ./mysql_mgr
1.3.3 創建配置文件
[mysqld] port=3306 basedir=/opt/mysql_mgr datadir=/opt/mysql_mgr/data character-set-server=utf8mb4 max_connections = 1500 show_compatibility_56=on
server_id=1 gtid_mode=ON enforce_gtid_consistency=ON binlog_checksum=NONE
log_bin=/opt/mysql_mgr/mysqllog/binlog/binlog log_slave_updates=ON binlog_format=ROW master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_index=/opt/mysql_mgr/mysqllog/relaylog/slave-relay-bin.index relay_log=/opt/mysql_mgr/mysqllog/relaylog/relaylog-binlog
##集群部分 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= "192.168.1.134:33061" loose-group_replication_group_seeds= "192.168.1.134:33061,192.168.1.135:33061,192.168.1.136:33061" loose-group_replication_bootstrap_group=OFF report_host=192.168.1.134 report_port=3306 |
1.3.4 初始化數據庫
[mysql@localhost bin]$ cd /opt/mysql_mgr/bin
[mysql@localhost bin]$ ./mysqld --initialize-insecure --basedir=/opt/mysql_mgr --datadir=/opt/mysql_mgr/data --user=mysql
2019-09-03T03:00:25.190551Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-09-03T03:00:26.960483Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-09-03T03:00:27.273154Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-09-03T03:00:27.411863Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: fb59af57-cdf6-11e9-bf83-525400c8dc1f.
2019-09-03T03:00:27.435468Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-09-03T03:00:27.436258Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
1.3.5 啟動數據庫
./mysqld_safe --defaults-file=/opt/mysql_mgr/conf/my.cnf --user=mysql &
1.3.6 登陸
這里密碼為空,不用輸入密碼,為了安全起見安裝完成后自行修改密碼
[mysql@localhost bin]$ ./mysql -h localhost -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.27-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, 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> show databases
-> ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.27-log |
+------------+
1 row in set (0.00 sec)
1.4 節點2(192.168.1.135)安裝
安裝部署跟節點1一致,只是配置文件需要適當修改
1.4.1 創建配置文件
拷貝一個節點1的過來修改即可,修改紅色部分
[mysqld] port=3306 basedir=/opt/mysql_mgr datadir=/opt/mysql_mgr/data character-set-server=utf8mb4 max_connections = 1500 show_compatibility_56=on
server_id=135 gtid_mode=ON enforce_gtid_consistency=ON binlog_checksum=NONE
log_bin=/opt/mysql_mgr/mysqllog/binlog/binlog log_slave_updates=ON binlog_format=ROW master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_index=/opt/mysql_mgr/mysqllog/relaylog/slave-relay-bin.index relay_log=/opt/mysql_mgr/mysqllog/relaylog/relaylog-binlog
##集群部分 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= "192.168.1.135:33061" loose-group_replication_group_seeds= "192.168.1.134:33061,192.168.1.135:33061,192.168.1.136:33061" loose-group_replication_bootstrap_group=OFF report_host=192.168.1.135 report_port=3306 |
1.4.2 啟動數據庫
./mysqld_safe --defaults-file=/opt/mysql_mgr/conf/my.cnf --user=mysql &
1.5 節點3(192.168.1.136)安裝
1.5.1 創建配置文件
[mysqld] port=3306 basedir=/opt/mysql_mgr datadir=/opt/mysql_mgr/data character-set-server=utf8mb4 max_connections = 1500 show_compatibility_56=on
server_id=136 gtid_mode=ON enforce_gtid_consistency=ON binlog_checksum=NONE
log_bin=/opt/mysql_mgr/mysqllog/binlog/binlog log_slave_updates=ON binlog_format=ROW master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_index=/opt/mysql_mgr/mysqllog/relaylog/slave-relay-bin.index relay_log=/opt/mysql_mgr/mysqllog/relaylog/relaylog-binlog
##集群部分 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= "192.168.1.136:33061" loose-group_replication_group_seeds= "192.168.1.134:33061,192.168.1.135:33061,192.168.1.136:33061" loose-group_replication_bootstrap_group=OFF report_host=192.168.1.136 report_port=3306 |
1.5.2 啟動數據庫
./mysqld_safe --defaults-file=/opt/mysql_mgr/conf/my.cnf --user=mysql &
1.6 單組模式配置集群
1.6.1 安裝MGR插件(所有節點執行)
每個節點上都要執行
[mysql@localhost bin]$ ./mysql -h localhost -uroot
mysql> install plugin group_replication soname 'group_replication.so';
Query OK, 0 rows affected (0.04 sec)
1.6.2 設置復制賬號(所有節點執行)
#設置復制賬號
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER repl@'%' IDENTIFIED BY 'repl';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
1.6.3 啟動MGR單主模式(節點上192.168.1.134執行)
# 啟動MGR,在主庫(192.168.1.134)上執行
mysql> set global group_replication_bootstrap_group=on;
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=off;
查看mgr組信息
mysql> SELECT * FROM performance_schema.replication_group_members;
#其他節點加入MGR,在從庫(192.168.1.135,192.168.1.136)上執行
mysql> start group_replication;
在節點1上查看mgr組信息
mysql> SELECT * FROM performance_schema.replication_group_members;
查看那個是主節點:
mysql> select * from performance_schema.global_status where variable_name='group_replication_primary_member';
可以看出目前192.168.1.134是主節點
1.6.4 驗證
1.6.4.1 主庫寫入重庫查詢
在主庫上(192.168.1.134)創建數據庫並創建表寫入測試數據
create table tb_test
(id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
name varchar(64),
PRIMARY KEY (id)
);
insert into tb_test values(1,'name1');
insert into tb_test values(2,'name2');
insert into tb_test values(3,'name3');
insert into tb_test values(4,'name4');
insert into tb_test values(5,'name5');
insert into tb_test values(6,'name6');
insert into tb_test values(7,'name7');
insert into tb_test values(8,'name8');
insert into tb_test values(9,'name9');
insert into tb_test values(10,'name10');
分別從另外2個從庫查詢數據
192.168.1.135從庫查詢
mysql> select * from tb_test;
+----+--------+
| id | name |
+----+--------+
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
| 4 | name4 |
| 5 | name5 |
| 6 | name6 |
| 7 | name7 |
| 8 | name8 |
| 9 | name9 |
| 10 | name10 |
+----+--------+
10 rows in set (0.00 sec)
192.168.1.136從庫查詢
mysql> select * from tb_test;
+----+--------+
| id | name |
+----+--------+
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
| 4 | name4 |
| 5 | name5 |
| 6 | name6 |
| 7 | name7 |
| 8 | name8 |
| 9 | name9 |
| 10 | name10 |
+----+--------+
10 rows in set (0.00 sec)
1.6.4.2 嘗試從庫寫入
192.168.1.135從庫嘗試寫入
mysql> insert into tb_test values(11,'name11');
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
192.168.1.136從庫嘗試寫入
mysql> insert into tb_test values(11,'name11');
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
1.6.4.3 關閉主庫
關閉主庫節點192.168.1.134
[mysql@localhost bin]$ ./mysqladmin -h localhost -uroot shutdown
登陸其中一個從庫檢查mgr組信息\
SELECT * FROM performance_schema.replication_group_members;
可以發現當前的節點只有2個了,下面看下目前那個是主庫
select * from performance_schema.global_status where variable_name='group_replication_primary_member';
可以發現192.168.1.136已經成為主節點,嘗試在該節點上寫入數據
mysql> insert into tb_test values(11,'name11');
Query OK, 1 row affected (0.09 sec)
寫入成功
1.6.4.4 啟動之前關閉的主庫
192.168.1.134上操作
[mysql@localhost bin]$ ./mysqld_safe --defaults-file=/opt/mysql_mgr/conf/my.cnf --user=mysql &
SELECT * FROM performance_schema.replication_group_members;
select * from performance_schema.global_status where variable_name='group_replication_primary_member';
可以看到當前該節點沒有加入到mgr,這個時候需要執行如下命令
mysql> start group_replication;
啟動后成為從庫
可以看到啟動后該節點不會為主庫,而是成為從庫
1.6.4.5 所有的節點都關閉然后啟動
三個節點執行關閉命令
./mysqladmin -h localhost -uroot shutdown
然后啟動
./mysqld_safe --defaults-file=/opt/mysql_mgr/conf/my.cnf --user=mysql &
啟動后發現目前是沒有mgr組信息的
需要執行如下命令啟動mgr
主節點執行(要想那個成為主節點就執行如下命令):
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
其他從節點執行:
start group_replication;
1.7 單主切換到多主模式
# 停止組復制(所有節點執行):
mysql> stop group_replication;
mysql> set global group_replication_single_primary_mode=off;
mysql> set global group_replication_enforce_update_everywhere_checks=on;
# 隨便選擇某個節點執行
mysql> set global group_replication_bootstrap_group=on;
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=off;
# 其他節點執行
mysql> start group_replication;
查看節點信息
可以發現group_replication_primary_member為空,說明該模式為多主模式
嘗試每個節點寫入數據:
192.168.1.134節點寫入:
insert into tb_test values(12,'name12');
192.168.1.135節點寫入:
insert into tb_test values(13,'name13');
192.168.1.136節點寫入:
insert into tb_test values(14,'name14');
說明當前每個節點都是主節點同時可以寫入
1.8 多主切換回到單主模式
# 所有節點執行
mysql> stop group_replication;
mysql> set global group_replication_enforce_update_everywhere_checks=OFF;
mysql> set global group_replication_single_primary_mode=ON;
#主節點執行
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
##其他節點
start group_replication;
查看當前主節點
1.9 遇到的錯誤
1.9.1 表必須有主鍵
mysql> insert into tb_test values(1,'name1');
ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.
附上文檔: