#本文欢迎转载,转载请注明出处和作者。
理论部分,在之前的文章已经说明过了,详见:
繁星亮与鲍包包:【理论研究】业务系统高可用及负载均衡zhuanlan.zhihu.com上一篇已经讲述通过2台LVS服务器安装Keepalived软件对2台Nginx服务器做负载均衡。
繁星亮与鲍包包:zhuanlan.zhihu.com但是其实既然2台Nginx服务器本身都需要安装keepalived来做高可用,而上一篇中的LVS服务器也是通过安装Keepalived来实现对Nginx服务的负载均衡的,那么是否能够直接让2台Nginx服务器的keepalived直接配置负载均衡,省去2台LVS服务器呢?答案是可以的。
1、Keepalived安装
1.1 安装keepalived
yum install keepalived -y
1.2 修改配置
cd /etc/keepalived
rm keepalived.conf
#删除原有的配置文件
vi keepalived.conf
#创建新的配置文件
Master(主)服务器配置
! Configuration File for keepalived
global_defs {
notification_email {
#xxxx@xxx.com # 发生故障时发送的邮箱
}
#notification_email_from xxxx@xxx.com # 使用哪个邮箱发送
#smtp_server xxx.com # 发件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # 标示为主lvs
interface eth1 # HA检测端口,按照实际网卡填写
virtual_router_id 51 # 主备的virtual_router_id 必须相同
priority 100 # 优先级,备lvs要比主lvs稍小
advert_int 1 # VRRP Multicast 广播周期秒数
authentication { # 定义认证
auth_type PASS # 认证方式为口令认证
auth_pass 1111 # 定义口令
}
virtual_ipaddress { # 定义vip
10.1.30.31 # 多个vip可换行添加
}
}
virtual_server 10.1.30.31 80 {
delay_loop 6 # 每隔6秒查看realserver状态
lb_algo wlc # 调度算法为加权最小连接数
lb_kind DR # lvs工作模式为DR(直接路由)模式
nat_mask 255.255.255.0
persistence_timeout 0 # 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
protocol TCP # 用TCP监测realserver的状态
real_server 10.1.30.26 80 { # 定义realserver
weight 3 # 定义权重
TCP_CHECK { # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
connect_timeout 3 # 三秒无响应超时
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.1.30.27 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
注意上述的配置,没有了检测脚本的配置。但是除了VIP的配置,还配置了real_server(实际负载业务流量的服务器)
Slave(从)服务器配置
! Configuration File for keepalived
global_defs {
notification_email {
#xxxx@itcast.com # 发生故障时发送的邮箱
}
#notification_email_from xxxx@xxx.com # 使用哪个邮箱发送
#smtp_server xxx.com # 发件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP # 标示为主lvs
interface eth1 # HA检测端口
virtual_router_id 51 # 主备的virtual_router_id 必须相同
priority 99 # 优先级,备lvs要比主lvs稍小
advert_int 1 # VRRP Multicast 广播周期秒数
authentication { # 定义认证
auth_type PASS # 认证方式为口令认证
auth_pass 1111 # 定义口令
}
virtual_ipaddress { # 定义vip
10.1.30.31 # 多个vip可换行添加
}
}
virtual_server 10.1.30.31 80 {
delay_loop 6 # 每隔6秒查看realserver状态
lb_algo wlc # 调度算法为加权最小连接数
lb_kind DR # lvs工作模式为DR(直接路由)模式
nat_mask 255.255.255.0
persistence_timeout 0 # 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
protocol TCP # 用TCP监测realserver的状态
real_server 10.1.30.26 80 { # 定义realserver
weight 3 # 定义权重
TCP_CHECK { # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
connect_timeout 3 # 三秒无响应超时
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.1.30.27 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
1.3 启动服务
service keepalived start
2、Realserver配置(2台Nginx服务器)
2.1 脚本自动配置
vi /etc/init.d/lvsdr
内容如下:
#!/bin/sh
VIP=10.1.30.31 #虚拟ip,根据需求修改
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "lo:0 port starting"
# 为了相应lvs调度器转发过来的包,需在本地lo接口上绑定vip
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
# 限制arp请求
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
;;
stop)
echo "lo:0 port closing"
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 "Usage: $0 {start ¦ stop}"
exit 1
esac
增加执行权限
chmod 777 /etc/init.d/lvsdr
然后可以直接使用service lvsdr start/stop进行启停。
service lvsdr start
2、测试
测试业务前,ip a s 先查看VIP在Nginx01还是Nginx02上。
通过VIP访问业务,发现业务能够正常分发。
手动将Nginx01关机或者停止keepalived服务。
service keepalived stop
查看VIP是否成功切换到Nginx02,
然后再次通过VIP测试业务,发现分发正常,证明LVS的HA功能也设置成功。
最后,可以将2台Nginx对2台Apache WEB服务器的负载均衡重新设置回去,方便后面开始做数据库的高可用。
繁星亮与鲍包包:【实战演练】Linux操作系统13-Nginx实现WEB服务器负载均衡zhuanlan.zhihu.com