0
点赞
收藏
分享

微信扫一扫

shell脚本部署MHA集群

#!/bin/bash
#AUTHOR:AN
#VERSION:1.1.1
#DATE:2019-05-21
#MODIFY:2019-05-24 2019-05-31
#FUNCTION:MHA高可用集群

#加载配置文件
source /cloud_nsd/conf/mysql.conf
#加载函数库
if [ -f "$Script_Path/myfunction.lib" ];then
source $Script_Path/myfunction.lib
else
echo -e "\033[31m函数库不存在\033[0m"
exit $NOEXIST
fi
##############################################################

#初始化环境(50秒)
INIT(){
#实现免密登陆
bash $Script_Path/Pssh.sh -p
#安装Perl依赖包
yum -y install perl-DBD-mysql perl-DBI
yum -y install $Soft_Path/mysql/mha-soft-student/perl-*.rpm
rpm -ivh $Soft_Path/mysql/mha-soft-student/mha4mysql-node-0.56-0.el6.noarch.rpm #node节点
}

#修改配置文件,设置半同步,开启binlog日志
CONFIG(){
cp $Mysql_Conf $Mysql_Conf.bak #备份配置文件
sed -i '/\[mysqld\]/a relay_log_purge=off' $Mysql_Conf #关闭中继日志自动清除
sed -i '/\[mysqld\]/a binlog-format="mixed"' $Mysql_Conf
sed -i "/\[mysqld\]/a log-bin=$HOSTNAME" $Mysql_Conf
sed -i "/\[mysqld\]/a server_id=$Server_Id" $Mysql_Conf
sed -i '/\[mysqld\]/a rpl-semi-sync-slave-enabled=1' $Mysql_Conf #从库半同步
sed -i '/\[mysqld\]/a rpl-semi-sync-master-enabled=1' $Mysql_Conf #主库半同步
sed -i '/\[mysqld\]/a plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"' $Mysql_Conf #加载主从半同步模块
}

#选择主库
SELECT_MASTER(){
mysql -uroot -p$Mysql_Pwd -e "change master to master_host=$Master_Slave_Ip,master_user=$Master_User,master_password=$Master_Passwd,master_log_file=$Master_Log,master_log_pos=$Master_Pos"
mysql -uroot -p$Mysql_Pwd -e "start slave"
Io_Thread=`mysql -uroot -p$Mysql_Pwd -e "show slave status\G" |grep 'Slave_IO_Running' |awk '{print $2}'`
Sql_Thread=`mysql -uroot -p$Mysql_Pwd -e "show slave status\G" |grep 'Slave_SQL_Running:' |awk '{print $2}'`
if [ "$Io_Thread" == "Yes" -a "$Sql_Thread" == "Yes" ];then
cecho 36 "主从同步成功"
else
cecho 31 "主从同步失败"
exit $ISERROR
fi
}

##############################################################
#配置主服务器(17秒)
MASTER(){
Float_Ip=`echo $Vip |sed -r 's/(.)(.*)(.)/\2/'` #浮动IP(192.168.4.100/24)
ifconfig $Nic:1 $Float_Ip #在主服务器上配置VIP
CONFIG
systemctl restart mysqld
#添加客户端访问账户
mysql -uroot -p$Mysql_Pwd -e "grant insert,select on *.* to $Client_User@$Grant_Net identified by $Client_Pwd"
#添加管理主机远程连接数据库的用户(监控用户)
mysql -uroot -p$Mysql_Pwd -e "grant all on *.* to $Moni_User@$Grant_Net identified by $Moni_Passwd"
#添加主从同步授权用户
mysql -uroot -p$Mysql_Pwd -e "grant all on *.* to $Master_User@$Grant_Net identified by $Master_Passwd"
mysql -uroot -p$Mysql_Pwd -e "show grants for $Moni_User" && cecho 36 "监控用户添加成功"
mysql -uroot -p$Mysql_Pwd -e "show grants for $Master_User" && cecho 36 "同步授权用户添加成功"
[ $? -ne 0 ] && ERROR MASTER && exit $CONFERROR
}

#配置备用主服务器(9秒)
BACKUP_MASTER(){
CONFIG
systemctl restart mysqld
SELECT_MASTER && cecho 36 "备用主服务器配置成功"
}

#配置数据备份服务器(9秒)
DATA_BACKUP(){
cp $Mysql_Conf $Mysql_Conf.bak #备份配置文件
sed -i '/\[mysqld\]/a relay_log_purge=off' $Mysql_Conf
sed -i "/\[mysqld\]/a server_id=$Server_Id" $Mysql_Conf
sed -i '/\[mysqld\]/a rpl-semi-sync-slave-enabled=1' $Mysql_Conf
sed -i '/\[mysqld\]/a plugin-load="rpl_semi_sync_slave=semisync_slave.so"' $Mysql_Conf
systemctl restart mysqld
SELECT_MASTER && cecho 36 "数据备份服务器配置成功"
}

#配置管理主机(35)
MANAGER(){
Master_Host=`echo $Master_Slave_Ip |sed -r 's/(.)(.*)(.)/\2/'`
yum -y install perl-ExtUtils-* perl-CPAN-*
CA_TAR $Soft_Path/mysql/mha-soft-student/mha4mysql-manager-0.56.tar.gz #manager节点
cd /opt/mha4mysql-manager-0.56
cecho 32 "安装MHA....."
perl Makefile.PL && make && make install
MKDIR `dirname $Mha_Conf` #创建目录/etc/mha_manager
touch $Mha_Conf
#故障切换脚本
cp $Soft_Path/mysql/mha-soft-student/master_ip_failover `dirname $Mha_Conf`
sed -i "35c my \$vip = $Vip; \# Virtual IP" `dirname $Mha_Conf`/master_ip_failover #修改Vip地址
#写入管理主机的配置文件
cat >> $Mha_Conf << EOF
[server default]
manager_workdir=`dirname $Mha_Conf`
manager_log=`dirname $Mha_Conf`/manager.log
master_ip_failover_script=`dirname $Mha_Conf`/master_ip_failover

ssh_port=22
ssh_user=root
repl_user=$Master_User
repl_password=$Master_Passwd
user=$Moni_User
password=$Moni_Passwd

[server$Master_ID]
hostname=$Master_Host
candidate_master=1

[server$Bk_Mst1_ID]
candidate_master=1
hostname=$Bk_Mst_Host_1

[server$Bk_Mst2_ID]
candidate_master=1
hostname=$Bk_Mst_Host_2

[server$Data_Bk1_ID]
hostname=$Data_Bk_1
no_master=1
EOF
}

#测试MHA集群
TEST(){
masterha_check_ssh --conf=$Mha_Conf && masterha_check_repl --conf=$Mha_Conf
[ $? -eq 0 ] && OK MHA
# masterha_manager --conf=/etc/mha_manager/app1.cnf --remove_dead_master_conf --ignore_last_failover #启动管理服务
# masterha_check_status --conf=/etc/mha_manager/app1.cnf #查看状态
}

#帮助信息
HELP(){
cat << EOF
MHA version 1.1.1
Usage: MHA [optional]
=======================================================================
optional arguments:
-h 提供帮助信息
-I 初始化环境
-M 部署主服务器
-B 部署备用主服务器
-D 部署数据备份服务器
-m 部署管理集群主机
-T 测试集群
EXAMPLE:
MHA.sh -I
EOF
}

#############################主程序#############################
[ $# -eq 0 ] && HELP
while getopts :hIMBDmT ARGS
do
case $ARGS in
h)
HELP;;
I)
INIT;;
M)
MASTER;;
B)
BACKUP_MASTER;;
D)
DATA_BACKUP;;
m)
MANAGER;;
T)
TEST;;
\?)
cecho 31 "Invalid option:bash `basename $0` [-h]"
esac
done


举报

相关推荐

0 条评论