实验主机server1,7,8:
组复制原理:
组复制是一种可用于实现容错系统的技术。 复制组是一个通过消息传递相互交互的 server 集群。通信层提供了原子消息(atomic message)和完全有序信息交互等保障机制
实现了基于复制协议的多主更新
复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。
mysql组复制协议:
组复制是一种 share-nothing 复制方案,其中每个 server 成员都有自己的完整数据副本。
故障检测:
故障检测是提供关于哪些 server 可能已死的信息(猜测)的分布式服务。
某个 server 无响应时触发猜测,组中其余成员进行协调决定以排除给定成员。如果某个 server 与组的其余成员隔离,则它会怀疑所有其他 server 都失败了。由于无法与组达成协议(因为它无法确保仲裁成员数),其怀疑不会产生后果。 当服务器以此方式与组隔离时,它无法执行任何本地事务。
在线 server 列表通常称为视图,新成员server的加入离开,无论是自愿还是被迫的离开,该组都会动态地重新规划其配置,并触发视图更新
MGR的限制:
仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;
必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set
COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景
目前一个MGR集群最多支持9个节点
不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚
二进制日志不支持binlog event checksum
三台主机安装mysql5.7并初始化密码。
编写配置文件:
vim /etc/my.cnf
添加:
1 server_id=1 #三台主机的id号不同
2 gtid_mode=ON
3 enforce_gtid_consistency=ON
4 master_info_repository=TABLE
5 relay_log_info_repository=TABLE
6 binlog_checksum=NONE
7 log_slave_updates=ON
8 log_bin=binlog
9 binlog_format=ROW
10
11 transaction_write_set_extraction=XXHASH64 #指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
12 loose-group_replication_group_name="8053c671-0622-11e8-a300-525400b9c5e8" #表示将加入或者创建的复制组命名为8053c671-0622-11e8-a300-525400b9c5e8,可以自己指定
13 loose-group_replication_start_on_boot=off #设置为Server启动时不自动启动组复制
14 loose-group_replication_local_address= "172.25.92.1:24901" #绑定本地的172.25.92.1以及25901端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
15 loose-group_replication_group_seeds="172.25.92.2:24901,172.25.92.7:24901,172.25.92.8:24901" #本行为告诉服务器当服务器加入组时,应当连接到172.25.92.2:24901,172.25.92.7:24901,172.25.92.8:24901这些种子服务器进行配置。本设置可以不是全部的组成员服务地址
16 loose-group_replication_bootstrap_group= off #配置是否自动引导组
17 loose-group_replication_single_primary_mode=FALSE #设置组自动选择一个 server 来处理读/写工作。 这个 server 是主(PRIMARY),所有其他的都是从
18 loose-group_replication_enforce_update_everywhere_checks=FALSE #多主模式下为多主更新启用或禁用严格一致性检查。
19 loose-group_replication_ip_whitelist="172.25.92.0/24" #开启白名单,认情况下只允许白名单连接到复制组,如果是其他IP则需要配置。
#使用的loose-前缀是指示Server启用时尚未加载复制插件也将继续启动
server1:
SET PASSWORD=PASSWORD("密码")
1 mysql -uroot -p
2 mysql> SET SQL_LOG_BIN=0;
3 Query OK, 0 rows affected (0.00 sec)
4
5 mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Workhard@345'; #创建复制用户及密码
6
7 mysql> flush privileges;
8 Query OK, 0 rows affected (0.00 sec)
9
10 mysql> SET SQL_LOG_BIN=1;
11 Query OK, 0 rows affected (0.00 sec)
12
13 mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Workhard@345' FOR CHANNEL 'group_replication_recovery'; #这个复制跟普通的change master命令有区别,并不需要指定master是谁,但需要指定通道为’group_replication_recovery’。
14
15 mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #安装一个group_replicaiton 的plugin
16 Query OK, 0 rows affected (0.16 sec)
17
18 mysql> SHOW PLUGINS;
19
20 mysql> SET GLOBAL group_replication_bootstrap_group=ON; #此引导应仅由单个 sever 独立完成,该 server 启动组并且只启动一次。 这就是为什么引导配置选项的值不保存在配置文件中的原因。 如果将其保存在配置文件中,则在重新启动时,server 会自动引导具有相同名称的第二个组。 这将导致两个不同的组具有相同的名称
21 Query OK, 0 rows affected (0.00 sec)
22
23 mysql> START GROUP_REPLICATION;
24 Query OK, 0 rows affected (1.78 sec)
25
26 mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
27 Query OK, 0 rows affected (0.00 sec)
28
29 mysql> SELECT * FROM performance_schema.replication_group_members; #查看组成员状态
30 +---------------------------+--------------------------------------+-------------+-------------+--------------+
31 | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
32 +---------------------------+--------------------------------------+-------------+-------------+--------------+
33 | group_replication_applier | 82aae2a9-05d5-11e8-9a44-525400b9c5e8 | server1 | 3306 | ONLINE |
34 +---------------------------+--------------------------------------+-------------+-------------+--------------+
server7和server8:
先修改配置文件。
1 mysql> SET SQL_LOG_BIN=0;
2 Query OK, 0 rows affected (0.00 sec)
3
4 mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Workhard@345';
5
6 mysql> flush privileges;
7 Query OK, 0 rows affected (0.00 sec)
8
9 mysql> SET SQL_LOG_BIN=1;
10 Query OK, 0 rows affected (0.00 sec)
11
12 mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Workhard@345' FOR CHANNEL 'group_replication_recovery';
13
14 mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
15 Query OK, 0 rows affected (0.16 se
16 mysql> show plugins;
17 +-------------------+----------------------+
18 | name | dl |
19 +-------------------+----------------------+
20 | group_replication | group_replication.so |
21 | validate_password | validate_password.so |
22 +-------------------+----------------------+
23 2 rows in set (0.03 sec)
24
25 mysql> delete from plugin where name='validate_password';
26 Query OK, 1 row affected (0.17 sec)
27
28 mysql> show plugins;
29 +-------------------+----------------------+
30 | name | dl |
31 +-------------------+----------------------+
32 | group_replication | group_replication.so |
33 +-------------------+----------------------+
34 1 row in set (0.00 sec)
35
36 mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
37 Query OK, 0 rows affected (0.00 sec)
38
39
40 mysql> START GROUP_REPLICATION;
41 Query OK, 0 rows affected (44,88 sec)
42 mysql> SELECT * FROM performance_schema.replication_group_members;
43 +---------------------------+--------------------------------------+-------------+-------------+--------------+
44 | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
45 +---------------------------+--------------------------------------+-------------+-------------+--------------+
46 | group_replication_applier | 379fe31a-0624-11e8-8636-525400f194e5 | server8 | 3306 | ONLINE |
47 | group_replication_applier | 82aae2a9-05d5-11e8-9a44-525400b9c5e8 | server1 | 3306 | ONLINE |
48 +---------------------------+--------------------------------------+------------
配置过程常见的错误:
1,来源IP没有在白名单列表中,所以连接拒绝
2,没有配置同步账号跟密码,使用的是空密码进行同步。 需要为复制通道group_replication_recovery设置同步信息:CHANGE MASTER TO MASTER_USER=’mysqlsync’, MASTER_PASSWORD=’mysqlsync_password’ FOR CHANNEL ‘group_replication_recovery’;
3,删除validate_password密码验证插件。
原地址:https://blog.csdn.net/sinat_36888624/article/details/79215233
整理文档如下
Mysql安装
三台机器互相做免密认证
51、52、53分别执行以下操作
ssh-keygen -t rsa -b 2048
ssh-copy-id 192.16.10.51
ssh-copy-id 192.16.10.52
ssh-copy-id 192.16.10.53
同时关闭防火墙(顺手关了NM,可以不关)
systemctl disable firewalld && systemctl stop firewalld && systemctl stop NetworkManager && systemctl disable NetworkManager
安装基础软件
yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc iftop zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget epel-release telnet ntpdate yum-utils python-pip iostat
关闭selinux
vim /etc/selinux/config
修改主机名
vim /etc/hosts
192.168.10.51 m1
192.168.10.52 m2
192.168.10.53 m3
重启 shutdown -r now
安装mysql(centos7默认会安装mariadb,会自动替换为mysql)
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
cp /etc/my.cnf /etc/my.cnf.bak
启动mysql
systemctl start mysqld
查看状态
systemctl status mysqld
查找mysql默认密码
grep "password" /var/log/mysqld.log
登录mysql(此时mysql不能进行任何操作,因为需要修改默认密码)
mysql -u root –p
原因是因为MySQL有密码设置的规范,具体是与validate_password_policy的值有关:
修改密码
set password=password('xxxxxx');
查看密码规则
SHOW VARIABLES LIKE 'validate_password%';
修改密码规则
set global validate_password_policy=0;
set global validate_password_length=1;
如果需要可视化连接数据库,可新增账号(暂未运行此语句)
grant all on *.* to root@'%' identified by 'xxxxxx';
但此时还有一个问题,就是因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉:
yum -y remove mysql57-community-release-el7-10.noarch.rpm
MGR搭建
51服务器
修改mysql配置
vim /etc/my.cnf
添加如下内容
server_id=51 #三台主机的id号不同
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64 #指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="8053c671-0622-11e8-a300-525400b9c5e8" #表示将加入或者创建的复制组命名为8053c671-0622-11e8-a300-525400b9c5e8,可以自己指定
loose-group_replication_start_on_boot=off #设置为Server启动时不自动启动组复制
loose-group_replication_local_address= "192.168.10.51:33061" #绑定本地的192.168.10.1以及25901端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
loose-group_replication_group_seeds="192.168.10.51:33061,192.168.10.52:33061,192.168.10.53:33061" #本行为告诉服务器当服务器加入组时,应当连接到192.168.10.51:33061,192.168.10.52:33061,192.168.10.53:33061这些种子服务器进行配置。本设置可以不是全部的组成员服务地址
loose-group_replication_bootstrap_group= off #配置是否自动引导组
loose-group_replication_single_primary_mode=FALSE #设置组自动选择一个 server 来处理读/写工作。 这个 server 是主(PRIMARY),所有其他的都是从
loose-group_replication_enforce_update_everywhere_checks=FALSE #多主模式下为多主更新启用或禁用严格一致性检查。
loose-group_replication_ip_whitelist="192.168.10.0/24" #开启白名单,认情况下只允许白名单连接到复制组,如果是其他IP则需要配置。
#group_replication_member_weight=80 #值最高的成员被选为新的主节点,值相同的情况下,group根据数据字典中 server_uuid排序,排序在最前的被选择为主节点
loose-group_replication_unreachable_majority_timeout=5 #少数组成员由于网络中断且无法连接到多数成员的成员在离开组之前等待多长时间参数
#group_replication_compression_threshold=131072 #复制压缩,当单个事务产生的binlog数据量大于设置的阈值GRP会启用压缩功能,在网络IO存在瓶颈时能有效减少网络占用30%-40%,但是对CPU消耗也会增加,该功能根据实际情况判定是否使用,默认该功能是超过1M的数据量就启用压缩,关闭只需设置该参数为0
#group_replication_transaction_size_limit=20971520 #指定允许的事务大小,防止过大事务导致组同步失败,这个值允许设置的最大值为2147483647,2G,好像大于max_allowed_packet的1G,最好设置成小于1G,直接避免超过1G事务导致其他复制失败的情况。
#loose-group_replication_bootstrap_group= off
#group_replication_allow_local_disjoint_gtids_join= OFF
重启51的mysql
systemctl restart mysqld
mysql -uroot –p
SET SQL_LOG_BIN=0;
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'192.168.10.%' IDENTIFIED BY 'yyyyyy'; #创建复制用户及密码
flush privileges;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='yyyyyy' FOR CHANNEL 'group_replication_recovery'; #这个复制跟普通的change master命令有区别,并不需要指定master是谁,但需要指定通道为’group_replication_recovery’
INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #安装一个group_replicaiton 的plugin
SHOW PLUGINS;
SET GLOBAL group_replication_bootstrap_group=ON; #此引导应仅由单个 sever 独立完成,该 server 启动组并且只启动一次。 这就是为什么引导配置选项的值不保存在配置文件中的原因。 如果将其保存在配置文件中,则在重新启动时,server 会自动引导具有相同名称的第二个组。 这将导致两个不同的组具有相同的名称
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members; #查看组成员状态
52、53服务器
修改mysql配置
vim /etc/my.cnf
###同上,注意修改IP地址和server-id。###
重启52、53的mysql
systemctl restart mysqld
mysql -u root –p
SET SQL_LOG_BIN=0;
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'192.168.10.%' IDENTIFIED BY 'yyyyyy';
flush privileges;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='yyyyyy' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
set global group_replication_allow_local_disjoint_gtids_join=ON;
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
Keepalived
51、52、53偷懒直接yum安装
yum install keepalived –y
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
mkdir /etc/keepalived/scripts
51修改配置文件
vim /etc/keepalived/keepalived.conf
vrrp_script chk_mysql {
script "/etc/keepalived/scripts/chk_mysql.sh"
interval 2
weight 10
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 100
advert_int 1
unicast_src_ip 172.16.101.251
unicast_peer {
172.16.101.252
172.16.101.253
}
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.101.239 dev ens33 label ens33:0
}
track_script { #指定前面脚本的名字
chk_mysql
}
}
52、53参照上方配置文件进行修改,注意state状态与priority权重
Keepalived的自杀脚本
vim /etc/keepalived/scripts/chk_mysql.sh
#!/bin/bash
mysql=`/usr/bin/systemctl status mysqld.service |grep Active|awk '{print $3}'|cut -d '(' -f2|cut -d ')' -f1`
keepalived="systemctl stop keepalived"
if [ $mysql != running ]; then
$keepalived
fi
给脚本添加权限
chmod a+x /etc/keepalived/scripts/chk_mysql.sh
重启keepalived
systemctl restart keepalived