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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Heartbeat配置多播方式以及heartbeat安装脚本相关的知识,希望对你有一定的参考价值。

之前部署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-debug

logfile /var/log/ha-log

logfacility local1

keepalive 2

deadtime 30

warntime 10

initdead 60

ucast eth1 172.16.49.133

auto_failback on

node heartbeat01.contoso.com

node heartbeat02.contoso.com

ping 172.16.49.1

respawn 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


本文出自 “IT小二郎” 博客,请务必保留此出处http://jerry12356.blog.51cto.com/4308715/1855926

以上是关于Heartbeat配置多播方式以及heartbeat安装脚本的主要内容,如果未能解决你的问题,请参考以下文章

heartbeat-gui

heartbeat-gui

Haproxy+Heartbeat 高可用集群方案操作记录

HA集群配置

LVS+Heartbeat 高可用集群方案操作记录

heartbeat安装与配置