负载均衡集群是 load balance 集群的简写, 翻译成中文就是负载均衡集群. 常用的负载均衡开源软件有 nginx,lvs,haproxy, 商业的硬件负载均衡设备 F5,Netscale. 这里主要是学习 LVS 并对其进行了详细的总结记录.
一, 负载均衡 LVS 基本介绍
LB 集群的架构和原理很简单, 就是当用户的请求过来时, 会直接分发到 Director Server 上, 然后它把用户的请求根据设置好的调度算法, 智能均衡地分发到后端真正服务器 (real server) 上. 为了避免不同机器上用户请求得到的数据不一样, 需要用到了共享存储, 这样保证所有用户请求的数据是一样的.
LVS 是 Linux Virtual Server 的简称, 也就是 Linux 虚拟服务器. 这是一个由章文嵩博士发起的一个开源项目, 它的官方网是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分. 使用 LVS 可以达到的技术目标是: 通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群, 它具有良好的可靠性, 可扩展性和可操作性. 从而以低廉的成本实现最优的性能. LVS 是一个实现负载均衡集群的开源软件项目, LVS 架构从逻辑上可分为调度层, Server 集群层和共享存储.
二, LVS 的基本工作原理
1. 当用户向负载均衡调度器 (Director Server) 发起请求, 调度器将请求发往至内核空间
2. PREROUTING 链首先会接收到用户请求, 判断目标 IP 确定是本机 IP, 将数据包发往 INPUT 链
3. IPVS 是工作在 INPUT 链上的, 当用户请求到达 INPUT 时, IPVS 会将用户请求和自己已定义好的集群服务进行比对, 如果用户请求的就是定义的集群服务, 那么此时 IPVS 会强行修改数据包里的目标 IP 地址及端口, 并将新的数据包发往 POSTROUTING 链
4. POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器, 那么此时通过选路, 将数据包最终发送给后端的服务器
三, LVS 的组成
LVS 由 2 部分程序组成, 包括 ipvs 和 ipvsadm.
1.ipvs(ip virtual server): 一段代码工作在内核空间, 叫 ipvs, 是真正生效实现调度的代码.
2. ipvsadm: 另外一段是工作在用户空间, 叫 ipvsadm, 负责为 ipvs 内核框架编写规则, 定义谁是集群服务, 而谁是后端真实的服务器(Real Server)
四, LVS 相关术语
1. DS:Director Server. 指的是前端负载均衡器节点.
2. RS:Real Server. 后端真实的工作服务器.
3. VIP: 向外部直接面向用户请求, 作为用户请求的目标的 IP 地址.
4. DIP:Director Server IP, 主要用于和内部主机通讯的 IP 地址.
5. RIP:Real Server IP, 后端服务器的 IP 地址.
6. CIP:Client IP, 访问客户端的 IP 地址.
下边是三种工作模式的原理和特点总结.
五, LVS/NAT 原理和特点
1. 重点理解 NAT 方式的实现原理和数据包的改变.
(a). 当用户请求到达 Director Server, 此时请求的数据报文会先到内核空间的 PREROUTING 链. 此时报文的源 IP 为 CIP, 目标 IP 为 VIP
(b). PREROUTING 检查发现数据包的目标 IP 是本机, 将数据包送至 INPUT 链
(c). IPVS 比对数据包请求的服务是否为集群服务, 若是, 修改数据包的目标 IP 地址为后端服务器 IP, 然后将数据包发至 POSTROUTING 链. 此时报文的源 IP 为 CIP, 目标 IP 为 RIP
(d). POSTROUTING 链通过选路, 将数据包发送给 Real Server
(e). Real Server 比对发现目标为自己的 IP, 开始构建响应报文发回给 Director Server. 此时报文的源 IP 为 RIP, 目标 IP 为 CIP
(f). Director Server 在响应客户端前, 此时会将源 IP 地址修改为自己的 VIP 地址, 然后响应给客户端. 此时报文的源 IP 为 VIP, 目标 IP 为 CIP
2. LVS-NAT 模型的特性
RS 应该使用私有地址, RS 的网关必须指向 DIP
DIP 和 RIP 必须在同一个网段内
请求和响应报文都需要经过 Director Server, 高负载场景中, Director Server 易成为性能瓶颈
支持端口映射
RS 可以使用任意操作系统
缺陷: 对 Director Server 压力会比较大, 请求和响应都需经过 director server
六, LVS/DR 原理和特点
1. 重将请求报文的目标 Mac 地址设定为挑选出的 RS 的 Mac 地址
(a) 当用户请求到达 Director Server, 此时请求的数据报文会先到内核空间的 PREROUTING 链. 此时报文的源 IP 为 CIP, 目标 IP 为 VIP
(b) PREROUTING 检查发现数据包的目标 IP 是本机, 将数据包送至 INPUT 链
(c) IPVS 比对数据包请求的服务是否为集群服务, 若是, 将请求报文中的源 Mac 地址修改为 DIP 的 Mac 地址, 将目标 Mac 地址修改 RIP 的 Mac 地址, 然后将数据包发至 POSTROUTING 链. 此时的源 IP 和目的 IP 均未修改, 仅修改了源 Mac 地址为 DIP 的 Mac 地址, 目标 Mac 地址为 RIP 的 Mac 地址
(d) 由于 DS 和 RS 在同一个网络中, 所以是通过二层来传输. POSTROUTING 链检查目标 Mac 地址为 RIP 的 Mac 地址, 那么此时数据包将会发至 Real Server.
(e) RS 发现请求报文的 Mac 地址是自己的 Mac 地址, 就接收此报文. 处理完成之后, 将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出. 此时的源 IP 地址为 VIP, 目标 IP 为 CIP
(f) 响应报文最终送达至客户端
2. LVS-DR 模型的特性
特点 1: 保证前端路由将目标地址为 VIP 报文统统发给 Director Server, 而不是 RS
RS 可以使用私有地址; 也可以是公网地址, 如果使用公网地址, 此时可以通过互联网对 RIP 进行直接访问
RS 跟 Director Server 必须在同一个物理网络中
所有的请求报文经由 Director Server, 但响应报文必须不能进过 Director Server
不支持地址转换, 也不支持端口映射
RS 可以是大多数常见的操作系统
RS 的网关绝不允许指向 DIP(因为我们不允许他经过 director)
RS 上的 lo 接口配置 VIP 的 IP 地址
缺陷: RS 和 DS 必须在同一机房中
3. 特点 1 的解决方案:
在前端路由器做静态地址路由绑定, 将对于 VIP 的地址仅路由到 Director Server
- # VIM /usr/local/sbin/lvs_nat.sh
- # 编辑写入如下内容:
- #! /bin/bash
- # director 服务器上开启路由转发功能:
- echo1> /proc/sys.NET/ipv4/ip_forward
- # 关闭 icmp 的重定向
- echo0> /proc/sys.NET/ipv4/conf/all/send_redirects
- echo0> /proc/sys.NET/ipv4/conf/default/send_redirects
- echo0> /proc/sys.NET/ipv4/conf/eth0/send_redirects
- echo0> /proc/sys.NET/ipv4/conf/eth1/send_redirects
- # director 设置 nat 防火墙
- iptables-tnat-F
- iptables-tnat-X
- iptables-tnat-APOSTROUTING-s192.168.0.0/24-jMASQUERADE
- # director 设置 ipvsadm
- IPVSADM='/sbin/ipvsadm'
- $IPVSADM-C
- $IPVSADM-A-t172.16.254.200:80-swrr
- $IPVSADM-a-t172.16.254.200:80-r192.168.0.18:80-m-w1
- $IPVSADM-a-t172.16.254.200:80-r192.168.0.28:80-m-w1
- Real server1: (eth0 192.168.0.18 vip lo:0 192.168.0.38)
- Real server2: (eth0 192.168.0.28 vip lo:0 192.168.0.38)
- # VIM /usr/local/sbin/lvs_dr.sh
- #! /bin/bash
- echo1> /proc/sys.NET/ipv4/ip_forward
- ipv=/sbin/ipvsadm
- vip=192.168.0.38
- rs1=192.168.0.18
- rs2=192.168.0.28
- ifconfigeth0:0down
- ifconfigeth0:0$vipbroadcast$vipnetmask255.255.255.255up
- routeadd-host$vip deveth0:0
- $ipv-C
- $ipv-A-t$vip:80-swrr
- $ipv-a-t$vip:80-r$rs1:80-g-w3
- $ipv-a-t$vip:80-r$rs2:80-g-w1
- # VIM /usr/local/sbin/lvs_dr_rs.sh
- #! /bin/bash
- vip=192.168.0.38
- ifconfiglo:0$vipbroadcast$vipnetmask255.255.255.255up
- routeadd-host$viplo:0
- 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
- Keepalived1 + lvs1(Director1):192.168.0.48
- Keepalived2 + lvs2(Director2):192.168.0.58
- Real server1:192.168.0.18
- Real server2:192.168.0.28
- IP: 192.168.0.38
- # yum install epel-release -y
- # yum install nginx -y
- # VIM /usr/local/sbin/lvs_dr_rs.sh
- #! /bin/bash
- vip=192.168.0.38
- ifconfiglo:0$vipbroadcast$vipnetmask255.255.255.255up
- routeadd-host$viplo:0
- 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
- VIM/etc/keepalived/keepalived.conf
- vrrp_instanceVI_1{
- stateMASTER
- interfaceeth0
- virtual_router_id51
- priority100
- advert_int1
- authentication{
- auth_type PASS
- auth_pass1111
- }
- virtual_ipaddress{
- 192.168.0.38
- }
- }
- virtual_server192.168.0.3880{
- delay_loop6
- lb_algo rr
- lb_kind DR
- persistence_timeout0
- protocol TCP
- real_server192.168.0.1880{
- weight1
- TCP_CHECK{
- connect_timeout10
- nb_get_retry3
- delay_before_retry3
- connect_port80
- }
- }
- real_server192.168.0.2880{
- weight1
- TCP_CHECK{
- connect_timeout10
- nb_get_retry3
- delay_before_retry3
- connect_port80
- }
- }
- }
- stateMASTER->state BACKUP
- priority100->priority90
- <strong>
- 先主后从分别启动 keepalive
- </strong>
- service keepalivedstart
来源: http://www.bubuko.com/infodetail-3235933.html