一、Linux集群
Linux集群系统保护集群管理器和集群节点两部分组成。集群节点简称为节点、服务器或服务器节点,是用来提供资源,进行集群的实际工作。一般来说,它必须进行配置后才能称为集群的一部分,同时也要运行集群用到的应用程序。Linux集群管理器再将各节点捆绑在一起,它用于将任务分解到所有的节点。简单的说,就是按照某种方式把服务器连起来来完成一种特定的任务,提高服务器的响应能力。 scale up 在单台主机上提高服务器性能, scale out 增加服务器的数量来提高,负载均衡的集群。
二、Linux集群类型
集群类型有三种:
1、 LB(Load Balancing) 负载均衡 前端有个调度器(Director)负责接收客户端的请求分发服务到后端的realserver上(或者dispatcher, balancer 都是调度器)
2、 HA(Hight Availability) 高可用集群(7x24 99.999% ;时时在线的提供服务,只有一个在线服务,另外的做备份)
3、 HP(hight Performance) 高性能集群,把任务分片发给集群服务器,然后把结果收集,计算速度非常快
三、负载均衡-lvs
4层负载均衡器----Linux Virtual Server ,工作在传输层,因此又被称为四层路由或四层交换
3.1、lvs工作方式: ipvsadm / ipvs
ipvsadm:用户空间的命令行工具,用于管理集群服务
ipvs:工作内核上的netfilter的INPUT链上
3.2、lvs的术语:director/realserver
调度器:director, dispatcher, balancer
VIP:Virtual IP 提供集群服务的ip地址,虚拟ip地址(公网ip)
DIP: Director IP 作为负载均衡器与后端服务器通信的ip地址(director的ip)
RIP: Real Server IP 后端真实服务器的ip地址
CIP:Client IP 客户端ip地址
3.3、lvs的类型 :
lvs-nat Network Address Translation : MASQUERADE
lvs-dr (Direct Routing) : GATEWAY
lvs-tun (IP tunneling) : IPIP
lvs-fullnat
四、lvs类型介绍(图示:左侧为源ip,右侧为目标ip)
4.1、lvs-nat
(1)通过网络地址转换的方法来实现调度的。首先调度器(director)接收到客户的请求数据包时(请求的目标ip为vip)
(2)根据调度算法决定将请求发送给哪个后端的真实服务器(realserver)。然后调度器就把客户端发送的请求数据包的目标ip地址及端口改成后端真实服务器的ip地址(rip),这样真实服务器(realserver)就能够接收到客户的请求数据包了
(3)realserver响应完请求后,查看默认路由(NAT模式下需要把realserver的默认路由设置为director服务器的dip,realserver把响应后的数据包发送给director,这时候的源ip为rip,目标ip为cip
(4)director接收到响应包后,把包的源地址改成虚拟地址(vip)然后发送回给客户端。
4.2、lvs-dr
dr模式是通过改写请求报文的目标mac地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同tun模式一样,dr模式可以极大的提高集群系统的伸缩性。而且DR模式没有ip隧道的开销,对集群中的真实服务器也没有必要必须支持ip隧道协议的要求。
要点:
<1>director要配置2个ip地址,1个是vip(公网地址),另1个是dip(负责和realserver进行通信)
<2>realserver也要配置2个ip地址,1个是rip,另一个是vip
<3>director主机和realserver都要配置vip地址
<4>客户端发出请求的时候,realserver不能响应,而只能有director进行响应
<5>一般来讲,dip和rip要在同一物理网络中,为了方便可以在同一网段中,保证director发出的对rip的arp请求,能够正常取得realserver的mac地址,即只要能够保证在同一路由器中就可以
<6>路由器的某个接口要是vip的网关
<7>各realserver与外部通信所使用的ip地址必须是rip,因此它的网关必须要跟rip在同一个网段中,如果rip是公网的ip,那么rip的网关要指向路由器的另外的某个接口上,或者是指向其他的路由器(要能到互联网)
<8>对linux内核而言,响应报文从哪块网卡出去,那么源ip地址就是这个网卡的ip地址
(1)客户端发起请求,源ip地址为cip,目标地址为vip(提供某个服务的ip地址)
(2)假设客户端的请求经过层层路由,已经进入本地网络,而本地通信靠的是mac地址,这时候路由器就要做arp广播,交换机是不会隔离广播报文的,所以这个时候director主机发现自己的mac地址是路由器广播的,做出回应,路由器收到回应后,封装源mac,目标mac(director的mac地址),发给交换机
(3)收到请求报文后,交换机内部有mac地址表,通过某个接口发给director主机
(4),director转发客户端的请求报文,但是不能改源ip和目标ip,因此只能改目标mac,通过调度算法挑一个realserver进行响应,得到这个realserver对ip地址,然后再通过arp广播的方式得到这个realserver的mac地址,调度的时候源ip(cip)和目标ip(vip)都没变,而重新封装mac报文,源mac为director的mac,目标mac为挑选出的realserver的mac,封装后通过交换机发送给realserver
(5)realserver收到请求报文,拆封后,发现源ip(cip)和目标ip(vip),vip是本机的ip地址,要提供客户端所请求的服务
(6)响应客户端的请求,将其请求的结果发送给客户端
4.3、lvs-tun
采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过ip隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端,这样调度器就只处理请求入站报文。
(1)调度器(director)接收到客户的请求数据包时(请求的目的ip为vip)
(2)不修改请求报文的ip首部,而是通过在原有的ip首部之外(cip,vip),再封装1个ip首部(dip,rip)
(3)realserver收到调度器发来的报文后,解封装,直接响应给客户端(vip,cip)
4.4、lvs-fullnat
原理: director通过同时修改请求报文的目标地址和源地址进行转发
(1)调度器(Director)接收到客户的请求数据包时(请求的目的IP为VIP)
(2)根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度器就把客户端发送的请求数据包的源ip和目标IP地址及端口改成director的dip及后端真实服务器的ip地址(rip)
(3)这样真实服务器(realserver)就能够接收到director发来的请求数据包。真实服务器响应请求
(4)realserver把响应后的数据包发送给director,director接收到响应包后,把包的源地址改成虚拟地址(vip),目标ip改成客户端ip(cip)后再发送回给客户端。
五、lvs调度算法
LVS调度方法,算法10种:
1、rr:Round-robin(轮询),客户端请求到达的时候,director会按照realserver在集群服务中从上至下的顺序循环分配请求
2、wr:Weighted Round-Robin(加权轮询),按照realserver的性能分配一个权重,确定请求发给谁,权重越大分到请求越多
3、sh:Source Hash(源地址hash),相当于SNAT,表示来源于同一个cip的请求将始终被定向至同一个realserver上去,保证源地址不变
4、dh:Destination Hashing(目标地址hash)相当于DNAT,不管来自哪个客户端都始终被定向至同一个主机,保证目标地址不变
5、lc(最少连接) 新的连接请求将被分配至当前连接数最少的realserver上;缺陷是如果一个realserver的性能足够好,那么很有可能客户端的所有请求都会分配给它,而性能差的realserver没有任何请求出现
6、wlc(加权最少连接) 在原有的最少连接的基础上给realserver一个权重,计算方法为:overload=(active*256+inactive)/weight ,缺陷:请求很有可能是从RS列表自上而下进行响应,很有可能是权重最小的
7、sed:最短期望延迟,对wlc的改进,可以让前几个请求使用让权重大的来响应
8、nq :永不排队,对sed简单改进,还检查当前服务器有没有连接
9、lblc:基于本地的最少连接,动态的DH,不仅检查是不是请求是不是同一个ip还检查当前有没有连接
10、lblcr:带复制的最少连接,对lblc的改进,当第二个realserver上的全部请求断开,允许第一个realserver上的请求复制到第二个realserver上响应,减轻第一个realserver上的负担
六、lvs-nat类型实现http和https的方法
6.1、测试环境:
director和realserver的操作系统为:centos 6.6
web1和web2的httpd:使用操作系统提供的httpd
配置好3台服务器的ip地址
6.2、http
director:提供简单的脚本来实现
[root@localhost shell]# vim lvs-nat.sh #!/bin/bash # auto install lvm-nat # date 2015-10-9 # ip_forward=1 sed -i "[email protected]_forward = [email protected]_forward = 1@" /etc/sysctl.conf && sysctl -p &>/dev/null //开启转发功能 # install ipvsadm rpm -q ipvsadm if [ $? -eq 1 ]; then yum install -y ipvsadm &> /dev/null //安装ipvsadm fi # define variable IPVSADM=`which ipvsadm` VIP=172.16.16.2 RS1=192.168.1.2 RS2=192.168.1.3 # define lvs-nat $IPVSADM -C //清空规则 $IPVSADM -A -t $VIP:80 -s rr //添加httpd集群服务,使用轮询调度算法 $IPVSADM -a -t $VIP:80 -r $RS1:80 -m -w 1 //向httpd集群服务添加节点 $IPVSADM -a -t $VIP:80 -r $RS2:80 -m -w 1
[root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.16.2:80 rr -> 192.168.1.2:80 Masq 1 0 0 -> 192.168.1.3:80 Masq 1 0 0
web1
[root@node1 ~]# vim realserver.sh #!/bin/bash # lvs-nat node define # # define hostname name=node1.bengbengtu.com hostname $name sed -i "s/HOSTNAME=localhost/HOSTNAME=$name/" /etc/sysconfig/network # define ip and gateway ipaddr=192.168.1.2 gateway=192.168.1.4 sed -i -e "s/ONBOOT=.*/ONBOOT=yes/; s/BOOTPROTO=.*/BOOTPROTO=static/; s/IPADDR=.*/IPADDR=$ipaddr/; s/GATEWAY=.*/GATEWAY=$gateway/; /NETMASK=.*/d" /etc/sysconfig/network-scripts/ifcfg-eth0 service network restart # yum install httpd rpm -q httpd if [ $? -eq 1 ];then yum install -y httpd &> /dev/null fi chkconfig httpd on service httpd start &> /dev/null && ss -tanl | grep 80 if [ $? -eq 0 ]; then echo -e "httpd start \033[32m[OK]\033[0m" echo $name > /var/www/html/index.html else echo -e "httpd start \033[31m[fail]\033[0m" exit 2 fi
web2
[root@node2 ~]# vim realserver.sh #!/bin/bash # lvs-nat node define # # define hostname name=node2.bengbengtu.com hostname $name sed -i "s/HOSTNAME=localhost/HOSTNAME=$name/" /etc/sysconfig/network # define ip and gateway ipaddr=192.168.1.3 gateway=192.168.1.4 sed -i -e "s/ONBOOT=.*/ONBOOT=yes/; s/BOOTPROTO=.*/BOOTPROTO=static/; s/IPADDR=.*/IPADDR=$ipaddr/; s/GATEWAY=.*/GATEWAY=$gateway/; /NETMASK=.*/d" /etc/sysconfig/network-scripts/ifcfg-eth0 service network restart # yum install httpd rpm -q httpd if [ $? -eq 1 ];then yum install -y httpd &> /dev/null fi chkconfig httpd on service httpd start &> /dev/null && ss -tanl | grep 80 if [ $? -eq 0 ]; then echo -e "httpd start \033[32m[OK]\033[0m" echo $name > /var/www/html/index.html else echo -e "httpd start \033[31m[fail]\033[0m" exit 2 fi
测试即可~~
5.3、https
为了简化过程,在web1上直接创建CA,并签发证书(www.bengbengtu.com)
director
# ipvsadm -t 172.16.16.2:443 -s rr # ipvsadm -t 172.16.16.2:443 -r 192.168.1.2:443 -m # ipvsadm -t 172.16.16.2:443 -r 192.168.1.2:443 -m
web1
[root@node1 ~]# mkdir /etc/httpd/ssl/ [root@node1 ~]# touch /etc/pki/CA/{serial,index.txt} [root@node1 ~]# echo 01 > /etc/pki/CA/serial [root@node1 ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) [root@node1 ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:Beijing Locality Name (eg, city) [Default City]:Beijing Organization Name (eg, company) [Default Company Ltd]:bengbengtu Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:ca.lvs.bengbengtu.com Email Address []:[email protected] [root@node1 ~]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048) Generating RSA private key, 2048 bit long modulus ..........+++ .......................................................................+++ e is 65537 (0x10001) [root@node1 ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365 Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:Beijing Locality Name (eg, city) [Default City]:Beijing Organization Name (eg, company) [Default Company Ltd]:bengbengtu Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:www.bengbengtu.com Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: [root@node1 ~]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/pki/CA/certs/www.bengbengtu.com.crt -days 365 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Oct 10 01:21:31 2015 GMT Not After : Oct 9 01:21:31 2016 GMT Subject: countryName = CN stateOrProvinceName = Beijing organizationName = bengbengtu organizationalUnitName = IT commonName = www.bengbengtu.com emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 1C:6A:9C:33:06:C9:66:00:31:2D:FD:01:0E:12:81:15:16:D2:D7:1B X509v3 Authority Key Identifier: keyid:80:9F:80:C7:D0:9C:3F:E0:CA:B1:53:ED:6E:9F:3D:B3:3F:30:69:64 Certificate is to be certified until Oct 9 01:21:31 2016 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated [root@node1 ~]# yum install mod_ssl [root@node1 ~]# cp /etc/pki/CA/certs/www.bengbengtu.com.crt /etc/httpd/ssl/ [root@node1 ~]# vim /etc/httpd/conf/httpd.conf ServerName 192.168.1.2 [root@node1 ~]# vim /etc/httpd/conf.d/ssl.conf <VirtualHost www.bengbengtu.com:443> #DocumentRoot "/var/www/html" ServerName www.bengbengtu.com SSLCertificateFile /etc/httpd/ssl/www.bengbengtu.com.crt SSLCertificateKeyFile /etc/httpd/ssl/httpd.key [root@node1 ~]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
拷贝https需要用到的证书及配置文件ssl.conf 到web2 [root@www ~]# scp /etc/httpd/ssl/www.bengbengtu.com.crt [email protected]:/etc/httpd/ssl/ [email protected]'s password: www.bengbengtu.com.crt 100% 4659 4.6KB/s 00:00 [root@www ~]# scp /etc/httpd/conf.d/ssl.conf [email protected]:/etc/httpd/conf.d/ [email protected]'s password: ssl.conf 100% 9474 9.3KB/s 00:00 [root@www ~]# scp /etc/httpd/ssl/httpd.key [email protected]:/etc/httpd/ssl/ [email protected]'s password: httpd.key 100% 1679 1.6KB/s 00:00
web2
[root@node2 ~]# mkdir /etc/httpd/ssl [root@node2 ~]# yum install mod_ssl -y [root@node2 ~]# vim /etc/httpd/conf/httpd.conf ServerName 192.168.1.3 [root@node2 ~]# service httpd start
测试结果
下次讲解lvs-dr类型实现过程!!!