一、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 

wKiom1YYtUSALoRhAADxbIYaGPQ677.jpg

(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地址


wKiom1YY0QqjLtIGAAFRYrKLGTw968.jpg

(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

wKiom1YYuF3DymYoAAECbdOUwgw168.jpg

采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过ip隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端,这样调度器就只处理请求入站报文。

(1)调度器(director)接收到客户的请求数据包时(请求的目的ip为vip)

(2)不修改请求报文的ip首部,而是通过在原有的ip首部之外(cip,vip),再封装1个ip首部(dip,rip) 

(3)realserver收到调度器发来的报文后,解封装,直接响应给客户端(vip,cip)


4.4、lvs-fullnat 


wKioL1YYu0fwNwERAAD9qygMXQQ772.jpg

原理: 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的方法

wKioL1YYjg_BNiBlAAGMbXmVpow107.jpg

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 "s@net.ipv4.ip_forward = 0@net.ipv4.ip_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

测试即可~~

wKiom1YYlC7S6KVvAAMsSyCU7No133.jpg


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 []:ca@bengbengtu.com
[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 []:admin@bengbengtu.com

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              = admin@bengbengtu.com
        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 root@192.168.1.3:/etc/httpd/ssl/
root@192.168.1.3's password: 
www.bengbengtu.com.crt                                            100% 4659     4.6KB/s   00:00    
[root@www ~]# scp /etc/httpd/conf.d/ssl.conf root@192.168.1.3:/etc/httpd/conf.d/
root@192.168.1.3's password: 
ssl.conf                                                          100% 9474     9.3KB/s   00:00    
[root@www ~]# scp /etc/httpd/ssl/httpd.key root@192.168.1.3:/etc/httpd/ssl/
root@192.168.1.3'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

测试结果

wKiom1YYlBTCBgHrAAQRWuSaEgw299.jpg

wKioL1YYlC6SdD4-AAQwfG8S7k0201.jpg

wKioL1YYlC_x7GB8AAJt0BUND8s994.jpg

wKiom1YYlBbTzrOxAAMPMVjwhvQ241.jpg

下次讲解lvs-dr类型实现过程!!!