系统运维

Keepalived+LVS高可用集群部署

温馨提示:本文最后更新于2021-03-30 22:18:30,某些文章具有时效性,若有错误或已失效,请在下方留言或提交工单提交工单
浅时光 · 3月29日 · 2021年 · 本文9062个字,预计阅读23分钟 3184次已读

一、LVS介绍

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 用现在的观点来看就是个4层(传输层tcp/udp)的负载均衡器。 它是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有原文链接:https://www.dqzboy.com良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。

二、主要功能

LVS目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)

       LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。

  • 注意:部署LVS需要网络环境的支持,不能针对上层协议分析
  • 以上我也是摘抄的官方文档,网上很多详细的介绍,我这里就不啰嗦了。
  • 详细介绍文章:http://linuxvirtualserver.org/zh/lvs1.html

三、集群部署

1、环境规划

主机名节点IP部署软件OS
VIP192.168.66.100虚拟VIP地址Cent OS 7.6
LVS_HA_M192.168.66.105KeepalivedCent OS 7.6
LVS_HA_B192.168.66.106KeepalivedCent OS 7.6
WEB01192.168.66.107Nginx1.18Cent OS 7.6
WEB02192.168.66.108Ngi原文链接:https://www.dqzboy.comnx1.18Cent OS 7.6

2、系统配置

2.1:修改主机名

hostnamectl set-hostname lvs_ha_m
hostnamectl set-hostname lvs_ha_b
hostnamectl set-hostname web01
hostnamectl set-hostname web02

2.2:免密认证

  • lvs_ha_m节点主机实现免密登入其他节点
ssh-keygen -t rsa
ssh-copy-id root@192.168.66.105
ssh-copy-id root@192.168.66.106
ssh-copy-id root@192.168.66.107
ssh-copy-id root@192.168.66.108

2.3:关闭防火墙

[root@lvs_ha_m ~]# for i in 192.168.66.{105..108}; do echo ">>> $i";ssh root@$i "systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld"; done

[root@lvs_ha_m ~]# for i in 192.168.66.{105..108}; do echo ">>> $i";ssh root@$i "systemctl stop NetworkManager && systemctl disable NetworkManager && systemctl status NetworkManager"; done

2.4:关闭SELINUX

[root@lvs_ha_m ~]# for i in 192.168.66.{105..108}; do echo ">>> $i";ssh root@$i "sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"; done

[root@lvs_ha_m ~]# for i in 192.168.66.{105..108}; do echo ">>> $i";ssh root@$i "setenforce 0 && getenforce"; done

2.5:安装常用组件

[root@lvs_ha_m ~]# for i in 192.168.66.{105..108}; do echo ">>> $i";ssh root@$i "yum -y install gcc gcc-c++ libaio make cmake zlib-devel openssl-devel pcre pcre-devel wget git curl lynx lftp mailx mutt rsync ntp net-tools vim lrzsz screen sysstat yum-plugin-security yum-utils createrepo bash-completion zip unzip bzip2 tree tmpwatch pinfo man-pages lshw pciutils gdisk system-storage-manager git  gdbm-devel sqlite-devel epel-release libnl libnl-devel libnfnetlink-devel "; done

3、WEB部署

  • 这里我们以Nginx作为我们的访问后端程序,进行测试,修改Nginx的默认访问页,加入用来可以区分web01web02站点
  • Nginx我们部署的是1.18版本,采用RPM包的方式进行部署
  • RPM包下载地址:http://nginx.org/packages/rhel/7/x86_64/RPMS/
wget http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.18.0-2.el7.ngx.x86_64.rpm

rpm -ivh nginx-1.18.0-2.el7.ngx.x86_64.rpm

#修改web01与web02节点上的nginx默认访问页面进行修改下
vim /usr/share/nginx/html/index.html
<h1>web02</h1>


#启动nginx服务
~]# systemctl start nginx
~]# systemctl enable nginx
  • 访问web节点IP检查页面返回信息
1616747557 20723b62c1a55e1
1616747558 72f923e393a4b38

4、安装部署

  • LVS现在已经成为了Linux内核的一部分了,所以不需要单独部署
  • 在lvs_ha_m与lvs_ha_b节点上安装ipvsadmin工具和keepalived程序
  • 注:在lvs_ha_m节点进行编译安装,最后将编译好的执行文件和配置传给lvs_ha_b节点,然后修改相应的配置信息后启动程序

4.1:安装ipvsadmin

yum -y install ipvsadm

4.2:安装keepalived

文章来源(Source):浅时光博客
[root@lvs_ha_m ~]# wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz

[root@lvs_ha_m ~]# tar -zxvf keepalived-2.2.2.tar.gz
[root@lvs_ha_m ~]# cd keepalived-2.2.2
[root@lvs_ha_m keepalived-2.2.2]# ./configure --prefix=/usr/local/keepalived
[root@lvs_ha_m keepalived-2.2.2]# make && make install

4.3:修改配置文件

4.3.1:主节点
[root@lvs_ha_m keepalived-2.2.2]# cd /usr/local/keepalived/etc/keepalived/
[root@lvs_ha_m keepalived]# cp keepalived.conf{,_bak}
[root@lvs_ha_m keepalived]# vim 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服务器地址
   smtp_connect_timeout 30	#smtp超时时间
   router_id lvs_ha_m	#唯一值,一般为所在服务器主机名
   vrrp_skip_check_adv_addr
   #vrrp_strict	#注释掉
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER		#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface ens33	#指定VIP绑定的网络接口
    virtual_router_id 51  #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,则Master与Backup节点上此参数值必须一致。
    priority 100		#定义优先级,数字越大,优先级越高
    advert_int 1		#MASTER与BACKUP负载均衡器之间同步检查的时间间隔
    authentication {
        auth_type PASS	#验证类型,主要有PASS和AH两种
        auth_pass 1111	#验证密码
    }
    virtual_ipaddress {
        192.168.66.100
    }
}

virtual_server 192.168.66.100 80 {	#虚拟服务IP地址,IP与端口直接空格隔开
    delay_loop 6		#服务检查时间
    lb_algo rr		#设置负载调度算法,这里设置为rr,即轮询算法
    lb_kind DR		#设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 50	#会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。
    protocol TCP		#指定转发协议类型,有TCP和UDP两种

    real_server 192.168.66.107 80 {	#配置服务节点1,需要指定后端服务的真实IP地址和端口,IP与端口之间用空格隔开
        weight 3		#配置服务节点的权值,权值大小用数字表示,数字越大,权值越高
        TCP_CHECK {
            connect_timeout 3	#表示3秒无响应超时
            nb_get_retry 3	#表示重试次数
            delay_before_retry 3	#表示重试间隔
            connect_port 80
        }
    }
    real_server 192.168.66.108 80 {	#配置服务节点2
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
  • keepalived默认会读取/etc/keepalived/keepalived.conf配置文件,所以需要将配置文件移至该目录下
[root@lvs_ha_m ~]# mkdir /etc/keepalived/
[root@lvs_ha_m ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

拷贝文件至备节点

scp -r /usr/local/keepalived root@192.168.66.106:/usr/local/ 
scp -r /etc/keepalived root@192.168.66.106:/etc/
scp /usr/lib/systemd/system/keepalived.service root@192.168.66.106:/usr/lib/systemd/system/
4.3.2:备节点
  • 登入到另外备节点进行修改配置
  • 注意:2节点的router_id一定不要重复最好以当前主机名;virtual_router_id一定要一致;priority值依次为MASTER(100)— BACKUP(90)
[root@lvs_ha_b ~]# vim /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 lvs_ha_b
   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 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.100
    }
}

virtual_server 192.168.66.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.66.107 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.66.108 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

4.4:LVS添加配置

  • 在两台 lvs 服务器上开启路由转发功能
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward= 1
EOF

sysctl -p
  • 添加 realserver ip原文链接:https://www.dqzboy.com 地址;就是将后端的2台web节点地址和端口进行添加
  • Lvs两台节点机器上都进行执行,指定为rr算法与keepalived保持一致
  • 192.168.66.100为VIP,107与108为后端真实服务IP和端口
ipvsadm -A -t 192.168.66.100:80 -s rr
ipvsadm -a -t 192.168.66.100:80 -r 192.168.66.107:80 -w 1
ipvsadm -a -t 192.168.66.100:80 -r 192.168.66.108:80 -w 1
  • 检查创建的规则
ipvsadm -l

4.5:启动HA服务

[root@lvs_ha_m ~]# for i in 192.168.66.{105,106}; do echo ">>> $i"; ssh root@$i systemctl daemon-reload && systemctl start keepalived && systemctl status keepalived|grep Active; done

4.6:LVS启动脚本

4.6.1:编写启动脚本
  • 两台LVS节点机器都需要编写LVS脚本
cat > /etc/init.d/ipvsadm <<\EOF
#!/bin/bash
VIP=192.168.66.100
RIP1=192.168.66.107
RIP2=192.168.66.108
PORT=80
Algorithm=rr
Weight=1
case "$1" in
start)
    echo 1 > /proc/sys/net/ipv4/ip_forward
    /usr/sbin/ipvsadm -C
    /usr/sbin/ipvsadm -A -t $VIP:$PORT -s$Algorithm
    /usr/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP1 -g -w $Weight
    /usr/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP2 -g -w $Weight
    /bin/touch /var/lock/subsys/ipvsadm &>/dev/null
    ;;
stop)
    echo 0 > /proc/sys/net/ipv4/ip_forward
    /usr/sbin/ipvsadm -C
    /usr/sbin/route del $VIP
    /bin/rm -f /var/lock/subsys/ipvsadm
    echo "ipvs is stopped..."
    ;;
status)
    if [ ! -e /var/lock/subsys/ipvsadm ]; then
        echo "ipvsadm is stopped ..."
    else
        echo "ipvs is running ..."
        ipvsadm -L -n
    fi
    ;;
*)
    echo "Usage: $0{start|stop|status}"
    ;;
esac
EOF
  • 启动服务
chmod +x /etc/init.d/ipvsadm
service ipvsadm start
service ipvsadm status
4.6.2:加入开机自启
echo "/etc/init.d/ipvsadm start" >> /etc/rc.d/rc.local
chmod+x /etc/rc.d/rc.loca

4.7:后端服务配置

4.7.1:修改内核配置
cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.ip_forward=0
EOF

sysctl -p
4.7.2:添加虚拟IP地址
  • 这里添加的是VIP的地址
cat > /etc/sysconfig/network-scripts/ifcfg-lo <<EOF
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=lo
DEVICE=lo
ONBOOT=yes
IPADDR=192.168.66.100
NETMASK=255.255.255.255
EOF

5、功能测试

5.1:浏览器访问VIP

  • 现在我们可以通过浏览器访问VIP地址,检查原文链接:https://www.dqzboy.com是否可以正常访问到后端的服务页面
1616748882 bf1a0f8765b5444
  • 通过ipvsadm查看连接数情况
[root@lvs_ha_m ~]# ipvsadm -ln
1616748960 c76aa82efc4c8c8
  • ActiveConn是活动连接数,也就是tcp连接状态的ESTABLISHED
  • InActConn是指除了ESTABLISHED以外的,所有的其它状态的tcp连接

5.2:停止一台WEB

  • 现在我们停止其中一台web服务,然后检查LVS集群中是否被将出现问题的后端服务给踢出集群
  • 将web01节点上的nginx服务停止掉
[root@web02 ~]# systemctl stop nginx
[root@web02 ~]# systemctl status nginx | grep Active
   Active: inactive (dead) since 五 2021-03-26 16:09:11 CST; 9s ago
  • 等待一会,返回至LVS节点执行ipvsadm命令查看集群信息
[root@lvs_ha_m ~]# ipvsadm -ln
1616749212 c8d915ca3a03e4f
  • 现在我们在通过浏览器访问VIP地址,查看现在返回的页面是什么
1616749267 b3bfb712c878f39
  • 测试没问题后,我们将web02上的nginx服务启动
[root@web02 ~]# systemctl start nginx
[root@web02 ~]# systemctl status nginx | grep Active
   Active: active (running) since 五 2021-03-26 16:13:29 CST; 3s ago
  • 启动之后,我们等待一会再次检查LVS集群是否已经把web02节点添加进来了
[root@lvs_ha_m ~]# ipvsadm -ln
1616749351 974399182385cf2

5.3:测试VIP漂移

  • 现在我们再来测试下当keepalived服务挂掉后,VIP是否可以正常进行漂移
  • 先查看下当前VIP绑定的节点,目前绑定在lvs_ha_m节点服务器上
1616749424 b13b8119149889c
  • 现在我们手动停止keepalived服务来模拟VIP进行漂移
[root@lvs_ha_m ~]# systemctl stop keepalived
  • 再次查看lvs_ha_m节点上VIP是否已经进行了漂移
1616749494 20c0157aba4f75b
  • 我们来查看lvs_ha_b节点上是否存在VIP
1616749537 40f41846eedcbbc
  • 现在我们通过浏览器进行访问VIP,是否可以正常提供访问
1616749590 71c09860ccd3e52



本文作者:浅时光
原文链接:https://www.dqzboy.com/7089.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可
转载时请以超链接形式标明文章原始出处和作者信息

2 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. lijizh10北京2021-4-4 · 14:11

    感谢博主🤙🤙🤙

  2. 好運黏黏上海2021-3-30 · 22:35

    哈哈,过来打卡学习