动态创建MySQL Group Replication的节点(r11笔记第84天)

前几天分享了下搭建MySQL Group Replication的脚本,其实感觉还是不太踏实,虽然我成功搭建了3个节点的环境,但是有不少问题还没有解决,甚至是特意避开了。

    1.节点数都是在脚本里固定的,想搭建4个,6个节点的,完全适应不了

   2.模板臃肿,每个节点一个参数模板,其实就几个参数不一样

   3.单主模式下的节点,其实就一个写节点的配置略有不同,其它节点配置都是一样的,但是脚本里也是写固定了。

   4.端口也是写固定了,没法再改了。

。。。。

  我能够一口气列出很多很多的缺点,但是你说这么多缺点,搭建3个节点耗时多少,大概不到1分钟,明显满足需求。

  在这个方面,看着臃肿的脚本就有些难受,我决定做些什么,我自己在想,我想搭建5个节点的环境,能不能秒级完成,最多的节点数是9个,我能不能1分钟左右模拟出来这个超限的错误。所以我重新改了一版脚本,把之前碰到的问题大部分都做了整合。

◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆

   首先说两个配置文件。这个文件是动态搭建的核心,每个节点的端口号,节点的编码(自定义),是否为主节点等都一一做了标识。

[root@grtest data]# cat init.lst
24801 s1 24901  Y
24802 s2 24902  N
24803 s3 24903  N
24804 s4 24904  N
24805 s5 24905  N
24806 s6 24906  N
24807 s7 24907  N
24808 s8 24908  N
24809 s9 24909  N接下来就是参数文件,里面的动态部分都使用变量来达到动态替换的效果。

[root@grtest data]# cat s.cnf
[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其中难点在于参数group_replication_group_seeds=这个参数值需要花点功夫拼出来。

除此之外,就没有其它的配置文件了,直接上我们的核心脚本。

get_seed_list就是特别处理参数group_replication_group_seeds的值,init_node用来初始化各个节点。

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

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
${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
}

#MAIN

while read line
do
echo ${seed_list}
init_node $line
done <init.lst我们花一两分钟来模拟一下节点数超限的问题。

即在init.lst添加10个节点信息。

很快就得到了报错信息:

ERROR 3191 (HY000) at line 10: The START GROUP_REPLICATION command failed since the group already has 9 members.

   

时间: 2024-10-23 08:54:00

动态创建MySQL Group Replication的节点(r11笔记第84天)的相关文章

MySQL 5.7 Group Replication错误总结(r11笔记第84天)

   今天来总结下MySQL 5.7中的一些问题处理,相对来说常规一些.搭建的过程我就不用多说了,昨天的文章里面可以看到一个基本的方式,在测试环境很容易模拟,如果在多台物理机环境中搭建是不是也一样呢,答案是肯定的,我自己都一一试过了.     因为搭建的环境官方建议也是single_primary的方式,即一主写入,其它做读,也就是读写分离,当然支持multi_primary理论上也是可行的,但是还是有点小问题,我们就以single_primary来举例.  问题1: 读节点加入组的时候,sta

分分钟搭建MySQL Group Replication测试环境(r11笔记第83天)

   最近看了下MySQL 5.7中的闪亮特性Group Replication,也花了不少做了些测试,发现有些方面的表现确实不赖.当然要模拟这么一套环境还是需要花不少的功夫的,一般来说都是3个节点的环境,实际中要找这样的环境也不是很容易.我们怎么快速模拟呢.一种方式就是在一台服务器上搭建多实例.    这样一来,服务器的问题就解决了,下面要解决的问题就要艰巨的多了,那就是部署环境.    可以看到各路博客中都有了详细的解释,而官方文档中对于搭建过程也花了不少的额篇幅来解释,每一个步骤,每个操作

Galera 将死 — MySQL Group Replication 发布

MySQL Group Replication GA 很多同学表示昨天的从你的全世界路过画风不对,好在今天MySQL界终于有大事情发生可作为聊资.话说,当昨天小伙伴们沉浸于双12的买买买节奏中,孰料远在美国西海岸的Oracle官方放出了最新的MySQL 5.7.17版本.更为重要的是,MySQL Group Replication(下简称MGR)终于来了. 在之前的MySQL的一致性世界的文章中,Inside君已经表示腾讯基于Paxos的强一致方案虽好,但官方基于Paxos的方案早已箭在弦上,作

Galera将死——MySQL Group Replication正式发布

2016-12-14 来源:InsideMySQL 作者:姜承尧 MySQL Group Replication GA 很多同学表示昨天的从你的全世界路过画风不对,好在今天MySQL界终于有大事情发生可作为聊资.话说,当昨天小伙伴们沉浸于双12的买买买节奏中,孰料远在美国西海岸的Oracle官方放出了最新的MySQL 5.7.17版本.更为重要的是,MySQL Group Replication(下简称MGR)终于来了. 在之前的MySQL的一致性世界的文章中,Inside君已经表示腾讯基于Pa

Mysql group replication复制原理

前言:          Mysql版本5.7.17推出Mysql group replication(组复制),相对以前传统的复制模式(异步复制模式async replication 及半同步复制模式semi-sync replication),一个主,对应一个或多个从,在主数据库上执行的事务通过binlog复制的方式传送给slave,slave通过 IO thread线程接收将事务先写入relay log,然后重放事务,即在slave上重新执行一次事务,从而达到主从事务一致的效果,如下图为两

To MGR or Not MGR? Review of MySQL Group Replication

MySQL Group Replication GA On December 12, 2016, Oracle released exciting news to the MySQL circle. It officially launched version 5.7.17 of MySQL, which includes the long-awaited MySQL Group Replication (MGR). This article provides insights on the b

公开课发布《MySQL Group Replication思想》

0.导读 央视网络国际有限公司资深MySQL专家古雷老师分享<MySQL Group Replication思想>. 1.活动总结 昨天晚上,知数堂培训邀请到央视网络国际有限公司资深MySQL专家古雷老师分享<MySQL Group Replication思想>主题.形象的通过马农.砖家与运韦合伙种地.放鸽子.鸽子间如何相互通信协调的故事,让我们对MySQL Group Replication的基础原理有了深刻认识. 本次分享通过"IT大咖说"平台进行,相关的课

MySQL Group Replication小试

   最近看了下MySQL Group Replication的内容,因为发布的时间不是很长,可以算是一个新鲜玩意,而且因为它特有的意义,这个特性显得更加意味深长.   我接触Oracle的时间要长一些,所以很多时候都喜欢带着对比的眼光来看,单着自己尝试着用了下这个特性,感觉一下子让我找到了当年学习Oracle 10g RAC时的感觉,里面还是有一些小问题,而且还不少,眼巴巴的看着报错,但是日志又很有限,查阅资料,竟然不是bug就是找不到一些相关的信息,所以有时候有种信息孤岛的感觉.   官网的

MySQL Group Replication 学习笔记

作者简介 刘伟  云和开创高级顾问 题记:group replication作为mysql官方,在5.7版本阶段开发的,innodb的分布式数据库架构,从发布开始就有很多关注,下文是我对目前为止的材料以及实验的一些总结. 主要资料来源是官方blog:http://mysqlhighavailability.com/ group replication架构 group replication(后文简称GR)实现的分布式数据库架构,底层的分布式基础是Paxos(出于行文限制,此处不单独交代Paxos