19,614
社区成员
发帖
与我相关
我的任务
分享#########keepalived配置文件 /etc/keepalived/keepalived.conf##############
global_defs {
notification_email {
xxx@abc.com
yyy@abc.com
}
notification_email_from root
smtp_server smtp.abc.com
smtp_connect_timeout 30
router_id app1_node1 ## 本节点的标识字符串,可以为hostname,只要每个节点不同就可以(相同也不影响运行,但邮件通知里节点同名就让管理员傻逼了)
}
vrrp_instance app1_cluster {
state BACKUP ## 节点状态预设值(MASTER|BACKUP),不过当keepalived启动时会将先启动的(设置了nopreempt)或priority比较大的节点选举为MASTER,都设为BACKUP吧
interface eth0 ## 绑定VIP的接口
virtual_router_id 51 ## 区分多个instance的VRRP组播,取值0-255之间,不同节点相同vrrp_instance该值必须相同!
priority 200 ## 节点的优先级的初始值(受健康检查影响而变化),该值越大,表示优先级越高,默认最大优先级的为master,即VIP的拥有者,但设置了nopreempt时例外。
nopreempt ## 即使master恢复也不接管backup,减少切换带来的丢包等问题
#preempt_delay 60 ## master启动多久之后进行接管资源(VIP/Route信息等),与nopreempt互斥。
advert_int 1 ## 发VRRP包的时间间隔,即多久进行一次master选举
authentication {
auth_type PASS ## 设置验证类型,主要有PASS和AH两种
auth_pass 1111 ## 验证密码,同一instance的节点要一致
}
virtual_ipaddress {
192.168.200.86/32 ## VIP地址和掩码,不一定非要32,但为了和RealServer的统一(DR方式下RealServer也要有和vip相同的ip绑在lo接口),最好就设为255.255.255.255。
}
notify_master "/etc/keepalived/notify_script master"## 切到master后执行的脚本(很重要,否则无法实现DR)
notify_backup "/etc/keepalived/notify_script backup"## 切到backup后执行的脚本(很重要,否则无法实现DR)
notify_fault "/etc/keepalived/notify_script fault" ## 故障状态后执行的脚本,这部分我随便写的,没有测试过,不需要可以注释掉
}
virtual_server 192.168.200.86 8000 { ## VIP的地址和端口,别忘了修改
## 以下设置实际是在调用ipvs,所以我把ipvsadm参数也放在注释里面
delay_loop 6 ## 设置健康检查时间,单位是秒
lb_algo sh ## 设置LVS调度算法,采用sh(-s sh),就是只要是这个源地址就会一直分配一个RS,算法有:rr、wrr、lc、wlc、lblc、lblcr、dh、sh、sed、nq,你原来是rr,就是请求一次换台服务器
lb_kind DR ## 设置LVS实现LB机制,有DR(-g)、NAT(-m)和TUN(-i)三种,NAT方式我很少用,TUN压根儿没有用过
persistence_timeout 600 ## 这个就是持久连接的秒数,会话保持时间,单位为秒(-p),设大些,默认300
protocol TCP ## 指定转发协议,有TCP(-t)和UDP(-u)两种
real_server 192.168.200.81 8000 { ## 设置real_server的ip(-r 192.168.200.81:8000),无端口映射可以不加端口号,DR不允许端口映射,别忘了修改
weight 1 ## 配置节点权限,默认为1,0为失效,数字越大权限越高(-w 1),也就被访问个没完,都设为1就好了
HTTP_GET { ## 使用HTTP_GET方式检查,SSL_GET的参数与其类似
url {
path / ## 就是http://192.168.200.81:8000后的url,可能是/index.html,/index.jsp啥的,请根据实际情况
#status_code 200
digest 23a90ac5e681408b59dc9b8e62a9ce49 ## 由genhash访问url生成。值相同则表示健康,这个比status_code靠谱,如果是通过http访问了db,还可以判断db是否正常。这个是我应用的值,你要自己改
}
connect_timeout 10 ## 尝试连接访问url的最大时间
nb_get_retry 3 ## 尝试的次数
delay_before_retry 3 ## 每次尝试的时间间隔
}
}
real_server 192.168.200.82 8000 { ## 别忘了修改
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.83 8000 { ## 别忘了修改,只有两台就删掉
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
脚本,很重要!!!
##########用来设置DR方式的脚本,我放在/etc/keepalived/notify_script,没有这个脚本lvs就不会工作在DR状态
#!/bin/bash
VIP=192.168.200.86 ##别忘了修改
case "$1" in
backup)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Start OK"
;;
master)
route del $VIP >/dev/null 2>&1
ifconfig lo:0 down
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
fault)
## stop keepalived
systemctl stop keepalived
while [[ -n $(pidof /usr/sbin/keepalived) ]]; do ## 如果没有pidof就安装一下,在sysvinit-tools包里
kill -9 $(pidof /usr/sbin/keepalived)
sleep 3
done
# stop http server
if [[ $(curl -I -m 10 -w %{http_code} -o /dev/null -s http://127.0.0.1:8000/) -ne 200 ]];then
while [[ -n $(pgrep -f </path/to/app1>) ]]; do ##如果没有pgrep就安装一下,在procps-ng包里
kill -9 $(pgrep -f </path/to/app1>) ## 这个app1是你程序的名字,请根据需要修改。例如tomcat
sleep 3
done
fi
# reset kernel argument and network
ifconfig lo:0 down >/dev/null 2>&1
ifconfig eth0:0 down >/dev/null 2>&1
route del $VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
</path/to/app1> ## 启动你的应用
systemctl start keepalived ## 启动keepalived
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0