一.集群(cluster)以及类型;
当后端服务器承受不住访问的压力,提高服务器性能的解决方案会极大增加成本时,人们提出了横向扩展的解决方案。增加一台或几台服务器,提供相同的服务,通过前段分发器将访问量均匀的分配到后台服务器上。这种多台服务器组成的数组集合就叫做集群。
集群类型:
LB(load balancing):负载均衡集群,扩展容量,实现伸缩性;开源方案:lvs,haproxy,nginx,ats
HA(HighAvailability)高可用,服务可用性集群;
开源方案:heartbeat,corosync+pacemaker,cman+pacemaker,cman+rgmanger,keepalived,u1tramonkey
HP(high performace):高性能,并发处理集群;开源方案:hadoop
二. 解决负载均衡集群方案
1.硬件配置
1.软件:lvs (linux virtual server)相当于组件,由两部分组成,ipvs工作在内核当中,相当于netfilter,iptables而LVS正好工作在iptables的input链上,ipvs框架需要依赖规则完成转发,ipvsadm外部命令编写规则交予ipvs进行处理。
三.lvs简单说明
lvs集群使用三层架构:
第一层负载均衡层:由一台或者多台负载均衡器组成,将用户请求分发给服务器群组层的服务器;
第二层服务器群组层:由一组实际运行的应用服务组成
第三层共享存储层:为服务提供共享存储空间和内容一致性的存储区域,一般由磁盘阵列组成。
四.lvs负载均衡的四种工作模型
NAT模式:
1.当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
3.IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
4. POSTROUTING链通过选路,将数据包发送给Real Server
5. Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
6.Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目IP为CIP
特点:
1.RS的应该使用私有地址
2.RS的网关必须指向DIP
3.RIP和DIP必须在同一网段内
4.请求和响应的报文都得经过Director,在高负载场景中,Director很可能成为性能凭借
5.支持端口映射
6.RS可以使用任意支持集群服务的OSDR模式:
1.首先,客户端CIP的请求发送给LVS调度器的VIP;
2.LVS调度器收到客户端的请求包后,将数据包的MAC地址改成LVS调度器选择的某一台RS的MAC地址,并通过交换机发送给RS服务器;
3.RS收到发送来的数据报文请求后,会从链路层往上传给IP层,此时IP层需要验证请求的目标IP地址。因为包的目标IP(即VIP)并不是RS的本地IP,而仅仅MAC地址是RS的。所以,在RS上需要配置一个VIP的loopbackdevice,是因为loopback device是服务器本地使用的网络接口,对外是不可见的,不会跟LVS的ip冲突。
4.RS处理数据包完成后,将应答直接返回给客户端。回复数据报不在经过调度器。因此,如果对外提供LVS负载均衡服务,则RS需要连上互联网才能将应答包返回给客户端。不过,RS最好为带公网IP的服务器,这样可以不经过网关直接回应客户,如果多个RS使用了同一网关出口,网关会成为LVS架构的瓶颈,会大大降低LVS的性能。
特点:
1.RS可以使用私有地址,还可以使用公网地址,此时可以直接通过互联网连入RS,以实现配置、监控等
2.RS的网关一定不能指向DIP
3.RS跟Dirctory要在同一物理网络内(不能有路由器分隔)
4.请求报文经过Directory,但响应报文一定不经过Director
5.不支持端口映射
6.RS可以使用大多数的操作系统
TUN模式:
客户端访问服务器,数据包的源地址cip,目标地址vip,发送给调度器。调度器创建虚拟的网络通道,在数据包上面在封装一层
而称为新的数据包,不改动之前地址,封装过后数据包源地址dip,目标地址rip,直接发送到后端服务器。后端服务器接受数据
包,目标地址符合,开始构建响应报文将响应数据通过虚拟通道直接返回给客户端;
特点:
(1)RIP,DIP可以使用私有地址;
(2)RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP;
(3)支持端口映射;
(4)RS的OS可以使用任意类型;
(5)请求报文经由Director,响应报文也经由Director;
fullant模型:
客户端到集群的响应报文源地址cip,目标地址vip,经过调度器将请求报文地址转变,源地址dip,目标地址rip,请求报文送达后
端服务器构建响应报文,响应报文送达调度器前源地址rrip,目标地址dip,调度器接受报文后将地址转化源地址vip,目标地址cip,将
送达数据到达客户端。在期间数据包地址经过两次转化。
特点:
1.RIP,DIP,VIP都得是公网地址
2.RS的网关不会指向也不可能指向DIP
3.请求报文经过Directory,但响应报文一定不经过Director
4.不支持端口映射
四. lvs的集群服务:
ipvsadm 用户界面的工作命令
-A #添加一个集群服务
-t : tcp协议
-u : udp
-f: firewall make 通常应用于将两个或以上的服务绑定为一个服务进行处理时使用
service-address #服务器添加地址
-t ip:port
-u ip:port
-s 调度算法,默认为w1c
LVS的调度方法:10种
静态方法:仅根据算法本身进行调度
rr:Round Robin 轮询
wrr:Weighted RR 权重轮询
sh:source hashing 源地址hash
dh:destination hashing 目标地址hash
动态方法:根据算法及RS当前的复制状态
lc:Least Connection 最少连接
计算当前的负载Overhead=Active*256+Inactive来实现
wlc:Weighted LC
Overhead=(Active*256+Inactive)/weigh
sed:Shortest Expect Delay 最短期望延迟
Overhead=(Active+1)*256/weight
aq:Nerver Queus: 永不排队
lblc:Locality-based least connection 基于本地的最少连接相当于dh+lc
Lblcr:基于复制的基于本地的最少连接 Replicated and Locality-based least connection-p : timeout persistent connection 持久链接
-E 修改定义过的集群服务
-D -t|u|f service-address 删除指定的集群服务
RS相关:
-a:向指定的CS中添加RS
-t|-u|-f service-address:指明将RS添加至那个Cluster Service 中
-r:指定RS,可以包含{IP[:port]},只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口
lvs类型:
-g:Gateway,DR
-i:ipip,TUN
-m:masquerade(地址伪装),NAT
默认为DR
指定RS权限 -w
上限下限: -x:下限 -y:上限
-e:修改指定的RS属性保存规则(使用输出重定向):
ipvsadm-save
ipvaadm -S
载入指定的规则:(使用输入重定向)
ipvsadmin-restore
ipvasdm -R
查看ipvs规则等
-L [options]
-n 使用数字格式显示IP地址,不反解
-c:查看连接数相关信息
--stats:显示统计数据
--rate:数据传输速率
--timeout:显示tcp会话时长
--daemon:守护进程的信息
--sort:对虚拟服务进行排序,默认为升序
--exact:精确显示,不做单位换算
-Z:计数器清零五.LVS的DR模式实现负载均衡
实验环境;redhat6.5系统,调度器ip192.168.88.152 后端服务器192.168.88.153和192.168.88.154
调度器配置:
1.配置6.5系统yum源需要配置,否则ipvsadm不能进行安装
2.安装ipvsamd
3.调度器添加虚拟ip192.168.88.200/24
4.定义集群,给集群设置轮询节点;
5.保存策略,重新启动ipvsadm 服务
后端服务器配置;
1. 192.168.88.153配置如下:
添加虚拟ip192.168.88.200/24
安装http服务,编辑默认网页
2.后端服务器192.168.88.154配置如下;
客户端测试结果:起初一直出现server3服务器,然后一致刷新等过了一段时间变成server2服务器,然后再长时间不变化;
问题原因是arp -an | grep 100 绑定的虚拟ip和server不在一起
后端服务器添加arptables策略
调度器配置不变化;
1.后端服务器server2添加arptables策略,安装arptables,添加调度器识别规则
2.后端服务器配置如上,安装arptables,添加调度器识别规则
以上调度器只能进行轮询,不能检测后端服务器的状况,需要安装Idirectord,自动创建集群添加节点,目的检查后端服务器健康
调度服务器配置:
1.安装ldirectord-3.95-3.1.x86_64.rpm软件
2.修改配置文件
3.清空ipvsadm 策略,启动ldirectord服务
4.后端服务器关闭http服务,调度器配置
物理主机访问:
六.LVS的NAT模式实现负载均衡
1.server1调度器主机配置
导入modprobe iptble-nat 模块
调度器添加虚拟ip和物理机ip在同一vlan
添加策略
打开调度器的路由转化功能,设定调度器的网关为添加的虚拟ip;
2, 后端服务器server2和server3配置
将调度器的虚拟ip设定为网关
3.test虚拟机测试,test虚拟机的ip和调度器虚拟ip在同一vlan,启动http服务;
七.LVS的TUN模型实现负载均衡
调度器setver1配置:
1.调度器server1导入modprobe ipip 模块,添加tunl0的隧道
2.添加虚拟ip,激活tunl0隧道,设定ipvsadm 规则
3.路由添加虚拟ip
后端服务器server2和server3配置:
1.导入模块,添加vip到tunl0隧道,激活tunl0隧道,
2.路由添加vip.关闭tunl0.rp_filter
#tunl0关闭rp_filter功能
3.设定arptables策略;
test虚拟机测试:curl 192.168.88.200
1.server1主机停止ldirectord服务
2.server1 调度器安装keepalived
在解压目录下·进行编译
出现如下报错是缺少libnl和libnl-devel,安装这两个软件包,再次进行编译;
出现如下报错缺少libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm,http://rpm.pbone.net/index.php3下载安装包,再次进行编译安装ok;
制作启动软连接
配置目录增加执行权限
安装mailx.程序动态以邮件的方式显示,在/var/log/messages
yum install -y mailx
3.配置keepalived服务
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #keepalive发生切换时将发送邮箱通知
}
notification_email_from keepalived@localhost #指定发件人
smtp_server 127.0.0.1 #smtp服务地址
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict #注销
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #指定服务器为主设备,backup为辅助设备
interface eth1
virtual_router_id 51
priority 100 #指定优先级,1-254数字越大优先级越高;
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.88.200 #设置vip
}
}
virtual_server 192.168.88.200 80 {
delay_loop 3 #健康检查时间间隔
lb_algo rr #lvs的调度算法
lb_kind DR #lvs的DR模式
# persistence_timeout 50 #保持会话时间
protocol TCP #使用tcp协议
real_server 192.168.88.153 80 { #设置后端服务设备
weight 1 #权重默认为1,0为失效
TCP_CHECK {
connect_timeout 3 #链接时间
retry 3 #重连次数
delay_before_retry 3 #重新链接间隔时间
}
}
real_server 192.168.88.154 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
将server1主机安装好的文件发送给server4主机
修改server4主机的配置文件
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #keepalive发生切换时将发送邮箱通知
}
notification_email_from keepalived@localhost #指定发件人
smtp_server 127.0.0.1 #smtp服务地址
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict #注销
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #指定服务器为主设备,backup为辅助设备
interface eth1
virtual_router_id 51
priority 50 #指定优先级,1-254数字越大优先级越高;
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.88.200 #设置vip
}
}
virtual_server 192.168.88.200 80 {
delay_loop 3 #健康检查时间间隔
lb_algo rr #lvs的调度算法
lb_kind DR #lvs的DR模式
# persistence_timeout 50 #保持会话时间
protocol TCP #使用tcp协议
real_server 192.168.88.153 80 { #设置后端服务设备
weight 1 #权重默认为1,0为失效
TCP_CHECK {
connect_timeout 3 #链接时间
retry 3 #重连次数
delay_before_retry 3 #重新链接间隔时间
}
}
real_server 192.168.88.154 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
4.server2和server3后端服务器配置相同
设置虚拟ip
添加arptables规则;
设置http默认网页
客户端测试:
server1做主机显示server1的网卡mac地址
5.实现高可用和健康体检;
配置还有点小问题我在检查检查