mysql 5.7 配置 MGR集群

简述

  • 1、在MySQL Group Replication中,没有明确的"主"或"从"角色,而是所有成员都是对等的。每个成员都参与写入和复制数据。当有新的事务被提交时,它会被广播给其他成员并在它们的数据库上执行。

  • 2、‘单主’ : 集群中,同一时刻只有一个写库,其他为 --super-read-only

  • 3、当 ‘写’(Primary) 宕机时,集群会自动选举一个新的Primary节点来接管写入操作。这个选举过程是自动的,其他节点会通过投票选择新的Primary节点。一旦新的Primary节点被选出,集群会重新配置自身,确保所有写入操作都发送到新的Primary节点。

  • 4、一旦新的Primary节点被选举出来,集群会开始将该节点上缺失的数据同步过去,以确保所有节点都具有相同的数据副本。这可以通过使用MySQL的内部复制机制来实现。

  • 5、当 宕机的 Primary 重启加入集群后,角色会变为 Secondary (读库),加入节点时,只需要 start group_replication; 即可,且会自动补齐缺失数据

  • 6、MGR 建议表中要有唯一标识, 如果表中没有主键或者唯一索引,可能会导致数据一致性的问题。因为在复制过程中,如果无法唯一标识每行,可能会出现数据冲突或者不一致的情况。

一、要求及环境:

要求 
1、mysql 5.7及以上版本  
2、开启bin-log 、 InnoDB 引擎 及 开启GTID(主从状态信息存储在表中)

hosts:
cat >>/etc/hosts <<EOF
192.168.1.11  node1
192.168.1.12  node2
192.168.1.13  node3
EOF

hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3

二、所有节点部署 MySQL 5.7

这里就简化了(可以略过),见下:

mv /etc/my.cnf{,.bak}
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config ;setenforce 0
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config ;echo "UseDNS no" >>/etc/ssh/sshd_config;systemctl restart sshd
yum install gcc gcc-c++ openssl openssl-devel libaio libaio-devel  ncurses  ncurses-devel numactl vim wget lrzsz unzip -y

wget -c http://mirrors.dotsrc.org/mysql/Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
tar -xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql

cd /usr/local/mysql ; vim my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql
port = 3306
server_id = 2
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
log-bin-index = master-bin.index
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 3
bind-address = 0.0.0.0
max_connections = 5000
open_files_limit = 263154
sync_binlog = 500
innodb_flush_log_at_trx_commit = 2
wait_timeout = 1000
interactive_timeout = 1000
group_concat_max_len = 200000
binlog_checksum = none
character_set_server = utf8
log_error = /var/log/mysql/error.log
long_query_time=2
slow-query-log=On  
slow_query_log_file="mysql_slow_query.log"
log_queries_not_using_indexes=off 


groupadd mysql
useradd -s /sbin/nologin -r -g mysql mysql
cp -r support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
mkdir -p /data/mysql
chown -R mysql. /data/mysql
mkdir -p /var/log/mysql
chown -R mysql:mysql /var/log/mysql/
 mkdir -p /var/lib/mysql ; chown -R mysql:mysql /var/lib/mysql
mkdir -p /var/log/mariadb;
touch /var/log/mariadb/mariadb.log
chown -R mysql:mysql /var/log/mariadb

初始化
/usr/local/mysql/bin/mysqld  \
--initialize-insecure  \
--user=mysql  \
--datadir=/data/mysql/  \
--basedir=/usr/local/mysql/   

vim  /etc/init.d/mysqld 
46  basedir=/usr/local/mysql
47  datadir=/data/mysql

echo "export PATH=$PATH:/usr/local/mysql/bin"  >>  /etc/profile
source /etc/profile
启动:
/etc/init.d/mysqld start;ps -ef|grep mysql

改密码:
mysql -uroot -p
> use mysql
> alter user 'root'@'localhost' identified by '123456';
> FLUSH PRIVILEGES; 
管理员用户及开启远程
> grant all on *.* to toyix@"%" identified by "123456";
> UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='toyix';
> flush privileges;

三、部署MGR集群

1、在每个节点上打开MySQL所使用的端口: - 所有节点
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --permanent --add-port=33061/tcp
sudo firewall-cmd --reload
2、编辑 my.cnf (旧设置中追加新配置) - 所有节点

其中group_replication_local_address 为当前节点的IP

# 开启全局事务。要求 enforce-gtid-consistency 为ON
gtid_mode=ON
# 强制GTID的一致性
enforce_gtid_consistency=ON
# 禁用二进制日志校验
binlog_checksum=NONE
log_bin=binlog
# 设置从主服务器接受的更新是否写入二进制日志中
log_slave_updates=ON
# 以行格式记录
binlog_format=ROW
# 将master_info元数据保存在系统表中
master_info_repository=TABLE
# 将relay_info元数据保存在系统表中
relay_log_info_repository=TABLE
#用于配置复制日志恢复行为的参数
relay-log-recovery=1
#指定写入集提取所使用的哈希函数。默认情况下,MySQL 使用的是 XXHASH64 哈希函数。你可以使用此选项来指定另一个哈希函数。
transaction_write_set_extraction=XXHASH64
# 组名UUID,UUID 是一个 128 位长的唯一标识符,通常表示为 32 个十六进制数字的字符串
loose-group_replication_group_name="3d66d2d4-9c2e-4e3e-af8a-33c06f05d3b5"
# 启动mysql时不自动启动组复制
loose-group_replication_start_on_boot=OFF
# 本机IP地址或者映射,33061用于接收来自其他组成员的传入连接
loose-group_replication_local_address= "192.168.1.11:33061"
# 当前主机成员需要加入组时,Server先访问这些种子成员中的一个,然后它请求重新配置以允许它加入组
# 需要注意的是,此参数不需要列出所有组成员,只需列出当前节点加入组需要访问的节点即可。
loose-group_replication_group_seeds= "192.168.1.11:33061,192.168.1.12:33061,192.168.1.13:33061"
# 是否自动引导组。此选项只能在一个server实例上使用,通常是首次引导组时(或在整组成员关闭的情况下),如果多次引导,可能出现脑裂。
loose-group_replication_bootstrap_group=OFF
重启MySQL
/etc/init.d/mysqld restart
3、创建 组复制帐号 - 所有节点
mysql -uroot -p
set sql_log_bin = 0;
create user rpl_user identified with 'mysql_native_password' by 'rpl_123';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
flush privileges;
set sql_log_bin = 1;
change master to master_user='rpl_user', master_password='rpl_123' for channel 'group_replication_recovery';

4、安装MGR插件 - 所有节点
install plugin group_replication soname 'group_replication.so';
show plugins
5、搭建集群 - 主节点执行 (初始写节点上)
RESET MASTER;
set global group_replication_bootstrap_group = 1;
start group_replication;
set global group_replication_bootstrap_group = 0;
show master status;
select * from performance_schema.replication_group_members;

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | fd75d6a1-fbab-11ee-808a-000c2994ce56 | node1       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
6、部署 - 其他节点

直接启动组即可

start group_replication;
mysql> start group_replication;
Query OK, 0 rows affected (6.36 sec)

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | fd75d6a1-fbab-11ee-808a-000c2994ce56 | node1       |        3306 | ONLINE       |
| group_replication_applier | fef8ce3c-fbab-11ee-8017-000c29192cda | node2       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

四、其他 新节点加入群体 ,以192.168.1.13为示例

步骤: my.cnf -> 创建组复制账号 -> 安装MGR插件 -> 启动组
改my.cnf这里省略,同上,变动 server_id 与 loose-group_replication_group_name 即可

[root@node3 mysql]# mysql -uroot -p

set sql_log_bin = 0;
create user rpl_user identified with 'mysql_native_password' by 'rpl_123';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
flush privileges;
set sql_log_bin = 1;
change master to master_user='rpl_user', master_password='rpl_123' for channel 'group_replication_recovery';

install plugin group_replication soname 'group_replication.so';
start group_replication;

select * from performance_schema.replication_group_members;

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 017a1f0c-fbac-11ee-bd9d-000c29b568cb | node3       |        3306 | ONLINE       |
| group_replication_applier | fd75d6a1-fbab-11ee-808a-000c2994ce56 | node1       |        3306 | ONLINE       |
| group_replication_applier | fef8ce3c-fbab-11ee-8017-000c29192cda | node2       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

---------------------------------end

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值