您的位置:首页 > 其它

Heartbeat配置多播方式以及heartbeat安装脚本

2016-09-23 18:13 295 查看
之前部署heartbeat都是使用单播的方式进行配置,但是网上也有传多播比较稳定的说法,这里先不去管那种方式更有效,先来实验一下多播的配置。
多播的配置只需要修改ha.cf中的几个参数,下面是多播的配置:
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local1
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
mcast eth1 225.0.0.1 694 1 0
auto_failback on
node heartbeat01.contoso.com
node heartbeat02.contoso.com
respawn hacluster /usr/lib64/heartbeat/ipfail
作为比较,下面是之前单播的配置:
debugfile /var/log/ha-debuglogfile /var/log/ha-loglogfacility local1keepalive 2deadtime 30warntime 10initdead 60ucast eth1 172.16.49.133auto_failback onnode heartbeat01.contoso.comnode heartbeat02.contoso.comping 172.16.49.1respawn hacluster /usr/lib64/heartbeat/ipfail区别:
1)多播两个节点的ha.cf文件内容是一模一样的。
2)单播两个节点的ha.cf文件中只有ucast的地址不一样(对端IP地址)。
3)单播不能指定udpport,不然会报错,而多播要指定udpport。
4)如果环境中有多个heartbeat集群,则集群中多播的地址不能一模一样,容易出现问题;单播不受集群数量的限制,每个集群中的单个节点只需要指定对端的IP地址即可。

下面是一个安装heartbeat的shell脚本(仅供参考):
#!/bin/bash
##############################################
#Description:This script is used to install
#hearbeat on CentOS 6.x.
#Usage: run the script, and it will ask you
#to input some information about the heartbeat
#nodes.
#Author: Jerry Zhao  QQ:1217406852
#Date: 2016-09-23 14:43:40 Friday
##############################################
stop_iptables(){
/etc/init.d/iptables status  >/dev/null 2>&1
if [ $? -eq 0 ];then
/etc/init.d/iptables stop >/dev/null
chkconfig iptables off >/dev/null
echo "Stop iptables successful."
else
echo "Iptables firewall was stopped."
fi
selinux_status=`getenforce`
if [ "$selinux_status" != "Disabled" ];then
sed -i '/^SELINUX/s/enforcing/disabled/' /etc/selinux/config
setenforce 0  2>/dev/null
echo "Disable selinux successful."
else
echo "SELinux was disabled."
fi
}

time_sync(){
crond_num=`crontab -l|grep ntpdate|wc -l`
if [ $crond_num -ge 1 ];then
echo "Already added crond job for time sync."
else
echo '0 * * * * /usr/sbin/ntpdate   210.72.145.44 64.147.116.229 time.nist.gov' >>/var/spool/cron/root
grep ntpdate /var/spool/cron/root >/dev/null
[ $? -ne 0 ] && echo "Add crond job for time sync failed." && exit 1 || echo "Add crond job for time sync successful."
fi
}

set_hostname(){
sed -i '/^HOSTNAME/s/^/#/' /etc/sysconfig/network
sed -i "/#HOSTNAME/aHOSTNAME=$NodeHostName1" /etc/sysconfig/network
sed -i '/^#HOSTNAME/d' /etc/sysconfig/network
hostname "$NodeHostName1"
Uname=`uname -n`
if [ "$NodeHostName1" == "$Uname" ];then
echo "Change hostname successful."
break;
else
echo "Change hostname failed."
break;
fi
}

change_hosts(){
cp /etc/hosts /etc/hosts.bak$(date +%F)
echo -e "127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4\n::1         localhost localhost.localdomain localhost6 localhost6.localdomain6" >/etc/hosts
echo -e "$localip   $LocalHostName\n$ip   $HostName" >>/etc/hosts
Host_Num=`grep -v "localhost" /etc/hosts |wc -l`
[ $Host_Num -lt 2 ] && echo "Change hosts failed, please add hosts manaully." && exit 1 || echo "Change hosts successful."
}

hbt_install(){
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 1>/dev/null 2>/dev/null
rpm -qa epel-release >/dev/null
[ $? -ne 0 ] && echo "Install epel failed." && exit 1
yum -y install heartbeat  >/dev/null
[ $? -ne 0 ] && echo "Install heartbeat failed." && exit 1 || echo "Install heartbeat successful."
}

hbt_config(){
cp /usr/share/doc/heartbeat-3.0.4/{ha.cf,haresources,authkeys} /etc/ha.d/
cd /etc/ha.d/

#config authkeys
#Str_SHA=`openssl rand -hex 8` #会导致两节点上的sha1不同,手动操作可以用来生成随机字符串
Str_SHA=55c91e0592851a27
sed -i '/^#auth/aauth 2' authkeys >/dev/null
sed -i "/^#2 sha1/a2 sha1 $Str_SHA" authkeys >/dev/null
chmod 600 authkeys
echo "Config authkeys successful."

#config ha.cf
sed -i '/^#debugfile/s/^#//' ha.cf
sed -i '/^#logfile/s/^#//' ha.cf
sed -i '/^logfacility/s/local0/local1/' ha.cf
sed -i '/#keepalive/s/^#//' ha.cf
sed -i '/#deadtime/s/^#//' ha.cf
sed -i '/#warntime/s/^#//' ha.cf
sed -i '/#initdead/ainitdead 60' ha.cf
sed -i "/#mcast/amcast eth$InterFaceNumber 225.0.0.$d  694 1 0" ha.cf
sed -i '/#udpport/s/^#//' ha.cf
sed -i "/kathy$/anode$LocalHostName\nnode $HostName" ha.cf
sed -i '/^#respawn hacluster/arespawn hacluster /usr/lib64/heartbeat/ipfail' ha.cf
echo "Config ha.cf successful."

#config haresources
echo "$LocalHostName IPaddr::$VIP/24/eth$InterFaceNumber" >>haresources
echo "Config haresources successful."

/etc/init.d/heartbeat start >/dev/null
[ $? -ne 0 ] && echo "Start heartbeat failed." && exit 1 || echo "Start heartbeat successful."

}

check_ip(){
read -p "Please enter your ip: " ip
if [ -z $ip ];then      #输入不能为空
echo "Enter not null."

elif [[ $ip =~ ^[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[1-9][0-9]{0,2}$ ]];then     #输入的不是数字或不是IP格式,则重新输入       #^$:从开始到结束是数字才满足条件,=~:一个操作符,表示左边是否满足右边(作为一个模式)正则表达式
a=`echo $ip |cut -d. -f1`
b=`echo $ip |cut -d. -f2`
c=`echo $ip |cut -d. -f3`
d=`echo $ip |cut -d. -f4`
if [ $a -le 255 -a $b -le 255 -a $c -le 255 -a $d -le 255 ];then
#当满足输入条件时,截取IP四段数字进行整数比较,判断四段数字是否小于或等于255,同时满足条件,跳出所有循环继续,如果其中一个不满足,则重新输入
echo "The IP address of another heartbeat node is [$ip]."
break;
else
echo "IP format error,Please enter the IP again."
fi
else
echo "IP format error,Please enter the IP again."
fi
}

check_local_ip(){
read -p "Please enter your ip: " localip
if [ -z $localip ];then      #输入不能为空
echo "Enter not null."
return 1
elif [[ $localip =~ ^[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[1-9][0-9]{0,2}$ ]];then     #输入的不是数字或不是IP格式,则重新输入       #^$:从开始到结束是数字才满足条件,=~:一个操作符,表示左边是否满足右边(作为一个模式)正则表达式
a=`echo $localip |cut -d. -f1`
b=`echo $localip |cut -d. -f2`
c=`echo $localip |cut -d. -f3`
d=`echo $localip |cut -d. -f4`
if [ $a -le 255 -a $b -le 255 -a $c -le 255 -a $d -le 255 ];then
#当满足输入条件时,截取IP四段数字进行整数比较,判断四段数字是否小于或等于255,同时满足条件,跳出所有循环继续,如果其中一个不满足,则重新输入
Eth_Num=`ifconfig|grep eth|wc -l`
for ((i=0;i<$Eth_Num;i++))
do
LIP=`ifconfig eth$i|grep "inet addr"|awk -F" " '{print $2}'|cut -d: -f2`
if [ "$localip" == "$LIP" ];then
echo "$localip is on eth$i."
return 0
break;

fi
echo "The ip address [$localip] you input is not on eth$i."
return 1
done

else
echo "IP format error,Please enter the IP again."
return 1
fi
else
echo "IP format error,Please enter the IP again."
return 1
fi
}

check_vip(){
read -p "Please enter your VIP: " VIP
if [ -z $VIP ];then      #输入不能为空
echo "Enter not null."

elif [[ $VIP =~ ^[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[1-9][0-9]{0,2}$ ]];then     #输入的不是数字或不是IP格式,则重新输入       #^$:从开始到结束是数字才满足条件,=~:一个操作符,表示左边是否满足右边(作为一个模式)正则表达式
a=`echo $VIP |cut -d. -f1`
b=`echo $VIP |cut -d. -f2`
c=`echo $VIP |cut -d. -f3`
d=`echo $VIP |cut -d. -f4`
if [ $a -le 255 -a $b -le 255 -a $c -le 255 -a $d -le 255 ];then
#当满足输入条件时,截取IP四段数字进行整数比较,判断四段数字是否小于或等于255,同时满足条件,跳出所有循环继续,如果其中一个不满足,则重新输入
echo "The VIP address is [$VIP]."
break;
else
echo "IP format error,Please enter the VIP again."
fi
else
echo "IP format error,Please enter the VIP again."
fi
}

check_ethnum(){
read -p "Please enter the interface number: " InterFaceNumber
if [ -z $InterFaceNumber ];then
echo "Interface number can't be null."
elif [[ $InterFaceNumber =~ ^[0-9]$ ]];then
if [ $InterFaceNumber -lt $Eth_Num ];then
echo "VIP will be run on eth$InterFaceNumber."
break;
else
echo "Can't find eth$InterFaceNumber."
fi
else
echo "Invalid interface number."
fi
}

check_hostname(){
read -p "Please enter your hostname : " HostName
if [ "$HostName" != "" ];then
echo "The hostname you typed is $HostName."
break;
else
echo "Hostname can't be null."
fi
}

change_local_hostname(){
read -p "Please input your hostname : " LocalHostName
if [ "$LocalHostName" != "" ];then
sed -i '/^HOSTNAME/s/^/#/' /etc/sysconfig/network
sed -i "/#HOSTNAME/aHOSTNAME=$LocalHostName" /etc/sysconfig/network
sed -i '/^#HOSTNAME/d' /etc/sysconfig/network
hostname "$LocalHostName"
Uname=`uname -n`
if [ "$LocalHostName" == "$Uname" ];then
echo "Change hostname successful."
break;
else
echo "Change hostname failed."
exit 1;
fi
fi
}

#检查用户输入的本地IP地址
while true;do
echo -e  "You need to input your local \033[1;32mIP address\033[0m on \033[1;32mthis server\033[0m."
check_local_ip
if [ $? -eq 0 ];then
break;
fi
done

#检查用户输入的另外一个节点的IP地址
while true;do
echo -e "You need to input the \033[1;32mIP address\033[0m of \033[1;32manother heartbeat node\033[0m."
check_ip
done

#检查用户输入的运行脚本的这台主机的主机名
while true;do
echo -e "You need to input the \033[1;32mhostname\033[0m for \033[1;32mthis server\033[0m."
change_local_hostname
done

#检查用户输入的另外一个节点的主机名
while true;do
echo -e "You need to input the \033[1;32mhostname\033[0m of \033[1;32manother heartbeat node\033[0m."
check_hostname
done

#检查用户输入的VIP地址
while true;do
echo -e "You need to input the \033[1;32mVIP address\033[0m."
check_vip
done

#检查绑定VIP的网卡
while true;do
echo -e "You need determine \033[1;32mwhich interface\033[0m to \033[1;32mrun the VIP\033[0m."
check_ethnum
done

stop_iptables
time_sync
change_hosts
hbt_install
hbt_config
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  heartbeat 单播 心跳