本文共 4603 字,大约阅读时间需要 15 分钟。
前几天分享了下搭建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}.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 } #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.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-2134189/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23718752/viewspace-2134189/