返回列表 发帖

Keepalived+LVS

LVS(Linux Virtual Server,Linux虚拟服务器)是一种群集技术。

负载均衡群集的分层结构:
负载调度器,这是访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP地址,也称为群集IP地址。通常会配置主、备两台调度服务器实现热备份,当主调度服务器失效以后平滑换至备用调度服务器,确保高可用性。

服务器池,群集所提供的应用服务(如HTTP、FTP等等)由服务器池承担,其中的每个节点具有独立的RIP(真实IP)地址,只处理调度服务器分发过来的客户机请求。当某个节点暂时失效时,负载调度服务器的容错机制会将其隔离,等待错误排除后再重新纳入服务器池。

共享存储,为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性。在Linux/UNIX环境中,共享存储可以使用NAS设备,或者提供NFS共享服务的专用服务器。

负载均衡的工作模式:
直接路由,简称DR模式,采用半开放式的网络结构,各节点与调度服务器在同一个物理网络(内网)。负载调度服务器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道。

LVS的调度算法:
调度器把客户端发来的请求分发给后端的真实服务器,这是依靠预先设定好的调度算法实现的,调度算法主要有8种。
带权重的轮询调度(WRR):权重越高的服务器被分配到的请求就越多,这样后端服务器性能不一致时,就可以给配置低的服务器较小的权重。
最小连接调度(LC):这种算法会根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数少说明服务器是空闲的,这样把新的请求分配到空闲服务器上才更加合理。
带权重最小连接调度(WLC):在最小连接调度的基础上再增加一个权重设置,这样可以人为地控制哪些服务器上多分配请求,哪些少分配请求。

NFS共享存储服务:
NFS是一种基于TCP/IP传输的网络文件系统协议,通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。









######################################
######################################

主调度器master:192.168.168.130/24

master的操作系统为 CentOS release 6.9 (Final)

使用VIP:192.168.168.180
web-1: 192.168.168.135   
web-2: 192.168.168.154

图片1.png
备注:所有服务器都要在同一内网里。




master的配置:(实验中用的是本地光盘YUM源)
yum -y install gcc-c++ vim
yum -y install kernel-devel openssl-devel popt-devel
yum -y install ipvsadm*


查看系统的内核版本:
[root@master ~]# uname -r
2.6.32-696.el6.x86_64


下载keepalived-1.2.24.tar.gz:https://pan.baidu.com/s/1w3Nv9DhaErcp1HK7WeDinw  提取码:p2it

编译安装Keepalived:
tar -zxvf keepalived-1.2.24.tar.gz -C /usr/local
cd /usr/local/keepalived-1.2.24/
./configure  --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-696.el6.x86_64/
make && make install


master的keepalived配置文件:
cat >/etc/keepalived/keepalived.conf<< EOF
! Configuration File for keepalived
global_defs {
        router_id Master  ## 每个参与热备的调度器都要指定不同的名字
}
vrrp_instance VI_1 {
        state MASTER  ## 热备状态,MASTER表示主调度器
        interface eth0  ## 承载VIP地址的物理接口
        virtual_router_id 1  ## 虚拟路由器的ID,每个热备组保持一致
        priority 100  ## 优先级,数值越大,优先级越高
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 888   ## 自定义密码,密码要一致
                        }
        virtual_ipaddress {
                        192.168.168.180   ## 指定虚拟IP地址
                        }
        virtual_ipaddress {
                        192.168.168.181   ## 可以有多个虚拟IP地址
                        }
}
EOF


启动Keepalived:
chmod a+x /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig --level 35 keepalived on
service keepalived start


验证:
[root@master ~]# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:2b:17:3a brd ff:ff:ff:ff:ff:ff
    inet 192.168.168.130/24 brd 192.168.168.255 scope global eth0
    inet 192.168.168.180/32 scope global eth0
    inet 192.168.168.181/32 scope global eth0
    inet6 fe80::20c:29ff:fe2b:173a/64 scope link
       valid_lft forever preferred_lft forever









以下是做Apache/Nginx的集群,使用TCP 80端口。

master和 slave在Web服务器池的配置是一样的:

cat >>/etc/keepalived/keepalived.conf<< EOF
virtual_server 192.168.168.180 80 {
        protocol TCP  ## 用TCP协议检查realserver的状态        
        delay_loop 10  ## 每隔10秒检查realserver的状态
        lb_algo wlc  ## LVS算法
        lb_kind DR  ## LVS模式
        persistence_timeout 60
## 同一IP的连接60秒内分配到同一台realserver;
## 假如60秒内有任何操作,则客户端始终在同一台Web服务器上;
## 假如60秒内没有任何操作,与客户端的连接会中断!!


      
        real_server 192.168.168.135 80 {
                weight 100  ## 权重
                TCP_CHECK {
                connect_timeout 10  ## 10秒无响应视为超时
                connect_port 80
                        nb_get_retry 3
                        delay_before_retry 4
                        }
}

        real_server 192.168.168.154 80 {
                weight 100  ## 权重
                TCP_CHECK {
                connect_timeout 10  ## 10秒无响应视为超时
                connect_port 80
                        nb_get_retry 3
                        delay_before_retry 4
                        }
}
}     
EOF


重启Keepalived:
service keepalived restart




添加虚拟网卡:
[root@master ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.168.180
NETMASK=255.255.255.255


###

[root@master ~]# route add -host 192.168.168.180 dev eth0
echo "route add -host 192.168.168.180 dev eth0" >> /etc/rc.local
echo "net.ipv4.conf.all.send_redirects = 0">> /etc/sysctl.conf
echo "net.ipv4.conf.default.send_redirects = 0">>/etc/sysctl.conf
echo "net.ipv4.conf.eth0.send_redirects = 0">>/etc/sysctl.conf
sysctl -p
modprobe ip_vs


重启网络服务:
[root@master ~]# service network stop;service network start








创建虚拟服务器:
ipvsadm -A -t 192.168.168.180:80 -s wlc

添加服务器节点:
ipvsadm -a -t 192.168.168.180:80 -r 192.168.168.135:80 -g -w 100
ipvsadm -a -t 192.168.168.180:80 -r 192.168.168.154:80 -g -w 100

备注,删除虚拟服务器:
ipvsadm -D -t 192.168.168.180:80


查看节点状态:( ipvsadm -ln )
图片2.png


保存负载分配策略:
[root@master ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]


确定保存结果:
[root@master ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.168.180:80 -s wlc
-a -t 192.168.168.180:80 -r 192.168.168.135:80 -g -w 100
-a -t 192.168.168.180:80 -r 192.168.168.154:80 -g -w 100



开机自动运行ipvsadm:
chkconfig --level 35 ipvsadm on


重启ipvsadm、keepalived:
service ipvsadm restart
service keepalived restart


防火墙开启 TCP 80 端口:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables-save > /etc/sysconfig/iptables














######################################
######################################


web-1的操作系统为 Oracle Linux Server release 6.9
web-2的操作系统为 CentOS Linux release 8.2.2004 (Core)


web-1的服务器配置:
笺注:Apache或Nginx的安装这里就省略了

添加虚拟网卡:
[root@oracle-linux6 ~]# vi /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.168.180
NETMASK=255.255.255.255


重启网络服务:
[root@oracle-linux6 ~]# service network restart

###
[root@oracle-linux6 ~]# route add -host 192.168.168.180 dev lo:0
echo "route add -host 192.168.168.180 dev lo:0">> /etc/rc.local
echo "net.ipv4.conf.all.arp_ignore = 1">> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce = 2">> /etc/sysctl.conf
echo "net.ipv4.conf.default.arp_ignore = 1">> /etc/sysctl.conf
echo "net.ipv4.conf.default.arp_announce = 2">> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_ignore = 1">> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_announce = 2">> /etc/sysctl.conf
sysctl -p


重启网络服务:
[root@oracle-linux6 ~]# service network restart


检验:(主要看有没有漂移IP地址出现)
[root@oracle-linux6 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.168.180/32 brd 192.168.168.180 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:01:1a:af brd ff:ff:ff:ff:ff:ff
    inet 192.168.168.135/24 brd 192.168.168.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe01:1aaf/64 scope link
       valid_lft forever preferred_lft forever









######

web-2的服务器配置:
笺注:Apache或Nginx的安装这里就省略了

添加虚拟网卡:
[root@centos8 ~]# vi /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.168.180
NETMASK=255.255.255.255



安装network服务
[root@centos8 ~]# yum -y install network-scripts

重启network服务
[root@centos8 ~]# systemctl restart network

开机自动开启network服务
[root@centos8 ~]# systemctl enable network


###

[root@centos8 ~]#route
-bash: route: 未找到命令
[root@centos8 ~]#
[root@centos8 ~]# yum -y install net-tools

[root@centos8 ~]# route add -host 192.168.168.180 dev lo:0
echo "route add -host 192.168.168.180 dev lo:0">> /etc/rc.local
echo "net.ipv4.conf.all.arp_ignore = 1">> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce = 2">> /etc/sysctl.conf
echo "net.ipv4.conf.default.arp_ignore = 1">> /etc/sysctl.conf
echo "net.ipv4.conf.default.arp_announce = 2">> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_ignore = 1">> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_announce = 2">> /etc/sysctl.conf
sysctl -p

[root@centos8 ~]# chmod a+x /etc/rc.d/rc.local



重启network服务
[root@centos8 ~]# systemctl restart network


检验:(主要看有没有漂移IP地址出现)
[root@centos8 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.168.180/32 brd 192.168.168.180 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:cb:1e:40 brd ff:ff:ff:ff:ff:ff
    inet 192.168.168.154/24 brd 192.168.168.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::92ab:5fb4:5373:ad53/64 scope link noprefixroute
       valid_lft forever preferred_lft forever








######
客户端访问的效果:(要访问漂移IP地址)
图片3.png


web-1关闭Apache:
[root@oracle-linux6 ~]# service httpd stop
停止 httpd:[确定]


图片4.png






web-1开启Apache:
[root@oracle-linux6 ~]# service httpd start
正在启动 httpd:[确定]

web-2关闭Apache:
[root@centos8 ~]# systemctl stop httpd


图片5.png








调度服务器要看到轮询效果:
[root@master ~]# ipvsadm -lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:48  FIN_WAIT    192.168.168.166:1265 192.168.168.180:80 192.168.168.154:80
TCP 00:55  FIN_WAIT    192.168.168.166:1254 192.168.168.180:80 192.168.168.135:80


注释:
正常情况下,客户端会稳定地停留在某一台Web服务器上,访问是不会突然中断的;
同一时刻,只有一台负载调度器在工作;
只要还有一台负载调度器、一台Web服务器还在正常工作,就不会影响到客户端的访问。


如果要修改Web程序池的节点(即修改Web服务器群集),可以先删除虚拟服务器,再重新创建虚拟服务器,并添加服务器节点。




相关文章:
Keepalived+LVS(二)
NFS共享存储服务
Keepalived双机热备+Nginx

CentOS8_Keepalived+LVS

返回列表