[Mysql] mysql-MGR集群配置


本文总阅读量

前提须知:mgr限制条件

1
2
3
4
5
仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set
COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景
目前一个MGR集群最多支持9个节点
不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚
二进制日志不支持binlog event checksum

0、修改每个节点hosts文件,如下面所示(三个节点均需修改)

[root@dax-mysql-master log]# cat /etc/hosts

1
2
3
4
5
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.7.53 dax-mysql-master
10.0.7.50 dax-mysql-slave
10.0.7.51 dax-mysql-mha

1、修改三个节点的my.cnf配置文件,在[mysqld]后添加如下信息,local_address这一行配置为自己的ip地址,其他不变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[mysqld]
master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
transaction_write_set_extraction = "XXHASH64"
slave_parallel_workers = 2
slave_preserve_commit_order = 1
slave_parallel_type = "LOGICAL_CLOCK"
binlog_checksum = NONE
#group_replication_allow_local_disjoint_gtids_join = ON
#group_replication_auto_increment_increment = 1
loose-group_replication_group_name = "867fee38-746b-11e8-b006-000d3a800ed3"
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = "dax-mysql-mha:24901"
loose-group_replication_group_seeds = "dax-mysql-master:24901,dax-mysql-slave:24901,dax-mysql-mha:24901"
loose-group_replication_bootstrap_group = off

集群参数详解:

1
2
3
4
5
6
7
#group_replication_auto_increment_increment = 1 单主模式下可以设置为1(每个节点都要设置,不设置默认仍然为7)
#loose-用于上述group_replication变量 的前缀 指示服务器在服务器启动时尚未加载组复制插件时继续启动。
#配置会 transaction_write_set_extraction 指示服务器为每个事务处理它必须收集写入集并使用XXHASH64散列算法将其编码为 散列。
#配置会 group_replication_group_name 告诉插件它正在加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”。
#值 group_replication_group_name 必须是有效的UUID。在二进制日志中为组复制事件设置GTID时,此UUID在内部使用。使用SELECT UUID();生成一个UUID。
#配置 group_replication_start_on_boot 指示插件在服务器启动时不自动启动操作。这在设置组复制时很重要,因为它可以确保您可以在手动启动#插件之前配置服务器。成员配置完成后,您可以将其设置 group_replication_start_on_boot 为开启,以便在服务器引导时自动启动组复制。
#配置 group_replication_local_address 告诉插件使用网络地址127.0.0.1和端口24901与组中的其他成员进行内部通信。

添加完参数之后重启数据库(三个节点均需重启)

2、主节点1(dax-mysql-master)执行:

1
2
3
4
5
6
7
8
9
10
11
mysql> 
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY '12345678';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='12345678' FOR CHANNEL 'group_replication_recovery';
#安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#查看插件是否安装成功
SHOW PLUGINS;

插件安装完成之后,将配置文件注释的那两行#去掉,重启数据库,并启动组复制进程:

1
2
3
4
5
6
#启动组复制
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
#查看组成员
SELECT * FROM performance_schema.replication_group_members;
2.1、创建数据,可在添加其他节点之前加,或者之后加(测试在节点之前加,添加其他节点后,会自动同步)(该步骤可选择性执行)
1
2
3
4
5
6
7
8
mysql>
CREATE DATABASE test1;
USE test;
CREATE TABLE t4 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t4 VALUES (1, 'Luis');
检查表t1和二进制日志的内容。
SELECT * FROM t4;
SHOW BINLOG EVENTS;

3、从节点2(dax-mysql-slave)执行:

1
2
3
4
5
6
7
8
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY '12345678';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='12345678' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;

将配置文件注释的那两行#去掉,重启数据库

1
mysql>START GROUP_REPLICATION;

4、从节点3(dax-mysql-mha)执行:

1
2
3
4
5
6
7
8
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY '12345678';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='12345678' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;

将配置文件注释的那两行#去掉,重启数据库

1
mysql>START GROUP_REPLICATION;

5、安装mysql-shell(只在主节点执行便可)

下载mysql-shell

1
wget https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.0.11-linux-glibc2.12-x86-64bit.tar.gz

MySQL Shell用来配置服务器以供InnoDB集群使用的供应脚本需要访问Python版本2.7。对于沙箱部署,在用于部署的单台机器上需要Python,生产部署需要在每个服务器实例上使用Python。

1
2
tar -zxvf mysql-shell-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
mv mysql-shell-8.0.11-linux-glibc2.12-x86-64bit mysql-shell

主节点1(dax-mysql-master),连接主节点,授权repl用户集群管理权限

1
2
3
4
GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO repl@'%' identified by '12345678' WITH GRANT OPTION;
GRANT RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, REPLICATION SLAVE, REPLICATION CLIENT, CREATE USER ON *.* TO repl@'%' identified by '12345678' WITH GRANT OPTION;
GRANT SELECT ON *.* TO repl@'%' identified by '12345678' WITH GRANT OPTION;
flush privileges;

通过mysql-shell连接到主节点1配置集群:

1
2
3
4
5
6
7
8
/data/soft/mysql-shell/bin/mysqlsh --uri repl@dax-mysql-master:3306
<输入用户名
mysql-shell>dba.verbose=2
创建集群
mysql-shell>var cluster = dba.createCluster('prodCluster', {adoptFromGR: true});
查看集群状态
mysql-shell>cluster = dba.getCluster("prodCluster")
mysql-shell>cluster.status()

6、在应用端安装mysql-router

1
2
3
4
5
6
sudo bash
mkdir -p /data/soft
cd /data/soft
wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
tar -zxvf mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
mv mysql-router-8.0.11-linux-glibc2.12-x86-64bit mysql-router

配置mysqlrouter

1
/data/soft/mysql-router/bin/mysqlrouter --bootstrap repl@10.5.0.6:3306 --directory /data/soft/myrouter --user=root --conf-use-sockets --force

在/data/soft/myrouter目录下生成关于mysqlrouter的配置文件,用于记录用于连接到mgr集群
其中mysqlrouter.conf配置文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[metadata_cache:prodCluster]
router_id=7
bootstrap_server_addresses=mysql://dax-mysql-slave:3306,mysql://dax-mysql-master
:3306,mysql://dax-mysql-mha:3306
user=mysql_router7_umuf7ikos8fp
metadata_cluster=prodCluster
ttl=5

[routing:prodCluster_default_rw]
bind_address=0.0.0.0
bind_port=6446
socket=/tmp/myrouter/mysql.sock
destinations=metadata-cache://prodCluster/default?role=PRIMARY
routing_strategy=round-robin
protocol=classic

[routing:prodCluster_default_ro]
bind_address=0.0.0.0
bind_port=6447
socket=/tmp/myrouter/mysqlro.sock
destinations=metadata-cache://prodCluster/default?role=SECONDARY
routing_strategy=round-robin
protocol=classic

[routing:prodCluster_default_x_rw]
bind_address=0.0.0.0
bind_port=64460
socket=/tmp/myrouter/mysqlx.sock
destinations=metadata-cache://prodCluster/default?role=PRIMARY
routing_strategy=round-robin
protocol=x

[routing:prodCluster_default_x_ro]
bind_address=0.0.0.0
bind_port=64470
socket=/tmp/myrouter/mysqlxro.sock
destinations=metadata-cache://prodCluster/default?role=SECONDARY
routing_strategy=round-robin
protocol=x

启动mysqlrouter命令:

1
2
/data/soft/myrouter/start.sh
netstat -tunlp|grep mysql

加入开机启动

1
2
3
4
echo "
rm -rf /data/soft/myrouter/mysqlrouter.pid
/data/soft/myrouter/start.sh " >> /etc/rc.local
cat /etc/rc.local

授权脚本执行权限

1
2
chmod +x /etc/rc.d/rc.local
ll /etc/rc.d/rc.local

####7、测试连接库是否有问题,并查看连接的库是主还是从
连接读写库

1
mysql -u root -h 127.0.0.1 -P 6446 -p

连接只读库

1
mysql -u root -h 127.0.0.1 -P 6447 -p

8、查看集群状态

查看组成员

1
SELECT * FROM performance_schema.replication_group_members;

查看主节点

1
SHOW STATUS LIKE 'group_replication_primary_member';

或者使用如下方法

1
2
set global show_compatibility_56 = on;
select MEMBER_HOST from performance_schema.replication_group_members where MEMBER_ID=(select VARIABLE_VALUE from information_schema.global_status where variable_name='GROUP_REPLICATION_PRIMARY_MEMBER');
目录
  1. 1. 前提须知:mgr限制条件
  2. 2. 0、修改每个节点hosts文件,如下面所示(三个节点均需修改)
  3. 3. 1、修改三个节点的my.cnf配置文件,在[mysqld]后添加如下信息,local_address这一行配置为自己的ip地址,其他不变
  4. 4. 2、主节点1(dax-mysql-master)执行:
    1. 4.1. 2.1、创建数据,可在添加其他节点之前加,或者之后加(测试在节点之前加,添加其他节点后,会自动同步)(该步骤可选择性执行)
  5. 5. 3、从节点2(dax-mysql-slave)执行:
  6. 6. 4、从节点3(dax-mysql-mha)执行:
  7. 7. 5、安装mysql-shell(只在主节点执行便可)
  8. 8. 6、在应用端安装mysql-router
  9. 9. 8、查看集群状态

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog