转自:http://guodayong.blog.51cto.com/263451/1201101
一:集群相关概念及知识点介绍:
LVS(Linux Virtual System)
本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的Free Software项目之一。linux虚拟服务器(LVS)项目在linux操作系统上提供了最常见的负载均衡软件。
集群定义:
集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中
的核心技术。本文就集群系统的定义、发展趋势、任务调度等问题进行了简要论述。集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
集群系统的主要优点:(高可扩展性、高可用性、高性能、高性价比)
目前运行在LINUX最主流的三种集群:
负载集群之一:LB(Load Balancing)
负载均衡集群运行时,一般通过一个或者多个前端负载均衡器(Director Server),将用户发来的请求资源信息,通过一种调度算法发送至到后端的一组应用服务器(Real Server)上,从而达到整个系统的高性能和高可用性。这样的计算机集群有时也被称为服务器群(Server Farm)
一般高可用性集群和负载均衡集群会使用类似的技术,或同时具有高可用性与负载均衡的特点。
负载集群之二:HA(High-Availability)
一般是指当集群中有某个节点失效的情况下,其上的任务会自动转移到其他正常的节点上。并且还可以将集群中的某节点进行离线维护再上线,该过程并不影响
整个集群的运行。
高可用集群:为了保证服务一直在线的高可用能力的集群
衡量标准:可用性=在线时间/(在线时间+故障处理时间)
负载集群之三:HP
高性能计算集群采用将计算任务分配到集群的不同计算节点从而提高计算能力,因而主要应用在科学计算领域。比较流行的HPC采用Linux操作系统和其它一些免费软
件来完成并行运算。这一集群配置通常被称为Beowulf集群。这类集群通常运行特定的程序以发挥HPC cluster的并行能力。这类程序一般应用特定的运行库, 比如专为科学计算设计的MPI库。
HPC集群特别适合于在计算中各计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果或影响到其它节点计算结果的情况。
高性能处理集群:
利用的是分布式存储:分布式文件系统,分布式文件系统把一个大任务切割为小任务、分别进行处理
LVS系统结构:
负载均衡器(Load Balancer)、服务器群组(Server Aarry)、共享存储(Shared Storage)
负载均衡层:
整个集群服务最前端设备,它有一个或多个调度器(Director Server)组成,LVS软件运行在调度服务器上。
调度服务器的功能:
将用户的请求,根据调度算法进行IP分流,将数据包发送到后端应用服务器上(Real Server),如果调度服务器安装了
监控模块Ldirectord,那么调度服务器会将出现故障的应用服务器标记为不可用,知道此应用服务器恢复正常。
服务器群组层:
这是由一个或者多个应用程序服务器(Real Server)组成,并且每个应用服务器提供相同的服务,调度服务器会将用户的请求定向到具体的应用服务器上,然后由后端的应用服务器响应客户端。
共享存储层:
功能只要是保证服务器群组中的应用服务器提供数据的一致性。
共享存储的实现方式:
磁盘阵列、集群文件系统(OCFS2)
LVS是linux系统上的一种机制,类似于iptables,其相关属性也是通过(ipvsadm)与iptables命令类似的方式定义的,
LVS是工作于linux系统内核空间,通过内核来提供工作,其工作空间在iptables的INPUT链上,当客户端请求到达INPUT链上以后,通过LVS规则的验证,如果是内部请求,发送至用户空间,如果发现是集群,将此请求发送至POSTROUTING链,并交给后端应用程序服务器来响应用户的请求。
注意:上面所提到LVS其实是工作在iptables的INPUT和postrouting链上的,所以在此系统上iptables和LVS不能同时存在。
LVS的组成:
ipvsadm:用于管理集群服务的命令行工具,工作于Linux系统中的用户空间
ipvs:为lvs提供服务的内核模块,工作于内核空间 (相对于是框架,通过ipvsadm添加规则,来实现ipvs功能)
注:在linux内核2.4.23之前的内核中模块默认是不存在的,需要自己手动打补丁,然后把此模块编译进内核才可以使用此功能
LVS类型:
LVS-NAT模式、LVS-DR模式、LVS-TUN模式
NAT:(Network address translation)
原理:把用户的请求发来的IP包的IP报头目的地址,通过LVS服务器转换至后端提供服务的Real Server的地址并将用户的请求报文发送至应用服务器。而应用服务器打开报文并响应用户请求发送并经过LVS服务器,LVS服务器将源地址修改为LVS服务器接口上的VIP地址。
NAT模式特点:
1
2
3
4
5
6
7
8
9
|
用户发来的请求和响应,都必须经过LVS服务器。
集群节点跟Director必须在同一个IP网络中;
RIP通常是私有地址,仅用于各集群节点间的通信;
Director位于Client和Real Server之间,并负责处理进出的所有通信;
Realserver必须将网关指向DIP地址;
支持端口映射;
Realserver可以使用任意OS;
LVS服务器必须有两块网卡
较大规模应该场景中,Director易成为系统瓶颈;
|
DR:(Direct routing)
DR模式工作在数据链路层,其原理,LVS服务器和应用服务器使用同一个IP地址对外服务,但只有LVS服务器对ARP请求进行响应,所有应用服务器对本身这个IP地址的ARP请求保持静默。网关会把所有的ARP请求定向至LVS服务器,而LVS服务器收到用户请求数据报文,根据调度算法进行IP分流,然后相应的MAC地址的修改,发送至后端对应的应用服务器。
注:由于LVS服务器对二层数据包进行修改,所以LVS服务器和应用服务器必须在同一个广播域。
DR模式特点:
1
2
3
4
5
|
集群节点跟director必须在同一个物理网络中;
RIP可以使用公网地址,实现便捷的远程管理和监控;
Director仅负责处理入站请求,响应报文则由Real Server直接发往客户端;
Real Server不能将网关指向DIP;
不支持端口映射;
|
注:在DR模式中,LVS服务器只负责接收用户请求,根据调度算法及IP分流,直接路由转发,其响应报文交给Real Server自行处理。
DR模式是三种模式当中性能最好的,唯一的缺陷是LVS服务器和后端的应用服务器必须在同一个广播域中,因此不能实现集群的跨网端应用。
TUN (IP Tunnel模式)
TUN模式,LVS将TCP/IP请求进行重新封装并转发给目标应用服务器,有目标应用程序服务器对用户请求做出相应。LVS Router和Real Server通过Tp Tunnel通过隧道技术
进行转发,因此两者可以存在不同的网络当中。
注:由于应用服务器需要对LVS发送的报文进行还原,也就是说应用服务器也要支持Ip Tunnel协议。(Network options)
TUN模式特点:
1
2
3
4
5
6
|
集群节点可以跨越Internet;
RIP必须是公网地址;
Director仅负责处理入站请求,响应报文则由Real Server直接发往客户端;
Real Server网关不能指向director;
只有支持隧道功能的OS才能用于Real Server;
不支持端口映射;
|
LVS负载均衡八种调度算法:
rr-->wrr-->lc-->wlc-->lblc-->lblcr-->dh-->sh
轮叫(Round Robin):
该算法将用户请求有次序地分发到后端的应用服务器,均等看待所有Real Server,而并不计算具体服务器上的链接和负载。
加权轮叫(Weighted Round Robin):
该调度算法根据各个应用服务器的不同负载能力,给服务器设置不同的权值,处理能力强的应用服务器的权值设置大点,来响应更多的用户请求。
最少连接(Least Connections):
该算法将用户发送的请求分配到连接做少的应用服务器上。
加权最少连接(Weighted Least Connections):
该算法根据应用服务器的不同负载能力,设置不同大小不同的权值,权值较大并且连接请求数少的应用服务器则优先分配用户请求信息。
基于局部性最少连接:(Locality-Based Least Connections):
该算法针对目标IP地址的负载均衡算法,主要用于缓存集群系统。此算法会根据用户请求的目标IP地址找出与目标地址最近的应用服务器,如果服务器没有超载,则请求被分发到该应用服务器,如果服务器不可用或者负载较大,则使用最少连接算法,选择目标应用服务器
带复制的基于局部性最少连接(Locality-Based Least Connections wiht Replication)
该算法也是针对目标IP地址的负载均衡算法,主要用于缓存集群系统。域LBLC区别在于,前者维护一个IP地址到一组服务器的映射。而后者则是维护一个IP地址到一台应用服务器的映射。
目标地址散列(Destination Hashing)
该算法将用户请求的目标地址作为散列键,并尝试从静态分配的散列表中找出对应的应用服务器。如果目标应用服务器没有超载,那么将用户的请求信息分发至该应用服务里,否则返回空。
源地址散列(Source Hashing)
该算法将请求的源地址作为散列键,并尝试从静态分配的散列表中找出对应的应用服务器。如果目标应用服务器可用并且没有超载,那么将用户请求的信息分发至此应用服务器,否则返回空。
LVS IP Address Name Conventions:(LVS Ip-address 命名规范)
1
2
3
4
5
|
Director's IP (DIP) address :中间层,根据不同模式,来接收并响应用户的请求。
Virtual IP (VIP) address:向外提供服务的地址。
Real IP (RIP) address :Real Server IP:后端提供应用服务的主机地址。
Director's IP (DIP) address :和内部的IP通信所使用的地址:设置在Director Server上
Client computer's IP (CIP) address:客户端地址
|
ipvsadm命令详细介绍:
pvsadm: 管理集群服务的命令行工具,而ipvs系统内核中的一个模块
ipvsadm命令的基本使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
-A:在内核的虚拟服务器列表中添加一条VIP记录
-E:修改内核虚拟服务器列表中的一条VIP记录
-D:删除内核虚拟服务器列表中的一条VIP记录
-C:清空内核虚拟服务器列表中的所有VIP记录
-S:保存虚拟服务器规则
-R:恢复虚拟服务器策略规则
-a:在内核虚拟服务器列表中添加一个应用服务器的地址。
-e:修改一个虚拟服务器列表中的一条应用服务器地址记录
-d:删除一个虚拟服务器列表中的一条应用服务器地址记录
-L/-l: 查看内核虚拟服务器列表
-Z:将内核中的虚拟服务器计数清为
0
-t service-address:指定虚拟服务器使用TCP服务
-u service-address:指定虚拟服务器使用UDP服务
-s scheduler:指定调度算法:
-p timeout:在应用服务器上的持续服务时间,单位为秒
-r service-address:指定应用服务器的地址
-g:指定LVS工作模式为直接路由(DR-defalut)
-I:指定LVS工作模式为隧道模式(Ip Tunnel)
-m:指定LVS工作模式为地址转换模式(NAT)
-w:设定应用服务器的权值
|
二:项目案例-如图
LVS/DR+Keepalived 实现lvs高可用,并提供web服务负载均衡
案例环境:版本及相及IP地址的分配
名称(Name) |
Ip_address |
LVS-DR-DIP:eth0 LVS-DR-DIP:eth0 |
172.16.88.88/16 172.16.88.66/16 |
LVS-DR-VIP:eth0:0 |
172.16.88.100/16 |
WEB1-Real-Server:eth0 |
172.16.88.10/16 |
WEB2-Real-Server:eth0 |
172.16.88.20/16 |
软件及版本:Vmware Station-RHEL 5.8(2.6.18) |
配置过程如下:
Realserver1:172.16.88.10/16配置
第一步:设置主机名、IP地址、hosts文件IP地址和主机名对应关系,及关闭selinux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@localhost ~]# sed -i
's@\(HOSTNAME=\).*@\1Real1.example.com@g'
/etc/sysconfig/network
[root@localhost ~]# hostname Real1.example..com
[root@localhost ~]# vim /etc/hosts
172.16
.
88.10
Real1.example.com Real1
172.16
.
88.20
Real2.example.com Real2
[root@Real1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
# Real Service Ip_address Information
DEVICE=eth0
BOOTPROTO=
static
IPADDR=
172.16
.
88.10
NETMASK=
255.255
.
0.0
GATEWAY=
172.16
.
0.1
ONBOOT=yes
HWADDR=
00
:0c:
29
:4b:
88
:1f
[root@Real1 ~]# service network restart
|
第二步:建立Realserver之间建立SSH互信及时间同步:
1
2
3
4
5
|
[root@Real1 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P
''
[root@Real1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@
172.16
.
88.20
[root@Real1 ~]# service ntpd stop && chkconfig ntpd off && ntpdate
172.16
.
0.1
[root@Real1 ~]# crontab -e
*/
3
* * * * /sbin/ntpdate
172.16
.
0.1
&> /dev/
null
|
第三步:创建Shell_Scripts,在这里,我们的RealServer提供的是web服务器,所以在这里我们采用脚本的方式来对Realserver进行配置,脚本内容如下:
[root@Real1 ~]# vim /scripts/realserver.sh ##创建脚本实现vip地址以和默认路由的设置以及对外网ARP请求的相关设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: -
90
10
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
VIP=
172.16
.
88.100
host=`/bin/hostname`
case
"$1"
in
start)
# Start LVS-DR real server on
this
machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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
/sbin/ifconfig lo:
0
$VIP broadcast $VIP netmask
255.255
.
255.255
up
/sbin/route add -host $VIP dev lo:
0
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:
0
down
echo
0
> /proc/sys/net/ipv4/conf/lo/arp_ignore
echo
0
> /proc/sys/net/ipv4/conf/lo/arp_announce
echo
0
> /proc/sys/net/ipv4/conf/all/arp_ignore
echo
0
> /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:
0
| grep $VIP`
isrothere=`netstat -rn | grep
"lo:0"
| grep $VIP`
if
[ !
"$islothere"
-o !
"isrothere"
];then
# Either the route or the lo:
0
device
# not found.
echo
"LVS-DR real server Stopped."
else
echo
"LVS-DR real server Running."
fi
;;
*)
# Invalid entry.
echo
"$0: Usage: $0 {start|status|stop}"
exit
1
;;
esac
|
第四步:给此脚本执行权限并安装httpd二进制软件包,提供web服务
1
2
3
4
5
6
7
8
|
[root@Real1 ~]# chmod +x /scripts/realserver.sh
[root@Real1 ~]# .realserver.sh start ##运行此脚本,传递一个参数为start,即可设置vip地址、默认路由、对与外网arp请求参数
[root@Real1 ~]# service ntpd stop && ntpdate
172.16
.
0.1
##这里实现时间同步,使用的ntpdate+crontab来实现,也可以通过system-config-date来做相关设置即可。
[root@Real1 ~]# crontab -e
*/
3
* * * * /sbin/ntpdate
172.16
.
0.1
&>/dev/
null
[root@Real1 ~]# yum install httpd -y
[root@Real1 ~]# echo
"Real1 Server-1"
> /
var
/www/html/index.txt ##提供网页内容,用于测试
[root@Real1 ~]# service httpd restart
|
[root@Real1 ~]# netstat -ntupl | grep 80 && curl httpd://172.16.88.10
这样Realserver1的基本设置就完成了,Realserver2的设置和Realserver1完全相同,所以笔者在这里就不再演示。
[root@Real2 ~]# curl http://172.16.88.20
Director1 Server Configure
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机(172.16.88.88/16)和Backup主机(172.16.88.66/16)之间failover的实现
下面为二台lvs调度服务器,安装lvs+keepalived软件包。安装lvs软件包,因为keepalived是运行在lvs之上的,因此lvs及keepalived必须装在一个系统里面。
第一步:设置主机名和/etc/hosts对照关系及两台Director调度器之间建立SSH互信:
Director Router1操作步骤
1
2
3
4
5
6
7
8
9
|
[root@localhost ~]# setup ##设置IP地址为
172.16
.
88.88
/
16
[root@localhost ~]# sed -i
's@\(HOSTNAME=\).*@\1Director1.example.com@g'
/etc/sysconfig/network ##修改主机名
[root@localhost ~]# hostname Director1.example.com
[root@localhost ~]# logout ##可以选择注销和重启来使配置文件生效
[root@Director1 ~]# vim /etc/hosts ##添加IP地址和主机名的映射关系
172.16
.
88.88
Director1.example.com Director1
172.16
.
88.66
Director2.example.com Director2
[root@Director1 ~]# ssh-keygen -t rsa -f ~/.ssl/id_rsa -P
''
##建立两台调度服务器之间的SSH互信,用于Director服务之间复制文件,也可以使用跳板级来实现部署。
[root@Director1 ~]# ssh-copy-id -i ./.ssl/id_rsa.pub Director2
|
第二步:IP地址信息及开路由转发功能:
[root@Director ~]# sysctl -p ##重新加载/etc/sysctl.conf配置文件
Director Router2操作步骤:
第一步:配置IP、主机名、hosts 、SSH互信
1
2
3
4
5
6
7
8
9
|
[root@localhost ~]# setup ##设置IP地址为
172.16
.
88.66
/
16
[root@localhost ~]# sed -i
's@\(HOSTNAME=\).*@\1Director2.example.com@g'
/etc/sysconfig/network
[root@localhost ~]# hostname Director2.example.com
[root@localhost ~]# logout ##重新登录,读取配置文件(/etc/sysconfig/network)
[root@Director2 ~]# vim /etc/hosts ##添加如下两行,完成IP地址和主机名对应关系,然后保存退出即可。
172.16
.
88
.88Director1.example.comDirector1
172.16
.
88
.66Director2.example.comDirector2
[root@Director2 ~]# ssh-keygen -t rsa -f ~/.ssl/id_rsa -P
''
[root@Director2 ~]# ssh-copy-id -i ./.ssl/id_rsa.pub Director2 ##以上的操作步骤,就完成了两台调度器之间建立SSH互信工作
|
第二步:安装ipvsadm和keepalived软件包
1
2
|
[root@Director1 ~]# yum install ipvsadm -y
[root@Director1 ~]# yum --nogpgcheck localinstall keepalived-
1.2
.
7
-
5
.el5.i386.rpm -y
|
第三步:keepalived主配置文件格式及对每一个参数做详细的解释:
keepalived分为三个部分:
全局配置、VRRP定义配置、虚拟服务器定义
全局配置格式:
1
2
3
4
5
6
7
8
9
|
global_defs {
notification_email {
root@localhost ##接收邮件的用户
}
notification_email_from keepalived@localhost ##发件用户为keepalived
smtp_server
127.0
.
0.1
##邮件服务器
smtp_connect_timeout
30
##连接请求超时时常
router_id LVS_DEVEL ##路由ID
}
|
VRRP定义配置格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
vrrp_instance VI_1 { ##定义虚拟路由
state MASTER ##两种状态分别是{MASTER|BACKUP}
interface
eth0 ##对外提供服务及通告所使用的接口
virtual_router_id
51
##虚拟路由标识ID
priority
101
##{MASTER|BACKUP}的优先级,MASTER的优先级比BACKUP的优先级大
advert_int
1
##同步通知间隔,MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒
authentication { ##验证类型和验证密码,目前类型主要有PASS、AH两种,通常使用的类型为PASS。
auth_type PASS
auth_pass keepalived
}
virtual_ipaddress { ##虚拟ip(VIP)地址,可以有多个地址,每个地址占一行,不需要指定子网掩码。
172.16
.
88.100
/
16
dev eth0
label
eth0:
0
}
}
|
虚拟服务器配置格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
virtual_server
172.16
.
88.1
80
{ ##虚拟服务器(virtual_server)所使用的VIP地址及端口,实现负责均衡。
delay_loop
6
##健康状态检查时间间隔,单位是秒。
lb_algo rr ##负载均衡调度算法,LVS总共有八种调度算法,互联网应用常使用wlc或rr作为调度算法。
lb_kind DR ##负载均衡模型,LVS包括三种模型,分别为DR、NAT、TUN。
nat_mask
255.255
.
0.0
persistence_timeout
50
##会话保持时间(持久连接),默认为
50
秒。
protocol TCP ##转发所使用的协议(protocol),{TCP|UPD}
real_server
172.16
.
88.10
80
{ ##后端应用服务器(real_server),用于提供用户的请求,有时也称为应用服务器群组。
weight
1
##设定权值,对rr没有意义,一般应用服务器性能好的,可以将其权值设置大写,这样此应用服务器就能分担分担更多的用户请求资源并响应。
HTTP_GET { ##健康状态检测{HTTP_GET|SSL_GET(https)|TCP_CHECK|SMTP_CHECK|MISC_CHECK 权值小的,根据不同的调度算法分担的请求量会少些。
url {
path /
status_code
200
##页面返回代码值
}
connect_timeout
3
##连接超时时常
nb_get_retry
3
##连接重试的次数
delay_before_retry
3
##延迟所使用的时间
}
}
real_server
172.16
.
88.10
80
{
weight
1
HTTP_GET {
url {
path /
status_code
200
}
connect_timeout
3
nb_get_retry
3
delay_before_retry
3
}
}
real_server
172.16
.
88.20
80
{
weight
1
HTTP_GET {
url {
path /
status_code
200
}
connect_timeout
3
nb_get_retry
3
delay_before_retry
3
}
}
}
|
第四步:将此Director1上的keepalived主配置文件复制到Director2上,并将其状态以及优先级修改为BACKUP和100,然后保存并退出即可。
1
2
3
4
|
[root@Director2 ~]#
[root@Director2 ~]# yum install ipvsadm -y
[root@Director2 ~]# yum --nogpgcheck localinstall keepalived-
1.2
.
7
-
5
.el5.i386.rpm -y
[root@Director1 ~]# scp /etc/keepalived/keepalived.conf Direcotr2:/etc/keepalived/keepalived.conf
|
第五步:启动keepalived服务器并查看vip配置在哪台Director上。
1
2
3
|
[root@Director1 ~]# service keepalived restart ##两台lvs同时启动keepalived服务
[root@Director2 ~]# service keepalived restart
[root@Director1 ~]# ifconfig ##查看VIP地址是否配置在Director1调度服务器上
|
查看ipvsadm的虚拟服务器真实存在的Realserver主机记录
1
|
[root@Director1 ~]# ipvsadm -L -n
|
第六步:如何在维护模式下,模拟LVS服务器发生故障
只需在keepalived配置文件中,添加如下内容(vrrp实例之外添加如下内容):
1
2
3
4
5
6
7
|
vrrp_script chk_schedown {
script
"[ -e /etc/keepalived/down ] && exit1 || exit 0 "
inerval
1
weight -
5
fall
2
rise
1
}
|
当vrrps事务发生改变时,运行此脚本:只需要在vrrp实例内添加如下内容即可
1
2
3
|
track_script {
chk_schedown
}
|
在两台调度服务器上,重启keepalived进程,加载主配置文件
当手动在/etc/keepalived目录中创建down文件时,主服务就会变成backup服务器,则从backup模式转换为master模式
1
2
|
手动创建down文件,查看主从是否切换
[root@Director1 ~]# touch /etc/keepalived/down
|
1、查看日志信息
日志分析:
1
2
3
|
通过日志信息,不难发现两台调度服务器重新选举主服务来提供服务,因为在Director1相关目录上手动创建了down文件,触发了chk_schedown脚本,
所以Director1的优先级从
101
变为了
96
,所以从主服务器变为了从服务器(BACKUP)移除vip地址,因此Director2变为主(MASTER)服务器,添加vip地址,
以及自主发起arp请求及响应arp请求,来更新记录。
|
2、查看vip地址相关信息
第七步:如果提供的两台应用服务里(web),由于其他原因出现故障,该如何解决呢:
1
2
3
4
5
|
只需要在/etc/keepalived/keepalived.conf,在virtual_server中添加如下内容:
[root@Director1 ~]# vim /etc/keepalived/keepalived.conf
sorry_service
127.0
.
0.1
:
80
然后分别重启keepalived服务进程
注:前提两台调度服务器都提供httpd服务,并且提供web错误页面信息
|
第八步:模拟两台应用程序服务出现故障
1
2
3
4
|
[root@Real1 ~]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[root@Real1 ~]# ssh Real2
'service httpd stop'
Stopping httpd: [ OK ]
|
第九步:到调度服务器上利用ipvsadm工具查看ipvs规则
测试一:利用windows客户端访问172.16.88.100看是否发生变化:
测试二:到其中一台应用程序服务器从新启动httpd进程,并查看ipvsadm规则
1
2
|
[root@Real1 ~]# service httpd restart
[root@Director2 ~]# ipvsadm -L -n
|
再次通过windows客户端访问网页,看是否提供正常web服务
三:通过corosync+pacemaker实现web服务高可用,主要实现步骤:
既然给web应用服务器做高可用,那么httpd进程就不能开机自动运行,而且当前httpd服务属于停止状态,有corosync来自动启动某台的httpd进程
1
2
|
[root@Real1 ~]# service httpd stop && chkconfig httpd off
[root@Real2 ~]# service httpd stop && chkconfig httpd off
|
注:在安装corosync+pacemaker软件包之前,使用yum来安装它们所依赖的软件包:
1
|
[root@Real1 ~]# yum install libibverbs librdmacm lm_sensors libtool-ltdl openhpi-libs openhpi perl-TimeDate -y
|
第一步:在两台Realserver应用服务器上安装corosync+pacemaker软件包,相应软件包列表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
cluster-glue
cluster-glue-libs
heartbeat
openaislib
resource-agents
corosync
heartbeat-libs
pacemaker
corosynclib
libesmtp
pacemaker-libs
注:软件包下载地址:http:
//clusterlabs.org/rpm/。
请根据硬件平台及操作系统类型选择对应的软件包;这里建议每个软件包都使用目前最新的版本。
使用如下命令安装:
# yum -y --nogpgcheck localinstall *.rpm 略过验证码检测,使用本地安装
|
第二步:配置corosync和authkeys文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@Real1 ~]# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
[root@Real1 ~]# vim /etc/corosync/corosync.conf ##编辑corosync主配置文件,并添加如下内容
aisexec {
user: root
group: root
}
service {
name: pacemaker
ver:
0
use_mgmtd: yes
}
并设定此配置文件中 bindnetaddr后面的IP地址为你的网卡所在网络的网络地址
bindnetaddr
172.16
.
0.0
生成节点间通信时用到的认证密钥文件:
[root@Real1 ~]# corosync-keygen
|
注:Real2上也做同样的操作,例如安装包依赖关系及安装corosync+pacemaker软件包。
第三步:将Realserver1上的corosync和authkey复制至Realserver2上即可:
1
|
[root@Real1 ~]# scp -p corosync authkey Real2:/etc/corosync/ ##使用-p选项可以保留原来的属性信息
|
第四步:分别为两个节点创建corosync,生成的日志所在的目录:
1
2
|
[root@Real1 ~]# mkdir /
var
/log/cluster
[root@Real1 ~]# ssh Real2
'mkdir /var/log/cluster'
|
第五步:分别在每个节点上启动corosync进程服务
1
2
3
|
[root@Real1 ~]# service corosync restart
[root@Real1 ~]# ssh Real2
'service corosync restart'
[root@Real1 ~]# crm status
|
◆ 查看corosync启动的相关进程
1
|
[root@Real1 ~]# ps auxf
|
第六步:检查corosync相关日志信息:
1:查看corosync引擎是否正常启动:
1
2
3
4
5
6
7
|
# grep -e
"Corosync Cluster Engine"
-e
"configuration file"
/
var
/log/cluster/corosync.log
May
19
15
:
46
:
30
corosync [MAIN ] Corosync Cluster Engine (
'1.2.7'
): started and ready to provide service.
May
19
15
:
46
:
30
corosync [MAIN ] Successfully read main configuration file
'/etc/corosync/corosync.conf'
.
May
19
15
:
46
:
51
corosync [MAIN ] Corosync Cluster Engine exiting
with
status
0
at main.c:
170
.
May
19
15
:
46
:
54
corosync [MAIN ] Corosync Cluster Engine (
'1.2.7'
): started and ready to provide service.
May
19
15
:
46
:
54
corosync [MAIN ] Successfully read main configuration file
'/etc/corosync/corosync.conf'
.
May
19
15
:
48
:
00
corosync [MAIN ] Corosync Cluster Engine exiting
with
status
0
at main.c:
170
.
|
2、查看初始化成员节点通知是否正常发出:
1
2
3
4
5
|
# grep TOTEM /
var
/log/cluster/corosync.log
May
19
15
:
46
:
54
corosync [TOTEM ] Initializing transport (UDP/IP).
May
19
15
:
46
:
54
corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode
0
).
May
19
15
:
46
:
56
corosync [TOTEM ] The network
interface
[
172.16
.
88.10
]
is
now up.
May
19
15
:
46
:
57
corosync [TOTEM ] A processor joined or left the membership and a
new
membership was formed.
|
3、查看pacemaker是否正常启动:
1
2
3
4
5
6
|
# grep pcmk_startup /
var
/log/cluster/corosync.log
May
19
15
:
46
:
33
corosync [pcmk ] info: pcmk_startup: CRM: Initialized
May
19
15
:
46
:
33
corosync [pcmk ] Logging: Initialized pcmk_startup
May
19
15
:
46
:
33
corosync [pcmk ] info: pcmk_startup: Maximum core file size
is
:
4294967295
May
19
15
:
46
:
33
corosync [pcmk ] info: pcmk_startup: Service:
9
May
19
15
:
46
:
33
corosync [pcmk ] info: pcmk_startup: Local hostname: Real1.example.com
|
第七步:使用如下命令查看集群节点的启动状态:
第八步:配置集群工作属性及集群资源:
◆ 禁用stonith设备和关闭法定票数的默认策略为ingore
◆ 添加集群资源(vip、httpd):
第九步:查看资源的启用状态(crm stauts)
◆ 如果想让两个资源运行在一个Realserver中的话,需要定义组资源,然后将vip和webservice加入到组中即可。
◆ 用windows客户端测试:
第十步:如果其中一个节点发生故障,另一个节点就会取代发生故障的节点,然后对外提供服务。
1
2
|
[root@Real1 ~]# crm node standby
[root@Real1 ~]# crm status
|
再次使用windows客户端测试:
◆ 我们知道限制资源运行在同一个节点上,有两种方法(定义资源组和设置排列约束),下面来如何使用排列约束来限制两个资源在同一个节点上,在设置前,我们将资源组web收到删除。
1
2
3
4
5
6
7
8
|
[root@Real1 ~]# crm resource
crm(live)resource# stop web
crm(live)resource# cleanup web
crm(live)resource# cd
crm(live)# configure
crm(live)configure#
delete
web
crm(live)configure# verify
crm(live)configure# commit
|
◆ 下面就可以使用排列约束来限制两个资源运行在同一个节点上:
◆ 使用crm status命令查看资源运行节点状态并使用netstat
◆ 设置资源启动顺序
◆ 手动迁移资源到另一个节点:
◆ 用windows客户端测试
◆ 定义资源的黏贴性(倾向性),vip资源更倾向运行在Real1主机上:
◆ 使用crm status命令查看当前资源运行在那个节点上,并手动迁移资源,然后手动在上线,看是否vip资源更倾向于节点一上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
[root@Real1 ~]# crm status ##查看当前资源运行在那个节点上
============
Last updated: Sun May
26
22
:
17
:
02
2013
Stack: openais
Current DC: Real1.example.com - partition
with
quorum
Version:
1.1
.
5
-
1.1
.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2
Nodes configured,
2
expected votes
2
Resources configured.
============
Online: [ Real1.example.com Real2.example.com ]
httpd (lsb:httpd): Started Real1.example.com
vip (ocf::heartbeat:IPaddr): Started Real1.example.com
[root@Real1 ~]# crm node standby ##手动迁移资源,并成为被动节点
[root@Real1 ~]# crm status
============
Last updated: Sun May
26
22
:
17
:
26
2013
Stack: openais
Current DC: Real1.example.com - partition
with
quorum
Version:
1.1
.
5
-
1.1
.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2
Nodes configured,
2
expected votes
2
Resources configured.
============
Node Real1.example.com: standby
Online: [ Real2.example.com ]
httpd (lsb:httpd): Started Real2.example.com
vip (ocf::heartbeat:IPaddr): Started Real2.example.com
[root@Real1 ~]# crm node online ##将节点变为主节点
[root@Real1 ~]# crm status ##再次查看资源,因为默认黏贴值为
0
,所以发现vip更倾向运行在节点Real1节点上
============
Last updated: Sun May
26
22
:
17
:
48
2013
Stack: openais
Current DC: Real1.example.com - partition
with
quorum
Version:
1.1
.
5
-
1.1
.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2
Nodes configured,
2
expected votes
2
Resources configured.
============
Online: [ Real1.example.com Real2.example.com ]
httpd (lsb:httpd): Started Real1.example.com
vip (ocf::heartbeat:IPaddr): Started Real1.example.com
|
◆ 设定默认黏贴值为200,然后再手动迁移资源,看vip资源是否更倾向于运行在哪个节点上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
[root@Real1 ~]# crm status
============
Last updated: Sun May
26
22
:
29
:
50
2013
Stack: openais
Current DC: Real1.example.com - partition
with
quorum
Version:
1.1
.
5
-
1.1
.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2
Nodes configured,
2
expected votes
2
Resources configured.
============
Online: [ Real1.example.com Real2.example.com ]
httpd (lsb:httpd): Started Real1.example.com
vip (ocf::heartbeat:IPaddr): Started Real1.example.com
[root@Real1 ~]# crm node standby
[root@Real1 ~]# crm status
============
Last updated: Sun May
26
22
:
30
:
05
2013
Stack: openais
Current DC: Real1.example.com - partition
with
quorum
Version:
1.1
.
5
-
1.1
.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2
Nodes configured,
2
expected votes
2
Resources configured.
============
Node Real1.example.com: standby
Online: [ Real2.example.com ]
httpd (lsb:httpd): Started Real2.example.com
vip (ocf::heartbeat:IPaddr): Started Real2.example.com
[root@Real1 ~]# crm node online
[root@Real1 ~]# crm status ##因为资源的默认粘性为
200
,大于Real1节点上的粘性值,所以vip资源更倾向运行在节点
2
上。
============
Last updated: Sun May
26
22
:
30
:
36
2013
Stack: openais
Current DC: Real1.example.com - partition
with
quorum
Version:
1.1
.
5
-
1.1
.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2
Nodes configured,
2
expected votes
2
Resources configured.
============
Online: [ Real1.example.com Real2.example.com ]
httpd (lsb:httpd): Started Real2.example.com
vip (ocf::heartbeat:IPaddr): Started Real2.example.com
|