lvs笔记之nat&dr模型简单实现

lvs笔记之nat&dr模型简单实现

lvs笔记之nat&dr模型简单实现

lvs 集群 实现 负载均衡 nat


ipvsadm使用说明

    -A: 添加一个集群服务
    -t: tcp
    -u: udp
    -f: firewall mark,
        通常用于将两个或以上的服务绑定为一个服务进行处理时使用
        例如httpd和https
        iptables mongo表一起使用

        service-address:
    -t IP:port
    -u ip:port
    -f firewall_mark

    -s 调度方法,默认为wlc
    -p timeout: persistent connection, 持久连接
    -E 修改定义过的集群服务
    -D -t|u|f service-address:删除指定的集群服务
RS相关:  
    -a:向指定的Cluster services中添加RS
    -t|-u|-f service-address:指明将RS添加至哪个Cluster Service中
    -r: 指定RS,可包含{IP[:port]},只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口
LVS类型:
    -g: Gateway模式,就是DR模型(默认)
    -i: ipip模式,TUN模型
    -m: masquerade地址伪装自动完成后半段的原地址转换,NAT
指定RS权重:
    -w # 省略权重为1
    -e: 修改指定的RS属性
    -d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS
    -C :清空集群服务配置
保存规则:
    ipvsadm-save 
    ipvsadm -S
载入指定的规则:
     ipvsadm-restore
     ipvsadm -R
查看ipvs规则:
    -L [options]
    -n: 数字格式显示IP地址
    -c: 显示连接数相关信息
    --stats: 显示统计数据
    --rate: 速率
    --exact:显示统计数据的精确值
    --timeout: 超时时间
     -Z: 计数器清零;

lvs-nat的简单实现

实验拓扑如下图:
lvs_nat.jpg-26.8kB

如图所示lvs-nat实现对后端2台real server(搭建apache httpd服务)进行负载均衡。

step1:

    1、按照拓扑所示配置好IP地址
    2、director需要准备两块网卡(一块公网网卡配置vip,一块内网网卡配置dip)
    3、后端两台real server准备一块网卡(内网网卡)配置rip,注意网关需要指向dip

step2各节点网络设置如下:

以下是director上的配置:

[root@localhost ~]# 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:37:63:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.146/24 brd 192.168.2.255 scope global dynamic eno16777736
       valid_lft 4229sec preferred_lft 4229sec
    inet6 fe80::20c:29ff:fe37:6302/64 scope link 
       valid_lft forever preferred_lft forever
3: eno33554984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:37:63:0c brd ff:ff:ff:ff:ff:ff
    inet 192.168.253.153/24 brd 192.168.253.255 scope global eno33554984
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe37:630c/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777736 
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.2.146
NETMASK=255.255.255.0
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736"
UUID="ee2e45b1-4b9c-41cb-8507-de93e3827896"
DEVICE="eno16777736"
ONBOOT="yes"
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno33554984 
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.253.153
NETMASK=255.255.255.0
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno33554984"
DEVICE="eno33554984"
ONBOOT="yes"

以下是rs1、和rs2的配置:
QQ图片20161211224831.png-32.3kB
QQ图片20161211225106.png-32.4kB

注意real server的网关要指向dip


step3在real server上进行如下操作:

以下是real server1上进行的操作:
# yum install httpd -y &> /dev/null && echo success || echo failure    #RS1安装httpd
success #安装成功
#route add default gw 192.168.253.153  #设置默认网关为Director的DIP
# echo "<h1>This is Real Server 1 </h1>" > /var/www/html/index.html   #添加测试网页
#systemctl start httpd #启动httpd服务

以下是real server2上进行的操作:
# yum install httpd -y &> /dev/null && echo success || echo failure    #RS1安装httpd
success #安装成功
#route add default gw 192.168.253.153  #设置默认网关为Director的DIP
# echo "<h1>This is Real Server 2 </h1>" > /var/www/html/index.html #添加测试网页
#systemctl start httpd #启动httpd服务

step4在director上进行操作:

# yum install ipvsadm -y   #安装ipvsadm
[root@localhost ~]#  curl 192.168.253.169   #测试rs是否可以服务
<h1>This is Real Server 1 </h1>
[root@localhost ~]#  curl 192.168.253.168  #测试rs是否可以服务
<h1>This is Real Server 2 </h1>
[root@localhost ~]#  vim /etc/sysctl.conf   #编辑内核文件开启内核路由转发

# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward = 1  #添加该项设置
[root@localhost ~]# sysctl -p  #对刚才的修改进行立即生效
net.ipv4.ip_forward = 1  #可见已经生效
[root@localhost ~]#  cat /proc/sys/net/ipv4/ip_forward  #查看是否开启路由转发功能
1  #开启
[root@localhost ~]# ipvsadm -A -t 192.168.2.146:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.2.146:80 -r 192.168.253.169 -m
[root@localhost ~]# ipvsadm -a -t 192.168.2.146:80 -r 192.168.253.168 -m
[root@localhost ~]#  ipvsadm -Ln  #查看规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.2.146:80 rr
  -> 192.168.253.168:80           Masq    1      0          0         
  -> 192.168.253.169:80           Masq    1      0          0 
[root@localhost ~]#  curl http://192.168.2.146
<h1>This is Real Server 2 </h1>
[root@localhost ~]#  curl http://192.168.2.146
<h1>This is Real Server 1 </h1>

测试:
QQ图片20161209151052.png-15.9kB
QQ图片20161209151059.png-23.5kB

踩过的坑1

在实验过程中遇到了浏览器访问vip失败,但是director上curlvip却可以的情况后来排查发现real server开启了两块网卡(一块外网,一块内网,浏览器可以通过外网ip访问real server上的web服务),当我只启用了内网网卡时,浏览器成功访问vip。
 因此当你实验失败时请从以下两点排查:
       1、real server是否启用了多块网卡,如果是请禁用多余的 只启用内网网卡。并且把网关指向dip
       2 关闭iptables和selinux(或者设置合适的规则)

lvs-dr实现

实验拓扑如下:
lvs_dr拓扑.jpg-98.4kB

后端两台real server搭建httpd服务(默认已搭建完成并启动),各节点iptables和selinux均已关闭

step1在director上执行如下操作:

#ifconfig eno16777736:0 192.168.2.11/32 broadcast 192.168.2.11 up
#route add -host 192.168.2.11 dev eno16777736:0

step2在real server1上执行如下操作:

#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#echo 1 > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/eno16777736/arp_announce
#添加如上内核参数,注意要在director节点添加ipvs规则前做此步操作
#ifconfig lo:0 192.168.2.11/32 broadcast 192.168.2.11 up
#route add -host 192.168.2.11 dev lo:0
#echo "<h1>This is Real Server 1 </h1>" > /var/www/html/index.html

step3在real server2上执行如下操作:

#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#echo 1 > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/eno16777736/arp_announce
#添加如上内核参数,注意要在director节点添加ipvs规则前做此步操作
#ifconfig lo:0 192.168.2.11/32 broadcast 192.168.2.11 up
#route add -host 192.168.2.11 dev lo:0
#echo "<h1>This is Real Server 2 </h1>" > /var/www/html/index.html

step4在director节点执行如下操作:

  #ipvsadm -A -t 192.168.2.11:80 -s rr
 #ipvsadm -a -t 192.168.2.11:80 -r 192.168.2.117 -g
 #ipvsadm -a -t 192.168.2.11:80 -r 192.168.2.135 -g

测试:
 QQ图片20161212213930.png-30.4kB
 QQ图片20161212213938.png-40.2kB

以上lvs-dr模型简单实现到此为止

总结

lvs特点是模型工作原理比较复杂,但是其服务配置却非常简单,lvs集群的配置难点主要集中在对模型的理解上,对网络的配置及排错上。
     这仅仅只是lvs的简单实现后期会与其他集群服务配合进行更复杂的拓扑。

原创文章,作者:Net17_desperado,如若转载,请注明出处:http://www.178linux.com/65441

赞 (0)
Net17_desperadoNet17_desperado
上一篇 2017-01-03 10:39
下一篇 2017-01-03 11:05

相关推荐

  • MySQL/MariaDB数据库基于SSL实现主从复制

    前言 备份数据库是生产环境中的首要任务,重中之重,有时候不得不通过网络进行数据库的复制,由于MySQL/MariaDB的主从复制是明文传送的,如果在生产环境中跨网络传送,数据的安全性就无法完全保证,为了解决这一问题,我们需要一种安全的方式进行传送,即基于SSL加密进行数据传输。 部署配置 实验拓扑 实验环境 系统环境:CentOS6.6 数据库版本:mari…

    Linux干货 2015-06-21
  • N25期—第一周作业

    1、描述计算机的组成及其功能 计算机五大组成部件:运算器、控制器、存储器、输入设备和输出设备。 运算器和控制器统称中央处理器(CPU)。  存储器分成内存储器和外存储器两大类。  外存储器、输入设备和输出设备统称为外部设备。  中央处理器(CPU)  计算机的中央处理器又称为CPU,它是计算机的核心部分。主要由运算器和…

    Linux干货 2016-12-04
  • 用户,管理,权限

    主要是介绍一些 关于创建用户 ,更改用户信息及密码 ,还有权限管理等等。可能介绍的不全还请大佬们多多关照新人!

    Linux干货 2017-11-24
  • python练习实例

    #依次输出五位数的每一位(由低位到高位)i=12345for a in range(5):j=i%10i=i//10print(j) #依次输出五位数的每一位(由高位到低位)i=12345for a in range(5,0,-1):j=i//10**(a-1)i=i%10**(a-1)print(j) #打印菱形for i in range(-3,4):j…

    Linux干货 2018-03-25
  • 如何在Java中避免equals方法的隐藏陷阱

    译者注 :你可能会觉得Java很简单,Object的equals实现也会非常简单,但是事实并不是你想象的这样,耐心的读完本文,你会发现你对Java了解的是如此的少。如果这篇文章是一份Java程序员的入职笔试,那么不知道有多少人会掉落到这样的陷阱中。原文转自http://www.artima.com/lejava/articles/equality.…

    开发运维 2015-04-03
  • awk的详细用法

    awk简介 awk是一种编程语言,也可以说是一个脚本语言解释器,主要是用来实现文本的格式化输出。awk是取了其三位作者名字的首字母,即Aho,Weinberger和Kernighan。awk在Linux上是基于GNU协议实现的,即GNU awk,也就是gawk。 awk的工作模式 遍历整个文件,从第一行到最后一行。每次仅读取文件的一行,依照用户指定的输入分隔…

    Linux干货 2016-11-14