LB负载均衡的目的是为了提升访问的并发性和服务器的性能。实现 LB 的方式主要有软件方式和硬件方式。软件方式实现的软件有LVS工做于传输层、nginx工做于应用层haproxy工做于传输层和应用层硬件方式实现的软件有 BIG-IPF5,A10A10等。这里主要介绍软件方式实现 LB。php
lvsLinux Virtual Server,Linux虚拟服务是工做在第四层的一款软件。是工做在内核的netfilter模块上的相似于iptables的工做模型。它是一个前端调度器Director,由它来具体实现负载均衡。它的工做原理以下图html
几个概念说明前端
cip请求客户端的 ip 地址。mysql
vip是lvs调度器的 ip 地址一般也是客户端请求服务的的目标 ip 地址。nginx
dip: 是directory和后端 real serveer 之间通讯使用的 ip 地址。web
rip: 是提供真正服务的real server的 IP 地址。算法
Director是lvs的前端调度器是ipvs的核心组件。sql
Real Server: 是后端真正提供服务的服务器。数据库
lvs在内核中是由ipvs实现具体的数据包转发包括软发到后端那个real server、响应报文如何工做在netfilter的INPUT链上在此处决定是否进行数据包的转发。可使用ipvsadm工具配置 ipvs 规则。apache
调度算法是在Directory转发集群数包的时候使用的具体算法目的是为了选择哪一个后端Real Server服务器。ipvs代码必须提供的调度方法。
如何查看本身的内核是否支持ipvs功能以及支持的算法
常见的算法有以下
RR: round robin、WRR: weighted 轮询 、加权轮询实现了起点公平。新的链接请求被轮流分配至各RealServer算法的优势是其简洁性它无需记录当前全部链接的状态因此它是一种无状态调度。轮叫调度算法假设全部服务器处理性能均相同无论服务器的当前链接数和响应速度。该算法相对简单不适用于服务器组中处理性能不一的状况并且当请求服务时间变化比较大时轮叫调度算法容易致使服务器间的负载不平衡
SHSource Hash 源地址hash,目的是session保持。意义来源于同一源地址的CIP请求会被定向到同一RS。它根据请求的源IP地址做为散列键Hash Key从静态分配的散列表找出对应的服务器若该服务器是可用的且未超载将请求发送到该服务器不然返回空。它采用的散列函数与目标地址散列调度算法的相同。除了将请求的目标IP地址换成请求的源IP地址外它的算法流程与目标地址散列调度算法的基本类似。在实际应用中源地址散列调度和目标地址散列调度能够结合使用在防火墙集群中它们能够保证整个系统的惟一出入口。
DH: Destination Hash 目标地址Hash。是针对目标IP地址的负载均衡但它是一种静态映射算法经过一个散列Hash函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址做为散列键Hash Key从静态分配的散列表找出对应的服务器若该服务器是可用的且未超载将请求发送到该服务器不然返回空。
LC: Least Connection 最少链接 如何监控通常状况是根据tcp协议的计数等相关信息判断
Overhead = Active * 256 + Inactive 表示负载状况越小说明负载越小,会优先选择
WLC: weigthed
Overhead = (Active * 256 + Inactive)/weight 默认机制
SED: shortest expection dalay 最短时间望链接
Overhead = (Actived + 1)/weight目的是为了让权重大的优先匹配。问题权重小的可能一直空的。
NQ: Never Quene 工做机制是先每个 Real Server 都请求一次。
LBLC: locality-based Least connection
LBLCR: Replicated LBLC,带复制的LBLC
工做模型能够这么理解就是 LB 的Real Server接收到报文到底以哪一种方式响应给客户端。lvs原生态支持的类型有NAT网络地址转换、DR直接路由、TUN隧道。
nat特色
一、RS使用私有地址网关为DIP
二、请求和响应都要通过direstor高负载时可能出现单点故障
三、支持端口映射PNAT意思是director 和 real sever 的服务端口能够不在同一端口。
四、RS可使用任何操做系统
DR特色
一、要保证前端路由将目标地址为VIP的报文通通发往Direstory,而不是RS
1) 静态地址绑定在前端路由器上配置一条静态ARP地址解析将vip地址和DIP的MAC地址绑定。
2arptables 在realserver主机上设置arp解析规则只要收到vip地址的arp解析就不进行解析
3)修改RS的内核参数修改内核参数arp_ignore arp_announce实现比解析vip的mac地址
此时还要在 Real Server 添加一条静态路由来实现响应报文的源地址是vip
二、RS可使用私有地址也可使用公网地址
三、RS跟Directory必须在同一物理网络中。
四、请求报文通过Directory,但响应报文必须不通过Directory.
五、不支持端口映射
六、RS可使常见的OS支持arptables
七、RS的网关不会指向DIP
TUN特色IP隧道 将IP首部经过IP首部隧道传送
一、rip,vip,dip所有是公网地址
二、rs的网关不会指向DIP
三、不支持端口映射
四、请求报文通过Directory,但响应报文必须不通过Directory。
五、各个real server 必须支持隧道
补充随着互联网的出现了lvs的第四种模型。
FullNat模型是基于NAT模型的扩展可实现局域网内能够有子网的状况。实现方式同时修改请求报文的源地址和目标地址。
NAT的优势1)能够隐藏内部rip地址安全2)配置简单
ipvsadm是配置ipvs规则的工具和iptables相似。
经常使用的用法
# 一、添加集群 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] \ [--pe persistence_engine] -A 添加集群 -E 修改集群 -t tcp 协议 -u udpx协议 -f 防火墙标记 service-address:指的是vip的地址 -s 指明调度算法默认是wlc # 二、删除一个集群服务 ipvsadm -D -t|u|f service-address # 三、清空全部的规则 ipvsadm -C # 四、导入ipvs规则至关于ipvsadm-restore ipvsadm -R # 五、保存ipvs规则等价于 ipvsadm-save ipvsadm -S [-n] #六、将real server 加入到定义好的集群服务中去 ipvsadm -a|e -t|u|f service-address -r server-address [options] -a -e 添加、修改real server到指定的集群中 -r 指定 real server 的IP地址 # 七、删除集群中的指定的real sever ipvsadm -d -t|u|f service-address -r server-address # 八、查看配置好的 ipvs 规则常与 -n 一块儿使用 ipvsadm -L|l [options]
常与的option的有
--gatewaying -g DR模型也是默认的lvs类型gatewaying --ipip -i TUN模型 ipip encapsulation (tunneling) --masquerading -mNAT模型 masquerading (NAT) -w 指明权重
借助netfilter的mangle将做为集群服务的请求报文打标记在PREROUTING链上完成。这样作的目的后者说是好处是只要是防火墙标记相同的就能够认为同一集群服务。例如在访问web服务时有用http协议的也有用https协议的此时就须要在director处定义2个集群服务这样能够实现功能。可是管理起来不方便防火墙标记就能够解决这样的困扰。
具体作法(例如将http 和 https 服务定义成统一的集群服务)
1)iptables -t mangle -A PREROUTING -d {vip} -p tcp -m mulitport --dports 80 -j MARK --set-mark 10
2)基于mark定义集群服务
ipvsadm -A -f 10 -s rr
ipvsadm -a -f 10 -r {rip} -g -w 1
常见的持久链接类型
PCC:持久客户端链接
在基于tcp或udp定义集群服务时其端口为0。表示未来自客户端的全部请求都转发到后端的RS。基于客户端持久链接时来自同一个client的全部请求都被转发到同一RS.
示例ipvsadm -A -t vip:0 -p 60 -p指定持久链接的时间
PPC:持久端口链接
仅针对某一特定的服务启用的持久服务。单服务调度各个集群分开调度。
示例ipvsadm -A -t vip:80 -s rr -p 60
PFM:持久防火墙标记
持久防火墙标记单服务调度。能够经过防火墙标记来定义一个集群的多个端口。
示例ipvsadm -A -f 10 -p 60
实验原理以下实验实现的目标是实现经过访问Director实现Discuz的访问。真正实现的discuz服务地后端的Real Sever从而实现负载均衡的效果。此时就必需要有单独的文件服务器和数据库服务器分别来存储像图片等的非结构数据和像帐号、密码等的结构化数据。
环境
操做系统CentOS 6.5 安装在VMware虚拟机上
配置步骤
在172.16.10.16
1、配置NFS服务器 # 一、安装客户端软件 yum install -y nfs-utils # 二、提供共享目录 mkdir /data setfacl -m u:48:rwx /data -R (id为48的用户是rpm方式安装httpd时的apache用户) # vim /etc/exports /data/ 172.16.0.0/24(rw) # 三、启动服务 /etc/init.d/nfs start # 之后使用 exports -ar 2、安装mysql #一、安装mysql软件这里使用rpm安装 yum install mysql mysql-sever -y # 二、初始化数据库这里再也不详细说明 # 三、受权用户 mysql> CREATE DATABASE discuz; mysql> GRANT ALL ON discuz.* TO discuz@'172.16.%.%' IDENTIFIED BY '123456';
在172.16.10.22
1、配置ip地址和网关信息 # 临时配置 ifconfig eth0 172.16.10.22/16 up route add default gw 172.16.10.9 # 也可以使用永久配置以下
2、部署discuz服务 # 一、安装软件 yum install httpd php php-mysql # 二、挂载NFS服务 mount -t nfs 172.16.10.16:/data /var/www/html # 解压 discuz 源代码将解压后的upload目录复制到此目录 cp upload /var/www/html -r # 修改属主属组 chown apache.apache /var/www/html/upload -R # 三、安装discuz # 不在详述安装时须要注意编码问题和数据库链接时的问题。其余可根据提示解决。
在172.16.10.33
在172.16.10.33可参照172.16.10.22步骤可完成。
在Director 上172.16.10.9 192.168.1.66
# 配置ipvs规则 ipvsadm -A -t 192.168.1.66:80 -s rr ipvsadm -a -t 192.168.1.66:80 -r 172.16.10.22:80 -m -w 1 ipvsadm -a -t 192.168.1.66:80 -r 172.16.10.33:80 -m -w 1
注意real sever和director的172.16.10.9属于同一局域网中在VMware中可使用以下方式配置
配置完成验证结果
实验原理图以下实现的目标是web服务。
解释
arp_announce:如何通告本地地址
0表示有arp请求时会通告本机全部网卡的mac地址。 默认
2 表示仅经过网络直连的接口的地址
arp_ignore:表示如何响应接收到的arp请求
0 表示请求的地址能够经过其余网卡响应 默认。
1 表示仅在请求的地址必须在请求报文接口进行响应
在172.16.10.33中
ifconfig eth0 172.16.10.22/16 up # 这个也能够写到配置文件 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 172.16.10.20 netmask 255.255.255.255 broadcast 172.16.10.20 route add -host 172.16.10.20 dev lo:0
在172.16.10.22中
此配置可参照172.16.10.33配置配置基本相同
在Director172.16.10.9 172.16.10.20中
ipvsadm -A -t 172.16.10.20:80 -s rr ipvsadm -a -t 172.16.10.20:80 -r 172.16.10.22:80 -g -w 1 ipvsadm -a -t 172.16.10.20:80 -r 172.16.10.33:80 -g -w 1
实验结果
实验拓扑图以下,实验实现的目的是:使用防火墙标记实现将80和443端口实现持久链接。
在192.168.1.201上
一、提供IP地址和网关
二、安装软件
httpd软件和mod_ssl软件
三、提供测试页面和ssl证书
编辑/etc/httpd/conf.d/ssl.conf
四、启动服务便可
在192.168.1.202上
在192.168.1.202上的配置于192.168.1.201相似ip地址和测试页面不一样。
在192.168.1.50172.16.0.50上
iptables -t mangle -A PREROUTING -d 172.16.0.50 -p tcp -m multiport \ --dports 80,443 -j MARK --set-mark 10 ipvsadm -A -j 10 -s rr ipvsadm -a -f 10 -r 192.168.1.201 -m ipvsadm -a -f 10 -r 192.168.1.202 -m
补充说明
如何得到证书能够参照http://guoting.blog.51cto.com/8886857/1535032。这里说明一点的是RealServer1和RealServer2使用相同的证书。
结果说明
此时只须要修改ipvs的规则以下
ipvsadm -A -f 10 -s rr -p 60 ipvsadm -a -f 10 -r 192.168.1.201 -m -w 1 ipvsadm -a -f 10 -r 192.168.1.202 -m -w 1
此时在访问到一个RealServer时会话会保持一段时间结果以下
至此全部配置完成。