Keepalived LVS

Stella981
• 阅读 806

Keepalived LVS-DR单网络双活双主配置模式

Linux就该这么学 今天

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)、十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq),LVS在Unix-like系统中是作为一个前端(Director)存在的,又称为调度器,它本身不提供任何的服务,只是将通过互联网进来的请求接受后再转发给后台运行的真正的服务器(RealServer)进行处理,然后响应给客户端。

Keepalived LVS

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

LVS有两个重要的组件:一个是IPVS,一个是IPVSADM。ipvs是LVS的核心组件,它本身只是一个框架,类似于iptables,工作于内核空间中。ipvsadm 是用来定义LVS的转发规则的,工作于用户空间中。

LVS有三种转发类型

LVS-NAT模式

称为网络地址转换,实现起来比较简单,所有的RealServer集群节点和前端调度器Director都要在同一个子网中,这种模型可以实现端口映射,RealServer的操作系统可以是任意操作系统,前端的Director既要处理客户端发起的请求,又要处理后台RealServer的响应信息,将RealServer响应的信息再转发给客户端,前端Director很容易成为整个集群系统性能的瓶颈。通常情况下RealServer的IP地址(以下简成RIP)为私有地址,便于RealServer集群节点之间进行通信通常情况下前端的Director有两个IP地址,一个为VIP,是虚拟的IP地址,客户端向此IP地址发起请求。一个是DIP,是真正的Director的IP地址,RIP的网关要指向Director的DIP。

LVS-DR模式

DR:直接路由(direct routing)模式,此种模式通过MAC地址转发工作,所有的RealServer集群节点和前端调度器Director都要在同一个物理网络中,此种模式不支持端口映射,此种模式的性能要优于LVS-NAT,RIP可以使用公网的IP,RIP的网关不能指向DIP。

优点:

相对LVS/NAT模式,DR模式不需要把返回的数据通过负载均衡转发,想要他发挥优势,那么就要相应的数据包的数量和长度远远大于请求数据包,幸运的是,大部分WEB服务都具备这样的特点,响应和请求并不对称,因此常用的WEB服务,都可以使用这种模式。

这种方式,负载均衡器不再是系统的瓶颈。如果你的负载均衡器只拥有100M的全双工网卡和带宽的话,通过集群的横向扩展也可以让整个系统达到1G的流量。

来自LVS官方站点的测试结果也告诉我们,LVS-DR可以容纳100台以上的实际应用服务器,对一般的服务而已,这样的表现足够了。

不足:

DR模式下不能跨网段转发数据,如果必须要跨网段进行负载,那么就必须使用LVS/TUN模式。

LVS-TUN模式

称为隧道模型RealServer服务器与前端的Director可以在不同的网络中,此种模型也不支持端口映射,RealServer只能使用哪些支持IP隧道的操作系统,前端的Director只处理客户端的请求,然后将请求转发给RealServer,由后台的RealServer直接响应客户端,不再经过Director,RIP一定不能是私有IP,在DR、TUN模式中,数据包是直接返回给用户的,所以,在Director Server上以及集群的每个节点上都需要设置这个地址。此IP在Real Server上一般绑定在回环地址上,例如lo:0,同样,在Director Server上,虚拟IP绑定在真实的网络接口设备上,例如eth0:0。

开始部署

准备四台服务器或虚拟机:

Web Nginx:10.16.8.8/10.16.8.9Keepalived:10.16.8.10/10.16.8.11Keepalived VIP:10.16.8.100/10.16.8.101OS:CentOS Linux release 7.4.1708 (Core)

先决条件:

安装keepalived
时间同步
设置SELinux和防火墙
互相之间/etc/hosts文件添加对方主机名(可选)。
确认网络接口支持多播(组播)新网卡默认支持。
以上部署请参阅:《keepalived 安装及配置文件讲解》。

ka67配置文件
$ vim /usr/local/keepalived/etc/keepalived/keepalived.confglobal_defs {   notification_email {     root@localhost   }   notification_email_from ka@localhost   smtp_server 127.0.0.1   smtp_connect_timeout 60   vrrp_mcast_group4 224.0.0.111}vrrp_instance VI_1 {    state MASTER    interface eth1    virtual_router_id 191    priority 100    advert_int 1    authentication {        auth_type PASS        auth_pass renwole0    }    virtual_ipaddress {        10.16.8.100    }    notify_master "/usr/local/keepalived/etc/keepalived/notify.sh master"    notify_backup "/usr/local/keepalived/etc/keepalived/notify.sh backup"    notify_fault "/usr/local/keepalived/etc/keepalived/notify.sh fault"        }vrrp_instance VI_2 {    state BACKUP    interface eth1    virtual_router_id 192    priority 95    advert_int 1    authentication {        auth_type PASS        auth_pass renwole1    }    virtual_ipaddress {        10.16.8.101    }    notify_master "/usr/local/keepalived/etc/keepalived/notify.sh master"    notify_backup "/usr/local/keepalived/etc/keepalived/notify.sh backup"    notify_fault "/usr/local/keepalived/etc/keepalived/notify.sh fault"         }
ka68配置文件
$ vim /usr/local/keepalived/etc/keepalived/keepalived.confglobal_defs {   notification_email {     root@localhost   }   notification_email_from ka@localhost   smtp_server 127.0.0.1   smtp_connect_timeout 60   vrrp_mcast_group4 224.0.0.111}vrrp_instance VI_1 {    state BACKUP    interface eth1    virtual_router_id 191    priority 95    advert_int 1    authentication {        auth_type PASS        auth_pass renwole0    }    virtual_ipaddress {        10.16.8.100    }    notify_master "/usr/local/keepalived/etc/keepalived/notify.sh master"    notify_backup "/usr/local/keepalived/etc/keepalived/notify.sh backup"    notify_fault "/usr/local/keepalived/etc/keepalived/notify.sh fault"         }vrrp_instance VI_2 {    state MASTER    interface eth1    virtual_router_id 192    priority 100    advert_int 1    authentication {        auth_type PASS        auth_pass renwole1    }    virtual_ipaddress {        10.16.8.101    }    notify_master "/usr/local/keepalived/etc/keepalived/notify.sh master"    notify_backup "/usr/local/keepalived/etc/keepalived/notify.sh backup"    notify_fault "/usr/local/keepalived/etc/keepalived/notify.sh fault"        }
创建通用notify.sh检测脚本

分别创建此脚本:

$ vim /usr/local/keepalived/etc/keepalived/notify.sh#!/bin/bash#contact='root@localhost'notify() {    local mailsubject="$(hostname) to be $1, vip floating"    local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"    echo "$mailbody" | mail -s "$mailsubject" $contact}case $1 inmaster)    notify master       ;;backup)    notify backup       ;;fault)    notify fault        ;;*)    echo "Usage: $(basename $0) {master|backup|fault}"    exit 1    ;;esac
启动keepalived服务
$ systemctl start keepalived$ systemctl enable keepalived
查看组播状态

我们还可以在任意一台keepalived节点,通过tcpdump命令查看组播心跳状态,例如:

$ tcpdump -nn -i eth1 host 224.0.0.111tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes00:32:31.714987 IP 10.16.8.10 > 224.0.0.111: VRRPv2, Advertisement, vrid 191, prio 100, authtype simple, intvl 1s, length 2000:32:31.715739 IP 10.16.8.11 > 224.0.0.111: VRRPv2, Advertisement, vrid 192, prio 100, authtype simple, intvl 1s, length 2000:32:32.716150 IP 10.16.8.10 > 224.0.0.111: VRRPv2, Advertisement, vrid 191, prio 100, authtype simple, intvl 1s, length 2000:32:32.716292 IP 10.16.8.11 > 224.0.0.111: VRRPv2, Advertisement, vrid 192, prio 100, authtype simple, intvl 1s, length 2000:32:33.717327 IP 10.16.8.10 > 224.0.0.111: VRRPv2, Advertisement, vrid 191, prio 100, authtype simple, intvl 1s, length 2000:32:33.721361 IP 10.16.8.11 > 224.0.0.111: VRRPv2, Advertisement, vrid 192, prio 100, authtype simple, intvl 1s, length 20

如果提示报错:-bash: tcpdump: command not found.

安装tcpdump即可:

$ yum install tcpdump -y
配置LVS

分别安装lvs。CentOS7已经集成了LVS的核心,所以只需要安装LVS的管理工具就可以了:

$ yum -y install ipvsadm

分别停止ka67/ka68的keepalived服务:

$ systemctl stop keepalived

分别在ka67/ka68配置文件最后添加Virtual Server配置:

$ vim /usr/local/keepalived/etc/keepalived/keepalived.confvirtual_server 10.16.8.100 80 {    delay_loop 3    lb_algo rr    lb_kind DR    protocol TCP    # sorry_server 127.0.0.1 80    real_server 10.16.8.8 80 {        weight 1        HTTP_GET {            url {              path /              status_code 200            }            connect_timeout 1            nb_get_retry 3            delay_before_retry 1        }    }    real_server 10.16.8.9 80 {        weight 1        HTTP_GET {            url {              path /              status_code 200            }            connect_timeout 1            nb_get_retry 3            delay_before_retry 1        }    }}virtual_server 10.16.8.101 80 {    delay_loop 3    lb_algo rr    lb_kind DR    protocol TCP    # sorry_server 127.0.0.1 80    real_server 10.16.8.8 80 {        weight 1        HTTP_GET {            url {              path /              status_code 200            }            connect_timeout 1            nb_get_retry 3            delay_before_retry 1        }    }    real_server 10.16.8.9 80 {        weight 1        HTTP_GET {            url {                path /                status_code 200            }            connect_timeout 1            nb_get_retry 3            delay_before_retry 1        }    }}
配置RS(Real Server)Web服务

分别在Web服务器安装Apache Httpd或Nginx作为Web服务,这里安装Nginx。

关于Nginx请参阅:《Centos 7 源码编译安装 Nginx》。

或通过以下方式安装Nginx,简单快速:

$ yum install epel-release -y$ yum install nginx -y

测试环境为区分机器的不同,故将显示页面设置成服务器IP地址,但在生产环境中获取的内容是一致的。

分别在web8/web9执行如下命令:

$ echo "Server 10.16.8.8" > /usr/share/nginx/html/index.html$ echo "Server 10.16.8.9" > /usr/share/nginx/html/index.html

测试是否访问正常:

$ curl http://127.0.0.1Server 10.16.8.8
添加RS脚本

由于该脚本部分命令,在Centos7 最小化安装中没有,所以请先安装网络工具包:

$ yum install net-tools -y

分别在web服务器上添加rs.sh脚本:

$ vim /tmp/rs.sh#!/bin/bashvip1=10.16.8.100vip2=10.16.8.101dev1=lo:1dev2=lo:2case $1 instart)    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 $dev1 $vip1 netmask 255.255.255.255 broadcast $vip1 up    ifconfig $dev2 $vip2 netmask 255.255.255.255 broadcast $vip2 up    echo "VS 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 "VS Server is Cancel!"    ;;*)    echo "Usage `basename $0` start|stop"    exit 1    ;;esac

再分别启动该脚本:

$ /tmp/rs.sh start

如果需要停止,请执行如下命令:

$ /tmp/rs.sh stop
测试

在另一台服务器测试是否能够访问

[root@localhost ~]# for i in `seq 5`; do>     curl 10.16.8.100>     curl 10.16.8.101> doneServer 10.16.8.9Server 10.16.8.8Server 10.16.8.8Server 10.16.8.9Server 10.16.8.9Server 10.16.8.8Server 10.16.8.8Server 10.16.8.9Server 10.16.8.9Server 10.16.8.8

根据测试结果判断,已经实现了Keepalived+LVS-DR+Nginx高可用故障切换模式

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Keepalived+Nginx实现高可用和双主节点负载均衡
简介Nginx可以实现高并发反向代理,lvs集群可以实现负载均衡,但是他们都有一个共同的弊端,就是Nginx,lvs架构中Director是单点故障,有没有一个好的方案解决这个问题呢?答案是有。通过Keepalived就可以实现,前端Nginx,lvs中Director服务器的高可用和负载均衡,通过shell命令或者脚本可以实现对服务器状态和服务的监控!
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
1. LVS概述
1.LVS介绍  LVS是linuxvirtualserver的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以再unix/linux平台下实现负载均衡集群功能2.LVS组成 LVS由2部分程序组成,包括ipvs(嵌入到linux的内核,不需要安装)和ipvsadm(https://www.oschina
Stella981 Stella981
3年前
LVS(三)LVS集群NAT模式
LVS集群NAT模式一Director服务器环境1.查看Director服务器内核中是否有IPVS的功能显示IPVS配置信息以及支持的调度算法grepi'vs'/boot/config3.10.0514.el7.x86_64...
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这