分分钟搭建MySQL Group Replication测试环境(二)(r12笔记第41天)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介:    之前总结过一篇,是分分钟搭建MySQL MGR环境的,但是有一个地方还有待改善,那就是那个脚本仅仅支持single-primary模式,不支持多主模式,而官方文档中这部分信息还比较少。

   之前总结过一篇,是分分钟搭建MySQL MGR环境的,但是有一个地方还有待改善,那就是那个脚本仅仅支持single-primary模式,不支持多主模式,而官方文档中这部分信息还比较少。

   我觉得这部分内容一方面和本身MGR的多主支持还不够成熟也有关系,需要一个过渡。但是如果想测试测试也是完全可以的,所以我决定改进我的脚本。

   大体来说,如果要开启多主模式,如果能够轻松搭建出单主,读写分离的架构,那么搭建多主是很简单的一件事情。

在原来单主模式的主节点执行操作如下:

stop GROUP_REPLICATION;
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;而对于他的节点,执行下面的操作即可。

stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;
start group_replication;

里面有一个地方比较有意思,那就是我需要修改不少校验逻辑在配置文件上。

原本的额配置文件依旧不变,通过下面的配置能够标示那个是主写节点,搭建出读写风能力的架构后,再根据条件进行多主的设置。里面的重点就是第四列的处理上。

# cat init.lst
24801 s1  24901  Y
24802 s2  24902  Y
24803 s3  24903  Y数据库的参数模板文件如下:

[mysqld]
# server configuration
datadir=${base_data_dir}/${node_name}
basedir=${base_dir}

port=${port}
socket=${base_data_dir}/${node_name}/${node_name}.sock
server_id=${port}
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
loose-group_replication_group_name="1bb1b861-f776-11e6-be42-782bcb377193"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "127.0.0.1:${v_port}"
loose-group_replication_group_seeds= "${seed_list}"
loose-group_replication_bootstrap_group= off这个模板文件的内容会根据配置而动态生成。

关键的部分就是如何初始化,如果有条不紊的进行多主环境的阶段性演进。

base_dir=/usr/local/mysql
base_data_dir=/home/data

init_node_flag=`cat init.lst|head -1|awk '{print $4}'`

function get_seed_list
{
while read line
do
tmp_port='127.0.0.1:'`echo $line|awk '{print $3}'`
echo ${tmp_port}
done <init.lst|xargs |sed 's/ /,/g'
}

export seed_list=`get_seed_list`
#echo ${seed_list}

function init_node
{
echo $seed_list
port=$1
node_name=$2
v_port=$3
primary_flag=$4
init_node_flag=`cat init.lst|head -1|grep -w ${port}`
if [[ -z ${init_node_flag} ]];
then
init_node_flag='N'
else
init_node_flag='Y'
fi

echo $init_node_flag
if [ ${primary_flag} = 'Y' -a ${init_node_flag} = 'Y' ];
then
primary_flag='Y'
else
primary_flag='N'
fi

${base_dir}/bin/mysqld --initialize-insecure --basedir=${base_dir} --datadir=${base_data_dir}/${node_name} --explicit_defaults_for_timestamp

chown -R mysql:mysql  ${base_data_dir}/${node_dir}

cp ${base_data_dir}/s.cnf ${base_data_dir}/${node_name}/${node_name}.cnf
sed -i 's:${base_data_dir}:'"${base_data_dir}:g"'' ${base_data_dir}/${node_name}/${node_name}.cnf
sed -i 's:${base_dir}:'"${base_dir}:g"'' ${base_data_dir}/${node_name}/${node_name}.cnf
sed -i 's:${node_name}:'"${node_name}:g"''  ${base_data_dir}/${node_name}/${node_name}.cnf
sed -i 's:${port}:'"${port}:g"''  ${base_data_dir}/${node_name}/${node_name}.cnf
sed -i 's:${v_port}:'"${v_port}:g"'' ${base_data_dir}/${node_name}/${node_name}.cnf
sed -i 's/${seed_list}/'"${seed_list}/g"'' ${base_data_dir}/${node_name}/${node_name}.cnf

chown -R mysql:mysql ${base_data_dir}/${node_name}

${base_dir}/bin/mysqld_safe --defaults-file=${base_data_dir}/${node_name}/${node_name}.cnf &

sleep  5

${base_dir}/bin/mysql -P${port}  -S ${base_data_dir}/${node_name}/${node_name}.sock  -e "show databases"

if [[ ${primary_flag} = 'Y' ]];then

mysql -P${port}  -S ${base_data_dir}/${node_name}/${node_name}.sock -e "
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass'
                      FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';               
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
select *from performance_schema.replication_group_members;
"
elif [[ ${primary_flag} = 'N' ]];then

mysql -P${port}  -S ${base_data_dir}/${node_name}/${node_name}.sock -e   "
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass'
        FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
set global group_replication_allow_local_disjoint_gtids_join=on;
start group_replication;
select *from performance_schema.replication_group_members;
"
else
   echo 'Please check variable primary_flag'
fi

}
function reset_node
{
port=$1
node_name=$2
v_port=$3
primary_flag=$4
init_node_flag=`cat init.lst|sed -n '2p'|awk '{print $4}'`
if [ ${init_node_flag} = 'N' ];
then
 exit
else
  echo change
fi

init_node_flag=`cat init.lst|head -1|grep -w ${port}`
if [[ -z ${init_node_flag} ]];
then
init_node_flag='N'
else
init_node_flag='Y'
fi

if [ ${primary_flag} = 'Y' -a ${init_node_flag} = 'Y' ];
then
mysql -P${port}  -S ${base_data_dir}/${node_name}/${node_name}.sock -e "
stop GROUP_REPLICATION;
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;
"
elif [ ${primary_flag} = 'Y' -a ${init_node_flag} = 'N'  ];then
mysql -P${port}  -S ${base_data_dir}/${node_name}/${node_name}.sock -e   "
stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;
start group_replication;
"
fi

}
#MAIN

while read line
do
echo ${seed_list}
echo ok
init_node $line
done <init.lst

while read line
do
reset_node $line
done <init.lst   运行这个脚本只需要sh init.sh即可,这个过程会自动读取配置文件init.lst的配置,然后初始化,搭建出多主的环境来,整个过程也就分分钟即可搞定。

   整个脚本会执行两大部分的内容,一个是函数init_node,一个是reset_node。init_node会初始化,搭建传统的单主MGR环境,而reset_node是在单主模式的基础上的设置,把单主改变为多主。

    感兴趣的同学可以多加交流,后期我打算放在github上,让更多的朋友来参考,提出改进建议。




 


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
关系型数据库 MySQL 索引
MySQL多表练习笔记
链接可行,多表查询语法
80 0
|
7月前
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
128 0
|
7月前
|
SQL 缓存 关系型数据库
MySQL8.4 Enterprise安装Firewall及测试
MySQL8.4 Enterprise安装Firewall及测试
182 0
|
7月前
|
安全 关系型数据库 MySQL
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
118 0
|
8月前
|
Oracle 关系型数据库 MySQL
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
|
9月前
|
存储 数据可视化 测试技术
一个测试工程师的实战笔记:我是如何在Postman和Apipost之间做出选择的?
优秀的API测试工具应该具备: 分层设计:既有可视化操作,也开放代码层深度定制 场景感知:自动识别加密需求推荐处理方案 协议包容:不强迫开发者为了不同协议切换工具 数据主权:允许自主选择数据存储位置
235 7
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
4568 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
测试技术
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
本文是关于自动化测试项目实战笔记,主要介绍了如何测试用户注册功能,包括验证码错误、注册成功以及弹框处理的测试步骤和代码实现。
405 2
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
|
机器学习/深度学习 JSON 算法
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
本文介绍了DeepLab V3在语义分割中的应用,包括数据集准备、模型训练、测试和评估,提供了代码和资源链接。
2704 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
261 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建

推荐镜像

更多