Keepalived LVS 双机高可用负载均衡架构

浪尽此生 提交于 2020-03-22 15:25:44

实验环境:
主机 IP
LVS-1 1.1.1.101
LVS-2 1.1.1.102
Nginx-1 1.1.1.103
Nginx-1 1.1.1.104
VIP 1.1.1.100
在这里插入图片描述

Keepalived - LVS 实验步骤:
1) 配置 Web 服务
可参考Nginx 安装

Web-1 安装、配置、启动

useradd -M -s /sbin/nologin nginx

cd /usr/src/nginx-1.6.0/

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_spdy_module --with-http_stub_status_module --with-pcre

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

echo 'This is a Web1-Master ' > /usr/local/nginx/html/index.html

nginx

curl 1.1.1.103
This is a Web1-Master
Web-1 设置路由规则
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
Web-1 设置VIP
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=1.1.1.100
NETMASK=255.255.255.255
…………
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=one
重启 网卡
[root@localhost network-scripts]# systemctl restart netw ork
添加路由
[root@localhost network-scripts]# route add -host 1.1.1.100 dev lo:0
Web-2 安装、配置、启动
useradd -M -s /sbin/nologin nginx

cd /usr/src/nginx-1.6.0/

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_spdy_module --with-http_stub_status_module --with-pcre

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

echo 'This is a Web2-Backup ' > /usr/local/nginx/html/index.html

nginx

curl 1.1.1.104
This is a Web2-Backup
Web-2 设置路由规则
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
Web-2 设置VIP
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=1.1.1.100
NETMASK=255.255.255.255
…………
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=one
重启网卡
[root@localhost network-scripts]# systemctl restart netw ork

添加路由

[root@localhost network-scripts]# route add -host 1.1.1.100 dev lo:0
2) 配置 LVS
安装 IPvsadmin 工具
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# yum -y install ipvsadm
开启路由转发
[root@localhost ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
LVS-1 创建集群
[root@localhost ~]# ipvsadm -A -t 1.1.1.100:80 -s rr
LVS-1 添加节点
[root@localhost ~]# ipvsadm -a -t 1.1.1.100:80 -r 1.1.1.103:80 -g -w 1
[root@localhost ~]# ipvsadm -a -t 1.1.1.100:80 -r 1.1.1.104:80 -g -w 1
LVS-1 保存集群
[root@localhost ~]# ipvsadm -S
-A -t 1.1.1.100:http -s rr
-a -t 1.1.1.100:http -r 1.1.1.103:http -g -w 1
-a -t 1.1.1.100:http -r 1.1.1.104:http -g -w 1
LVS-1 查看集群
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 1.1.1.100:http rr
-> 1.1.1.103:http Route 1 0 0
-> 1.1.1.104:http Route 1 0 0
LVS-1 测试
[root@localhost ~]# curl 1.1.1.100
This is a Web1-Master
[root@localhost ~]# curl 1.1.1.100
This is a Web2-Backup
LVS-2 创建集群
[root@localhost ~]# ipvsadm -A -t 1.1.1.100:80 -s rr
LVS-2 添加节点
[root@localhost ~]# ipvsadm -a -t 1.1.1.100:80 -r 1.1.1.103:80 -g -w 1
[root@localhost ~]# ipvsadm -a -t 1.1.1.100:80 -r 1.1.1.104:80 -g -w 1
LVS-2 保存集群
[root@localhost ~]# ipvsadm -S
-A -t 1.1.1.100:http -s rr
-a -t 1.1.1.100:http -r 1.1.1.103:http -g -w 1
-a -t 1.1.1.100:http -r 1.1.1.104:http -g -w 1
LVS-2 查看集群
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 1.1.1.100:http rr
-> 1.1.1.103:http Route 1 0 0
-> 1.1.1.104:http Route 1 0 0

LVS-2 测试
[root@localhost ~]# curl 1.1.1.100
This is a Web1-Master
[root@localhost ~]# curl 1.1.1.100
This is a Web2-Backup

3) 配置 Keepalived

安装 Keepalived
[root@localhost ~]# tar -zxf keepalived-1.2.13.tar.gz -C /usr/src/
[root@localhost ~]# yum -y install popt-devel kernel-devel openssl-devel
[root@localhost ~]# cd /usr/src/keepalived-1.2.13/
[root@localhost keepalived-1.2.13]# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernel && make && make install

配置 Keepalived-Master
[root@localhost ~]# vim /etc/keepalived/keepalived.conf

global_defs { # 全局配置
notification_email { # 管理员邮箱
acassen@firewall.loc # 邮箱地址
failover@firewall.loc …………br/>sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 邮件的发送者,可自定义
smtp_server 192.168.200.1 # 邮件服务器 IP地址
smtp_connect_timeout 30 # 邮件服务超时时间
router_id LVS_DEVEL # 节点标识
}

vrrp_instance VI_1 { # VRRP 协议族 ,VI_1 为name(可自定义)
state MASTER # 节点状态, master 与 backup
interface ens33 # Keepalived使用的网卡
virtual_router_id 51 # server_id , 主与从 id 要一致
priority 100 # 1-255 优先级
advert_int 1 # 发送 VRRP 通告时间 1s
authentication { # 密码认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 虚拟IP地址(漂移地址)
1.1.1.100 # 指定自己的虚拟IP地址
}
}

virtual_server 1.1.1.100 80 { # 对后端进行健康检查
delay_loop 6 # 健康检查间隔的时间
lb_algo rr # 调度算法
lb_kind DR # LVS 所使用的 工作模式
nat_mask 255.255.255.0 # 子网掩码
persistence_timeout 0 # 会话保持时间,也就是说在一定的时间内,会指定一台服务器进行访问,不会有轮训的效果,为了试验,该为零
protocol TCP # LVS 使用的协议

real_server 1.1.1.104 80 { # 真实节点信息
weight 1 # 权重
connect_port 80 # 连接端口
connect_timeout 3 # 超时时间
nb_get_retry 3 # 与节点连接次数
delay_before_retry 3 # 每个连接次数的间隔时间
}

real_server 1.1.1.105 80 { # 真实节点信息
weight 1 # 权重
connect_port 80 # 连接端口
connect_timeout 3 # 超时时间
nb_get_retry 3 # 与节点连接次数
delay_before_retry 3 # 每个连接次数的间隔时间
}
}
启动服务
[root@localhost ~]# service keepalived start
Reloading systemd: [ 确定 ]
Starting keepalived (via systemctl): [ 确定 ]
配置 Keepalived-Backup
[root@localhost ~]# vim /etc/keepalived/keepalived.conf

global_defs { # 全局配置
notification_email { # 管理员邮箱
acassen@firewall.loc # 邮箱地址
failover@firewall.loc …………br/>sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 邮件的发送者,可自定义
smtp_server 192.168.200.1 # 邮件服务器 IP地址
smtp_connect_timeout 30 # 邮件服务超时时间
router_id LVS_DEVEL # 节点标识
}

vrrp_instance VI_1 { # VRRP 协议族 ,VI_1 为name(可自定义)
state MASTER # 节点状态, master 与 backup
interface ens33 # Keepalived使用的网卡
virtual_router_id 51 # server_id , 主与从 id 要一致
priority 100 # 1-255 优先级
advert_int 1 # 发送 VRRP 通告时间 1s
authentication { # 密码认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 虚拟IP地址(漂移地址)
1.1.1.100 # 指定自己的虚拟IP地址
}
}

virtual_server 1.1.1.100 80 { # 对后端进行健康检查
delay_loop 6 # 健康检查间隔的时间
lb_algo rr # 调度算法
lb_kind DR # LVS 所使用的 工作模式
nat_mask 255.255.255.0 # 子网掩码
persistence_timeout 0 # 会话保持时间,也就是说在一定的时间内,会指定一台服务器进行访问,不会有轮训的效果,为了试验,该为零
protocol TCP # LVS 使用的协议

real_server 1.1.1.104 80 { # 真实节点信息
weight 1 # 权重
connect_port 80 # 连接端口
connect_timeout 3 # 超时时间
nb_get_retry 3 # 与节点连接次数
delay_before_retry 3 # 每个连接次数的间隔时间
}

real_server 1.1.1.105 80 { # 真实节点信息
weight 1 # 权重 #
connect_port 80 # 连接端口
connect_timeout 3 # 超时时间
nb_get_retry 3 # 与节点连接次数
delay_before_retry 3 # 每个连接次数的间隔时间
}
}
启动服务
[root@localhost ~]# service keepalived start
Reloading systemd: [ 确定 ]
Starting keepalived (via systemctl): [ 确定 ]
测试
[root@localhost ~]# curl 1.1.1.100
This is a Web2-Backup
[root@localhost ~]# curl 1.1.1.100
This is a Web1-Master
[root@localhost ~]# curl 1.1.1.100
This is a Web2-Backup
[root@localhost ~]# curl 1.1.1.100
This is a Web1-Master
[root@localhost ~]# curl 1.1.1.100
This is a Web2-Backup
[ 确定 ]
Starting keepalived (via systemctl): [ 确定 ]

  • 测试

[root@localhost ~]# curl 1.1.1.100
This is a Web2-Backup 
[root@localhost ~]# curl 1.1.1.100
This is a Web1-Master 
[root@localhost ~]# curl 1.1.1.100
This is a Web2-Backup 
[root@localhost ~]# curl 1.1.1.100
This is a Web1-Master 
[root@localhost ~]# curl 1.1.1.100
This is a Web2-Backup 

ps:这里的lvs其实才是对外直接提供服务的应用,这里的两个lvs之所以能切换是因为两台lvs机器对外包楼的是虚拟ip(vip),在切换的时候,keepalived会把备机的vip绑定好,主机上的vip也会被解绑定
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!