首页 > 代码库 > 测试文章

测试文章

HA集群配置

HA即(high available)高可用,又被叫做双机热备,用于关键性业务。简单理解就是,有2台机器A和B,正常是A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至B机器继续提供服务。常见的实现高可用的开源软件有heartbeat和keepalived有负载均衡的功能。

这样,一台web服务器一天24小时提供web服务,难免会存在web服务挂掉或服务器宕机宕机的情况,那么用户就访问不了服务了,这当然不是我们期望的。如果这样,有2台服务器,A对外提供web服务,B作为备用,如果A挂掉,那么B立刻替代A的位置去提供web服务,这样对用户来说是透明的。但是有个问题,服务器A的ip是10.0.0.100,服务器B的ip是10.0.0.101,显然向用户提供A或B的ip地址是不可行的,因为用户总不能去切换ip来访问的吧。这时heartbeat或keepalived可以提供一个虚拟IP:10.0.0.102,用户只需要访问10.0.0.102,当A提供服务时,VIP会设置在A服务器上,当B提供服务时,VIP会设置在B服务器上,这样就可以让用户通过访问10.0.0.102来获取web服务,即使A或B服务器切换也不影响用户的正常访问。

下面我们使用heartbeat来做HA集群,并且把nginx服务作为HA对应的服务。

1、准备实验环境

服务器A
主机名:master
操作系统:CentOS6.8 64位
eth0网卡地址:192.168.0.18
eth1网卡地址:172.16.254.18

服务器B
主机名:slave
操作系统:CentOS6.8 64位
eth0网卡地址:192.168.0.28
eth1网卡地址:172.16.254.28

虚拟VIP
VIP:192.168.0.38

2、设置主机名

master节点设置hostname
hostname
master
vim /etc/sysconfig/network
编辑配置文件:
HOSTNAME=master

slave节点设置hostname
# hostname slave
# vim /etc/sysconfig/network
编辑配置文件
:
HOSTNAME=slave

3、关闭防火墙和selinux(2台节点都要操作)

关闭iptables
# iptables -F
# service iptables save
# service iptables stop

关闭selinux
# setenforce 0
# sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/‘ /etc/selinux/config

4、配置hosts文件(2台节点都操作)

# vim /etc/hosts

增加内容如下:

192.168.0.18 master

192.168.0.28 slave

     

5、安装epel扩展源 (2台都操作)

# yum install -y epel-release

     

6、安装heartbeat (2台都操作)    

# yum install -y heartbeat* libnet nginx

     

7、主master节点配置

拷贝配置文件

# cd /usr/share/doc/heartbeat-3.0.4/

# cp authkeys ha.cf haresources /etc/ha.d/

# cd /etc/ha.d

     

修改authkeys

# vim authkeys

更改或增加如下内容:

auth 3

3 md5 Hello!

     

然后修改其权限

# chmod 600 authkeys

     

编辑haresources文件

# vim haresources

加入下面一行:

master 192.168.0.38/24/eth0:0 nginx

     

说明:master为主节点hostname192.168.0.38vip/24为掩码为24的网段,eth0:0vip的设备名,nginxheartbeat监控的服务,也是两台机器对外提供的核心服务。

     

编辑ha.cf

# vim ha.cf

修改为如下内容:

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 60

udpport 694

ucast eth1 172.16.254.28

auto_failback on

node master

node slave

ping 172.16.254.1

respawn hacluster /usr/lib64/heartbeat/ipfail

     

配置说明:

debugfile /var/log/ha-debug该文件保存heartbeat的调试信息。

logfile /var/log/ha-logheartbeat的日志文件。

keepalive 2:心跳的时间间隔,默认时间单位为秒s

deadtime 30:超出该时间间隔未收到对方节点的心跳,则认为对方已经死亡。

warntime 10:超出该时间间隔未收到对方节点的心跳,则发出警告并记录到日志中。

initdead 60:在某系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔,取值至少为deadtime2倍。

     

udpport 694:设置广播通信使用的端口,694为默认使用的端口号。

ucast eth1 172.16.254.28:设置对方机器心跳检测的网卡和IP

auto_failback onheartbeat的两台主机分别为主节点和从节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给从节点由从节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代从节点,否则不取代从节点。

respawn heartbeat /usr/lib/heartbeat/ipfail指定与heartbeat一同启动和关闭的进程,该进程被自动监视,遇到故障则重新启动。最常用的进程是ipfail,该进程用于检测和处理网络故障,需要配合ping语句指定的ping node来检测网络连接。如果你的系统是64bit,请注意该文件的路径。

     

8、把主节点上的三个配置文件拷贝到从节点

# cd /etc/ha.d

# scp authkeys ha.cf haresources slave:/etc/ha.d

     

9、从节点slave编辑ha.cf

# vim /etc/ha.d/ha.cf

只需要更改一个地方如下:

ucast eth1 172.16.254.28改为ucast eth1 172.16.254.18

     

10、启动heartbeat服务

配置完毕后,先master启动,后slave启动。

# service heartbeat start

     

11、检查测试

# ifconfig

看是否有接口 eth0:0

     

# ps aux | grep nginx

看是否有nginx进程

     

12、测试方式一

主节点上故意禁ping

# iptables -I INPUT -p icmp -j DROP

     

13、测试方式二

主节点停止heartbeat服务

# service heartbeat stop

     

14、测试脑裂

主节点master和从节点slave都down掉eth1网卡

# ifdown eth1

     

     

负载均衡LB集群之LVS介绍

LB集群是load balance集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、keepalived,商业的硬件负载均衡设备F5、Netscale。

     

LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。

     

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。这是一个由章温嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 现在LVS已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和Linux操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。LVS 从实现上分为下面3种模式。

     

三种工作模式

     

NAT模式

NAT模式,调度器将请求的目标 IP 即 VIP 地址改为 Real Server 的 IP ,返回的数据包也经过调度器,调度器再把源地址修改为 VIP 。

     

TUN 模式

TUN 模式,调度器将请求来的数据包封装加密通过 IP 隧道转发到后端的 real server 上,而 real server 会直接把数据返回给客户端,而不再经过调度器。

     

DR 模式

DR 模式,调度器将请求来的数据包的目标 MAC 地址改为 real server 的MAC 地址,返回的时候也不经过调度器,直接返回给客户端

     

关于 IP 说明

需要解释一下, DIP 为调度器的 IP, NAT 模式下它必须为公网 IP,要对外提供服务。 VIP 为虚拟 IP,用在 TUN 和 DR 模式中,需要同时配置在调度器和后端真实服务器上。RIP 为后端真实服务器的 IP,在 TUN 和 DR 模式中,RIP 为公网 IP。

     

要想把用户的请求调度给后端的RS,是需要经过调度算法来实现的,那么关于 LVS 的调度算法,都有哪些?

     

LVS 调度算法

轮叫调度 rr

这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

     

加权轮叫 wrr

这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

     

最少链接 lc

这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1 。

     

加权最少链接 wlc

这个算法比 lc 多了一个权重的概念。

     

基于局部性的最少连接调度算法 lblc

这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器。

     

复杂的基于局部性最少的连接算法 lblcr

记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

     

目标地址散列调度算法 dh

该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

     

源地址散列调度算法 sh

与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

     

实践 LVS 的 NAT 模式

实验环境

三台服务器,一台作为 director,两台作为 real server,director 有一个外网网卡(172.16.254.200) 和一个内网ip(192.168.0.8),两个 real server 上只有内网 ip (192.168.0.18) 和 (192.168.0.28),并且需要把两个 real server 的内网网关设置为 director 的内网 ip(192.168.0.8)

安装和配置

两个 real server 上都安装 nginx 服务

# yum install -y nginx

     

Director 上安装 ipvsadm

# yum install -y ipvsadm

     

Director 上编辑 nat 实现脚本

# vim /usr/local/sbin/lvs_nat.sh

编辑写入如下内容:

#! /bin/bash

# director服务器上开启路由转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

# 关闭 icmp 的重定向

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects

# director设置 nat 防火墙

iptables -t nat -F

iptables -t nat -X

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

# director设置 ipvsadm

IPVSADM=‘/sbin/ipvsadm‘

$IPVSADM -C

$IPVSADM -A -t 172.16.254.200:80 -s wrr

$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.18:80 -m -w 1

$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.28:80 -m -w 1

     

保存后,在Director上直接运行这个脚本就可以完成lvs/nat的配置

/bin/bash /usr/local/sbin/lvs_nat.sh

     

查看ipvsadm设置的规则

ipvsadm -ln    

     

测试 LVS 效果

通过浏览器测试2台机器上的web内容 http://172.16.254.200 。为了区分开,我们可以把 nginx 的默认页修改一下:

     

RS1 上执行

# echo "rs1rs1" >/usr/share/nginx/html/index.html

     

RS2 上执行

# echo "rs2rs2" >/usr/share/nginx/html/index.html

注意,切记一定要在两台 RS 上设置网关的 IP 为 director 的内网 IP。

     

实践LVS 的 DR 模式

实验环境

三台机器:

Director节点:(eth0 192.168.0.8 vip eth0:0 192.168.0.38)

Real server1: (eth0 192.168.0.18 vip lo:0 192.168.0.38)

Real server2: (eth0 192.168.0.28 vip lo:0 192.168.0.38)

     

     

安装和编写配置脚本

两个 real server 上都安装 nginx 服务

# yum install -y nginx

     

Director 上安装 ipvsadm

# yum install -y ipvsadm

     

Director 上配置脚本

# vim /usr/local/sbin/lvs_dr.sh

#! /bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward

ipv=/sbin/ipvsadm

vip=192.168.0.38

rs1=192.168.0.18

rs2=192.168.0.28

ifconfig eth0:0 down

ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip dev eth0:0

$ipv -C

$ipv -A -t $vip:80 -s wrr

$ipv -a -t $vip:80 -r $rs1:80 -g -w 3

$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

     

执行脚本:

# bash /usr/local/sbin/lvs_dr.sh

     

     

分别在2 rs 上配置脚本

# vim /usr/local/sbin/lvs_dr_rs.sh

#! /bin/bash

vip=192.168.0.38

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

     

rs 上分别执行脚本:

bash /usr/local/sbin/lvs_dr_rs.sh

     

测试结果

测试方式同上,浏览器访问 http://192.168.0.38

注意:在 DR 模式下,2台 rs 节点的 gateway 不需要设置成 dir 节点的 IP 。

     

参考链接地址:http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

     

LVS 结合 keepalived 配置

实验环境

4台节点

Keepalived1 + lvs1(Director1)192.168.0.48

Keepalived2 + lvs2(Director2)192.168.0.58

Real server1192.168.0.18

Real server2192.168.0.28

VIP: 192.168.0.38

     

安装必备软件

Lvs + keepalived2个节点安装

# yum install ipvsadm keepalived -y

     

Real server + nginx服务的2个节点安装

# yum install epel-release -y

# yum install nginx -y

     

设置配置脚本

Real server节点2台配置脚本

# vim /usr/local/sbin/lvs_dr_rs.sh

#! /bin/bash

vip=192.168.0.38

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

 1

2节点rs 上分别执行脚本:

bash /usr/local/sbin/lvs_dr_rs.sh

     

keepalived节点配置(2节点)

主节点( MASTER )配置文件

vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.0.38

}

}

     

virtual_server 192.168.0.38 80 {

delay_loop 6

lb_algo rr

lb_kind DR

persistence_timeout 0

protocol TCP

     

real_server 192.168.0.18 80 {

weight 1

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

     

real_server 192.168.0.28 80 {

weight 1

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

     

从节点( BACKUP )配置文件

拷贝主节点的配置文件keepalived.conf,然后修改如下内容:

state MASTER -> state BACKUP

priority 100 -> priority 90

     

keepalived的2个节点执行如下命令,开启转发功能:

# echo 1 > /proc/sys/net/ipv4/ip_forward

     

启动keepalived

先主后从:service keepalived start

     

验证结果

实验1

手动关闭192.168.0.18节点的nginx,service nginx stop 在客户端上去测试访问 http://192.168.0.38 结果正常,不会出现访问18节点,一直访问的是28节点的内容。

     

实验2

手动重新开启 192.168.0.18 节点的nginx, service nginx start 在客户端上去测试访问 http://192.168.0.38 结果正常,按照 rr 调度算法访问18节点和28节点。

     

实验3

测试 keepalived 的HA特性,首先在master上执行命令 ip addr ,可以看到38的vip在master节点上的;这时如果在master上执行 service keepalived stop 命令,这时vip已经不再master上,在slave节点上执行 ip addr 命令可以看到 vip 已经正确漂到slave节点,这时客户端去访问 http://192.168.0.38 访问依然正常,验证了 keepalived的HA特性。

lvs介绍:http://www.it165.net/admin/html/201401/2248.html

     

nginx 的负载均衡集群

在前边内容我们提到过 nginx 的负载均衡功能,其实实际上和 nginx 的代理是同一个功能,只是把代理一台机器改为多台机器而已。 Nginx 的负载均衡和 lvs 相比,nginx属于更高级的应用层,不牵扯到 ip 和内核的修改,它只是单纯地把用户的请求转发到后面的机器上。这就意味着,后端的 RS 不需要配置公网。

     

实验环境

Nginx 调度器 (public 172.16.254.200 privite 192.168.0.48)

RS1只有内网IP (192.168.0.18)

RS2只有外网IP (192.168.0.28)

     

配置文件

在nginx调度器上编辑配置文件

# vim /usr/local/nginx/conf/vhosts/lb.conf

添加如下内容:

upstream test {

ip_hash;

server 192.168.0.18;

server 192.168.0.28;

}

server {

listen 80;150

server_name www.aminglinux.com;

location / {

proxy_pass http://test/;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

     

配置说明

你会发现这个配置和我们之前讲的 nginx 代理配置如出一辙,只是多了一个upstream,这个 upstream 用来定义后端的 RS,可以只写一个。 ip_hash 为 nginx 的一种调度算法,加上这一行后会达到这样的效果,即一个用户的请求会适中被分发到固定的一个 RS上。这样的好处是,可以避免把同一个用户的请求分发到不同的机器上而导致 session 丢失的情况。 upstream 里面, RS 后面的 ip 后面还可以加权重,比如"server 192.168.31.100 weight=100;"。还有一点要注意, upstream 后面的 test 是自定义的一个名字,可以随便写,唯一的要求是要和 proxy_pass 后面保持一致。

测试文章