LVS负载均衡之NAT模式配置

NAT 模式架构图:

操作步骤

实验环境准备:(centos7平台)

所有服务器上配置

# systemctl stop firewalld         //关闭防火墙
# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux //关闭selinux,重启生效
# setenforce         //关闭selinux,临时生效
# ntpdate .centos.pool.ntp.org //时间同步
注意:realserver的网关需要指向DIP

步骤一:配置realserver

在 realserver(web01和web02)上安装 nginx,并在不同的 web 服务器上建立不同的主页内容(方便测试),并启动。

1) 在 web01 服务器配置

[root@web01 ~]# yum install nginx -y
[root@web01 ~]# echo "`hostname` `ifconfig ens33 |sed -n 's#.*inet \(.*\)netmask.*#\1#p'`" > /usr/share/nginx/html/index.html
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx

2) 在 web02 服务器配置

[root@web02 ~]# yum install nginx -y
[root@web02 ~]# echo "`hostname` `ifconfig ens33 |sed -n 's#.*inet \(.*\)netmask.*#\1#p'`" > /usr/share/nginx/html/index.html
[root@web02 ~]# systemctl start nginx
[root@web02 ~]# systemctl enable nginx

步骤二:调度器上配置

1)在调度器上打开ip转发,因为在上面架构图中,调度器会用到两个IP段的转发

# vim /etc/sysctl.conf
net.ipv4.ip_forward =
# sysctl -p //使之生效

2)在调度器(director)上安装软件包(ipvsadm)

# yum install ipvsadm -y
# rpm -qa |grep ipvsadm //检查是否安装成功

3)按照架构图来配置lvs进程调度

[root@lvs-director ~]# ipvsadm -A -t 192.168.1.31: -s rr    //--A参数增加服务,-t 绑定的ip地址(VIP),-s指定调度算法
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.11: -m //-a 指定增加真实服务器,-r 指定realserver;-m 表示使用 NAT 模式
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.12: -m
// 上面三条写的就是访问192.168.1.31的80端口会以rr算法调给10.10.10.11的80和10.10.10.12的80端口。
[root@lvs-director ~]# ipvsadm -ln //查看ipvsadm调度规则
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.31: rr
-> 10.10.10.11: Masq
-> 10.10.10.12: Masq

步骤三:测试

1)rr算法验证

在client 端进行访问验证

[root@client ~]# elinks 192.168.1.31

[root@client ~]# elinks 192.168.1.31

验证结果为 web1 页面和web2 页面轮循

验证一:健康检查

停掉web01上的nginx服务

[root@web01 ~]# systemctl stop nginx
[root@node01 ~]# elinks 192.168.1.31

验证结果只有 web02 了,说明健康检查ok

验证二:验证调度MySQL服务

1、在后端 realserver 装两个 mysql ,并启动服务,分别创建两个不同名的库,方便测试

# yum install mariadb mariadb-server
# systemctl start mariadb
MariaDB [(none)]> create database mariadb1; //web1上操作
MariaDB [(none)]> create database mariadb2; //web2上操作

2、两个 mysql 授权,这里授权的 IP 应该为客户端的 IP 192.168.1.35(通过 IP 包的原理分析得到)

MariaDB [(none)]> grant all on *.* to 'abc'@'192.168.1.35' identified by '';
MariaDB [(none)]> flush privileges;

3、在 调度器上面添加调度规则

[root@lvs-director ~]# ipvsadm -A -t 192.168.1.31: -s rr
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.11: -m
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.12: -m

4、客户端 192.168.1.35 上使用 (mysql -h 192.168.1.31 -u 授权用户名 -p授权密码)来测试,通过 show  databases;查看库中有 mariadb1 爱是 mariadb2,就知道连接的是哪个 mysql。

[root@client ~]# mysql -h 192.168.1.31 -u abc -p123
......
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mariadb1 |
| mysql |
| performance_schema |
| test |
+--------------------+
rows in set (0.00 sec) [root@client ~]# mysql -h 192.168.1.31 -u abc -p123
......
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mariadb2 |
| mysql |
| performance_schema |
| test |
+--------------------+
rows in set (0.00 sec)

2)会话保持验证

会话保持:永久粘贴和持续性的比较

验证一:永久性会话粘贴(类似 nginx 的 ip_hash)

1、在调度器上面配置调度规则

[root@lvs-director ~]# ipvsadm -A -t 192.168.1.31: -s sh
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.12: -m
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.11: -m
[root@lvs-director ~]# ipvsadm -ln
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.31: sh
-> 10.10.10.11: Masq
-> 10.10.10.12: Masq

2、测试结果如下,如果客户端第一次访问的是 web02,那么永远访问的是 web02(web02挂了还是访问 web02,这里的健康检查就无效了)

[root@client ~]# curl 192.168.1.31
web02 10.10.10.12
[root@client ~]# curl 192.168.1.31
web02 10.10.10.12
[root@web02 ~]# systemctl stop nginx
[root@client ~]# curl 192.168.1.31
curl: () Failed connect to 192.168.1.31:; 拒绝连接
[root@client ~]# curl 192.168.1.31
curl: () Failed connect to 192.168.1.31:; 拒绝连接

验证二:通过持续性 persistent 实现非永久性的会话粘贴

1、启动上面停掉的web02 的服务,并将调度器上面的规则更改为 persistent 持续性的会话粘贴  -E 参数 修改已有的规则

[root@lvs-director ~]# ipvsadm -E -t 192.168.1.31: -s rr -p
[root@lvs-director ~]# ipvsadm -ln
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.31: rr persistent
-> 10.10.10.11: Masq
-> 10.10.10.12: Masq

2、验证,在客户端上面访问,然后查看调度器上面的调度信息。

[root@client ~]# curl 192.168.1.31
web01 10.10.10.11
[root@client ~]# curl 192.168.1.31
web01 10.10.10.11
[root@lvs-director ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP : NONE 192.168.1.35: 192.168.1.31: 10.10.10.11:
TCP : TIME_WAIT 192.168.1.35: 192.168.1.31: 10.10.10.11:
TCP : TIME_WAIT 192.168.1.35: 192.168.1.31: 10.10.10.11:

通过上面的命令看到客户端 192.168.1.35 访问了两次192.168.1.31:80,被调度到了10.10.10.11:80

说明:当一个 client 访问 vip 的时候,ipvs 或记录一条状态为 NONE 的信息,NONE 状态前面的 expire 值是 persistence_timeout 的值(这里设置为10,所以从10开始计算),然后根据时钟主键变小,在以下记录存在时间,同一 client ip 连接上来,都会被分配到同一个后盾。TIME_WAIT 的值就是 tcp tcpfin udp 的超时时间,同一个客户端 ip 可能有几个 TIME_WAIT ,它们公用一个 NONE,当 NONE 的值为 0 时,如果 TIME_WAIT 还存在,那么 NONE 的值会从新变成 60秒,再减少,知道这个客户端 IP 的所有 TIME_WAIT 消失以后,NONE 才会消失,只要 NONE 存在,同一 client 的访问,都会分配到统一 的real server。也就是说,客户端 192.168.1.35 第一次访问 被调度给 10.10.10.11:80,要等 2*60+10=130秒左右的时间再做第二次访问才可能被调度给另一个 real server。

3)wrr算法验证

wrr 加权轮循,先将上面创建的规则删除,然后再添加规则(也可以直接修改 -E)

[root@lvs-director ~]# ipvsadm -D -t 192.168.1.31:
[root@lvs-director ~]# ipvsadm -A -t 192.168.1.31: -s wrr
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.11: -m -w
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.12: -m -w
[root@lvs-director ~]# ipvsadm -ln
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.31: wrr
-> 10.10.10.11: Masq
-> 10.10.10.12: Masq

验证,在客户端机上测试结果如下,可以发现按照配置的规则2:1的调度到 web01 和web02

[root@client ~]# curl 192.168.1.31
web01 10.10.10.11
[root@client ~]# curl 192.168.1.31
web01 10.10.10.11
[root@client ~]# curl 192.168.1.31
web02 10.10.10.12

4)lc算法验证

lc 通过实时的链接数来判定,链接数少的会被分配更多的请求,此处就不测试了,因为这个要大规模连接才能看出效果来。配置方法和上面一样,只是更改 -s 后面的算法,示例:

[root@lvs-director ~]# ipvsadm -A -t 192.168.1.31: -s lc
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.11: -m
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.12: -m

5)wlc算法验证

wlc 加权最小连接

[root@lvs-director ~]# ipvsadm -A -t 192.168.1.31: -s wlc
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.11: -m
[root@lvs-director ~]# ipvsadm -a -t 192.168.1.31: -r 10.10.10.12: -m
[root@lvs-director ~]# ipvsadm -ln
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.31: wlc
-> 10.10.10.11: Masq
-> 10.10.10.12: Masq

等等  还有别的算法都是一样的配置。

将 ipvsadm 规则加入开机启动

因为ipvsadm 命令添加的规则,重启后就没有了,此时我们就需要保存下来,添加到开机启动

[root@lvs-director ~]# rpm -ql ipvsadm
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm
/usr/sbin/ipvsadm-restore
/usr/sbin/ipvsadm-save
/usr/share/doc/ipvsadm-1.27
/usr/share/doc/ipvsadm-1.27/README
/usr/share/man/man8/ipvsadm-restore..gz
/usr/share/man/man8/ipvsadm-save..gz
/usr/share/man/man8/ipvsadm..gz

通过查看ipvsadm 软件包安装清单,可以看到有启动服务脚本,内容如下:

[root@lvs-director ~]# cat /usr/lib/systemd/system/ipvsadm.service
[Unit]
Description=Initialise the Linux Virtual Server
After=syslog.target network.target [Service]
Type=oneshot
ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"
ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
ExecStop=/sbin/ipvsadm -C
RemainAfterExit=yes [Install]
WantedBy=multi-user.target

可以看出停止时候也是将规则保存在 /etc/sysconfig/ipvsadm文件中,由于该文件不存在,所以第一次需要手动保存创建文件。然后再添加到开机启动

[root@lvs-director ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@lvs-director ~]# systemctl enable ipvsadm

LVS 概念篇参考 ->点我

DR 模式实现参考 ->点我

LVS负载均衡NAT模式实现的更多相关文章

  1. LVS负载均衡NAT模式原理介绍以及配置实战

    LVS基本原理 流程解释: 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ...

  2. lvs 负载均衡 NAT模式

    1.原理 基于NAT机制实现.当用户请求到达director之后,director将请求报文的目标地址(即VIP)改成选定的realserver地址,同时将报文的目标端口也改成选定的realserve ...

  3. LVS负载均衡DR模式

    什么是集群? 一组相互独立的计算机,利用高速通信网络组成的一个计算机系统,对于客户机来说像是一个单一服务器,实际上是一组服务器.简而言之,一堆机器协同工作就是集群.集群的基本特点:高性能.高并发.高吞 ...

  4. lvs负载均衡(DR模式)

    lvs负载均衡(DR模式) 系统环境:lvs+keepalivedcentos7.5 ip:192.168.1.157 vip:192.168.1.150(主)centos7.5 ip:192.168 ...

  5. LVS负载均衡DR模式实现

    LVS负载均衡之DR模式配置 DR 模式架构图: 操作步骤 实验环境准备:(centos7平台) 所有服务器上配置 # systemctl stop firewalld //关闭防火墙 # sed - ...

  6. LVS负载均衡工作模式和调度算法

    原文链接:https://blog.csdn.net/weixin_40470303/article/details/80541639 一.LVS简介 LVS(Linux Virtual Server ...

  7. Linux系统(四)LVS集群负载均衡NAT模式

    序言 提到LVS,就从章文嵩博士开始吧,反正也不知道如何下笔来写这一篇.章大博士,读博时候创建这个lvs软件项目,但是他提倡开源精神,在用户的建议和反馈中,这个花了他两周时间开发的开源软件不断得到改建 ...

  8. lvs负载均衡net模式

    环境配置,一台双网卡的ens33,ens37,ens37的网关是ens33的IP,指定一下nginx ens33,192.168.30.22,ens37,172.16.1.1nginx  192.16 ...

  9. VMware上实现LVS负载均衡(NAT)

    本文LVS的实现方式採用NAT模式.关于NAT的拓扑图请參照我的上一篇文章.本文纯粹实验.NAT在生产环境中不推荐使用.原因是Load Balancereasy成为瓶颈! 1.VMware9上安装Ce ...

随机推荐

  1. 使用tensorflow搭建自己的验证码识别系统

    目录 准备验证码数据 保存为tfrecords文件 验证码训练 学习tensorflow有一段时间了,想做点东西来练一下手.为了更有意思点,下面将搭建一个简单的验证码识别系统. 准备验证码数据 下面将 ...

  2. 教你一步永久激活WebStorm2018

    工欲善其事必先利其器,我们在开发过程中,编辑器是我们提高开发效率及生产必备的工具,如何发现一个高效好用的编辑器是程序员必备的技能之一. 前端开发有众多编辑器 sublime.vscode.webstr ...

  3. Python3 isdigit()方法

    描述 Python isdigit() 方法检测字符串是否只由数字组成. 语法 isdigit()方法语法: str.isdigit() 参数 无. 返回值 如果字符串只包含数字则返回 True 否则 ...

  4. 如何连接别人电脑上的Oracle数据库?

    需要一些前提条件: 1.对方的主机能被连接(如在同一局域网内) 2.需要知道对方数据库IP.端口号.服务名 3.需要知道对方提供的管理数据库的用户名及密码 连接方法: 1.在本地的oracle安装目录 ...

  5. 免费了 -- EXCEL插件 智表ZCELL 普及版V1.0 发布了!!!

    智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...

  6. Android Studio3.x上使用Lombok

    1.添加gradle依赖 implementation 'org.projectlombok:lombok:1.16.8' //添加lombok依赖implementation 'org.glassf ...

  7. MySQL实现按天统计数据的方法

    一.首先生成一个日期表,执行SQL如下: CREATE TABLE num (i int); ), (), (), (), (), (), (), (), (), (); CREATE TABLE i ...

  8. VS2010主题设置及插件推荐

    本文主要写了个人使用 VS2010 的一些配置及实用插件,从而打造一个符合个人风格的开发环境. 基础设置 安装 Visual Assist X 在 VS2010 中若不安装 Visual Assist ...

  9. springboot 配置文件

    – Spring Boot使用一个全局的配置文件 • application.properties • application.yml – 配置文件放在src/main/resources目录或者类路 ...

  10. mysql 8.0.X 创建新的数据库、用户并授权

    一.创建数据库 mysql> create database jira; Query OK, 0 rows affected (0.09 sec) 二.创建用户 mysql> create ...