目录
背景
在实际应用中,为了提高服务器的高可用性,往往会部署多套服务器,避免一台服务器故障后,引起服务瘫痪。针对无需数据冗余的服务,可以用第三方的成熟方案实现高可用性。
第三方方案可与当前业务逻辑完全分离,互不影响,实现更加灵活。目前主要存在两种成熟的高可用性方案,Keepalived与Heartbeat。
方案简介
Keepalived
Keepalived可用于服务器状态检测,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从集群系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
- 优势:使用更简单:从安装、配置、使用、维护等角度上对比,Keepalived都比Heartbeat简单,并且满足集群倒切需求;
- 劣势:没有管理功能;
- 编码难度较小,满足功能需求
Heartbeat
Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。Heartbeat(Linux-HA)的工作原理:Heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运 行在对方主机上的资源或者服务。
- 优势:功能更强大,配套工具更全,适合做大型集群管理,而Keepalived主要用于集群倒换,基本没有管理功能;
- 劣势:功能复杂,使用难度较大;
- 编码难度大,主要用于大型集群管理。
综上所述,针对只有两架服务器作为温备,组成的冗余系统,Keepalived方式即可满足需求,实现设备倒切。
以下主要介绍Keepalived的实现方式
Keepalived技术介绍
Keepalived通信方式
Keepalived支持单播和组播两种方式,由于方案中目前只存在两台设备作为温备,单播即可满足要求,同时也可避免其他系统Keepalived组播消息干扰。
Keepalived通信消息中携带鉴权类型为PASS方式,密码为一组任意的字符串,保证Keepalived安全通信。
时间同步
Keepalived通信裁决主备时,要求两台服务器的时间差不能太大,否则无法正确进行主备裁决,因此该方案采用NTP方式进行设备时间同步。
服务器操作系统安装时,已默认安装NTP服务,该文档只讲述NTP服务的配置。NTP配置文件路径:/etc/ntp.conf。在配置文件中分别添加如下两行:
server xx.xx.xx.xx
server 127.127.1.0
xx.xx.xx.xx为NTP服务器IP,表示该设备向NTP服务器同步时间。
第二行表示当上级NTP时钟失效时,使用本地时钟继续提供服务,方便其他设备进行时间同步。
当两台设备时间相差过大时,NTP服务无法进行时间同步。所以,需要结合ntpdate服务进行时间同步。ntpdate可强制进行时间同步。可在开机启动脚本(/etc/rc.d/rc.local)中添加如下三行:
service ntpd stop
ntpdate xx.xx.xx.xx
service ntpd start
由于NTP、ntpdate两个服务冲突,必须停止NTP服务后,ntpdate才能提供服务。
xx.xx.xx.xx为NTP服务器IP,表示设备向NTP服务器强制同步时间。
最后再重新启动NTP服务
NTP结合ntpdate时间同步后,会出现硬件时间与系统时间不一致的情况,可在文件/etc/sysconfig/ntpd添加如下配置向,使硬件时间与系统时间保持一致。
SYNC_HWCLOCK=yes
NTP时间同步时,硬件时间也进行相应的时间同步。
Keepalived配置案例
Keepalived日志配置
Keepalived安装成功后,配置其日志输出路径为:/var/log/keepalived.log。
在/etc/sysconfig/keepalived配置文件中将KEEPALIVED_OPTIONS设置修改为
KEEPALIVED_OPTIONS=”-D -d -S 0”
同时在/etc/rsyslog.conf配置文件中,添加一行
local0.* /var/log/keepalived.log
Keepalived服务配置
Keepalived服务配置共分为三个部分:全局配置段、VRRP配置段、LVS配置段。其中全局配置段用于定义全局设置,VRRRP配置段用于配置实例,LVS配置段用于定义虚拟服务器的设置。该方案中无需LVS配置段。
全局配置段
全局配置段中只需修改router_id即可,其中温备的两台设备该值必须区分开,作为设备唯一标志。
示例
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL1
}
VRRP配置段
VRRP配置段内包含服务监控脚本及vrrp同步组配置、相应的实例配置。
vrrp_script为监控脚本,定时执行周期为2秒,用于监控四个浮动IP的状态。
vrrp_sync_group为同步组配置,组内共有两个实例,任何一个监控实例出现异常后,即进行主备切换。角色切换后,执行notify脚本,服务器根据角色执行相应的操作。
vrrp_script monitor_service {
script "monitor_service.sh " 20.31.250.13 20.31.250.14 192.168.10.13 192.168.10.14
interval 2
}
vrrp_sync_group VG_1 {
group {
VI_1
VI_2
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}
需要监测两个网卡时可写两个实例,实例名对应于同步组group内的节点名,对于只需监测一个网卡的情况,可只写一个实例。该方案以两个实例为例进行介绍,两个实例只有网卡名、IP、virtual_router_id,其他项都基本一致。
实例1
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface bond0
track_interface {
bond0
}
virtual_router_id 133
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 337639943
}
unicast_src_ip 20.31.250.10
unicast_peer {
20.31.250.11
}
virtual_ipaddress {
20.31.250.13
20.31.250.14
}
track_script {
monitor_service
}
实例2
vrrp_instance VI_2 {
state BACKUP
nopreempt
interface eth2
track_interface {
eth2
}
virtual_router_id 233
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 337639943
}
unicast_src_ip 192.168.10.10
unicast_peer {
192.168.10.11
}
virtual_ipaddress {
192.168.10.13
192.168.10.14
}
track_script {
monitor_service
}
实例参数介绍
参数名称 | 解释 |
---|---|
state | 可配置为MASTER、BACKUP,该方案中,温备两台设备都配置为BACKUP |
interface | 浮动IP绑定的物理网口 |
track_interface | 监控的物理网口 |
virtual_router_id | 唯一标识id,用于区分vrrp实例,温备两台设备VI_1都配置为133,VI_2都配置为233 |
priority | 优先级,默认配置为100 |
advert_int | 发送vrrp通告的时间间隔,默认为1秒 |
authentication | vrrp实例协商的方式及密码,方式默认为PASS,密码为本地核心网十进制IP地址 |
unicast_src_ip | 本端interface网口上的固定IP |
unicast_peer | 对端interface网口上的固定IP |
virtual_ipaddress | Interface网口上的浮动IP |
track_script | 监控脚本,默认为vrrp_scrip定义的脚本 |
Keepalived服务启动
Keepalived安装完成后,可通过命令 service keepalived start 启动。
同时在开机启动配置文件/etc/rc.d/rc.local中添加如下一行,使Keep alived可开机自启动。
service keepalived start
服务异常检测
Keepalived服务只能监测硬件、网络的状态,无法服务进行检测。所以,一般需要增加服务异常检测。
在/etc/crontab定时任务文件中增加一行,每十分钟执行一次定时任务。
*/10 * * * * root my_keepalived_crontime.sh
当十分钟内,服务重启超过5次,则认为设备或服务出现问题,进行主备切换。