一、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操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
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:
文章来源(Source):浅时光博客 //linuxvirtualserver.org/zh/lvs1.html
三、集群部署
1、环境规划
主机名 | 节点IP | 部署软件 | OS |
VIP | 192.168.66.100 | 虚拟VIP地址 | Cent OS 7.6 |
LVS_HA_M | 192.168.66.105 | Keepalived | Cent OS 7.6 |
LVS_HA_B | 192.168.66.106 | Keepalived | Cent OS 7.6 |
WEB01 | 192.168.66.107 | Nginx1.18 | Cent OS 7.6 |
WEB02 | 192.168.66.108 | Nginx1.18 | Cent 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 [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
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的默认访问页,加入用来可以区分
web01
和web02
站点 - 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检查页面返回信息
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
- 安装方式:通过源码编译的方式进行安装
- keeplived官网:https://www.keepalived.org/download.html
[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:修改配置文件
[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 {
[email protected] #报警接收人,多个写多行
[email protected]
[email protected]
}
notification_email_from [email protected] #报警发件人
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 [email protected]:/usr/local/
scp -r /etc/keepalived [email protected]:/etc/
scp /usr/lib/systemd/system/keepalived.service [email protected]:/usr/lib/systemd/system/
- 登入到另外备节点进行修改配置
- 注意: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 {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 地址;就是将后端的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启动脚本
- 两台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
echo "/etc/init.d/ipvsadm start" >> /etc/rc.d/rc.local
chmod+x /etc/rc.d/rc.loca
4.7:后端服务配置
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
- 这里添加的是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地址,检查是否可以正常访问到后端的服务页面
- 通过
ipvsadm
查看连接数情况
[root@lvs_ha_m ~]# ipvsadm -ln
ActiveConn
是活动连接数,也就是tcp连接状态的ESTABLISHEDInActConn
是指除了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
- 现在我们在通过浏览器访问VIP地址,查看现在返回的页面是什么
- 测试没问题后,我们将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
5.3:测试VIP漂移
- 现在我们再来测试下当keepalived服务挂掉后,VIP是否可以正常进行漂移
- 先查看下当前VIP绑定的节点,目前绑定在lvs_ha_m节点服务器上
- 现在我们手动停止keepalived服务来模拟VIP进行漂移
[root@lvs_ha_m ~]# systemctl stop keepalived
- 再次查看lvs_ha_m节点上VIP是否已经进行了漂移
- 我们来查看lvs_ha_b节点上是否存在VIP
- 现在我
文章来源(Source):浅时光博客 们通过浏览器进行访问VIP,是否可以正常提供访问
4.7的配置在那个节点
后端服务节点
指的是nginx的二台机器上吗,二台都需要配置吗
嗯,都需要配置
感谢博主🤙🤙🤙
哈哈,过来打卡学习