如何搭建原生mgr集群
使用docker 拉去镜像centos7来配置的,默认是glibc2.17,mysql8.0版本的支持glibc2.12的,不过这个没关系。正常安装操作就 可以了。
具体使用docker想要指定ip启动容器,可以参考下面具体的步骤,注意要控制和真机的网段,因为之前我自己新建的 docker桥接网络导致真机无法访问某些地址。
参考命令:
1、创建自定义网络类型,并且指定网段
sudo docker network create --subnet=192.168.0.0/16 staticnet
通过docker network ls可以查看到网络类型中多了一个staticnet
2、使用新的网络类型创建并启动容器
sudo docker run -it --name userserver --net staticnet --ip 192.168.0.2 ubuntu /bin/bash
通过docker inspect可以查看容器ip为192.168.0.2,关闭容器并重启,发现容器ip并未发生改变
我使用的是
docker run -itd --privileged --init ----name test12(启动的容器起个名字) --net mynetwork(我自己创建的网络名)--ip 192.168.56.102(指定的ip) centos:centos7 (镜像) tail -f /dev/null
没有使用centos6 是因为里面的yum源配置需要自己搞一下,所以我就直接用了7.
直接wget安装包我这边网络报错,所以就在真机download之后,使用
docker cp 真机目录文件 容器:目录
命令拷贝过去的,以后如果有脚本一键部署我会再更新的。
单机多实例配置mgr
如果在docker容器中配置,可以参考如下配置文件,将参数直接写死。以下配置文件是在单机器上部署多个实例节点,开启mgr。
部署节点是3306,3307,3308。注意server-id,report_host,和对应的mgr端口,group_replication_local_address需要不同。
首先需要创建各个目录:
user add mysql
mkdir /mysql8.0
cd mysql8.0
tar -xvf mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz
ln -s mysql-8.0.25-linux-glibc2.12-x86_64 mysqlmgr
cd /mysql8.0/mysqlmgr
chown -R mysql:mysql .
mkdir -p /mysqlmgr/etc/
mkdir -p /mysqlmgr/mgrdata/mgr3306/
mkdir -p /mysqlmgr/mgrdata/mgr3307/
mkdir -p /mysqlmgr/mgrdata/mgr3308/
chown -R mysql:mysql /mysqlmgr/mgrdata/mgr3306/ /mysqlmgr/mgrdata/mgr3307/ /mysqlmgr/mgrdata/mgr3308/ /mysqlmgr/etc/
配置文件位置:
/mysqlmgr/etc/3306.cnf
剩下的位置都在配置文件中标明了,如果是没有的目录需要创建。
下面的配置文件是3308这个实例的配置信息。
如果启动mgr一直recovering,主要查看报错日志排错。写好配置文件就可以按照上面单机的步骤初始化配置了。
由于我需要指定配置文件,因此命令需要是这样的
/mysql8.0/mysqlmgr/bin/mysqld --defaults-file=/mysqlmgr/etc/3306.cnf --basedir=/mysql8.0/mysqlmgr --datadir=/mysqlmgr/mgrdata/mgr3306/data --initialize-insecure --user=mysql
配置文件的位置必须在第一个。
启动
/mysql8.0/mysqlmgr/bin/mysqld_safe --defaults-file=/mysqlmgr/etc/3308.cnf &
登录
由于我指定initialize-insecure ,因此不会生成一个临时密码,需要指定socket去登录
/mysql8.0/mysqlmgr/bin/mysql -S /mysqlmgr/mgrdata/mgr3306/data/mysql.sock
/mysql8.0/mysqlmgr/bin/mysql -S /mysqlmgr/mgrdata/mgr3307/data/mysql.sock
/mysql8.0/mysqlmgr/bin/mysql -S /mysqlmgr/mgrdata/mgr3308/data/mysql.sock
接下来的步骤配置就可以参考上面的命令操作了。
[mysqld]
user=mysql
port=3308
#安装目录
basedir=/mysql8.0/mysqlmgr
#数据目录
datadir=/mysqlmgr/mgrdata/mgr3308/data
#socket位置
socket=/mysqlmgr/mgrdata/mgr3308/data/mysql.sock
#二进制文件位置(这个也可以不指定,我为了方便给拿出来放到别的地址了)
log_bin=/mysqlmgr/mgrdata/mgr3308/log/binlog
#二进制日志的文件格式,必须是row
binlog-format=row
log-error = /mysqlmgr/logs/dump3308.log
pid-file = /mysqlmgr/mgrdata/mgr3308/data/mysqld.pid
gtid_mode=ON
#强制GTID的一致性
enforce_gtid_consistency=ON
binlog_format=row
server-id = 3
#MGR使用乐观锁,所以官网建议隔离级别是RC,减少锁粒度
transaction_isolation = READ-COMMITTED
#因为集群会在故障恢复时互相检查binlog的数据,
#所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.
log-slave-updates=1
#The host name or IP address of the replica to be reported to the source during replica registration.
report_host='0675b52f6c49'
#binlog校验规则,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE
binlog_checksum=NONE
#基于安全的考虑,MGR集群要求复制模式要改成slave记录记录到表中,不然就报错
master_info_repository=TABLE
relay_log_info_repository=TABLE
#指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction = XXHASH64
##告知插件,正在加入或创建的组要命名,一般写uuid,所有节点的这个组名必须保持一致!相当于此GROUP的名字,是UUID值,不能和集群内其他GTID值的UUID混用,可用uuidgen来生成一个新的。
loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂。是否随服务器启动而自动启动组复制,不建议直接启动,怕故障恢复时有扰乱数据准确性的特殊情况。
loose-group_replication_start_on_boot = OFF
#本地MGR的地址和端口,host:port,是MGR的端口,不是数据库的端口
loose-group_replication_local_address = '0675b52f6c49:33081'
#需要接受本MGR实例控制的主机和端口,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds ='0675b52f6c47:33061,0675b52f6c48:33071,0675b52f6c49:33081'
#设置为Server启动时不自动启动组复制
loose-group_replication_bootstrap_group = OFF
#关闭单主模式
loose-group_replication_single_primary_mode=FALSE
#每个节点都可以向外更新数据(多主模式),多主模式下,强制检查每一个实例是否允许写操作,如果是单主模式,可以设置为off。
loose-group_replication_enforce_update_everywhere_check=TRUE
loose-group_replication_consistency=EVENTUAL
relay-log-recovery=1
多机器部署mysql8.0的mgr
集群信息
节点数量: 3个
部署在机器:
192.168.56.101
192.168.56.102
192.168.56.103
端口是:3306
对应容器 :
test11 test12 test13
系统: centos7
mysql版本: 8.0.25
glibc版本:glibc2.17(我在mysql 官网下载的是最新版本的mysql8.0.25,也可以用在2.17)
配置文件位置:/home/mysql/etc/my_mgr_8.0.cnf
数据文件位置:/mysql/data_mgr_8.0/
依赖包: libaio numactl.x86_64
配置信息
编辑配置文件 /home/mysql/etc/my_mgr_8.0.cnf,3个节点除了server_id、loose-group_replication_local_address、report_host 三个参数不一样外,其他保持一致。
# /home/mysql/etc/my_mgr_8.0.cnf
[mysqld]
port=3306
basedir=/usr/local/mysql8.0
datadir=/mysql/data_mgr_8.0/
socket=/mysql/data_mgr_8.0/mysql.sock
pid_file=/mysql/data_mgr_8.0/mysql.pid
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "192.168.56.101:33061"
loose-group_replication_group_seeds= "192.168.56.101:33061,192.168.56.102:33061,192.168.56.103:33061"
loose-group_replication_bootstrap_group=OFF
report_host=192.168.56.101
report_port=3306
步骤
- 初始化数据库(三个节点均执行)
useradd mysql
mkdir -p /mysql/data_mgr_8.0
chown -R mysql:mysql /mysql/data_mgr_8.0/
ln -s mysql-8.0.25-linux-glibc2.12-x86_64 mysql8.0
chown -R mysql:mysql /home/mysql/etc/
/usr/local/mysql8.0/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql8.0 --datadir=/mysql/data_mgr_8.0 --user=mysql
- 启动数据库
/usr/local/mysql8.0/bin/mysqld_safe --defaults-file=/home/mysql/etc/my_mgr_8.0.cnf &
- 登录数据库,安装插件,设置mgr账号(三个节点都执行)
/usr/local/mysql8.0/bin/mysql -S /mysql/data_mgr_8.0/mysql.sock
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
- 启动多主模式
- 所有节点执行
set global group_replication_single_primary_mode=OFF;
set global group_replication_enforce_update_everywhere_checks=ON;
- 某一节点执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
- 其他节点执行
START GROUP_REPLICATION;
- 查看集群状态
SELECT * FROM performance_schema.replication_group_members;