https://hub.docker.com/r/greatsql/greatsql
https://gitee.com/GreatSQL/GreatSQL
docker run -itd --name mgr0 \
--hostname mgr0 \
--network galera \
--ip 172.33.0.6 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=wdqdmm@r \
-e MYSQL_ALLOW_EMPTY_PASSWORD=0 \
-e MYSQL_IBP=1G \
-e MYSQL_INIT_MGR=1 \
-e TZ: Asia/Shanghai \
-v /data/file:/data/file/ \
-v /etc/localtime:/etc/localtime:ro
--restart always --privileged=true --user=root greatsql/greatsql:latest
docker exec -it mgr0 bash
# 只有使用--subnet创建的网络才能指定静态IP
docker network create --driver bridge --subnet 172.18.0.0/24 --gateway 172.18.0.1 mgr
# mgr 网络ip情况
docker network inspect mgr
---包含仲裁节点的4节点MGR集群
docker run -d --name mgr1 --hostname mgr1 --restart always --network mgr --ip 172.18.0.11 --privileged=true --user=root -p 3301:3306 -e MYSQL_ROOT_PASSWORD='wdqdmm@r' -e MYSQL_ALLOW_EMPTY_PASSWORD='no' -e MYSQL_RANDOM_ROOT_PASSWORD='no' -e MYSQL_IBP='1g' -e MYSQL_INIT_MGR='1' -e MYSQL_MGR_USER='repl' -e MYSQL_MGR_USER_PWD='wdqdmm@r' -e MYSQL_MGR_LOCAL='172.18.0.11:33061' -e MYSQL_MGR_SEEDS='172.18.0.11:33061,172.18.0.12:33061,172.18.0.13:33061,172.18.0.14:33061' -e TZ='asia/shanghai' -e MYSQL_MGR_START_AS_PRIMARY='1' -e MYSQL_MGR_ARBITRATOR='0' -v /data/file:/data/file/ -v /data/docker/mysql/greatsql/hosts:/etc/hosts:ro greatsql/greatsql:latest
docker run -d --name mgr2 --hostname mgr2 --restart always --network mgr --ip 172.18.0.12 --privileged=true --user=root -p 3302:3306 -e MYSQL_ROOT_PASSWORD='wdqdmm@r' -e MYSQL_ALLOW_EMPTY_PASSWORD='no' -e MYSQL_RANDOM_ROOT_PASSWORD='no' -e MYSQL_IBP='1g' -e MYSQL_INIT_MGR='1' -e MYSQL_MGR_USER='repl' -e MYSQL_MGR_USER_PWD='wdqdmm@r' -e MYSQL_MGR_LOCAL='172.18.0.12:33061' -e MYSQL_MGR_SEEDS='172.18.0.11:33061,172.18.0.12:33061,172.18.0.13:33061,172.18.0.14:33061' -e TZ='asia/shanghai' -e MYSQL_MGR_START_AS_PRIMARY='0' -e MYSQL_MGR_ARBITRATOR='0' -v /data/file:/data/file/ -v /data/docker/mysql/greatsql/hosts:/etc/hosts:ro greatsql/greatsql:latest
docker run -d --name mgr3 --hostname mgr3 --restart always --network mgr --ip 172.18.0.13 --privileged=true --user=root -p 3303:3306 -e MYSQL_ROOT_PASSWORD='wdqdmm@r' -e MYSQL_ALLOW_EMPTY_PASSWORD='no' -e MYSQL_RANDOM_ROOT_PASSWORD='no' -e MYSQL_IBP='1g' -e MYSQL_INIT_MGR='1' -e MYSQL_MGR_USER='repl' -e MYSQL_MGR_USER_PWD='wdqdmm@r' -e MYSQL_MGR_LOCAL='172.18.0.13:33061' -e MYSQL_MGR_SEEDS='172.18.0.11:33061,172.18.0.12:33061,172.18.0.13:33061,172.18.0.14:33061' -e TZ='asia/shanghai' -e MYSQL_MGR_START_AS_PRIMARY='0' -e MYSQL_MGR_ARBITRATOR='0' -v /data/file:/data/file/ -v /data/docker/mysql/greatsql/hosts:/etc/hosts:ro greatsql/greatsql:latest
-仲裁节点
docker run -d --name mgr4 --hostname mgr4 --restart always --network mgr --ip 172.18.0.14 --privileged=true --user=root -p 3304:3306 -e MYSQL_ROOT_PASSWORD='wdqdmm@r' -e MYSQL_ALLOW_EMPTY_PASSWORD='no' -e MYSQL_RANDOM_ROOT_PASSWORD='no' -e MYSQL_IBP='1g' -e MYSQL_INIT_MGR='1' -e MYSQL_MGR_USER='repl' -e MYSQL_MGR_USER_PWD='wdqdmm@r' -e MYSQL_MGR_LOCAL='172.18.0.14:33061' -e MYSQL_MGR_SEEDS='172.18.0.11:33061,172.18.0.12:33061,172.18.0.13:33061,172.18.0.14:33061' -e TZ='asia/shanghai' -e MYSQL_MGR_ARBITRATOR='0' -v /data/file:/data/file/ -v /data/docker/mysql/greatsql/hosts:/etc/hosts:ro greatsql/greatsql:latest
--新增节点
docker run -d --name mgr5 --hostname mgr5 --restart always --network mgr --ip 172.18.0.15 --privileged=true --user=root -p 3305:3306 -e MYSQL_ROOT_PASSWORD='wdqdmm@r' -e MYSQL_ALLOW_EMPTY_PASSWORD='no' -e MYSQL_RANDOM_ROOT_PASSWORD='no' -e MYSQL_IBP='1g' -e MYSQL_INIT_MGR='1' -e MYSQL_MGR_USER='repl' -e MYSQL_MGR_USER_PWD='wdqdmm@r' -e MYSQL_MGR_LOCAL='172.18.0.15:33061' -e MYSQL_MGR_SEEDS='172.18.0.11:33061,172.18.0.12:33061,172.18.0.13:33061,172.18.0.14:33061,172.18.0.15:33061' -e TZ='asia/shanghai' -e MYSQL_MGR_ARBITRATOR='0' -v /data/file:/data/file/ -v /data/docker/mysql/greatsql/hosts:/etc/hosts:ro greatsql/greatsql:latest
--add-host mgr2:172.33.0.8
--ip 172.33.0.8
--network galera
/data/GreatSQL
-指定当前MGR节点为Arbitrator角色,此时不能同时指定其为Primary/Secondary角色
MYSQL_MGR_ARBITRATOR: 1
-既非Primary,也非Arbitrator,那么就是Secondary角色了
MYSQL_MGR_ARBITRATOR: 0
-如果不想要仲裁节点,则可以修改最后一个节点的属性
docker exec -it mgr1 bash
docker exec -it mgr2 bash
docker exec -it mgr3 bash
docker exec -it mgr4 bash
docker exec -it mgr5 bash
docker restart mgr1 mgr2 mgr3 mgr4 mgr5
docker logs -f --tail="100" mgr1
-容器外
mysql -A -uroot -p -P3301 -h127.0.0.1
mysql -A -uroot -p'wdqdmm@r' -P3301 -h127.0.0.1
-容器内
mysql -A -uroot -p -P3306 -h127.0.0.1
mysql -A -uroot -p'wdqdmm@r' -P3306 -h127.0.0.1
ALTER USER root@'%' IDENTIFIED WITH mysql_native_password BY 'wdqdmm@r';
flush privileges;
-MGR服务状态
select * from performance_schema.replication_group_members;
# mysql-维护相关: https://abc.htmltoo.com/thread-45627.htm
# greatsql mysql - 管理维护: https://abc.htmltoo.com/thread-46490.htm
---初始化MGR集群
-选择第一个容器 mgr1 作为 PRIMARY节点,设置该容器的MGR的引导,然后启动MGR服务
docker exec -it mgr1 /bin/bash
mysql -S/data/GreatSQL/mysql.sock -uroot -pwdqdmm@r
-设置本节点为MGR引导启动节点,【注意】其他节点无需执行本操作
SET GLOBAL group_replication_bootstrap_group=ON;
-启动MGR服务
START GROUP_REPLICATION;
-启动完MGR服务后,关闭引导参数
SET GLOBAL group_replication_bootstrap_group=OFF;
-MGR服务状态
select * from performance_schema.replication_group_members;
-如果在创建容器时未指定 -e MYSQL_INIT_MGR=1 选项,
-则还需要手动执行下面的命令创建账户,授权,并创建MGR复制通道:
SET SQL_LOG_BIN=0;
CREATE USER repl IDENTIFIED with mysql_native_password BY 'repl4MGR';
GRANT REPLICATION SLAVE, BACKUP_ADMIN ON *.* TO repl;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl4MGR' FOR CHANNEL 'group_replication_recovery';
---启动MGR服务
-在另外的docker容器里,记住不要设置 group_replication_bootstrap_group=ON,
-直接启动 MGR服务即可。
docker exec -it mgr2 bash;
mysql -S/data/GreatSQL/mysql.sock -uroot -pwdqdmm@r
start group_replication;
-查看所有节点都启动后的MGR服务状态
select * from performance_schema.replication_group_members;
-各节点创建MGR账号后,会产生BINLOG,因此要执行 SET SQL_LOG_BIN=0 或者创建账号后再执行 RESET MASTER,否则会提示本地节点比远程节点的事务数更多,无法加入集群。
docker exec -it mgr1 /bin/bash
mysql -A -uroot -pwdqdmm@r;
SET GLOBAL group_replication_bootstrap_group=ON;
start group_replication;
select * from performance_schema.replication_group_members;
docker exec -it mgr2 /bin/bash
mysql -A -uroot -pwdqdmm@r;
start group_replication;
select * from performance_schema.replication_group_members;
# 查看版本
mysqladmin ver -uroot -pwdqdmm@r;
# 基础环境: centos8
yum check-update
yum update -y
yum clean all
yum -y install --skip-broken epel-release yum-axelget vim net-tools unzip zip wget ftp lsof curl
set global log_bin_trust_function_creators=1;
show variables like '%func%';
stop group_replication;
-v /data/docker/hosts:/etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
172.18.0.2mgr1
172.18.0.3mgr2
172.18.0.4mgr3
在金融级应用场景中,对数据的可靠性和架构的容错性要求都更高,对多数据中心甚至多活都有较高需求。为此,GreatSQL未来会在以下几方面着重发力。
2.1 增加更多金融级场景需求特性
增加地理标签功能。当在多机房部署MGR时,可以保证每个机房中至少有一个节点都参与事务认证,确保该节点总有最新事务,这可用于解决多机房数据同步的问题。
采用全新的流控机制,流控阈值计算更合理、细致,不会出现频繁性能抖动问题。
官方称,更多企业级新特性正在持续完善中,后续的版本会陆续放出。
2.2 提升同城双机房和跨城架构部署的可靠性
支持AFTER模式下多数派写机制。发生网络分区时,只要多数派节点已经回放完毕,集群就可以继续处理新的事务,依然可以保障集群的高可用性。
解决磁盘空间爆满时导致MGR集群阻塞的问题。当发现某节点磁盘空间满了,就会让这个节点主动退出集群,避免像MySQL社区版那样整个集群被阻塞的问题。
解决多主模式下或切主时可能导致丢数据的问题。调整了事务认证处理流程,改成放到 applier queue 里按照paxos顺序处理,这就解决了在多主模式下或切主时可能导致丢数据的问题。
解决节点异常退出集群时导致性能抖动的问题。优化paxos通信机制,发生异常时只会产生约1~3秒的性能小抖动,最差时TPS可能只损失约20% ~ 30%。而MySQL社区版本可能会造成约20~30秒的性能抖动,最差时TPS可能有好几秒都降为0。下面两个图非常明显体现了GreatSQL针对这种情况所做的优化。