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
备注:所有服务器都要在同一内网里。
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 )
保存负载分配策略:
[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地址)
web-1关闭Apache:
[root@oracle-linux6 ~]# service httpd stop
停止 httpd:[确定]
web-1开启Apache:
[root@oracle-linux6 ~]# service httpd start
正在启动 httpd:[确定]
web-2关闭Apache:
[root@centos8 ~]# systemctl stop httpd
调度服务器要看到轮询效果:
[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 |