一.LVS概述
1.什么是lvs:
lvs是一个实现负载均衡集群开源软件项目,lvs逻辑上可以分为调度层,server集群层和共享层
2.特点:免费,开源,四层负载均衡
3.Lvs工作原理
4.lvs调度算法:
- 静态调度算法
- 轮询
RR 轮询**
均等的对待每一台服务器,而不管服务器上实际的连接数和系统负载
- 加权轮询
WRR 加权轮询**
调度器可以自动询问真实服务器的负载情况,并动态的调整其权值
- 目标地址hash**
DH 目标地址hash**
通过一个散列函数将一个目标IP地址映射到一台服务器
- 源地址hash
SH 源地址hash**
- 组成及相关术语
- 组成
Ipvs----是真正生效实现调度的代码
Ipsadm----负责为ipvs内核框架编写规则,定义谁是集群服务,谁是后端真正的服务器
lvs组成=ipvsipv+sadm
- 术语
二.环境准备
主机名 | 功能 | IP地址 |
Net(ds01) | 负载均衡调度器(ds.director,ntp服务) | vip:192.168.2.177 dip:192.168.1.164 |
Web01 | 真实web服务器 Rs(rs.realserver) | 192.168.2.200 |
Web02 | 真实web服务器Rs(rs.realserver) | 192.168.2.201 |
DNS | dns服务 | 192.168.2.188 |
Client | 192.168.2.180 |
都要关闭防火墙,关闭selinux,启动网卡
1.Web01和web02机器
(1)给web01和web02安装nginx
yum -y install nginx
(2)启动
nginx
(3)改变两台机器的nginx页面内容
[root@web01 ~]# echo "web---------01" > /usr/share/nginx/html/index.html
[root@web02 ~]# echo "web----------02" > /usr/share/nginx/html/index.html
2.net(ds01)主机
配置两给网卡和IP地址,一个对外的vip,一个对内的dip,现在主要使用nat网络模式,可以配置桥接模式对外,nat对内,教师机不方便配置桥接模式,所以都是配置的nat模式,但是一定要分清楚哪个是vip,哪个是dip,在物理主机上都要能够ping通。
3.配置Dns服务器
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld.service
关闭selinux
vim /etc/selinux/config
SELINUX=disabled
关闭NetworkManager
systemctl stop NetworkManager
systemctl disable NetworkManager.service
(1)安装bind
[root@dns ~]# yum -y install bind
(2)配置主配置文件
[root@dns ~]# vim /etc/named.conf
options {
listen-on port 53 { 127.0.0.1; any; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost; any; };
(3)配置zones文件
[root@dns ~]# vim /etc/named.rfc1912.zones //在最后添加
zone "jj.qd" IN {
type master;
file "jj.qd.zone";
allow-update { none; };
};
cd /var/named/
cp -p named.localhost jj.qd.zone
(4)配置zone文件
vim jj.qd.zone
nat A 192.168.2.199
ds A 192.168.2.188
web01 A 192.168.2.200
web02 A 192.168.2.201
named-checkconf /etc/named.conf
named-checkconf /etc/named.rfc1912.zones
named-checkzone jj.qd.zone jj.qd.zone
systemctl start named
systemctl enable named.service
- client主机
(1)编辑网卡
vim /etc/resolv.conf进去全删了
vim /etc/sysconfig/network-scripts/ifcfg-ens33 //进去添加
DNS1=192.168.2.188
(2)在client访问
[root@client ~]# ping nat.jj.qd
[root@client ~]# ping ds.jj.qd
[root@client ~]# ping web01.jj.qd
[root@client ~]# ping web02.jj.qd
(3)同步时间
[root@dns ~]# yum -y install ntpdate.x86_64
ntpdate cn.ntp.org.cn
crontab -e
* 2 * * * /usr/sbin/ntpdate cn.ntp.org.cn
(4)下载ntp
yum -y install ntp
(5)启动服务
systemctl start ntpd
systemctl enable ntpd
NAT模式搭建实战
5.ds01服务器配置
(1)安装ipvsadm
[root@ds01 ~]# yum -y install ipvsadm.x86_64
查看所有规则,如果语句配置好规则,重启之后也就没有了
[root@ds01 ~]# ipvsadm -L -n
(2)额外添加一张网卡,选择对外提供服务的桥接模式或者nat模式,选 择桥接模式(ip不同)
(3)配置网卡
[root@ds01 ~]# uuidgen
bdb8b43b-5f66-478c-9401-93aa80333cff
[root@ds01 ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36
[root@ds01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
TYPE=Ethernet
BOOTPROTO=none
NAME=ens36
UUID=5d4dbbba-38b2-41d0-a5be-1d2c30dba649
DEVICE=ens36
ONBOOT=yes
IPADDR=192.168.1.164
[root@ds01 ~]# systemctl restart network
(4)清空以往的规则
[root@ds01 ~]# ipvsadm -C
(5)查看规则
[root@ds01 ~]# ipvsadm -L -n
(6)配置规则
ipvsadm -A -t 192.168.1.164 -s rr //-A添加虚拟服务,-t添加主机
ipvsadm -Ln
(7)添加规则
ipvsadm -a -t 192.168.1.164:80 -r 192.168.2.200:80 -m
ipvsadm -a -t 192.168.1.164:80 -r 192.168.2.201:80 -m
ipvsadm -Ln
[root@ds01 ~]# ipvsadm -A -t 192.168.1.164:80 -s rr
[root@ds01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.164:80 rr
[root@ds01 ~]# ipvsadm -a -t 192.168.1.164:80 -r 192.168.2.200:80 -m
[root@ds01 ~]# ipvsadm -a -t 192.168.1.164:80 -r 192.168.2.201:80 -m
[root@ds01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.164:80 rr
-> 192.168.2.200:80 Masq 1 0 0
-> 192.168.2.201:80 Masq 1 0 0
(8)vim /etc/sysctl.conf
net.ipv4.ip_forward=1 //在最后一行添加
[root@ds01 ~]# sysctl -p
net.ipv4.ip_forward = 1 //让立即生效-----能够正常显示就可以了
6.Web01主机:
临时修改web01的网关,网管必须指向dip----对内的ip
[root@web01 ~]# route del default
[root@web01 ~]# route add default gw 192.168.2.177
7.Web02主机:
临时修改web02的网关
[root@web02 ~]# route del default
[root@web02 ~]# route add default gw 192.168.2.177
lvs-nat模式的优点是配置简单,缺点是请求和响应都必须经过ds,容易成为性能瓶颈
希望有这样一个模式,请求的时候使用input链进行负载均衡,响应的时候就不要经过ds,直接rs响应客户端
在nat模式,请求vip,就是vip的响应
构想请求vip,接受rip响应,这是不允许lvs-dr模式
8.nat模式脚本
# ds脚本
#!/bin/bash
#配置网卡
echo TYPE="Ethernet" >> /etc/sysconfig/networkscripts/ifcfg-ens36 echo BOOTPROTO="none" >> /etc/sysconfig/networkscripts/ifcfg-ens36 read -p "router name:" router_name
echo NAME='"$rount_name"' >>/etc/sysconfig/networkscripts/ifcfg-ens36 uuidkey=$( uuidgen )
echo UUID='"$uuidkey"' >>/etc/sysconfig/networkscripts/ifcfg-ens36 >> /etc/sysconfig/networkscripts/ifcfg-ens36
echo DEVICE='"$rount_name"' >>/etc/sysconfig/networkscripts/ifcfg-ens36 echo ONBOOT="yes" >> /etc/sysconfig/network-scripts/ifcfgens36
echo IPADDR=192.168.1.164 >>/etc/sysconfig/networkscripts/ifcfg-ens36 systemctl restart network
#安装ipvsadm
yum list installed|grep ipvsadm
if[ $? -ne 0 ];then
yum -y install ipvsadm
fi
#配置规则
read -p "vip:" vip
read -p "port:" port
read -p "rule:" s
ipvsadm -A -t $vip:$port -s $s
# ip forward
echo "net.ipv4.ip_forward=1" >/etc/sysctl.conf
sysctl -p
# rs脚本
#!/bin/bash
read -p "dip:" dip
# 设置网关
route del default
route add defualt gw $dip
三.DR模式
- 性能更优,回路不经过ds
- ds和rs为了保证用户的响应,都要求配置统一的vip
- 由于rs是直接响应client,网关一定不能设置为ds的dip
- 对rs的vip进行抑制,让ds的vip接受请求,rs的vip不接受请求
1.ds03上的ens33上挂一个vip192.168.2.102
[root@ds03 ~]# ifconfig ens33:0 192.168.2.102 broadcast 192.168.2.102 netmask 255.255.255.255 up
route add -host 192.168.2.102 dev ens33:0
#192.168.2.101 dip
#192.168.2.102 vip 在rs上的vip和这个vip相同
2.安装ipvsadm
yum -y install ipvsadm.x86_64
3.设置规则
ipvsadm -C
ipvsadm -A -t 192.168.2.102:80 -s rr
ipvsadm -a -t 192.168.2.102:80 -r 192.168.2.200 -g
ipvsadm -a -t 192.168.2.102:80 -r 192.168.2.201 -g
#rs不在需要指定端口,dr不支持端口映射,vip上是80端口,最终就是80端口
#-m nat -g gateway
4.在rs(web01,web02)上配置
(1)在lo接口上挂载一个vip192.168.2.102
[root@web01 ~]# ifconfig lo:0 192.168.2.102 broadcast 192.168.2.102 netmask 255.255.255.255 up
(2)配置主机路由
[root@web01 ~]# route add -host 192.168.2.102 dev lo:0
[root@web01 ~]# ifconfig
[root@web01 ~]# ip a
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.2.102/32 brd 192.168.2.102 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:13:76:e2 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.200/24 brd 192.168.2.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::4e57:f3b5:85eb:4fb1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::fc42:faf3:7cd0:dbf1/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
(3)抑制rs的vip接受请求
[root@web01 ~]# vim arp.sh
ifconfig lo:0 192.168.2.102 broadcast 192.168.2.102 netmask 255.255.255.255 up
route add -host 192.168.2.102 dev lo:0 //可以把这个也加进来,前面配置了可以不用写进来
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
[root@web01 ~]# source arp.sh
SIOCADDRT: 文件已存在
[root@web01 ~]# ls
anaconda-ks.cfg arp.sh
(4)将web01这个里面的arp.sh这个文件传到web02上面
[root@web01 ~]# scp arp.sh root@192.168.2.201:~
[root@web02 ~]# ls
anaconda-ks.cfg arp.sh
测试使用,查看状态
在浏览器用vip访问
运行web02里面的arp.sh这个脚本
[root@web02 ~]# source arp.sh
在浏览器里面刷新访问
在ds03上面查看连接状态与信息
[root@ds03 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.2.102:80 8 52 0 6692 0
-> 192.168.2.200:80 4 31 0 5080 0
-> 192.168.2.201:80 4 21 0 1612 0
5.dr模式的脚本
(1)ds脚本
#!/bin/bash
#在ens33上挂载一个ip地址
read -p "vip:" vip
read -p "mac:" mac
read -p "num" num
ifconfig $mac:$num $vip broadcast $vip netmask
255.255.255.255
# 主机路由
route add -host $vip dev $mac:$num#安装ipvsadm
yum list installed|grep ipvsadm
if [ $? -ne 0 ] ; then
yum -y install ipvsadm
fi
#配置规则(不需要设置ip_forword)
ipvsadm -C
read -p "rule:" rule
read -p "port:" port
ipvsadm -A -t $vip:$port -s $rule
read -p "rip1:" rip1
ipvsadm -a -t $vip:$port -r $rip1 -g
read -p "rip2:" rip2
ipvsadm -a -t $vip:$port -r $rip2 -g
(2)rs脚本
#!/bin/bash
#在ens33上挂载一个ip地址
read -p "vip:" vip
read -p "mac:" mac
read -p "num" num
ifconfig $mac:$num $vip broadcast $vip netmask
255.255.255.255
# 主机路由
route add -host $vip dev $mac:$num
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