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

之前总结过一篇,是分分钟搭建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

}

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

while read line

do

reset_node $line

done

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值