DR模型的工作过程:

Client向VIP发起请求,请求被路由器接收到,转发给不同网段的Director的VIP,Director再通过私有网络转给RS服务器,RS服务器处理请求并通过自身配置的VIP直接将响应发给Client.

要点:

关键点是在集群内部,Director和RS服务器都要配置相同的VIP,这就要解决IP冲突的问题,有三种方法:

1,在路由器中绑定Director的MAC与VIP,各RS还要添加arptables拒绝网络通告

2,在RS中使用arptables解决

3,RS服务器对于路由器发起寻找VIP的广播不予回应,修改内核参数即可.

每台主机只需一块网卡,并处于同一个物理网络,请求到达Director之后会把报文重新封装目标MAC为选择的其中一台RS,这样就可以把报文发送给这台RS来响应.

所有RS通过修改内核参数屏蔽arp通告.把VIP配置在lo:0这个别名上,再添加入栈路由,让报文经过lo:0,这样报文出栈时,源IP才能改成VIP.

请求报文经过Director,响应报文不经过Director,RS网关只能指向路由器,不能指向DIP,无法实现端口映射.

实验环境:

假设:

Client网络为172.18.7.0

服务器公网:10.0.0.0

服务器内网(主机模式):192.168.7.0

准备五台CentOS 7虚拟机,

Director:

一块网卡,仅主机模式

VIP:10.0.0.100

网关:10.0.0.200 实际上随意填一个网关都可以.因为并不真的需要使用这个网关,但是不写又不行.

DIP:192.168.7.30

网关:192.168.7.200

RS1:

一块网卡,仅主机模式

RIP:192.168.7.10

网关:192.168.7.200

VIP:10.0.0.100

RS1:

一块网卡,仅主机模式

RIP:192.168.7.20

网关:192.168.7.200

VIP:10.0.0.100

网关:10.0.0.200

Router:

两块网卡,ens33桥接,ens37仅主机模式,不需要网关

公网IP(ens33):172.18.7.200

内网IP1(ens37):192.168.7.200

模拟另一公网网关IP(ens37:1):10.0.0.200

Client:

一块网卡,桥接

CIP:172.18.7.70

网关:172.18.0.1

配置Router:

Router需要两块网卡,ens33和ens37

ens33:

配置地址172.18.7.200,由于是路由器,所以不需要网关

  1. ]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
  2. BOOTPROTO="static"
  3. DEVICE="ens33"
  4. ONBOOT="yes"
  5. IPADDR=172.18.7.200
  6. PREFIX=16

ens37:

配置地址192.168.7.200和10.0.0.200

  1. ]# cd /etc/sysconfig/network-scripts/
  2. ]# vim ifcfg-ens37
  3. BOOTPROTO="static"
  4. DEVICE="ens37"
  5. ONBOOT="yes"
  6. IPADDR=192.168.7.200
  7. PREFIX=24

  1. ]# vim ifcfg-ens37:1
  2. BOOTPROTO="static"
  3. DEVICE="ens37:1"
  4. ONBOOT="yes"
  5. IPADDR=10.0.0.200
  6. PREFIX=8

开启ip地址转发

  1. ]# cat /proc/sys/net/ipv4/ip_forward
  2. ]# vim /etc/sysctl.conf
  3. net.ipv4.ip_forward = 1
  4. ]# sysctl -p
  5. net.ipv4.ip_forward = 1
  6. ]# cat /proc/sys/net/ipv4/ip_forward
  7. 1

这样可以让RS服务器能够连通Client.

  1. ]# systemctl restart network

查看一下


Client:

客户端ip地址172.18.7.70,网关指向路由器172.18.7.200

  1. ]# nmcli connection modify System\ ens33 ipv4.addresses 172.18.7.70/16 ipv4.gateway 172.18.7.200 ipv4.method manual
  2. ]# nmcli connection up System\ ens33
  3. ]# route -n
  4. Kernel IP routing table
  5. Destination Gateway Genmask Flags Metric Ref Use Iface
  6. 0.0.0.0 172.18.7.200 0.0.0.0 UG 100 0 0 ens33
  7. 172.18.0.0 0.0.0.0 255.255.0.0 U 100 0 0 ens33

测试ping 另外两个网段是否通

  1. ]# ping 192.168.7.200
  2. PING 192.168.7.200 (192.168.7.200) 56(84) bytes of data.
  3. 64 bytes from 192.168.7.200: icmp_seq=1 ttl=64 time=3.31 ms
  4. ]# ping 10.0.0.200
  5. PING 10.0.0.200 (10.0.0.200) 56(84) bytes of data.
  6. 64 bytes from 10.0.0.200: icmp_seq=1 ttl=64 time=3.47 ms

Director

作为Director,只需要与RS服务器通讯,由于Director与RS服务器在同网段,所以实际上并不需要配置网关

暂时修改网关为192.168.7.200

  1. ]# nmcli connection modify System\ ens33 ipv4.addresses 192.168.7.30/24 ipv4.gateway 192.168.7.200 ipv4.method manual
  2. ]# nmcli connection up System\ ens33

运行以下脚本.

  1. ]# vim lvs_dr_vs.sh
  2. #!/bin/bash
  3. vip='10.0.0.100'
  4. iface='ens33:1'
  5. mask='255.255.255.255'
  6. port='80'
  7. rs1='192.168.7.10'
  8. rs2='192.168.7.20'
  9. scheduler='wrr'
  10. type='-g'
  11. rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null
  12. case $1 in
  13. start)
  14. ifconfig $iface $vip netmask $mask broadcast $vip up
  15. iptables -F
  16. ipvsadm -A -t ${vip}:${port} -s $scheduler
  17. ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
  18. ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 2
  19. echo "The VS Server is Ready!"
  20. ;;
  21. stop)
  22. ipvsadm -C
  23. ifconfig $iface down
  24. echo "The VS Server is Canceled!"
  25. ;;
  26. *)
  27. echo "Usage: $(basename $0) start|stop"
  28. exit 1
  29. ;;
  30. esac

  1. ]# bash lvs_dr_vs.sh start

脚本中给ens33:1网卡别名添加了VIP10.0.0.100,然后通过yum安装了ipvsadm,并添加了规则.

查看.

  1. ]# ipvsadm -Ln
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 10.0.0.100:80 wrr
  6. -> 192.168.7.10:80 Route 1 0 0
  7. -> 192.168.7.20:80 Route 2 0 0

RS1

配置ip地址

  1. ]# nmcli connection modify System\ ens33 ipv4.addresses 192.168.7.10/24 ipv4.gateway 192.168.7.200 ipv4.method manual
  2. ]# nmcli connection up System\ ens33

测试ping Client

  1. ]# ping 172.18.7.70
  2. PING 172.18.7.70 (172.18.7.70) 56(84) bytes of data.
  3. 64 bytes from 172.18.7.70: icmp_seq=1 ttl=63 time=1.64 ms

准备预配置脚本,用于配置VIP,修改内核参数,安装httpd和测试页面等,要事先配置好yum原,我这里使用本地光盘作为yum源.

  1. ]# cat lvs_dr_rs.sh
  2. #!/bin/bash
  3. vip=10.0.0.100
  4. mask='255.255.255.255'
  5. dev=lo:1
  6. rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
  7. service httpd start &> /dev/null && echo "The httpd Server is Ready!"
  8. echo "<h1>`hostname`</h1>" > /var/www/html/index.html
  9. case $1 in
  10. start)
  11. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
  12. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  13. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  14. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  15. ifconfig $dev $vip netmask $mask #broadcast $vip up
  16. echo "The RS Server is Ready!"
  17. ;;
  18. stop)
  19. ifconfig $dev down
  20. echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
  21. echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  22. echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
  23. echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
  24. echo "The RS Server is Canceled!"
  25. ;;
  26. *)
  27. echo "Usage: $(basename $0) start|stop"
  28. exit 1
  29. ;;
  30. esac

运行脚本

  1. ]# bash lvs_dr_rs.sh start

把VIP地址绑定到了本地回环网卡lo的别名lo:1上.这样RS会使用lo:1发送响应报文,源地址也就变成了VIP.

  1. ]# scp lvs_dr_rs.sh 192.168.7.20:/root/

RS2

配置ip地址配置

  1. ]# nmcli connection modify System\ ens33 ipv4.addresses 192.168.7.20/24 ipv4.gateway 192.168.7.200 ipv4.method manual
  2. ]# nmcli connection up System\ ens33
  3. ]# ping 172.18.7.70
  4. PING 172.18.7.70 (172.18.7.70) 56(84) bytes of data.
  5. 64 bytes from 172.18.7.70: icmp_seq=1 ttl=63 time=2.80 ms


跑脚本.

测试:

Client :

如果出现下面的情况

  1. ]# curl 10.0.0.100
  2. curl: (7) Failed connect to 10.0.0.100:80; No route to host

可以尝试:

给Director添加gateway

重启网络服务

  1. ]# bash lvs_dr_vs.sh stop
  2. ]# bash lvs_dr_vs.sh start

还不行就重启Director.

ldirectord

LVS虽然调度效率极强,但也存在缺点.

1,一旦Director不可用,整个系统将不可用.

解决方案,配合高可用

2,某RS不可用时,Director依然会调度请求至此RS.

解决方案:由Director对各RS健康状态进行检查,失败时禁用,成功时启用

此时就要借助其他工具来实现.类似工具有keepalived,heartbeat/corosync,ldirectord等,本次实验以ldirectord为例.

directord: 监控和控制LVS守护进程,可管理LVS规则

对于健康检查,有以下几种方式:

(a) 网络层检测,icmp

(b) 传输层检测,端口探测

(c) 应用层检测,请求某关键资源

RS全都不可用时:将访问调度到backup server或叫做 sorry server,用于反馈用户提示信息.

ldirecord支持包括https,firewall mark ,ftp,smtp,submission,pop,imap,ldap,UDP DNS,MySQL,PostgreSQL,Oracle等多种协议以及ipv6.

ldrectord下载地址

http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/

按照系统版本和架构选择下载

这里选择页面中Centos 7下的x86_64下的ldirectord-3.9.6-0rc1.1.2.x86_64.rpm

在Director中安装ldirector:

之前要先清空ipvsadm创建的规则

  1. ]# ipvsadm -C

yum安装ldirectord

  1. ]# yum -y install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm
  2. ]# rpm -ql ldirectord
  3. /etc/ha.d
  4. /etc/ha.d/resource.d
  5. /etc/ha.d/resource.d/ldirectord
  6. /etc/logrotate.d/ldirectord
  7. /usr/lib/ocf/resource.d/heartbeat/ldirectord
  8. /usr/lib/systemd/system/ldirectord.service
  9. /usr/sbin/ldirectord
  10. /usr/share/doc/ldirectord-3.9.6
  11. /usr/share/doc/ldirectord-3.9.6/COPYING
  12. /usr/share/doc/ldirectord-3.9.6/ldirectord.cf
  13. /usr/share/man/man8/ldirectord.8.gz

修改配置

  1. ]# cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
  2. ]# vim /etc/ha.d/ldirectord.cf
  3. checktimeout=3 #每次检测超时时长
  4. checkinterval=1 #每次检测间隔时间
  5. fallback=127.0.0.1:80 #sorry_server,此处设置为本机.需要在本机开启http服务.
  6. autoreload=yes #修改配置文件自动生效,无需手动reload
  7. logfile="/var/log/ldirectord.log"
  8. quiescent=no
  9. virtual=10.0.0.100:80 #VIP
  10. real=192.168.7.1:80 gate 1 #RS服务器,gate表示dr模式,数字为权重.
  11. real=192.168.7.2:80 gate 3
  12. service=http
  13. scheduler=wrr #权重轮询
  14. persistent=600
  15. checktype=negotiate
  16. checkport=80
  17. request="test.html" #用于检测的页面
  18. receive="test" #检测关键字,如果检测得到,则认为RS还活着

real参数还支持范围写法如real=192.168.6.2->192.168.6.7:80 gate.

安装httpd,准备测试页面,测试结果.

  1. ]# yum install httpd -y
  2. ]# echo 'sorry server' > /var/www/html/index.html
  3. ]# systemctl start httpd
  4. ]# curl 10.0.0.100
  5. sorry server

两个RS服务器建立测试页面

  1. ]# echo 'test' > /var/www/html/test.html

Director开启Ldirectord服务

  1. ]# systemctl start ldirectord

查看ipvsadmin状态

  1. ]# ipvsadm -Ln
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 10.0.0.100:80 wrr
  6. -> 192.168.7.10:80 Route 1 0 0
  7. -> 192.168.7.20:80 Route 3 0 0

规则已经配好

Client测试:

模拟RS宕机

停止RS1的httpd服务

  1. ]# systemctl stop httpd

Director中看ipvsadm规则

  1. ]# ipvsadm -Ln
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 10.0.0.100:80 wrr
  6. -> 192.168.7.20:80 Route 3 0 13

显示只有RS2在.

回到CLient看结果,只剩下RS2了

模拟RS2也宕机

  1. ]# systemctl stop httpd

Director中看ipvsadm规则

  1. ]# ipvsadm -Ln
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 10.0.0.100:80 wrr
  6. -> 127.0.0.1:80 Route 1 0 0

RS服务器都不在,被sorry server代替

回到CLient看结果,结果显示sorry server已经启用

现在恢复RS1.和RS2

  1. ]# systemctl start httpd

Director查看规则

  1. ]# ipvsadm -Ln
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 10.0.0.100:80 wrr
  6. -> 192.168.7.10:80 Route 1 0 3
  7. -> 192.168.7.20:80 Route 3 0 7

回到CLient看结果,已经恢复

测试结束.


可见,LVS配合ldirectord之后,功能性大大加强了.

LVS跨网段DR模式并使用ldirectord实现RS高可用性的更多相关文章

  1. Linux学习-LVS跨网段DR模型和FWM多服务绑定

    一.实验环境 系统:CentOS7.6 主机:5台 (虚拟机) 客户端1台:172.16.236.134/24 (NAT网卡),网关指向 172.16.236.185/24(路由服务器) 路由服务器1 ...

  2. LVS跨网段DR模型

    客户端IP地址:172.16.8.147 路由器服务器IP地址:172.16.8.167内网IP地址:192.168.1.3 一.将客户端的网关修改为路由服务器IP地址 vim ifcfg-ens33 ...

  3. LVS负载均衡DR模式

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

  4. LVS集群DR模式实例(4)

    LVS集群DR模式实例 1. 实验拓扑图 2. 实验环境 3台CentOS6.4 64bit的服务器. 类型 IP DR eth0:10.20.73.20  VIP eth0:0 10.20.73.3 ...

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

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

  6. LVS系列二、LVS集群-DR模式

    一. LVS-DR和LVS-IP TUN集群概述 1.  Direct Routing(直接路由) Director分配请求到不同的real server.real server处理请求后直接回应给用 ...

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

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

  8. LVS+keepalived 的DR模式的两种做法

    LVS DR模式搭建 准备工作 三台机器: dr:192.168.13.15 rs1:192.168.13.16 rs2: 192.168.13.17 vip:192.168.13.100 修改DR上 ...

  9. lvs 中的DR模式 ,解释

    CIP即为客户端的IP地址 . DIR为调度器 . VIP为虚拟IP地址 . RIP为真实服务器IP地址 . 假设CIP的mac为A1,ip为B1:DIR只有一个物理网卡mac为A2,IP为B2:RI ...

随机推荐

  1. mysql 索引数据结构及原理

    原文:http://www.uml.org.cn/sjjm/201107145.asp 1 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子 ...

  2. 最新 IntelliJ Idea 2017 激活方法(转)

    转载地址:http://www.cnblogs.com/suiyueqiannian/p/6754091.html 1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入 ...

  3. CountDownLatch 使用(模拟一场比赛)

    java.util.concurrency中的CountDownLatch,主要用于等待一个或多个其他线程完成任务.CountDownLatch在初始化时,会被赋一个整数,每次执行countDown( ...

  4. 十分钟理解Actor模式

    Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing.所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor.共享内存更适合单 ...

  5. 嵌套div的margin-top不生效

    之前遇到过嵌套div设置margin-top不生效的情况,一直没去研究,今天又遇到了,查阅资料得知原因,并不是margin-top没生效,只是当外层容器跟内层容器之间没有别的元素的时候,内层容器的ma ...

  6. flask框架的学习

    ---恢复内容开始--- 第一个flask程序讲解:1. 第一次创建项目的时候,要添加flask的虚拟环境.添加虚拟环境的时候,一定要选择到python这个执行文件.比如你的flask的虚拟环境的目录 ...

  7. 分层 DAO层,Service层,Controller层、View层

    前部分摘录自:http://blog.csdn.net/zdwzzu2006/article/details/6053006 DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务 ...

  8. Lambda表达式&匿名方法

    “Lambda表达式“(lambda Expression)就是一个匿名函数(匿名方法),lambda表达式基于数学中的入演算得名. lambda运算符:所有的lambda表达式都是用新的lambda ...

  9. Java常用的排序算法三

    Merge Sort :归并排序:用递归的思想,分解成单个元素的排序,在归并 代码: import java.util.*; public class MergeSort { public stati ...

  10. flask中的数据操作

    flask中数据访问: pip install flask-sqlalemy 创建数据: 创建app的工厂 from flask import Flask from flask_sqlalchemy ...