分分鐘搭建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 <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上,讓更多的朋友來參考,提出改進建議。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2137790/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分分鐘搭建MySQL Group Replication測試環境(r11筆記第83天)MySql筆記
- 分分鐘搭建MySQL一主多從環境(r12筆記第31天)MySql筆記
- MGR(MySQL Group Replication)部署搭建測試MySql
- 分分鐘搭建Oracle環境Oracle
- MYSQL Group Replication搭建過程記錄MySql
- MySQL Group Replication小試MySql
- 【Mysql】MySQL5.7.17- Group Replication搭建MySql
- kafka學習筆記1:測試環境搭建Kafka筆記
- 配置Mysql Group Replication遇到的問題筆記MySql筆記
- 在eclipse中配置MySQL原始碼環境(r12筆記第14天)EclipseMySql原始碼筆記
- MySQL Group ReplicationMySql
- 動態建立MySQL Group Replication的節點(r11筆記第84天)MySql筆記
- mysqlpump的效能測試(r12筆記第89天)MySql筆記
- MySQL InnoDB Cluster環境搭建和簡單測試MySql
- Oracle閃回原理測試(三)(r12筆記第16天)Oracle筆記
- sandbox和MHA快速測試(r12筆記第32天)筆記
- MySQL group replication介紹MySql
- kaldi環境搭建 | yesno 測試
- android測試環境搭建Android
- MySQL自增列主從不一致的測試(r12筆記第37天)MySql筆記
- Dockerfile 與 Compose 環境搭建學習筆記(二)Docker筆記
- griffin環境搭建及功能測試
- 搭建自動化測試環境
- MySQL中的批量初始化資料的對比測試(r12筆記第71天)MySql筆記
- 達夢6.0試用之測試環境搭建
- 聊點高考往事和駕照科目二考試(r12筆記第86天)筆記
- 軟體測試培訓:如何搭建測試環境
- 筆記一:前期 docker 環境搭建筆記Docker
- Laravel 開發環境搭建-筆記Laravel開發環境筆記
- 學習筆記:MQTT環境搭建筆記MQQT
- MySQL中的derived table(r12筆記第47天)MySql筆記
- 使用pt工具檢測MySQL主從延遲(r12筆記第7天)MySql筆記
- MySQL Group Replication 學習(部署篇)MySql
- 新手搭建 kubernetes 測試環境
- 你真的會搭建測試環境嗎?
- OCM實驗-測試環境的搭建
- 搭建rac+DataGuard的測試環境
- 如何搭建良好的軟體測試環境?測試環境對軟體測試起到什麼作用?