一. 环境
DR模式
VIP: 172.18.1.100
LVS-M: 172.18.1.10
LVS-S: 172.18.1.11
RS1(web):172.18.1.101
RS2(web):172.18.1.102
GATEWAY: 172.18.1.1
二. LVS-Server
1. 安装
安装依赖库
# yum -y install gcc openssl-devel popt-devel popt-static libnl libnl-devel libnfnetlink-devel net-tools
ipvsadm--yum安装
# yum -y install ipvsadm
ipvsadm--编译安装
# tar -zxvf ipvsadm-1.26.tar.gz
# make && make install
keeplived--yum安装
# yum -y install keepalived
keeplived--编译安装
# tar -zxvf keepalived-1.2.19.tar.gz
# ./configure --prefix=/usr/local/keeplived
# make && make install
做软连接
# mkdir /etc/keepalived/
# ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
2. 配置
keeplived配置样例
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
test@gmail.com
}
notificationemailfrom root@localhost
smtp_server 127.0.0.1
smtpconnecttimeout 30
routerid lvs1 #设备标识
}
vrrpinstance LVSHA {
state MASTER #LVS slave is BACKUP
interface eth0 #根据要配置的网卡确定,不能错
virtualrouterid 60 #设置虚拟路由ID,主从要保持一致
priority 100 #优先级数值大的被推举为主设备
advert_int 1 #检查间隔,默认为1秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.1.100/24
}
}
virtual_server 172.18.1.100 80 {
delay_loop 6
lb_algo wrr #加权轮询-负载均衡算法
lb_kind DR #调度算法为DR直接路由模式
nat_mask 255.255.255.0
persistence_timeout 50 #会话保持50秒
protocol TCP #数据转发协议为TCP
real_server 172.18.1.101 80 {
weight 1 #设置服务器权重
TCP_CHECK { #对后端真实服务器进行TCP健康检查
connect_timeout 20 #连接超时20秒
connect_port 80 #通过TCP端口80去检查真实服务器健康状态
nbgetretry 3 #连接重试次数为3次
}
}
real_server 172.18.1.102 80 {
weight 1
TCP_CHECK {
connect_timeout 20
connect_port 80
nbgetretry 3
}
}
}
LVS-S配置同理,注意以下:
1. routerid保持唯一
2. priority 50 #优先级数值大的被推举为主设备
网卡配置举例
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=172.18.1.10
NETMASK=255.255.0.0
GATEWAY=172.18.1.1
TYPE="Ethernet"
# service network restart
防火墙配置
开启防火墙端口
# iptables -A INPUT -p 112 -j ACCEPT
# iptables -A INPUT -p vrrp -jACCEPT //这里不开启vrrp协议的端口,会造成backup服务器检测不到master服务器的是否正常而自动启动backup的应用服务
启动keeplived
# service keepalived start
查看虚拟IP
# ip addr show
查看LVS规则:
# ipvsadm -Ln
3. RS-server
网卡配置举例
# vim /etc/sysconfig/network-scripts/ifcfg-em1
DEVICE="em1"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=172.18.1.101
NETMASK=255.255.0.0
GATEWAY=172.18.1.1
TYPE="Ethernet"
# vim /etc/sysconfig/network-scripts/ifcfg-em1:0
DEVICE=em1:0
BOOTPROTO=static
IPADDR=172.18.1.100
NETMASK=255.255.255.255 #注意这里是4个255
GATEWAY=10.215.7.254
ONBOOT=yes
sysctl配置
因网络中多个设备设置了VIP地址,为防止IP地址冲突,需要通过sysctl.conf文件修改系统内核ARP相关参数
# vim /etc/sysctl.conf
追加
### Arp config for lvs-VIP
net.ipv4.conf.em1.arp_ignore = 1
net.ipv4.conf.em1.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
# sysctl -p
# service network restart
常用命令:
keepalived常用命令
keepalived启动/关闭
# service keepalived start/stop
加入开机启动
# chkconfig keepalived on
查看虚拟IP和LVS配置规则:
# ip addr show
或者
# ip a
ipvsadm常用命令
查看LVS统计信息(在LVS master上运行)
# ipvsadm -lnc
加载ipvs模块:
# modrpobe ipvs
查看ipvsadm模块加载情况:
# lsmod | gre ip_vs
查看IPVS版本:
# cat /proc/net/ip_vs
在eth0网卡绑定VIP地址(高可用), lb服务的IP地址可扩展性较差,故使用VIP地址(删除del;显示show)
# ip addr add 172.16.7.13/24 dev eth0
清除当前所有LVS规则
# ipvsadm -C
设置tcp、tcpfin、udp链接超时时间(s), 控制浏览器与lb01的超时时间
# ipvsadm --set 30 5 60
添加虚拟服务,调度算法见man ipvsadm, LVS默认无80端口,需另外添加新的虚拟IP记录->控制lb01与web01、web02的超时时间
# ipvsadm -A -t 172.16.7.13:80 -s wrr -p 20
将虚拟服务vip地址关联到真实服务上
# ipvsadm -a -t 172.16.7.13:80 -r 172.16.7.17:80 -g -w 1
# ipvsadm -a -t 172.16.7.13:80 -r 172.16.7.18:80 -g -w 1
设置当客户端访问服务器VIP的任意端口都可以被调度到后台Real Server
# ipvsadm -A -t 172.18.1.100:0 -s wrr
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096) #LVS版本号
Prot LocalAddress:Port Scheduler Flags #协议(TCP)本地IP:端口 调度算法 标志(持续时间20s)
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#后端节点IP:端口 工作模式 权重 已建立连接 正在连接
TCP 172.16.7.3:80 wrr persistent 20
-> 172.16.7.17:80 Route 1 0 0
-> 172.16.7.18:80 Route 1 0 0
keeplived应用场景举例:
安装
# tar -zxvf keepalived-1.2.7.tar.gz
# ./configure --prefix=/usr/local/keepalived
# make && make install
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
或者
# yum install keepalived
开启防火墙端口
# iptables -A INPUT -p 112 -j ACCEPT
# iptables -A INPUT -p vrrp -jACCEPT //这里不开启vrrp协议的端口,会造成backup服务器检测不到master服务器的是否正常而自动启动backup的应用服务
配置说明
1). Master
global_defs {
notification_email {
edisonchou@hotmail.com
}
notification_email_from sns-lvs@gmail.com
smtp_server 192.168.80.1
smtp_connection_timeout 30
router_id 51 # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
interface em1 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication { #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.200/24 dev em1:1 #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.1.200 80 {
delay_loop 6 # 设置健康检查时间,单位是秒
lb_algo rr # 设置负载调度的算法为wlc
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.1.130 80 { # 指定real server1的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.131 80 { # 指定real server2的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
2). Backup
global_defs {
notification_email {
edisonchou@hotmail.com
}
notification_email_from sns-lvs@gmail.com
smtp_server 192.168.80.1
smtp_connection_timeout 30
router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
interface em1 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 50 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication { #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.200/24 dev em1:1 #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.1.200 80 {
delay_loop 6 # 设置健康检查时间,单位是秒
lb_algo rr # 设置负载调度的算法为wlc
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.1.130 80 { # 指定real server1的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.131 80 { # 指定real server2的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
应用场景一: 使用keepalived监控端口进行切换
global_defs {
router_id 51
}
vrrp_script check_http {
script "</dev/tcp/127.0.0.1/80" #修改最后的redis端口6379为自己需要监听的端口,理论上可以监听远程端口
interval 2 #检查脚本的频率,单位(秒)
weight -10 #端口检查失败,优先级减少30,默认减少2[注意:两台主机配置的weight相同时候必须保证weight的值大于priority差值]
}
vrrp_instance VI_1 {
state MASTER#BACKUP
interface eth0
virtual_router_id 51
priority 95
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24 dev em1:1
}
track_script {
check_http
}
}
应用场景二: 通过notify_down方式触发关闭keepalived的脚本实现切换(只监控本机服务节点)
global_defs {
notification_email {
edisonchou@hotmail.com
}
notification_email_from sns-lvs@gmail.com
smtp_server 192.168.80.1
smtp_connection_timeout 30
router_id WEB-MASTER # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
interface em1 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication { #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.200/24 dev em1:1 #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.1.200 80 {
delay_loop 6 # 设置健康检查时间,单位是秒
lb_algo rr # 设置负载调度的算法为wlc
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.1.130 80 { # 指定real server1的IP地址
weight 3 # 配置节点权值,数字越大权重越高
notify_down /data/sh/stopkeepalived.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
另一种监控方法:
写一个脚本监控服务,如果服务不存在,停止服务所在节点的keepalived,例如
vim nginx_check.sh
--------------------------------------
#!/bin/bash
while true
do
if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ]
then
/etc/init.d/keepalived stop
fi
sleep 2
done
#给脚本授权
chmod u+x nginx_check.sh
#执行脚本
nohup /usr/local/develop/anginx/shell/nginx_check.sh &