分分钟搭建MySQL Group Replication测试环境(二)(r12笔记第41天)
公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2017-04-21 23:55:59 · 原文链接
之前总结过一篇,分分钟搭建MySQL Group Replication测试环境(r11笔记第82天),但是有一个地方还有待改善,那就是那个脚本仅仅支持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.lst24801 s1 24901 Y24802 s2 24902 Y 24803 s3 24903 Y数据库的参数模板文件如下:
[mysqld]# server configurationdatadir=${base_data_dir}/${node_name}basedir=${base_dir}
port=${port}socket=${base_data_dir}/${node_name}/${node_name}.sockserver_id=${port}gtid_mode=ONenforce_gtid_consistency=ONmaster_info_repository=TABLErelay_log_info_repository=TABLEbinlog_checksum=NONElog_slave_updates=ONlog_bin=binlogbinlog_format=ROW
transaction_write_set_extraction=XXHASH64loose-group_replication_group_name="1bb1b861-f776-11e6-be42-782bcb377193"loose-group_replication_start_on_boot=offloose-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/mysqlbase_data_dir=/home/data
init_node_flag=`cat init.lst|head -1|awk '{print $4}'`
function get_seed_list{while read linedotmp_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_listport=$1node_name=$2v_port=$3primary_flag=$4init_node_flag=`cat init.lst|head -1|grep -w ${port}`if [[ -z ${init_node_flag} ]];theninit_node_flag='N'elseinit_node_flag='Y'fi
echo $init_node_flagif [ ${primary_flag} = 'Y' -a ${init_node_flag} = 'Y' ];thenprimary_flag='Y'elseprimary_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}.cnfsed -i 's:${base_data_dir}:'"${base_data_dir}:g"'' ${base_data_dir}/${node_name}/${node_name}.cnfsed -i 's:${base_dir}:'"${base_dir}:g"'' ${base_data_dir}/${node_name}/${node_name}.cnfsed -i 's:${node_name}:'"${node_name}:g"'' ${base_data_dir}/${node_name}/${node_name}.cnfsed -i 's:${port}:'"${port}:g"'' ${base_data_dir}/${node_name}/${node_name}.cnfsed -i 's:${v_port}:'"${v_port}:g"'' ${base_data_dir}/${node_name}/${node_name}.cnfsed -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=$1node_name=$2v_port=$3primary_flag=$4init_node_flag=`cat init.lst|sed -n '2p'|awk '{print $4}'`if [ ${init_node_flag} = 'N' ];then exitelse echo changefi
init_node_flag=`cat init.lst|head -1|grep -w ${port}`if [[ -z ${init_node_flag} ]];theninit_node_flag='N'elseinit_node_flag='Y'fi
if [ ${primary_flag} = 'Y' -a ${init_node_flag} = 'Y' ];thenmysql -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' ];thenmysql -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 linedoecho ${seed_list}echo okinit_node $linedone <init.lst
while read linedoreset_node $linedone <init.lst 运行这个脚本只需要sh init.sh即可,这个过程会自动读取配置文件init.lst的配置,然后初始化,搭建出多主的环境来,整个过程也就分分钟即可搞定。
整个脚本会执行两大部分的内容,一个是函数init_node,一个是reset_node。init_node会初始化,搭建传统的单主MGR环境,而reset_node是在单主模式的基础上的设置,把单主改变为多主。
感兴趣的同学可以多加交流,后期我打算放在github上,让更多的朋友来参考,提出改进建议。
