一, 传统一台服务器无法满足现有的业务需求时,通常是增加新的服务器来解决。将这些服务器组合成一个整体,逻辑意义上的整体,向外提供同一种服务。也就今天要给大家介绍的集群。集群的目的实现负载均衡,也是说当一个请求来了,后台的第一台服务器提供服务,第二个请求来了之后,后台的第二台服务器提供服务。现在问题就出现,要怎么做才能让第一个请求到第一台服务器上,而第二个请求到第二台服务器上。如果我们在后台服务器的前面专门用一台服务器来接受用户的请求,由这台服务器来分配请求到后台的服务器。用来专门接受用户请求在这称之为Director(调度器),后台提供服务的服务器叫做Real Server(提供服务的真实服务器)。如下图所示:
二,上面好像解决了客户端的请求,但是当服务器响应完客户端请求时,返回给客户端用数据包是否由前端Director响应给用户,还是由RS自己响应客户端。那此时就需要定义Director工作在哪种模型下。如果工作在nat模型,则返回客户端的数据包需要由Director响应用户,如果工作在DR模型下,则返回用RS自己直接响应用户请求。
三,众所周知,Director有硬件和软件之分,而硬件的价格并不是每个公司都能够买得起,那么此时就只能退而求其次,用一台服务器,在上面安装软件,来达到负载均衡的目的。
四,既然用软件来解决这个问题,那先介绍一个lvs,lvs是一款开源软件,由国人编写的。lvs的全称为linux virtual system(linux虚拟系统)。lvs工作在一台服务器上,而这台服务器只处理用户请求,本身并不提供服务。lvs两分成两段代码:ipvs与ipvsadm,ipvs工作在内核,ipvsadm工作在用户空间用于定义服务。
五,那lvs工作在用户空间还是内核空间。答案肯定是工作在内核空间,假如lvs工作在用户空间,当客户端请求到达到Director时,数据包进入Director时先要经过prerouting链,prerouting链做出路由判断后,请求本机资源,那此时将经过input链进入本机。如果这样的话,Director没有启到应有的作用。况且Director本身也不提供服务。因此lvs必须工作在内核空间,那工作在内核空间的哪个位置,lvs在判断用户请求时,根据协议与目标端口做用户请求的资源做出判定。lvs也称4层交换,那么lvs就只能工作在Input链上,当用户请求到达到input链时,发现请求的一个集群服务,此时就会把请求送达给后面提供服务的RS。lvs基于netfilter框架来实现,因此与input链会有冲突。
六:director根据什么来分配用户请求,此时需要在director定义调度算法,调度算法分为静态与动态。静态算法只根据用户请求来决定哪台rs来响应,而动态算法根据当前rs的连接个数,来决定哪台rs响应。
fixed静态算法有四种:
1,round-robin rr:轮询的方式,固定调度算法
2,weighted round-robin: wrr:加权轮询,根据rs服务器的权值来分配请求
3,destination hashing dh:目标地址哈希 当director后面直接连接的是缓存服务器时,客户端第一次访问的是哪个缓存服务器,则下次directo还是会分配访问之前那台缓存服务器来响应,提高缓存命中率。
4,source hashing sh:源地址哈希
dynamic动态算法有六种:
1,LC:least contect 最少负载
计算负载:overhead(负载)=active*256+inactive(活动的连接数(正在处理的请求)*256+非活动的连接(处理空闲状态))
2,wlc:加权lc:上面的值除以权重值,得到值越小,则director会将请求给谁。
3,sed(shortest expected delay)最少期望延迟,不考虑非活动连接。
overhead=(active+1)*256/weight(+1为了避免权重值较小的服务器获得连接)得到值越小,则越优先获得请求
4,nq:(never queue永不排队):不考虑非活动的连接,如果某个rs空闲,则不管权重值的大小,都会将请求分配给rs。
5,LBLC:基于本地的最少连接,与静态的dh实现效果一样。
6,LBLCR:对lblc的改进,带复制的基于本地的最少连接,缓存服务器可以相互交换缓存,使用cdp协议来交换,当客户端第一次访问第一台缓存服务器,如果下次访问是第二台缓存服务器,则第二台缓存服务器去会第一缓存服务器复制缓存到本机。但是需要支持cpd协议的操作系统才有能实现。
六,下面介绍Director工作在nat模型实现步骤
实上环境:redhat 5.8,三台虚拟机,两台rs提供web服务,客户机物理机。
nat模型
由于数据包进出都经过director,当director将请求转发到rs上时,需要做地址转换,因此rs的网关需要指向director内网网卡。director的eth1与rs通信用虚拟网卡vmnet2。
1,先对director做好配置,查看本机的内核是否支持ipvs
-
[root@server30 ~]# grep -i ipvs /boot/config-2.6.18-308.el5
-
# IPVS transport protocol load balancing support
-
# IPVS scheduler
-
# IPVS application helper
如果出现ipvs,那表示内核已经将ipvs编译进内核,如果没有需要重新编译内核。安装ipvsadm: yum -y install ipvsadm
2,对director提供两块网卡,并配置如上图的IP,其中eth0的IP与客户端的IP在同一网段,并将director的转发功能打开,执行
[root@server30 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
3,添加集群服务:
-
[root@server30 ~]# ipvsadm -A -t 192.168.0.32:80 -s rr 定义集群服务
-
[root@server30 ~]#ipvsadm -a -t 172.16.100.1:80 -r 192.168.200.2 -m
-
[root@server30 ~]#ipvsadm -a -t 172.16.100.1:80 -r 192.168.200.3 -m
提供服务的rs,-t表示tcp,-m表示nat模型。
4,对两台rs安装好http,yum -y install httpd。并启动服务service httpd start,并提供测试页,为了验证效果给rs1提供的主页中包含rs1,给rs2提供的主页为rs2。
5,给两台rs分别设置ip与默认网关,给rs1设置地址如下
ifconfig eth0 192.168.200.2
route add default gw 192.168.200.1
给rs2设置只需要将192.168.200.2修改成192.168.200.3
6,需要保证rs1,rs2与director能够相互ping通。
7,在客户机的浏览器中输入192.168.0.32,并刷新查看每次显示的出的内容就可以知道,有没有启动负载均衡的效果。
8,由于NAT模型中,出去的数据包也要经过director,因此会造成director成为整个集群的瓶颈。在这种模型下,director最多也就只能负载10台服务器。
七,dr模型
在dr模型中,由于director只接收客户端的请求,此时对director是一种极大的解脱,那么此种情况下,director能够负载多达上百台服务器。
在dr 模型中只有进来的用数据包经过dr,出去的数据由rs自己响应用户的请求,由于用户请求的是vip(eth0),如果rs只有一个rip(eth1)的话,用户根本就不会接收来自rip返回的资源。那么此时就需要解决一个问题rs上也需要一个vip,那么当rs响应用户请求时,用vip去响应用户请求就OK。此时会有疑问,既然rs也有vip,那数据包进来的时,怎么才能让director的vip网卡来响应,并由他决定分配哪台rs来响应用户的请求。当用户的请求到达路由器时,路由器会发送一个arp广播包的方式来响查找vip,由于rs也有vip,因此rs也能够响应用户的请求。如果这样那director并没启到应有的作用。如果不让rs响应路由器arp广播包,那么当用户的请求到达director时,directory发现用户的请求是一个集群服务,那此时就需要将用户的请求转发到rs的rip,此过程修改dircetor中vip的mac为rs的rip mac。为不让rs的vip来不响应前端路由。就将vip配置在rs的lo网卡上,并配置两个内核参数,只要apr包请求vip在哪,由于arp包只能经过rip,linux默认情况下会如果有请求通过rip来获取vip,rip会响应,但是启用两个内核参数之后 ,则rip不予于响应,只有对rip自身的请求,rip才响应。因此当用户请求到达前面路由时,路由器会发送arp包广播包,rs能收到,但是并不响应,只有director响应,此时director发现用户请求的是集群服务,那此时就将请求转发到其中的一台rs上,现在的问题是director怎么把请求转发到其中一台rs上,在请求包中,肯定会封装源mac,目标mac(vip),由于director与rs在同一局域网此时是通信只需通过mac通信就ok,那么此时director会将目标mac修改成rs的rmac,再将请求包发送给交换机,那么此时交换发现目标mac是rs的mac,此时就rs就接收请求。当然有人肯定会问,director怎么知道rs的mac,在director中已经定义好rs服务器的ip,那director只要将发送arp广播包,询问rip的mac是多少。当rs接收请求之后发现源ip为cip,目标ip为vip,那么此时会将请求转送到lo上vip。并将响应包通过网关发送出去。在目前的系统上,由于请求是哪个网卡进来那么就从哪块网卡出去。那么就会重新封装数据包,源ip为rip,目标ip为cip,注意是响应包。但是cip请求的vip,因此cip会拒收。此时我们要怎么样才能让源ip为vip。rs接收请求包,发现是请求lo,那么此时交给lo,因此我们可以强制设置一条规则只要是请求lo的,就由lo做为源地址响应。这条规则就是路由。
内核中两个参数:
(1)arp_announce : 对网络接口上本地IP地址发出的ARP回应作出相应级别的限制
arp_announce 默认等0,不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
arp_announce=1尽量避免不在该网络接口子网段的本地地址
arp_anounce=2对查询目标使用最适当的本地地址
(2)arp_ignore :定义对目标地址为本地IP的ARP询问不同的应答模式
arp_ignore默认等于0,回应任何网络接口上对任何本地IP地址的arp查询请求
arp_ignore=1 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
根据上图的配置,三台服务器都只需要一块网卡,并且在同一个物理网络中,在director中,vip配置在eth0:0上,在rs上,vip配置你lo:0上。既然在同一物理网络中,那么他们之间是以桥连的方式来通信。
1,对director做好配置:清空之前的配置
-
ipvsadm -C
-
ifconfig eth0:0 192.168.0.241 broadcast 192.168.0.241 up
-
route add -host 172.16.100.1 dev eth0:0
-
echo 1 > /proc/sys/net/ipv4/conf/forward
-
ipvsadm -A -t 192.168.0.241:80 -s rr
-
ipvsadm -A -t 192.168.0.241:80 -r 192.168.0.242 -g (-g可以省略,因为默认就dr)
-
ipvsadm -A -t 192.168.0.241:80 -r 192.168.0.242 -g
2,对rs1,rs2做配置,下面是对rs1的配置
-
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
-
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
-
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
-
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
-
ifconfig eth0 192.168.0.242
-
ifconfig lo:0 172.16.100.1(vip) broadcast 172.16.100.1 netmask 255.255.255.255 up
-
route add -host 172.16.100.1 dev lo:0
3,此时可以在IE浏览器中输入192.168.0.241测试,,如果第一次网页出现RS1,并刷新一次页面,第二次出现的是RS2,则负载均衡的效果达到了。
八,下面介绍lvs的持久连接,持久连接类型:
(1)pcc持久客户端连接:只要是同一个用户发起的请求,不管请求的哪个端口,都会被永久的定义第一次被访问到的real server
(2)ppc持久端口连接:根据用户请求的端口来判定,从而定向到不同服务器。
(3)pnp持久防火墙标记:实际是iptables的mangle功能,它能实现将通过本机的数据包,打上一个独特的标记。标记通常使用0-99之间的数字
(4) ftp的持久连接:定义一个范围的端口,ftp工作在被动模式下,给他定义一段范围的端口。
九, 在lvs中实现http与https服务。
要实现https协议,需要安装在两台rs上安装ssl_mod,三台虚拟以桥接的方式通信。
(1)director做为CA服务器
-
vim /etc/pki/tls/openssl.cnf 编辑其中一行dir = /etc/pki/CA
-
cd /etc/pki/CA
-
mkdir crl certs newcerts
-
echo 01 > serial
-
touch index.txt
-
(umask 077; openssl genrsa 1024 > private/cakey.pem)
-
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
-
Country Name (2 letter code) [GB]:cn
-
State or Province Name (full name) [Berkshire]:ha
-
Locality Name (eg, city) [Newbury]:zz
-
Organization Name (eg, company) [My Company Ltd]:magedu
-
Organizational Unit Name (eg, section) []:tech
-
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
-
Email Address []:
(2)在director 定义好集群服务
-
iptables -t mangle -A PREROUTING -d 192.168.0.241 -p tcp --dport 80 -j MARK --set-mark 6
-
iptables -t mangle -A PREROUTING -d 192.168.0.241 -p tcp --dport 443 -j MARK --set-mark 6
-
ipvsadm -A -f 6 -s rr -p 1800(定义持久连接为1800秒)
-
ipvsadm -a -f 6 -r 192.168.0.242 -g
-
ipvsadm -a -f 6 -r 192.168.0.243 -g
(2)在rs1申请证书请求,并与rs2共用
-
mkdir /etc/httpd/ssl
-
cd /etc/httpd/ssl
-
(umask 077;openssl genrsa 1024 > httpd.key)
-
[root@rs1 ssl]# openssl req -new -key httpd.key -out httpd.csr
-
Country Name (2 letter code) [GB]:cn
-
State or Province Name (full name) [Berkshire]:ha
-
Locality Name (eg, city) [Newbury]:zz
-
Organization Name (eg, company) [My Company Ltd]:magedu
-
Organizational Unit Name (eg, section) []:tech
-
Common Name (eg, your name or your server's hostname) []:www.magedu.com
-
Email Address []:
-
Please enter the following 'extra' attributes
-
to be sent with your certificate request
-
A challenge password []:
-
An optional company name []:
-
将证书传送到director上,进行签发
-
scp httpd.csr 192.168.0.32:/tmp
(3)在director上签发证书:
-
cd /tmp
-
openssl ca -in httpd.csr -out httpd.crt -days 3655
-
scp httpd.crt 192.168.0.242:/etc/httpd/ssl 传送回rs1
(4)此时签署完了,如果rpm包安装httpd,则需要要yum -y install mod_ssl,在两台rs都要执行。
(5)在rs1上,编辑vim /etc/httpd/conf.d/ssl.conf,修改下面两行。并重启httpd
SSLCertificateFile "/etc/httpd/ssl/httpd.crt"
SSLCertificateKeyFile "/etc/httpd/ssl/httpd.key"
(6)将rs1上配置好的传送到rs2
scp -rp /etc/httpd/ssl/ 192.168.0.243:/etc/httpd
scp /etc/httpd/conf.d/ssl.conf 192.168.0.243:/etc/httpd/conf.d/
(7)配置win 下hosts文件添加一行:
192.168.0.241 www.magedu.com
(8)在浏览器中输入192.168.0.241与https://www.magedu.com测试,测试的结果是如果第一次网页显示是rs1,则输入https://www.magedu.com的也是rs1。这样才达到效果。