环境:ubuntu20.04 mysql8.0.20
mgr(Mysql Group Replication) 坑逼之路开始:
1、配置文件路径的坑
首先我的 mysql8.0.20是安装的,不是编译的。有些相关路径和网上不一样。有可能直接安装导致的,也有可能是版本太新导致的。
mysql的配置文件放置路径过多,真他妈多。到底哪个目录是第一读取的呢?mysql8.0.20 的配置文件路径我是靠 故意配错里面的内容让mysql报错 而发现的。
网上一大堆 说是 /etc/my.cnf,在我的实验下发现 第1读取路径是 /etc/mysql/my.cnf。
你要是找不到第1读取路径,任你配置文件配的天花乱坠,你的mgr都搭不起来。
小建议:windows上找到的配置文件,比如我下面给出的配置文件,最好一行一行复制,不要整段复制,以防调入“换行”的坑里
2、复制虚拟机的坑
有些人用多个虚拟机模拟多节点,然后采用偷懒模式,直接复制,这个会导致坑的一批,我就是受害者之一。
1)首先检查mysql的auto.cnf文件里面的uuid 是否相同,只要你复制之前已经安装了mysql,一定相同。
这个uuid一定要改成唯一的,也就是每个节点的mysql uuid都不能一样,坑的一批。
2)再次检查主机名是否相同,这个一定相同。每个节点必须改为不一样的,后面要用,不然节点之间识别不了,坑的一批。
我的3个节点主机名被我改为 master/slave1/slave2。
3、主机名和ip映射配置的坑
/etc/hosts 下,每个节点的主机名和ip映射需要配置好,后面mgr 内部会用到,坑的一批。例如:
192.168.3.103 master
192.168.3.104 slave1
192.168.3.105 slave2
4、配置文件配好了后直接复制到其他节点的坑
因为配置mgr的命令不少,你后面有可能会直接忘记 需要根据每个节点需要小幅度修改配置文件。坑的一批。
最好复制一个就改一个,省的后面忘了自己坑自己。需要修改的也就是server_id和group_replication_local_address。
server_id 每个节点都需要不一样,group_replication_local_address就是本机的 ip:port
修改好后,一定要重启mysql!!!别忘了!!!
5、配置文件内容的坑
[mysqld]
#为了只启用InnoDB,因为这个模式只支持InnoDB。防止后面自己坑自己,这条可以不写
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 唯一标识,组内的节点一定要 保持不一样
server_id=3
#开启 Replication with Global Transaction Identifiers模式
gtid_mode=ON
#只允许执行可以使用GTID安全记录的语句
enforce_gtid_consistency=ON
#禁用二进制的写检查
binlog_checksum=NONE
#这个为了防止修改主机名导致 复制出问题,XXXX自己填啥都可以,主机名不改这条可以不写.
#主机名改了,/etc/hosts 你的主机名和ip映射也要改。
relay-log=XXXX-relay-bin
#安装插件,写配置文件里,省的手动命令行忘记了
plugin_load_add='group_replication.so'
#组名,组内节点都一样
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#是否随服务器启动而自动启动组复制,不建议直接启动,有时数据出问题,需要人为干预后,才能启动
group_replication_start_on_boot=off
#本地MGR的IP地址和端口,host:port,是MGR的端口,不是数据库的端口
group_replication_local_address= "192.168.3.105:33061"
#组内成员
group_replication_group_seeds= "192.168.3.103:33061,192.168.3.104:33061,192.168.3.105:33061"
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启即可
group_replication_bootstrap_group=off
请确保至少包含以上内容,如果你的版本大于8.0.3。
如果版本小于 8.0.3,还需要包含如下配置:
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
如果版本小于 8.0.2,还需要包含如下配置:
transaction_write_set_extraction=XXHASH64
上面2个额外配置含义,可以在https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html找到。
6、启动命令的坑
最后一步了,至于为什么命令要这么写,有的我也不知道,反正不这么搞,出错的可能性很大。
master:
set sql_log_bin=0;
create user 'sroot'@'%' identified by '123123';
grant REPLICATION SLAVE on *.* to 'sroot'@'%';
flush privileges;
set sql_log_bin=1;
CHANGE MASTER TO MASTER_USER='sroot', MASTER_PASSWORD='123123' FOR CHANNEL 'group_replication_recovery';
reset master;
SET GLOBAL group_replication_bootstrap_group=ON; //只有主节点有
start group_replication;
SET GLOBAL group_replication_bootstrap_group=OFF; //只有主节点有
2个slave一样:
set sql_log_bin=0;
create user 'sroot'@'%' identified by '123123';
grant REPLICATION SLAVE on *.* to 'sroot'@'%';
flush privileges;
set sql_log_bin=1;
CHANGE MASTER TO MASTER_USER='sroot', MASTER_PASSWORD='123123' FOR CHANNEL 'group_replication_recovery';
reset master;
start group_replication;
到此,用 SELECT * FROM performance_schema.replication_group_members; 你应该可以看到 MEMBER_STATE 都是ONLINE,
就代表成功了。
如果从库出现 recoverying 状态,一直卡住,那么
stop group_replication;
reset master;
start group_replication;
以上是单主多从的命令,如果想配置多主,只需要在start group_replication; 前面加上这2句话就可以了。
set global group_replication_single_primary_mode=FALSE; #是否启动单主模式,
set global group_replication_enforce_update_everywhere_checks=TRUE; #多主模式下,强制检查每一个实例是否允许该操作,
其实不建议多主模式,本来就是读多写少。单主模式 ,主提供读写 ,从只提供读。
这不是刚好可以完美读写分离么,主写,从读,完美。
最后每个节点的 时钟最好同步一下,mysql对时钟比较敏感。
over,希望大家 搭建愉快。
..........................20206/7.....................................
最近发现SELECT * FROM performance_schema.replication_group_members; 的MEMBER_HOST是/etc/hosts里面设置的主机名,实际很不方便,因为程序需要的都是ip 。偶然发现在上述配置文件中加入:
report_host=192.168.3.103
然后重新启动 mgr ,MEMBER_HOST就会变成你设置的ip地址。这样集群内的节点ip 都可以拿到了,方便连接到任意节点