mysql MGR集群配置
Mysql Group Replication简介 (官网翻译)
Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务。
-
高一致性,基于原生复制及paxos协议的组复制技术,以插件方式提供一致数据安全保证;
-
高容错性,大多数服务正常就可继续工作,自动不同节点检测资源征用冲突,按顺序优先处理,内置自动防脑裂机制;
-
高扩展性,自动添加移除节点,并更新组信息;
-
高灵活性,单主模式和多主模式。单主模式自动选主,所有更新操作在主进行;多主模式,所有server同时更新。
Mysql Group replication与传统复制的区别和大幅改进
1.传统复制
主-从复制:有一个主和不等数量的从。主节点执行的事务会异步发送给从节点,在从节点重新执行。(异步和半同步)
(半同步相对异步Master会确认Slave是否接到数据,更加安全)
(原理见主从复制笔记)
2.并行复制
并行复制:复制->广播->正式复制
优势:
弹性复制(高扩展性):server动态添加移除
高可用分片(高扩展性):分片实现写扩展,每个分片是一个复制组。
替代主从复制(高扩展性):整组写入,避免单点争用。
自动化系统:自动化部署Mysql复制到已有复制协议的自动化系统。
故障检测与容错:自动检测,若服务faild,组内成员大多数达成认为该服务已不正常,则自动隔离。
组内成员会构成一个视图,组内成员主动加入或离开(主动或被动),都会更新组配置,更新视图。成员自愿离开,先更新组配置,然后采用大多数成员(不包含主动脱离的成员)意见是否确认该成员离开更新视图。如果是故障要排除,则需大多数服务确认(包括故障成员意见),然后才会更新组配置和视图。
最大允许即时故障数:f=(n-1)/2,多数正常则正常
主从复制限制
-
存储引擎必须为innodb
-
每个表必须提供主键
-
只支持ipv4,网络需求较高
-
一个group最多只能有9台服务器
-
不支持Replication event checksums,
-
不支持Savepoints
-
multi-primary mode部署方式不支持SERIALIZABLE事务隔离级别
-
multi-primary mode部署方式不能完全支持级联外键约束
-
multi-primary mode部署方式不支持在不同节点上对同一个数据库对象并发执行DDL(在不同节点上对同一行并发进行RW事务,后发起的事务会失败)
-
单主模式布置组复制
(组中server可在独立物理机运行,也可在同一台机器,同一机器采用多实例,也就是逻辑认为是独立机器)
实验环境
centos 7.6 mysql-5.7.24 (MGR集群只有在5.7.17版本之后才能配置)
机器 2G 1核
实现前准备
[root@mysql-mgr-master ~]# systemctl stop firewalld && systemctl disable firewalld
[root@mysql-mgr-master ~]# setenforce 0
[root@mysql-mgr-master ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@mysql-mgr-master ~]# tail -n 3 /etc/hosts
192.168.0.159 mysql-mgr-master
192.168.0.160 mysql-mgr-slave1
192.168.0.161 mysql-mgr-slave2
mysql编译安装脚本
#/usr/bin/env bash
#Author:Yingjian
#data 2020.5.12
#version:1.9
#env
src=/usr/local/src
id=`ip a |grep inet |grep brd|awk -F'/' '{print $1}'|awk -F'.' '{print $4}'`
ping -c1 -w1 www.baidu.com &>/dev/null
if [ ! $? -eq 0 ];then
echo "请检查你的网络是否有问题!"
exit 1
fi
yum1=`yum repolist |grep repolist |awk '{print $2}'|sed 's/,//'`
if [ $yum1 -lt 20000 ];then
rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
yum clean all && yum makecache &>/dev/null
yum -y install epel-release &>/dev/null
fi
#
yum -y groupinstall "Development Tools" >/dev/null 2>&1
yum -y install make cmake gcc gcc-g++ ncurses ncurses-devel bison bison-devel libgcrypt perl &>/dev/null
#wget -P $src https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.24.tar.gz
#获取该文件所在的目录
echo "如果执行过长 请手动修改此脚本 IN line 28"
abc=`find / -iname 'mysql-boost-5.7.24.tar.gz' |awk -F'mysql' '{print $1}'`
cd $abc
if [ ! -f $abc\mysql-boost-5.7.24.tar.gz ];then
echo "你还未下载mysql-boost-5.7.24"
echo "下载后在执行该脚本"
exit 1
fi
groupadd mysql
useradd -M -g mysql -s /sbin/nologin mysql
mkdir -p /usr/local/mysqld/{data,mysql,log,tmp}
chown -R mysql:mysql /usr/local/mysqld/*
tar xzvf $abc\mysql-boost-5.7.24.tar.gz -C $src
#tar xf $abc\mysql-boost-5.7.24.tar.gz -C $src
cd $src/mysql-5.7.24
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysqld/mysql \
-DMYSQL_DATADIR=/usr/local/mysqld/data \
-DWITH_BOOST=$src/mysql-5.7.24/boost \
-DDEFAULT_CHARSET=utf8
if [ ! $? -eq 0 ];then
echo "make 失败 请检查路径和依赖包有无下载"
echo "请执行此命令 再次执行该脚本"
echo "rm -rf $src/CMakeCache.txt"
exit 2
fi
make -j `lscpu |awk 'NR==4{print $2}'`
if [ ! $? -eq 0 ];then
echo "make 失败 请检查环境是否健康"
exit 3
fi
make install
if [ $? -eq 0 ];then
echo "`date +%Y%m%d-%H:%M:%S` Congratulations Complete"
else
echo "编译失败 请检测脚本或联系该作者"
exit 4
fi
#提升MySQL命令为系统级别命令
echo "export PATH=$PATH:/usr/local/mysqld/mysql/bin" >/etc/profile.d/mysql.sh
#加载环境变量
source /etc/profile.d/mysql.sh
if [ ! $? -eq 0];then
echo "请手动source /etc/profile.d/mysql.sh 手动执行下面命令\n删除生成的文件重新\tsource $0启动该脚本即可 "
fi
#修改新生成文件的属主组
chown -R mysql.mysql /usr/local/mysqld/*
cd $src/../mysqld/mysql/mysql-test/include
#备份/etc/my.cnf
mv /etc/my.cnf /etc/my.cnf.bak
#拷贝生成的配置到my.cnf
cp default_mysqld.cnf /etc/my.cnf
cat >> /etc/my.cnf <<-EOF
basedir = /usr/local/mysqld/mysql
datadir = /usr/local/mysqld/data
tmpdir = /usr/local/mysqld/tmp
socket = /usr/local/mysqld/tmp/mysql.sock
pid_file = /usr/local/mysqld/tmp/mysqld.pid
log_error = /usr/local/mysqld/log/mysql_error.log
slow_query_log_file = /usr/local/mysqld/log/slow_warn.log
server_id = $id
user = mysql
port = 3306
bind-address = 0.0.0.0
character-set-server = utf8
default_storage_engine = InnoDB
EOF
#初始化数据库
/usr/local/mysqld/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user='mysql'
#启动mysqld服务
nohup /usr/local/mysqld/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
#设置mysql.socket软链接到mysql命令指定目录中
ln -s $src/../mysqld/tmp/mysql.sock /tmp/mysql.sock
#配置mysql服务的管理工具
cd $src/../mysqld/mysql/support-files
cp mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
#systemctl enable mysqld 无法设置开机自启,只能用下列命令
chkconfig mysqld on
#统一修改密码
passwd=`grep "password" /usr/local/mysqld/log/mysql_error.log |awk -F'@' '{print $2}'|awk '{print $2}'`
if [ -n "$passwd" ];then
echo "mysql初始密码为$passwd"
else
echo "获取密码失败,请检测脚本"
exit 8
fi
#echo 'grep "password" /usr/local/mysqld/log/mysql_error.log |awk -F'@' '{print $2}'|awk '{print $2}'` 获取mysql初始密码'
#
#2020-05-11T05:53:09.526931Z 1 [Note] A temporary password is generated for root@localhost: WF&hYq5suyes
mysql -u'root' -p"$passwd" --connect-expired-password -e"alter user 'root'@'localhost' identified by 'Lige@2020'"
#以systemctl启动服务
ps -ef |grep mysqld |grep -v "grep"|awk '{print $2}' >$src/kill.txt
for i in `cat $src/kill.txt`
do
kill -9 $i
sleep 2
done
echo -e "请手动执行systemctl restart mysqld\t启动mysql服务\n如果启动失败 请查看mysql是否已启动"
echo "systemctl 命令管理mysql服务"
echo "`date +%Y%m%d-%H:%M:%S` 脚本执行成功"
echo -e "mysql密码修改为Lige@2020\nmysql -uroot -pLige@2020尝试登录\n如果使用该密码无法登录 可以尝试使用"$passwd"初始密码登录"
echo -e "为了您的使用安全,请记得修改密码\n格式如下\t alter user 'root'@'localhost' identified by 'Lige@2020'"
安装路径/usr/local/mysqld
数据目录/usr/local/mysqld/data
日志目录/usr/local/mysqld/log
- 下面为我做实验的mysql配置文件
basedir = /usr/local/mysqld/mysql
datadir = /usr/local/mysqld/data
tmpdir = /usr/local/mysqld/tmp
socket = /usr/local/mysqld/tmp/mysql.sock
pid_file = /usr/local/mysqld/tmp/mysqld.pid
log_error = /usr/local/mysqld/log/mysql_error.log
slow_query_log_file = /usr/local/mysqld/log/slow_warn.log
server_id = 159 #每个mysql服务的标识必须为不同
user = mysql
port = 3306
bind-address = 0.0.0.0
character-set-server = utf8
default_storage_engine = InnoDB
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery=1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = ON
binlog_checksum=NONE
slave_preserve_commit_order = ON #开启并行复制相关
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=1 #根据CPU的
log-bin=/usr/local/mysqld/log/mysql-bin
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off #mysql配置插件相关的参数 只能在插件加载之后设置,如果想启动时设置这些参数并且启动后加载插件到配置文件中,可以在参数前加上“loose-”前缀。
loose-group_replication_local_address="192.168.0.159:33306" #需要修改
loose-group_replication_group_seeds="192.168.0.159:33306,192.168.0.160:33306,192.168.0.161:33306" #修改
loose-grup_replication_bootstrap_group=off
loose-group_replication_single_primary_mode = on #默认不填写到my.cnf是ON即单主模式 OFF为多主模式
loose-group_replication_enforce_update_everywhere_checks = off #配置多主模式的时候需要调整为ON
report_host='mysql-mgr-master'
report_port=3306
-
下面为比较详细的mysql配置文件
[client] port = 3306 socket = /usr/local/mysql/tmp/mysql.sock [mysqld] port = 3306 socket = /usr/local/mysql/tmp/mysql.sock back_log = 80 basedir = /usr/local/mysql tmpdir = /tmp datadir = /usr/local/mysql/data #-------------------gobal variables------------# 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 = /usr/local/mysql/log/mysql-bin transaction_write_set_extraction = XXHASH64 loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856' loose-group_replication_start_on_boot = off loose-group_replication_local_address = '192.168.1.20:33061' loose-group_replication_group_seeds ='192.168.1.20:33061,192.168.1.21:33061,192.168.1.22:33061' loose-group_replication_bootstrap_group = off max_connect_errors = 20000 max_connections = 2000 wait_timeout = 3600 interactive_timeout = 3600 net_read_timeout = 3600 net_write_timeout = 3600 table_open_cache = 1024 table_definition_cache = 1024 thread_cache_size = 512 open_files_limit = 10000 character-set-server = utf8 collation-server = utf8_bin skip_external_locking performance_schema = 1 user = mysql myisam_recover_options = DEFAULT skip-name-resolve local_infile = 0 lower_case_table_names = 0 #--------------------innoDB------------# innodb_buffer_pool_size = 2000M innodb_data_file_path = ibdata1:200M:autoextend innodb_flush_log_at_trx_commit = 1 innodb_io_capacity = 600 innodb_lock_wait_timeout = 120 innodb_log_buffer_size = 8M innodb_log_file_size = 200M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 85 innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_support_xa = 1 innodb_thread_concurrency = 32 innodb_file_per_table innodb_rollback_on_timeout #------------session variables-------# join_buffer_size = 8M key_buffer_size = 256M bulk_insert_buffer_size = 8M max_heap_table_size = 96M tmp_table_size = 96M read_buffer_size = 8M sort_buffer_size = 2M max_allowed_packet = 64M read_rnd_buffer_size = 32M #------------MySQL Log----------------# log-bin = my3306-bin binlog_format = row sync_binlog = 1 expire_logs_days = 15 max_binlog_cache_size = 128M max_binlog_size = 500M binlog_cache_size = 64k slow_query_log log-slow-admin-statements log_warnings = 1 long_query_time = 0.25 #---------------replicate--------------# relay-log-index = relay3306.index relay-log = relay3306 server-id = 20 init_slave = 'set sql_mode=STRICT_ALL_TABLES' log-slave-updates [myisamchk] key_buffer = 512M sort_buffer_size = 512M read_buffer = 8M write_buffer = 8M [mysqlhotcopy] interactive-timeout [mysqld_safe] open-files-limit = 8192 log-error = /usr/local/mysql/log/mysqld_error.log my.cnf 此文件中的参数配置需对应不同服务器配置不同的参数,从而达到与应用结合后的最佳状态
服务器启动
mysqld --defaults-file=/etc/my.cnf --initialize --user='mysql' #数据库服务初始化 nohup mysqld_safe --defaults-file=/etc/my.cnf & #加载相对应的配置文件并启动
MGR配置单主模式
在主192.168.0.19上 [root@mysql-mgr-master mysqld]# tailf nohup.out 2020-05-21T02:39:03.082561Z mysqld_safe Logging to '/usr/local/mysqld/log/mysql_error.log'. 2020-05-21T02:39:03.112817Z mysqld_safe Starting mysqld daemon with databases from /usr/local/mysqld/data 过滤初始化生成的密码 grep "password" /usr/local/mysqld/log/mysql_error.log 2020-05-21T02:37:38.228592Z 1 [Note] A temporary password is generated for root@localhost: tl-Z>kesL80d [root@mysql-mgr-master ~]# mysql -uroot -p"tl-Z>kesL80d" 修改密码 mysql> alter user "root"@"localhost" identified by "Lige@2020"; mysql> flush privileges;
创建复制账号、不记录到bin_log日志
mysql> set sql_log_bin=0; mysql> create user 'repl'@'192.168.0.%'; mysql> grant replication slave on *.* to "repl"@"192.168.0.%" identified by "Lige@Lige"; mysql> flush privileges; mysql> set sql_log_bin=1; mysql> change master to master_user='repl', master_password='Lige@Lige' for CHANNEL 'group_replication_recovery'; #授权 使用group_replication_recovery复制通道的给定凭证。
安装插件
mysql> install plugin group_replication soname 'group_replication.so'; mysql> show plugins; | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL #看最后
查看group相关的参数
mysql> show global variables like "%group%";
启动组复制
mysql> set global group_replication_bootstrap_group=ON; mysql> start group_replication; mysql> set global group_replication_bootstrap_group=OFF; mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ | group_replication_applier | 9c078212-9b0f-11ea-807b-000c29a77e1c | mysql-mgr-master | 3306 | ONLINE | +---------------------------+--------------------------------------+------------------+-------------+--------------+
测试
mysql> create database yingjian; mysql> create table test(id int,name varchar(50)); ysql> insert into test values (1 , 'ying'); ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.(group_replication表结构必须要有主键) mysql> drop table test; mysql> create table test(id int primary key,name varchar(50)); mysql> insert into test values (1 , 'ying'); Query OK, 1 row affected (0.02 sec) mysql> select * from test; +----+------+ | id | name | +----+------+ | 1 | ying | +----+------+
配置MGR-slave
my.cnf
server_id = 159 user = mysql port = 3306 bind-address = 0.0.0.0 character-set-server = utf8 default_storage_engine = InnoDB master_info_repository = TABLE relay_log_info_repository = TABLE relay_log_recovery=1 gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates = ON binlog_checksum=NONE slave_preserve_commit_order = ON slave_parallel_type=LOGICAL_CLOCK slave_parallel_workers=1 log-bin=/usr/local/mysqld/log/mysql-bin 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.0.159:33306" loose-group_replication_group_seeds="192.168.0.159:33306,192.168.0.160:33306,192.168.0.161:33306" loose-grup_replication_bootstrap_group=off report_host='mysql-mgr-master' report_port=3306
创建复制账号、不记录到bin_log日志
mysql> set sql_log_bin=0; mysql> create user 'repl'@'192.168.0.%'; mysql> grant replication slave on *.* to "repl"@"192.168.0.%" identified by "Lige@Lige"; mysql> flush privileges; mysql> set sql_log_bin=1; mysql> change master to master_user='repl', master_password='Lige@Lige' for CHANNEL 'group_replication_recovery'; mysql> install plugin group_replication soname 'group_replication.so'; mysql> set global group_replication_allow_local_disjoint_gtids_join=ON; #添加到复制组 mysql> start group_replication; mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master | 3306 | ONLINE | | group_replication_applier | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | mysql-mgr-slave1 | 3306 | ONLINE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ mysql> select * from test; +----+------+ | id | name | +----+------+ | 1 | ying | +----+------+ mysql> insert into test values(2,'jian'); ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement #插入数据失败 只读模式 mysql> show global variables like "%read_only%"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | ON | | super_read_only | ON | | transaction_read_only | OFF | | tx_read_only | OFF | +-----------------------+-------+ #从服务器只读是开启的 所以无法插入数据
mysql> show global variables like "%read_only%"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | OFF | | super_read_only | OFF | | transaction_read_only | OFF | | tx_read_only | OFF | +-----------------------+-------+ #主服务器是关闭的
查看该服务器是不是主服务器
mysql> select variable_value from information_schema.global_status where variable_name='group_replication_primary_memmber'; +--------------------------------------+ | variable_value | +--------------------------------------+ | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | +--------------------------------------+ mysql> select * from replication_group_members; +---------------------------+--------------------------------------+------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master | 3306 | ONLINE | | group_replication_applier | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | mysql-mgr-slave1 | 3306 | ONLINE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ #很明显 mysql-mgr-master 为主 mysql> select @@server_uuid; #查看该节点上的UUID +--------------------------------------+ | @@server_uuid | +--------------------------------------+ | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | +--------------------------------------+
测试MGR单主模式下的是否支持高可用
192.168.0.159 mysql> stop group_replication; mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master | 3306 | OFFLINE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ mysql> show global variables like "%read_only%"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | OFF | | super_read_only | OFF | | transaction_read_only | OFF | | tx_read_only | OFF | +-----------------------+-------+ # 此时mysql-mgr-slave1成为master 现在并添加数据 mysql> insert into test values(2,'jian'); mysql> SELECT * FROM test; +----+------+ | id | name | +----+------+ | 1 | ying | | 2 | jian | +----+------+ mysql> start group_replication; #重启mgr-master mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master | 3306 | ONLINE | | group_replication_applier | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | mysql-mgr-slave1 | 3306 | ONLINE | | group_replication_applier | cd90ec9f-9b1c-11ea-89cb-000c29036b74 | mysql-mgr-slave2 | 3306 | ONLINE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ mysql> select * from test; +----+------+ | id | name | +----+------+ | 1 | ying | | 2 | jian | +----+------+ 这个时候主并不会返回到master上 而是还在slave1上 set global group_replication_member_weight=80; (最高即可) 可设置权重使主宕机后跳到指定的slave为master 如果权重一样 即都是默认 则比较uuid的大小
切换到多主模式
MGR切换模式需要重新启动组复制,因些需要在所有节点上先关闭组复制,设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。 #停止组复制(所有节点执行) mysql> stop group_replication; mysql> set global group_replication_single_primary_mode=OFF; mysql> set global group_replication_enforce_update_everywhere_checks=ON; # 随便选择在某个节点执行 mysql> SET GLOBAL group_replication_bootstrap_group=ON; mysql> START GROUP_REPLICATION; mysql> SET GLOBAL group_replication_bootstrap_group=OFF; 其他节点执行 mysql> START GROUP_REPLICATION; 查看组信息 mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master | 3306 | ONLINE | | group_replication_applier | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | mysql-mgr-slave1 | 3306 | ONLINE | | group_replication_applier | cd90ec9f-9b1c-11ea-89cb-000c29036b74 | mysql-mgr-slave2 | 3306 | ONLINE | +---------------------------+--------------------------------------+------------------+-------------+--------------+ mysql> show global variables like "%read_only%"; 都是OFF 即都为主
切回单主模式
#所有节点执行
mysql> stop group_replication;
mysql> set global group_replication_enforce_update_everywhere_checks=OFF;
mysql> set global group_replication_single_primary_mode=ON;
# 主节点(192.168.0.159)执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
# 从节点(192.168.0.160、192.168.0.161)执行
START GROUP_REPLICATION;
# 查看MGR组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
一些补充
站在巨人肩膀上的总结
1)在各个正常成员上查看各自的组内通信地址:
SELECT @@group_replication_local_address;
如果服务器正常使用过程中需要添加机器
即可在set global group_replication_group_seeds=所有节点的ip+端口
如果在配置过程中有报错 请查看错误日志
multi-master 模式 (多主,性能有15%的损失)
如果要开启multi-master 模式,需要在配置文件/etc/my.cnf 中指定
loose-group_replication_single_primary_mode=OFF;
loose-group_replication_enforce_update_everywhere_checks=ON;
#查看该服务器是否宕机 可用于监控
select member_id,member_host,member_state from performance_schema.replication_group_members where member_id=@@server_uuid;
#查看当前是不是可读
mysql> select * from performance_schema.global_variables where variable_name in ('read_only', 'super_read_only');
本节点执行队列是不是有堆积(大于0表示有延迟):
mysql> select count_transactions_in_queue from performance_schema.replication_group_member_stats where member_id=@@seerver_uuid;
流控(flow control)
当启用:
group_replication_flow_control_mode=QUOTA 是表示启用流控。 流控默认通过两个参数控制:
group_replication_flow_control_applier_threshold (默认: 25000)
group_replication_flow_control_certifier_threshold (默认: 25000)
也就说默认延迟在25000个GTID时,会对整个集群Block住写操作。
当然,也可以允许,节点延迟,就如同我们主从结构,从节点延迟,不往上面发请求就可以。
关闭流控:
set global group_replication_flow_control_mode='DISABLED';
提示: 关闭流控制,注意查看是不是存在延迟,如果延迟,自已控制阀值不向上面发请求即可。 多IDC结构的MGR,建议关闭流控。
MGR调优参数
因为基本复制结构,所有的数据复制,还是逻辑的重放,所以优化也是复制优化点。
slave_parallel_type -> LOGICAL_CLOCK #增强sql_thread个数:
slave_parallel_workers -> 2-8 #如果CPU瓶颈,网络没问题,减少CPU压缩:
group_replication_compression_threshold = 1000000 -> 2000000
由原来的1M变成2M,再进行压缩(主要针对大事务传述优化)
流控(flow control)
当启用:
group_replication_flow_control_mode=QUOTA 是表示启用流控。 流控默认通过两个参数控制:
group_replication_flow_control_applier_threshold (默认: 25000)
group_replication_flow_control_certifier_threshold (默认: 25000)
也就说默认延迟在25000个GTID时,会对整个集群Block住写操作。
当然,也可以允许,节点延迟,就如同我们主从结构,从节点延迟,不往上面发请求就可以。
关闭流控:
set global group_replication_flow_control_mode=‘DISABLED’;
提示: 关闭流控制,注意查看是不是存在延迟,如果延迟,自已控制阀值不向上面发请求即可。 多IDC结构的MGR,建议关闭流控。
MGR调优参数
因为基本复制结构,所有的数据复制,还是逻辑的重放,所以优化也是复制优化点。
slave_parallel_type -> LOGICAL_CLOCK #增强sql_thread个数:
slave_parallel_workers -> 2-8 #如果CPU瓶颈,网络没问题,减少CPU压缩:
group_replication_compression_threshold = 1000000 -> 2000000
由原来的1M变成2M,再进行压缩(主要针对大事务传述优化)