MySQL集群——高可用架构
目录
一、实现mysql组复制-单主模式
1. 环境说明
2. 环境配置
1)master的配置
2)从配置
3)验证结果
二、实现mysql组复制-多主模式
1. 修改所有的my.cnf的配置文件
2. 在其中一台主机执行
3. 三台主机分别执行
一、实现mysql组复制-单主模式
1. 环境说明
主机名 | ip | 操作系统版本 | mysql版本 |
---|---|---|---|
master | 192.168.248.136/24 | rhel7.9 | mysql8.0.40 |
rep1 | 192.168.248.139/24 | rhel7.9 | mysql8.0.40 |
rep2 | 192.168.248.140/24 | rhel7.9 | mysql8.0.40 |
1)克隆RHEL79_mysql_master两个
2)修改IP、主机名等
3)三个主机均需要配置hosts文件的解析,如果不配置域名解析则需要在/etc/my.cnf中加一条配置skip-name-resolve
[root@mysql-master ~]# vim /etc/hosts
192.168.248.136 master
192.168.248.139 rep1
192.168.248.140 rep2
2. 环境配置
1)master的配置
# 1)修改配置文件
[root@mysql-master ~]# vim /etc/my.cnf
添加如下内容:
[mysqld]
log_timestamps=SYSTEM
server_id=136
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.248.136:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group=off
group_replication_ip_whitelist="192.168.248.0/24,127.0.0.1/8"
group_replication_recovery_use_ssl=on
[root@master ~]# /etc/init.d/mysqld restart# 2)在主的数据库中使用sql语句添加复制账号并授予权限,从上面也需要设置一样的账号-------
SET SQL_LOG_BIN=0;
CREATE USER rp@'%' IDENTIFIED BY '123';
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE REPLICATION SOURCE TO SOURCE_USER='rp', SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';# 注意:如果需要重置则使用命令reset master;# 3)查看是否有group_replication插件----------------------------------------------
mysql> show plugins;
|group_replication| ACTIVE|GROUP REPLICATION|group_replication.so|GPL|# 4)启动MGR集群----------------------------------------------------------------
# 使用当前服务器作为引导服务器启动一个新的群组复制过程或者恢复一个已经存在的群组
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION USER='rp',PASSWORD='123';
SET GLOBAL group_replication_bootstrap_group=OFF;# 在主上查看组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
2)从配置
# 1)在从上写配置文件------------------------------------------------------------
[root@master-rep1 ~]# vim /etc/my.cnf
添加如下内容:
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM
server_id=139
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="192.168.248.139:33061"
group_replication_group_seeds="192.168.248.136:33061,192.168.248.139:33061,192.168.248.140:33061"
group_replication_ip_whitelist="192.168.248.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_recovery_use_ssl=on [root@master-rep1 ~]# /etc/init.d/mysqld restart[root@master-rep2 ~]# vim /etc/my.cnf
添加如下内容:
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM
server_id=140
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="192.168.248.140:33061"
group_replication_group_seeds="192.168.248.136:33061,192.168.248.139:33061,192.168.248.140:33061"
group_replication_ip_whitelist="192.168.248.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_recovery_use_ssl=on # 2)在所有从的数据库中使用sql语句添加复制账号并授予权限,从上面也需要设置一样的账号--
SET SQL_LOG_BIN=0;
CREATE USER rp@'%' IDENTIFIED BY '123';
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE REPLICATION SOURCE TO SOURCE_USER='rp', SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';# 3)开启组复制----------------------------------------------------------------
mysql> START GROUP_REPLICATION USER='rp', PASSWORD='123';#查看组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
3)验证结果
# 在主库节点数据库上执行--------------------------------------------------------
mysql> create database test;
mysql> use test;#必须设置主键,不然无法插入数据
mysql> create table t1(id int primary key,name char(30));
mysql> insert into t1 values (1,'xiaoming');# 在三个节点均可以查看到新增信息
mysql> select * from test.t1;
+----+----------+
| id | name |
+----+----------+
| 1 | xiaoming |
+----+----------+# 在从节点测试写入,验证不支持写入操作---------------------------------------------
mysql> insert into test.t1 values (2,'xiaohong');
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement# 测试主节点宕机
mysql> stop GROUP_REPLICATION;# 从库节点查看,发现仅剩2个节点,并且自动选举出主节点
mysql> SELECT * FROM performance_schema.replication_group_members;# 在重新选举出来的rep1上测试插入数据
mysql> insert into test.t1 values (3,'xiaohei');mysql> select * from test.t1;
+----+----------+
| id | name |
+----+----------+
| 1 | xiaoming |
| 3 | xiaohei |
+----+----------+# 重新启动前面的master主节点,可以看到master已经作为从节点加入到群组中
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (10.73 sec)mysql> SELECT * FROM performance_schema.replication_group_members;
二、实现mysql组复制-多主模式
1. 修改所有的my.cnf的配置文件
# 修改所有的my.cnf的配置文件,添加如下内容:
# 关闭单master模式
loose-group_replication_single_primary_mode=off# 多主一致性检查
loose-group_replication_enforce_update_everywhere_checks=ON[root@mysql-master ~]# /etc/init.d/mysqld restart
2. 在其中一台主机执行
# 在其中一台主机里面执行以下mysql命令
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;#在另外两台主机里面执行以下mysql命令,开启组复制
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;
3. 三台主机分别执行
# 在三个主机上面分别执行以下三条命令测试是否都可以执行写入操作
mysql> insert test.t1 values (4,'xiaolan');
mysql> insert test.t1 values ('5','xiaozi');
mysql> insert test.t1 values (6,'xiaohei');
mysql> select * from test.t1;
+----+----------+
| id | name |
+----+----------+
| 1 | xiaoming |
| 3 | xiaohei |
| 4 | xiaolan |
| 5 | xiaozi |
| 6 | xiaohei |
+----+----------+