Linux Lvs负载均衡集群技术(二)

2024-04-26 15:38

本文主要是介绍Linux Lvs负载均衡集群技术(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:博客园“走自己的路”

1.6安装LVS软件
1.6.1 安装LVS的准备
1.6.1.1 需要三台服务器或VM虚拟主机
1、数据库及memcache等对内业务的负载均衡环境

管理IP地址

角色

备注

10.0.0.51

LVS(负载均衡器)

对外提供VIP 10.0.0.56

10.0.0.55

RS1(真实服务器)

 

10.0.0.57

RS2(真实服务器)

 

 

 

 

 

 

 

2、web服务或web cache等负载均衡环境

管理IP地址

内部IP地址

角色

备注

192.168.1.51

10.0.0.51

LVS(负载均衡器)

对外提供VIP 10.0.0.56

192.168.1.55

10.0.0.55

RS1(真实服务器)

 

192.168.1.57

10.0.0.57

RS2(真实服务器)

 

 

 

 

 

 

 

注意:将10网段为内网卡,192假设为外网卡。

1.6.1.2 LVS安装配置

复制代码
#查看ip_vs是否在内核存在
[root@tty-lvs tools]# lsmod |grep ip_vs#查看系统版本
[root@tty-lvs tools]# cat /etc/redhat-release 
CentOS release 5.8 (Final)#查看系统内核号
[root@tty-lvs tools]# uname -r
2.6.18-308.el5#查看系统位
[root@tty-lvs tools]# uname -m
x86_64#做内核链接
[root@tty-lvs tools]# ln -s /usr/src/kernels/2.6.18-308.el5-x86_64/ /usr/src/linux
[root@tty-lvs tools]# ls -l /usr/src/ |grep linux
lrwxrwxrwx 1 root root   39 Aug  5 12:30 linux -> /usr/src/kernels/2.6.18-308.el5-x86_64/注意事项:
1、此ln命令的链接路径要和uname -r输出结果内核版本对应,工作中可能有多个内核路径。
2、如果没有/usr/src/kernels/2.6.18-308.el5-x86_64/,是因为缺少kernel-devel-2.6.18-308.el5软件包,可通过yum -y install kernel-devel 安装
---------------------------------------------------------------------------------------------------------------------------#进入软件目录
[root@tty-lvs ~]# cd /tools/#查看内核版本
[root@tty-lvs tools]# uname -r
2.6.18-308.el5#下载软件1.24
[root@tty-lvs tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
--2013-08-05 12:24:03--  http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
Resolving www.linuxvirtualserver.org... 69.56.251.119, 2001:470:1f0f:297::2
Connecting to www.linuxvirtualserver.org|69.56.251.119|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 36598 (36K) [application/x-gzip]
Saving to: `ipvsadm-1.24.tar.gz'

100%[===============================================================>] 36,598      --.-K/s   in 0.06s   2013-08-05 12:24:12 (578 KB/s) - `ipvsadm-1.24.tar.gz' saved [36598/36598]

[root@tty-lvs tools]# ls -l ipvsadm-1.24.tar.gz 
-rw-r--r-- 1 root root 36598 Dec 11  2005 ipvsadm-1.24.tar.gz
[root@tty-lvs tools]# tar zxf ipvsadm-1.24.tar.gz 
[root@tty-lvs tools]# cd ipvsadm-1.24
[root@tty-lvs ipvsadm-1.24]# make
[root@tty-lvs ipvsadm-1.24]# make install#检测安装是否成功
[root@tty-lvs ipvsadm-1.24]# echo $?
0
[root@tty-lvs ipvsadm-1.24]##启动ipvs,进行查看确认
[root@tty-lvs ipvsadm-1.24]# ipvsadm或者  modprobe ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@tty-lvs ipvsadm-1.24]# lsmod |grep ip_vs
ip_vs                 122113  0提示:执行ipvsadm命令就会把ip_vs加载到内核中
提示:ipvsadm 1.26的版本适用于kernel 2.6.28之后的版本,若符合此环境yum install libnl* popt* -y安装依赖库。
复制代码

1.7手动配置LVS负载均衡服务-DR模式
1.7.1 手动添加LVS转发

复制代码
1)用户访问:www.123456.com  -->vip:10.0.0.56 ==>这个步骤是在DNS里配置。
2)配置LVS虚拟IP(VIP)
[root@tty-lvs ipvsadm-1.24]# ifconfig eth0:0 10.0.0.56 netmask 255.255.255.0 up
[root@tty-lvs ipvsadm-1.24]# ifconfig eth0:0
eth0:0    Link encap:Ethernet  HWaddr 00:50:56:31:04:2E  inet addr:10.0.0.29  Bcast:10.0.0.255  Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1-->非必须的(添加路由)
[root@tty-lvs ipvsadm-1.24]# route add -host 10.0.0.56 dev eth0
[root@tty-lvs ipvsadm-1.24]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.29       0.0.0.0         255.255.255.255 UH    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         10.0.0.2        0.0.0.0         UG    0      0        0 eth03)配置后的检查结果
ping 10.0.0.56查看是否通4)手工执行配置添加LVS服务并增加两台RS
#清空ipvs所有的表记录
[root@tty-lvs ipvsadm-1.24]# ipvsadm -C#设置超时参数:tcp tcpfin udp 
[root@tty-lvs ipvsadm-1.24]# ipvsadm --set 30 5 60#添加虚拟服务和负载算法: wrr 权重轮询 
[root@tty-lvs ipvsadm-1.24]# ipvsadm -A -t 10.0.0.56:80 -s wrr -p 20#查看添加的虚拟服务
[root@tty-lvs ipvsadm-1.24]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.56:80 wrr persistent 20#添加RS主机
[root@tty-lvs ipvsadm-1.24]# ipvsadm -a -t 10.0.0.56:80 -r 10.0.0.55:80 -g -w 1 
[root@tty-lvs ipvsadm-1.24]# ipvsadm -a -t 10.0.0.56:80 -r 10.0.0.57:80 -g -w 1 
[root@tty-lvs ipvsadm-1.24]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.29:80 wrr persistent 20-> 10.0.0.57:80                 Route   1      0          0  -> 10.0.0.55:80                 Route   1      0          0   [删除RS方法]
[root@tty-lvs ipvsadm-1.24]# ipvsadm -d -t 10.0.0.56:80 -r 10.0.0.55:80LB端配置command
ifconfig eth0:0 10.0.0.56 netmask 255.255.255.0 up
ifconfig eth0:0
route add -host 10.0.0.56 dev eth0:0
route -n
ipvsadm -C
ipvsadm --set 30 5 60
ipvsadm -A -t 10.0.0.56:80 -s wrr -p 20
ipvsadm -a -t 10.0.0.56:80 -r 10.0.0.55:80 -g -w 1
ipvsadm -a -t 10.0.0.56:80 -r 10.0.0.57:80 -g -w 1
ipvsadm -L -n
复制代码

1.7.2 手工在RS端绑定VIP

复制代码
1、每台RS端执行
[root@tty-rs1 ~]# ifconfig lo:55 10.0.0.56 netmask 255.255.255.255 up    <==子网掩码为255.255.255.255
[root@tty-rs1 ~]# route add -host 10.0.0.56 dev lo[root@tty-rs2 ~]# ifconfig lo:57 10.0.0.56 netmask 255.255.255.255 up    <==子网掩码为255.255.255.255
[root@tty-rs2 ~]# route add -host 10.0.0.56 dev lo2、RS上执行抑制ARP响应方法如下:
echo "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 RS端配置command
ifconfig lo:55 10.0.0.56 netmask 255.255.255.255 up
route add -host 10.0.0.56 dev lo
echo "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_announceifconfig lo:57 10.0.0.56 netmask 255.255.255.255 up
route add -host 10.0.0.56 dev lo
echo "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
复制代码

1.7.3 脚本实现自动配置

复制代码
LB自动化配置脚本
#!/bin/bash. /etc/init.d/functionsVIP=10.0.0.56RIP=(10.0.0.5510.0.0.57
)NETMASK=255.255.255.0
RETVAL=0IFCONFIG=/sbin/ifconfig
ROUTE=/sbin/route
IPVSADM=/sbin/ipvsadm
SUBETH=eth0:`echo $VIP|awk -F "." '{print $4}'`
PORT=80function checkCMD(){if [ $# -ne 1 ];thenecho "Usage: /bin/sh $0 {start|stop}"fi
}function checkSubnet(){$IFCONFIG |grep "$1"|wc -l
}function start_lvs(){#if [ $(checkSubnet $SUBETH) -ne 0 ];then#               $IFCONFIG $SUBETH down#fi$IFCONFIG $SUBETH $VIP netmask $NETMASK up$IPVSADM -C$IPVSADM --set 30 5 60$IPVSADM -A -t $VIP:$PORT -s wrr -p 20for((i=0;i<`echo ${#RIP[@]}`;i++))do$IPVSADM -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1doneRETVAL=$?[ $RETVAL -eq 0 ] && action "start lvs" /bin/true || action "start lvs" /bin/falsereturn $RETVAL
}function stop_lvs(){$IFCONFIG $SUBETH $VIP netmask $NETMASK down$IPVSADM -C$IPVSADM -ZRETVAL=$?[ $RETVAL -eq 0 ] && action "stop lvs" /bin/true || action "stop lvs" /bin/falsereturn $RETVAL
}case "$1" instart)start_lvs;;
stop)stop_lvs;;
*)checkCMD;;
esacRS自动化配置脚本
#!/bin/bash
. /etc/init.d/functionsRVIP=10.0.0.56
NETMASK=255.255.255.255
RETVAL=0case "$1" in
start)interface="lo:`echo $RVIP|awk -F . '{print $4}'`"/sbin/ifconfig $interface $RVIP netmask $NETMASK updoneecho "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announceRETVAL=$?[ $RETVAL -eq 0 ]&& action "Start LVS of RearServer" /bin/true || action "Start LVS of RearServer" /bin/false;;
stop)interface="lo:`echo $RVIP|awk -F . '{print $4}'`"/sbin/ifconfig $interface $RVIP netmask $NETMASK downdoneecho "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announceRETVAL=$?[ $RETVAL -eq 0 ]&& action "Stop LVS of RearServer" /bin/true || action "Stop LVS of RearServer" /bin/false;;
*)echo "Usage: $0 {start|stop}"exit 1
esacLB上对RS的健康检查脚本
#!/bin/bashVIP=10.0.0.56
RIP=(10.0.0.5510.0.0.57
)
PORT=80while true
dofor((i=0;i<`echo ${#RIP[@]}`;i++))doCOUNT=`nmap ${RIP[$i]} -p $PORT |grep open |wc -l`if [ $COUNT -eq 1 ]thenif [ `ipvsadm -L -n|grep ${RIP[$i]}|wc -l` -ne 1 ];thenipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORTfielseif [ `ipvsadm -L -n|grep ${RIP[$i]}|wc -l` -eq 1 ];thenipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORTfifidonesleep 2
done
复制代码

1.7.4 ARP抑制技术参数说明

复制代码
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应4-7 - 保留未使用8 -不回应所有(本地地址)的arp查询arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
复制代码

1.8 LVS负载均衡-附
1.8.1 手工实现LVS负载均衡器的高可用
  高可用脑裂问题及解决方案
  (1)、导致裂脑发生的原因
    1.高可用服务器之间心跳链路故障,导致无法相互检查心跳
    2.高可用服务器上开启了防火墙,阻挡了心跳检测
    3.高可用服务器上网卡地址等信息配置不正常,导致发送心跳失败
    4.其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件BUG等
  (2)、防止裂脑一些方案
    1.加冗余线路
    2.检测到裂脑时,强行关闭心跳检测(远程关闭主节点,控制电源的电路fence)
    3.做好脑裂的监控报警
    4.报警后,备节点在接管时设置比较长的时间去接管,给运维人员足够的时间去处理(人为处理)
    5.启动磁盘锁,正在服务的一方锁住磁盘,裂脑发生时,让对方完全抢不走"共享磁盘资源"
  磁盘锁存在的问题:
    使用锁磁盘会有死锁的问题,如果占用共享磁盘的一方不主动"解锁"另一方就永远得不到共享磁盘,假如服务器节点突然死机或崩溃,就不可能执行解锁命令,备节点也就    无法接管资源和服务了,有人在HA中设计了智能锁,正在提供服务的一方只在发现心跳全部断开时才会启用磁盘锁,平时就不上

1.8.2 常见的LVS负载均衡高可用解决方案
    1.通过开发脚本解决
    2.hearbeat+lvs+ldirectord脚本配置方案(复杂、不易控制)
      heartbeat and ldirectord方案资料: 
      http://www.linuxvirtualserver.org/docs/ha/heartbeat_ldirectord.html
      http://www.linuxvirtualserver.org/docs/ha/ultramonkey.html
    3.通过Redhat提供的工具piranha来配置LVS
      The Piranha Solution :http://www.linuxvirtualserver.org/docs/ha/piranha.html 
    4.keepalived方案(推荐的当前最优方案)
      http://www.keepalived.org/
      The Keepalived Solution: http://www.linuxvirtualserver.org/docs/ha/keepalived.html 
    5.其他 ...

1.8.3 LVS分发请求RS不均衡生产环境解决
    ①persistent <会话保持造成的原因>
    ②reload重启keepalived

  其他导致负载均衡不均衡的原因可能有:
    1.LVS自身的会话保持参数设置(-p 300, persistent 300)。优化:大公司尽量用cookie替代session。
    2.LVS调度算法设置,例如:rr,wrr,wlc,lc,dh,sh算法。
    3.后端RS节点的会话保持设置参数,例如:apache的keepalive参数。
    4.访问量较少的情况,不均衡的现象更加明显。
    5.用户请求时间长短,请求资源多少。

1.8.4 LVS故障排查理论
    1.调度器上LVS调度规则及IP的正确性。
    2.RS节点上VIP绑定和抑制的检查。

  处理思路:1、对绑定的VIP进行实时监控,出问题报警或者自动处理后报警。 2、把绑定的VIP做成配置文件,例如:vim /etc/sysconfig/network-scripts/lo:0
  ARP抑制的配置思路:
    1.如果是单个VIP,那么可以用通过脚本传参arp_ignore/arp_announce设置为0;
    2.如果RS端有多个VIP绑定,此时一定不要置0,即使是停止VIP绑定,也一定不要置0.
    3.RS节点上自身提供服务的检查。
    4.辅助工具有tcpdump,ping等。

分类: 负载均衡高可用

这篇关于Linux Lvs负载均衡集群技术(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937979

相关文章

技术速递|Python in Visual Studio Code 2024年4月发布

排版:Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展 2024 年 4 月发布! 此版本包括以下公告: 改进了 Flask 和 Django 的调试配置流程Jupyter Run Dependent Cells with Pylance 的模块和导入分析Hatch 环境发现为 pipenv、pyenv 和 Poet

VBA技术资料MF152:列出工作表中所有单元格的注释

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解,从简单的入门、到入门后的提高、到数据库、到字典、到Word VBA的应用、到高级网抓及类的应用、一直讲到程序的分发。另外,为了方便大家在写代码是方便查找,“VBA语言専攻”又推出了一部V

linux C按日期动态实时建文件夹按小时建文件继scanf相关

效果: 按天建文件夹,按小时建文件 从串口读取库伦计的打印内容,过滤掉干扰字符后用scanf将关注的数字分离出来之后写入txt文件 matlab从txt文件中读入数据绘图分析 完整源码 #include <signal.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include <sys/stat.h>#inc

抖音APP运用的AI技术拆解

1.推荐系统(RS) 用户画像:根据用户的信息(如地区、性别、年龄、收藏、关注......)进行分析,构建用户画像,对用户进行分类; 行为分析:将用户的显形行为数据(如互动点赞、收藏、评论等)和隐形行为数据(如观看时长、观看次数等)结合在一起,对用户行为进行分析,判断用户的兴趣喜好; 视频推荐:基于用户和视频标签,运用推荐算法推荐下一条视频。比如,用户A和用户B相似,则将用户A(或B)喜欢

开源文档管理系统Paperless-ngx如何在Linux系统运行并发布至公网

文章目录 1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 Paperless-ngx是一个开源的文档管理系统,可以将物理文档转换成可搜索的在线档案,从而减少纸张的使用。它内置了OCR功能,可以自动对上传的扫描文档执行OCR,识别文档中的文字,

Linux网络编程(四) 同时处理一个端口的UDP与TCP连接

从bind系统调用的参数来看,一个socket只能与一个socket地址绑定,即一个socket只能用来监听一个端口。因此,服务器如果要同时监听多个端口,就必须创建多个socket,并将它们分别绑定到各个端口上。这样一来,服务器程序就需要同时管理多个监听socket,I/O复用技术就有了用武之地。 即使是同一个端口,如果服务器要同时处理该端口上的TCP和UDP请求,则也需要创建两个不同的sock

linux基础命令第二篇

雷迪斯and the乡亲们  欢迎你们来到 奇幻的编程世界 8.history命令 作用:查看和控制历史命令纪录 保存位置::~/.bash_history (1)在启动终端的时候,会自动从:~/.bash_history 中读取历史命令,加载到内存中 (2)在终端中执行命令,命令的历史纪录是保存在内存中 (3)在关闭终端的时候,会将内存中的命令自动保存到:~/.bash_h

Linux内存管理——Swap

swap space 一个磁盘区域,作为内存使用。当系统内存不足时,会将一些很久不使用的数据转移到swap space中。 优点:扩展了内存空间 缺点:用磁盘做内存,读写效率降低。 swappiness swappiness的值表示建议swap space替代内存的比例;即当swappiness为X时,当内存使用了(100%-X)之后,会使用swap space,实际的内存空间大小为

Linux下的I2C通信

I2C通信: 一.硬件初识: IIC(inter-intergrated-Circu):内部集成总线 四线通讯:SCL,SDA,GND,VCC,串行,半双工 I2C 总线是同步,串行,半双工通信总线。 I2C 总线由时钟线 SDA 和 SCL 两根信号线构成。并且都有上拉电阻。确保总线空闲状态为高电平。 I2C 总线支持多设备连接,允许多主机存在,但同一时刻只允许一台主机。 每

Linux内核源码阅读以及工具

Linux内核源码阅读以及工具     随着linux的逐步普及,现在有不少人对于Linux的安装及设置已经比较熟悉了。与Linux  的蓬勃发展相适应,想深入了解Linux的也越来越多。而要想深入了解Linux,就需要阅读和分析linux内核的源代码。   Linux的内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux目录下的东西