在大型网站中一般服务端会做集群, 同时利用负载均衡器做负载均衡. 这样有利于将大量的请求分散到各个服务器上, 提升网站的响应速度. 当然为了解决单点故障的问题, 还会做热备份方案. 这里演示利用 LVS 做负载均衡器, 同时利用 Keepalived 保证其高可用, 基于 LVS 的 DR 模式构建 Nginx 集群.
1, 环境准备
各个软件及其版本信息如下:
软件 | 版本 |
---|---|
Centos 系统 | Linux release 7.3.1611 (Core) |
Nginx | 1.16.0 |
LVS | ipvsadm-1.27-7.el7.x86_64 |
Keepalived | keepalived.x86_64 0:1.3.5-8.el7_6 |
节点分配及角色如下:
节点 | 角色 |
---|---|
192.168.208.154 | lvs master |
192.168.208.155 | lvs slave |
192.168.208.150 | nginx1 |
192.168.208.151 | nginx2 |
同时特别注意这里设置的 VIP 地址为: 192.168.208.100,VIP 也即虚拟的 IP 地址, 即当外部请求所访问的 IP 地址.
2, 部署架构
基于上述的环境, 部署的架构如下:
特别注意:
由于是采用 DR 模式, 也即当用户请求发送到 VIP 时, LVS 会根据所设置的负载均衡算法将请求转发到具体的 Nginx 服务器 (Real Server) 上, 而当具体的 Nginx 服务器处理完后是直接将结果返回给用户. 所以在具体的 Nginx 服务器是要设置回环的 IP, 即在 lo 网卡上设置 VIP 的地址.
3, 部署程序
(1), 首先在 lvs master 节点和 slave 节点安装 lvs 和 keepalived:
- yum install ipvsadm
- yum install keepalived
(2), 在 nginx1 和 nginx2 节点上安装 nginx:
- # 添加 nginx 的 yum 源
- rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- # 安装
- yum install nginx
安装完成 nginx 后, 编辑其默认页面, 加上特定的信息, 这样才能判断请求到底是哪个 nginx 处理的, 即:
vi /usr/share/nginx/html/index.HTML
对于 nginx1 加上 150 字样, nginx2 加上 151 字样, 即:
当直接访问 nginx1 时, 效果为:
当直接访问 nginx2 时, 效果为:
(3), 在 lvs master 节点和 lvs slave 节点配置 keepalived 信息:
首先配置 lvs master 节点:
编辑如下文件:
vi /etc/keepalived/keepalived.conf
内容为:
- ! Configuration File for keepalived
- global_defs {
- # 这里将这些邮件设置的相关信息都注释掉了
- # notification_email {
- # acassen@firewall.loc
- # failover@firewall.loc
- # sysadmin@firewall.loc
- # }
- # notification_email_from Alexandre.Cassen@firewall.loc
- # smtp_server 192.168.200.1
- # smtp_connect_timeout 30
- # router_id 是 keepalived 的一个标识, 最好不同的 keepalived 配置成不一样
- router_id LVS_DEVEL
- # vrrp_skip_check_adv_addr
- # vrrp_strict
- # vrrp_garp_interval 0
- # vrrp_gna_interval 0
- }
- vrrp_instance VI_1 {
- # MASTER 表示是主节点, 备份节点是 BACKUP
- state MASTER
- # 网卡名称, 这个不同的服务器, 可能有所不同
- interface ens33
- # 路由标识, MASTER 和 BACKUP 节点的该值要保持一致
- virtual_router_id 51
- # 优先级, MASTER 节点的值必须大于 BACKUP 的值
- priority 100
- # MASTER 与 BACKUP 同步的时间间隔, 单位为秒
- advert_int 1
- # lvs 对应的真实 IP
- mcast_src_ip=192.168.208.154
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- # 虚拟 IP 的址
- virtual_ipaddress {
- 192.168.208.100
- }
- }
- virtual_server 192.168.208.100 80 {
- # 健康检查的时间, 单位为秒
- delay_loop 6
- # 负载调度算法, 这里设置为 rr, 即轮询算法
- lb_algo rr
- # 设置 DR 模式
- lb_kind DR
- # 虚拟地址的子网掩码
- nat_mask 255.255.255.0
- # 会话保持时间, 单位为秒
- persistence_timeout 50
- protocol TCP
- # 配置真实服务器信息
- real_server 192.168.208.150 80 {
- # 节点的权值
- weight 1
- TCP_CHECK {
- # 超时时间
- connect_timeout 3
- # 重试次数
- nb_get_retry 3
- # 重试间隔
- delay_before_retry 3
- }
- }
- real_server 192.168.208.151 80 {
- weight 1
- TCP_CHECK {
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- }
基于上述的配置, 那么 lvs slave 的配置如下:
- ! Configuration File for keepalived
- global_defs {
- # notification_email {
- # acassen@firewall.loc
- # failover@firewall.loc
- # sysadmin@firewall.loc
- # }
- # notification_email_from Alexandre.Cassen@firewall.loc
- # smtp_server 192.168.200.1
- # smtp_connect_timeout 30
- router_id LVS_DEVEL_SLAVE
- # vrrp_skip_check_adv_addr
- # vrrp_strict
- # vrrp_garp_interval 0
- # vrrp_gna_interval 0
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 99
- advert_int 1
- mcast_src_ip=192.168.208.155
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.208.100
- }
- }
- virtual_server 192.168.208.100 80 {
- delay_loop 6
- lb_algo rr
- lb_kind DR
- nat_mask 255.255.255.0
- persistence_timeout 50
- protocol TCP
- real_server 192.168.208.150 80 {
- weight 1
- TCP_CHECK {
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- real_server 192.168.208.151 80 {
- weight 1
- TCP_CHECK {
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- }
分别启动 lvs master 和 slave 的 keepalived, 并且设置为开机自启动:
- systemctl start keepalived
- systemctl enable keepalived
此时在 lvs master 节点查看 IP 地址情况:
ip a
结果为:
说明此时 VIP 在 master 节点上的 ens33 网卡上生成好了.
在 lvs master 节点查看路由转发情况:
ipvsadm -Ln
结果为:
这个结果跟预期的是一样的.
(4), 关闭 lvs master 和 slave 节点上的访火墙:
- systemctl stop firewalld
- systemctl disable firewalld
(5), 在 nginx 服务器上设置回环 IP:
由于服务器重启后设置的回环 IP 会失效, 所以将设置的内容放在脚本 lvs-rs.sh 中, 内容如下:
- #!/bin/bash
- 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
- sysctl -w.NET.ipv4.ip_forward=1
- ifconfig lo:0 192.168.208.100 broadcast 192.168.208.100 netmask 255.255.255.255 up
- route add -host 192.168.208.100 dev lo:0
执行后, 查看 IP 信息, 可以在 lo 网卡中看到 VIP 的信息, 即:
4, 测试
分别打开 Chrome,IE 浏览器, 同时输入 http://192.168.208.100, 结果如下:
结果也达到预期的效果的.
现在测试将 lvs master 节点关闭掉, 然后查看 lvs slave 节点的 IP 路由情况:
ip a
结果为:
此时 VIP 漂移到了 lvs slave 节点上了.
ipvsadm -Ln
结果为:
此时 lvs slave 已经可以做路由地址转发了.
关注我
以你最方便的方式关注我:
微信公众号:
来源: https://www.cnblogs.com/atcloud/p/11281982.html