热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

keepalive+LVS

Linux集群架构集群介绍keepalived介绍用keepalived配置高可用负载均衡集群介绍LVS介绍LVS的调试算法LVSNAT模式搭建LVSDR模式搭建keepalive

Linux集群架构

  • 集群介绍
  • keepalived介绍
  • 用keepalived配置高可用
  • 负载均衡集群介绍
  • LVS介绍
  • LVS的调试算法
  • LVS NAT模式搭建
  • LVS DR模式搭建
  • keepalived LVS

集群介绍

根据功能划分为两大类:高可用和负载均衡
高可用集群常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务
实现高可用的开源软件有:keepalived、heartbeat
负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2
实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler


keepalived介绍

使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题
keepalived通过VRRP(Virtual Router Redundancy Protocol)来实现高可用
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组会有1个master角色和N(N>=1)个backup角色。
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。
keepalived有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP的。


用keepalived配置高可用集群

mater:192.168.221.10

1.安装keepalived
2.安装nginx
3.编辑keepalived.conf
4.编辑监控脚本,给脚本文件执行权限
5.启动keepalived

代码如下:

yum install keepalived.x86_64 -y
yum install epel-release -y
yum install nginx -y
vim keepalived.conf //以下是文件内容
1 global_defs {2 notification_email {3 apeng@apenglinux.com4 }5 notification_email_from root@apenglinux.com6 smtp_server 127.0.0.17 smtp_connect_timeout 308 router_id LVS_DEVEL9 }10 vrrp_script check_nginx {11 script "/usr/local/sbin/check_nginx.sh"12 interval 313 }14 vrrp_instance VI_1 {15 state MASTER16 interface ens3317 virtual_router_id 5118 priority 10019 advert_int 120 authentication {21 auth_type PASS22 auth_pass 111123 }24 virtual_ipaddress {25 192.168.221.10026 }27 track_script {28 check_nginx29 }30 }vim /usr/local/sbin/check_nginx.sh#!/bin/bash
#
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --on-heading | wc -l`
if [ $n -eq "0" ]; thensystemctl start nginxn2=`ps -C nginx --no-heading | wc -l`if [ $n2 -eq "0" ]; thenecho "$d nginx down,keepalived will stop." >> /var/log/check_nginx.logsystemctl stop keepalivedfi
fichmod +x /usr/local/sbin/check_nginx.sh
systemctl start keepalived

启动keepalived时,如果没有将拉起nginx进程,则需要关闭selinux
backup:192.168.221.20

1.安装keepalived
2.安装nginx(源码包安装过了)
3.编辑keepalived.conf
4.编辑监控脚本,给脚本文件执行权限
5.启动keepalived

代码如下:

yum install keepalived.x86_64 -y
vim /etc/keepalived/keepalived.conf
global_defs {notification_email {apeng@apenglinux.com}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_DEVEL
}
vrrp_script check_nginx {script "/usr/local/sbin/check_nginx.sh"interval 3
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.221.100}track_script {check_nginx}
}

vim /usr/local/sbin/check_nginx.sh
#!/bin/bash
#
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading | wc -l`
if [ $n -eq "0" ]; then/etc/init.d/nginx startn2=`ps -C nginx --no-heading | wc -l`if [ $n2 -eq "0" ]; thenecho "$d nginx down,keepalived will stop." >> /var/log/check_nginx.logsystemctl stop keepalivedfi
fi

chmod +x /usr/local/sbin/check_nginx.sh

systemctl start keepalived.service

vip:192.168.221.100(用于用户访问)

负载均衡集群介绍

主流开源软件LVS、keepalived、haproxy、nginx等
其中LVS属于4层(网络OSI7层模型),nginx属于7层,haproxy既可以为是4层,也可以当做7层使用
keepalived的负载均衡功能其实就是lvs
lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如Mysql的,而nginx仅仅支持http、https、mail、haproxy也支持mysql这种
相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求

LVS介绍

LVS(Linux Virtual Server)是由中国大牛章文嵩开发的,这款软件的流行度不亚于Apache的httpd,它是一款四层的负载均衡软件,是针对TCP/IP做的转发和路由,所以稳定性和效率相当高。虽然目前越来越多的企业选择使用Nginx实现负载均衡,但LVS依然被很多企业应用在核心的架构中。该架构中有一个核心的角色叫做调度器(Load Balance),用来分发用户的请求,还有诸多的真实服务器(Real Server),也就是处理用户的服务器。

LVS根据实现方式的不同,主要分为三种类型:NAT模式、IP Tunnel(IP隧道)模式、DR模式。

LVS NAT模式

调试器会把用户的请求通过预设的iptables规则转发给后端的真实服务器。其中调试器有两个IP,一个是公网ip,一个是内网ip,而真实服务器只有内网ip。用户访问的时候请求的是调试器的公网IP,它会把用户的请求转发到真实服务器的内网ip上。这种模式的好处是节省公网ip,但是调试器会成为一个瓶颈。

IP Tunnel模式

IP隧道是将一个IP报文封装在另一个IP报文的技术,这可以使目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。像大家熟知的×××技术其实就是IP隧道。在LVS的IP Tunnel架构中,后端服务器有一组而非一个,所以不可能静态地建立一一对应的隧道,而是动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理,将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。
这种模式需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip。
客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标ip所为rs的ip,这样数据包就到了rs上。rs接收数据包后,会还原始数据包,这样目标ip为vip,因为所有rs上配置了这个vip,所以它会认为是它自己。

DR模式

和IP Tunnel模式方法相同,用户的请求被调度器动态地分配到真实服务器上,真实服务器响应请求把结果返回给用户。不过,在这种模式下不会封装ip,而是将数据帧的MAC地址改为真实服务器的MAC地址。

LVS的调度算法

调度器把客户端发来的请求均衡地分发给后端的真实服务器,这是依靠预先设定好的调度算法实现的,在LVS中支持的调度算法主要有以下8种。

  • 轮询调度(Round-Robin)
  • 带权重的轮询调度(Weighted Round-Robin)
  • 最小连接调度(Least-Connection)
  • 带权重最小连接调度(Weight Least-Connection)
  • 基于局部性的最少链接调度(Locality-Based Least Connection)
  • 带复制的基于局部性最小链接调度(Locality-Based Least-Connection with Replication)
  • 目标地址散列调度(Destination Hashing)
  • 源地址散列调度(Source Hashing)

LVS NAT模式搭建

  • 调度器dir :192.168.221.10(内网) 192.168.1.50(外网) 安装ipvsadm,脚本lvs_nat.sh
  • 真实服务器rs1:192.168.221.20(内网) nginx
  • 真实服务器rs2:192.168.221.30(内网) ngnix
  • rs1,rs1的网关指向dir的内网ip
  • 将三台机器上的防火墙规则清空

    iptables -F;iptables -t nat -F;service iptables save

    调度器dir的配置代码如下:

    yum install ipvsadm.x86_64 -y


    vim /usr/local/sbin/lvs_nat.sh //以下脚本内容
    #!/bin/bash
    #
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
    iptables -t nat -F
    iptables -t nat -X
    iptables -t nat -A POSTROUTING -s 192.168.221.0/24 -j MASQUERADE
    IPVSADM="/usr/sbin/ipvsadm"
    $IPVSADM -C
    $IPVSADM -A -t 192.168.1.50:80 -s wlc -p 300
    $IPVSADM -a -t 192.168.1.50:80 -r 192.168.221.20:80 -m -w 1
    $IPVSADM -a -t 192.168.1.50:80 -r 192.168.221.30:80 -m -w 1

ipvsadm [options]
-C //清空规则
-A //增加Virtual Server
-t //tcp
-s //调度算法
-p //指定超时时间
-a //添加rs
-r //指定rs的ip
-m //表示lvs的模式为NAT(masquerad)
-g //表示lvs模式为DR
-i //表示lvs模式为IP Tunnel

bash /usr/local/sbin/lvs_nat.sh

rs1配置如下:

yum install epel-release -y
yum install nginx -y
grep -i gateway ifcfg-ens33 //以下一行是查出的内容
GATEWAY=192.168.221.10
echo "Real Server1 IP is 192.168.221.20" > /usr/share/nginx/html/index.html
systemctl start nginx.service

rs2配置如下:

yum install epel-release -y
yum install nginx -y
grep -i gateway ifcfg-ens33 //以下一行是查出的内容
GATEWAY=192.168.221.10
echo "Real Server2 IP is 192.168.221.30" > /usr/share/nginx/html/index.html
systemctl start nginx.service

测试
在dir上分别访问两个rs,在dir上访问dir外网ip:192.168.1.50(多访问几次,看看效果)

curl 192.168.221.20
Real Server1 IP is 192.168.221.20

curl 192.168.221.30
Real Server2 IP is 192.168.221.30

curl 192.168.1.50
Real Server2 IP is 192.168.221.30

在浏览器中访问dir外网
keepalive + LVS

LVS DR模式搭建

  • 调度器dir:192.168.221.10 lvs_dr.sh 安装ipvsadm
  • 真实服务器rs1:192.168.221.20 lvs_dr_rs.sh nginx
  • 真实服务器rs2:192.168.221.30 lvs_dr_rs.sh nginx
  • VIP:192.168.221.100

调度器dir代码如下:

vim /usr/local/sbin/lvs_dr.sh
#!/bin/bashecho 1 > /proc/sys/net/ipv4/ip_forward
ipv="/usr/sbin/ipvsadm"
vip=192.168.221.100
rs1=192.168.221.20
rs2=192.168.221.30
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

bash /usr/local/sbin/lvs_dr.sh

rs1代码如下:

vim /usr/local/sbin/lvs_dr_rs.sh
#!/bin/bashvip="192.168.221.100"
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

bash /usr/local/sbin/lvs_dr_rs.sh

rs2代码如下:

vim /usr/local/sbin/lvs_dr_rs.sh
#!/bin/bashvip="192.168.221.100"
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

bash /usr/local/sbin/lvs_dr_rs.sh

在浏览器中访问
keepalive + LVS

keepalived LVS

LVS架构中,不管是NAT模式还是DR模式,当后端的RS宕掉时,调度器依然会把请求转发到宕掉的RS上,这样的结果并不是我们想要的。其实,keepalived就可以解决该问题,它不仅仅有高可用的功能,还有负载均衡的功能。在调度器上只要安装了keepalived,就不用再安装ivpsadm了,也不用去编写lvs相关的脚本了,也就是说keepalived已经嵌入了lvs功能了。完整的keepalived+lvs架构需要有两台调度器实现高可用,提供调度器服务的只需要一台,另外一台作为备用。

  • 调度器dir1:192.168.221.10 keepalived 开启路由转发功能
  • 调度器dir2:192.168.221.50 keepalived 开启路由转发功能
  • 真实服务器rs1:192.168.221.20 nginx
  • 真实服务器rs2:192.168.221.30 nginx
  • VIP:192.168.221.100

调度器dir1的代码如下(dir1与dir2代码一样):

yum install keepalived -y

vim /etc/keepalived/keepalived.conf //以下是文件内容 vrrp_instance VI_1 {state MASTER //dir2上为"BACKUP"interface ens33virtual_router_id 51priority 100 //dir2上改为“90”advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.221.100}
}virtual_server 192.168.221.100 80 {delay_loop 6lb_algo wlclb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.221.20 80 {weight 100TCP_CHECK {connection_timeout 10nb_get_retry 3delay_before_retry 3connect_port 80}}real_server 192.168.221.30 80 {weight 100TCP_CHECK {connection_timeout 10nb_get_retry 3delay_before_retry 3connect_port 80}}
}

rs1,rs2上分别执行

bash /usr/local/sbin/lvs_dr_rs.sh //内容与上面定义的一样

测试

在浏览器中访问192.168.221.100
关闭rs1中的nginx进行测试
关闭dir1中的keepalived进行测试

转:https://blog.51cto.com/13480443/2083289



推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
  • 本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投 ... [详细]
  • c# java socketn 字节流_C#Socket编程详解(一)TCP与UDP简介
    一、TCP与UDP(转载)1、TCP1.1定义TCP(TransmissionControlProtocol)传输控制协议。是一种可靠的、面向连接的协议(eg:打电话)、传输效率低 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • LINUX学习之centos7营救模式
    今天卸载软件的时候,不小心把GNOME的一些组件给卸了,导致桌面无法正常开启,会卡在启动过程中,而我的开机启动模式又是设置为图形界面,所以一开LINUX就卡住了,进入不了命令行界面 ... [详细]
  • 目录1、将mysql数据导出到SQL文件中(数据库存在的情况)2、将现有的sql文件数据导入到数据库中(前提数据库存在) 3、利用Navicat导出SQL文件和导入SQL文件1)从 ... [详细]
  • k8s进阶之搭建私有镜像仓库
    企业级私有镜像仓 ... [详细]
author-avatar
静静
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有