lvs+keepalived

lvs四种集群特点及使用场景

  • lvs-nat(net adress translation)
    类似于DNAT,但支持多目标转发。通过修改请求报文的目标地址为根据调度算法所挑选出的某RS的RIP来进行转发;
    架构特性:
    1)RS应该使用私有地址,即RIP应该为私有地址:各RS的网关必须指向DIP;
    2)请求和响应报文都经由director转发:高负载场景中,dircetor可能成为瓶颈;
    3)支持端口映射;
    4)RS可以使用任意OS;
    5)RS的RIP必须与director的DIP在同一网络;

  • lvs-dr(direct route)
    director在实现转发时不修改请求的ip首部,而是通过直接封装MAC首部完成转发:目标MAC是Dircetor根据调度算法挑选出某RS的MAC地址,此类型中,RS也有同Director一样的VIP。
    架构特点:
    1)通过静态绑定或内核参数修改或arptables规则实现只有Director上的VIP响应服务请求,RS上的VIP拒绝响应服务请求;
    2)RS上的RIP可以是私有地址,也可以是公网地址;
    3)请求报文必须经过Director调度,响应报文直接由RS通过VIP返回给用户;
    4)各RIP必须与DIP在同一网络中;
    5)不支持端口映射;
    6)RS可以使用大多数的OS;
    7)RS的网关一定不能指向Director;

  • lvs-tun(Tunnel transmission)
    隧道传输ipip:不修改请求报文ip首部,而是通过ip隧道机制在原有的ip报文之外在封装ip首部,经由互联网把请求报文交给选定的rs;
    架构特性:
    1)RIP,DIP,VIP都是公网地址;
    2)RS的网关不能,也不可能指向DIP;
    3)请求报文由Director分发,但响应报文直接由RS响应给Client;
    4)不支持端口映射;
    5)RS的OS必须得支持IP隧道,现在只有linux系统支持,windows,bsfdb等不支持;

  • lvs-fullnat(双向转换)
    通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发:
    架构特点:这是一种对nat模型的改进,是一个扩展,使得RS与Director可以处于不同网络。
    1)RIP,DIP可以使用私有地址;
    2)RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP;
    3)支持端口映射;
    4)RS的OS可以使用任意类型;
    5)请求报文经由Director,响应报文也经由Director;

LVS-DR工作原理,并配置实现。

  • DR架构


    lvs-dr.PNG

其原理是数据包在director上被二层重写成被调度的RS的mac。
因所有RS上都配有相同VIP,故所有RS上都需要关闭ARP相应及通告。

  • 实验拓扑:


    lvs.jpg
  • VS配置:
    编写脚本lvs_dr_vs.sh
#!/bin/bash
#
vip='172.16.2.200'  #设置VIP
iface='lo:1'         #VIP绑定网卡label
mask='255.255.255.255'  #掩码
port='80'          #端口
rs1='172.16.2.135'  #设置rip
rs2='172.16.2.136'
scheduler='rr'   #调度算法
type='-g'       #集群类型
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null   #安装ipvsadm工具

case $1 in
start)
    #添加VIP
    ifconfig $iface $vip netmask $mask #broadcast $vip up
    #清空防火墙
    iptables -F
    #添加ipvs规则
    ipvsadm -A -t ${vip}:${port} -s $scheduler
    ipvsadm -a -t ${vip}:${port} -r ${rs1} $type
    ipvsadm -a -t ${vip}:${port} -r ${rs2} $type
    echo "The VS Server is Ready!"
    ;;
stop)
    # 清空ipvs规则
    ipvsadm -C
    ifconfig $iface down
    echo "The VS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

启动脚本

[root@node1 ~]# bash lvs_dr_vs.sh start
  • RS配置:
    编写脚本lvs_dr_rs.sh
#!/bin/bash
vip=172.16.2.200  #设置VIP
mask='255.255.255.255'  #掩码
dev=lo:1   #VIP绑定网卡label
#安装httpd服务并启动
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"    
#生成index文件
echo "<h1>172.16.2.136</h1>" > /var/www/html/index.html

case $1 in
start)
    #关闭ARP相应
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    #添加VIP
    ifconfig $dev $vip netmask $mask #broadcast $vip up
    #route add -host $vip dev $dev
    echo "The RS Server is Ready!"
    ;;
stop)
    #还原配置
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

启动脚本

[root@centos8-node1 ~]# bash lvs_dr_rs.sh start
  • 测试:
[root@centos6 ~]# ip a

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:21:75:ba brd ff:ff:ff:ff:ff:ff
    inet 172.16.98.200/24 brd 172.16.98.255 scope global eth0
    inet6 fe80::20c:29ff:fe21:75ba/64 scope link
       valid_lft forever preferred_lft forever

[root@centos6 ~]# while true;do curl 172.16.2.200;sleep 0.5;done
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>

LVS+Keepalived高可用

  • 实验拓扑:


    keepalived.jpg
  • RS端:
    使用RS脚本:

#!/bin/bash
vip=172.16.2.200
mask='255.255.255.255'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "<h1>172.16.2.135</h1>" > /var/www/html/index.html

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $dev $vip netmask $mask #broadcast $vip up
    #route add -host $vip dev $dev
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac
  • keepalived服务配置:(以MASTER端为例)
    安装keepalived服务
[root@node1 ~]# yum install -y keepalived

配置sorry server

[root@node1 ~]# yum install -y httpd
[root@node1 ~]# echo sorry server > /var/www/html/index.html
[root@node1 ~]# systemctl start httpd

编辑keepalived配置文件

[root@node1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {   #全局通用配置
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1  #邮件服务器IP
   smtp_connect_timeout 30   #邮件发送超时时间
   router_id node1     #本机id标识 BACKUP应为其id
   #vrrp_strict     #此设置应注销,否则会添加iptables规则使主机无法通行
   vrrp_skip_check_adv_addr
   rrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 239.1.1.1 # vrrp组播侦听地址,默认为224.0.0.18
}

vrrp_instance VI_1 {   #配置vrrp实例
    state MASTER   #设置主从 从服务器应为BACKUP
    interface ens160  #使用的网卡名称
    virtual_router_id 66  #识别同一个虚拟路由,一个实例内服务器应相同
    priority 100   #优先级,MASTER比BACKUP
    advert_int 1
    authentication {  #配置认证
        auth_type PASS
        auth_pass 6666
    }
    virtual_ipaddress {  #虚拟IP
        172.16.2.200/24
    }
}


virtual_server 172.16.2.200 80 {   #VS配置
    delay_loop 3  
    lb_algo rr  #定义调度算法
    lb_kind DR  #集群类型
    #persistence_timeout 50  #持久连接,为实验效果已注释
    protocol TCP  #服务协议
    real_server 172.16.2.135 80 { #配置RS
        weight 1
        HTTP_GET {   #健康检测
            url {
              path /
              status_code 200
            }
            connect_timeout 1  
            nb_get_retry 3
            delay_before_retry 3

        }
    }
    real_server 172.16.2.136 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1

        }
    }
}

启动服务

[root@node1 ~]# systemctl start keepalived
  • 验证:
    查看MASTER节点IP
[root@node1 ~]# 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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:db:0a:d3 brd ff:ff:ff:ff:ff:ff
    inet 172.16.2.131/24 brd 172.16.2.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 172.16.2.200/24 scope global secondary ens160  #VIP上线
       valid_lft forever preferred_lft forever
    inet6 fe80::52b4:adde:49fc:1544/64 scope link tentative noprefixroute dadfailed
       valid_lft forever preferred_lft forever
    inet6 fe80::8e34:700b:215e:e13c/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

查看ipvs规则

[root@node1 ~]# ipvsadm -Ln  #ipvs规则已生成
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.2.200:80 rr
  -> 172.16.2.135:80              Route   1      0          0
  -> 172.16.2.136:80              Route   1      0          0

尝试关闭MASTER节点keepalived服务,验证VIP是否漂移至BACKUP节点

[root@node1 ~]# systemctl stop keepalived
[root@node2 ~]# 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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:c9:0a:a2 brd ff:ff:ff:ff:ff:ff
    inet 172.16.2.132/24 brd 172.16.2.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 172.16.2.200/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::52b4:adde:49fc:1544/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

[root@node2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.2.200:80 rr
  -> 172.16.2.135:80              Route   1      0          0
  -> 172.16.2.136:80              Route   1      0          0
  • client端测试:
    keepalived主从节点切换,业务流量未端
[root@centos6 ~]# while true;do curl 172.16.2.200 ;sleep 0.5;done
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
<h1>172.16.2.136</h1>
<h1>172.16.2.135</h1>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343