实验环境:rhel6.5
lvs中的常用术语约定
主机相关:
Director:调度器
Real Server:RS,后端真正提供服务的主机。
IP地址相关:
Client:CIP,客户端IP
Director Virtual IP:VIP,调度器面向客户端的IP。由于调度器会成为单点,因此需要对调度器做高可用。由此,如果A调度器故障了,此地址是要转移到B调度器上的。
Director IP:DIP,调度器面向后端的IP
Real IP:RIP,后端服务器的IP
fullnat无非就是nat,但DIP和RIP之间可以经过路由进行转发。当请求到来时,源目IP分别为CIP和VIP。到达调度器后,还是由ipvs挑选一台主机,但由于DIP和RIP并不在同一个网段,所以ipvs会将请求的报文源目IP分别改为DIP和RIP。RS收到报文后,就会将响应报文发给DIP,这是毋庸置疑的。调度器在收到报文,通过在内部追踪nat表以后,将响应报文的源目IP分别改为VIP和CIP,于是报文就发给客户端。这种源目IP都进行修改的LVS类型就是fullnat。
总结:通过请求报文的源地址为DIP,目标为RIP来实现转发。对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发。
此架构能扛住每秒20W的并发,如果对并发要求不是特别的高,但又希望使用更复杂的内网模型,fullnat是一个不错的选择。但内核不支持fullnat,要从内核编译,因此安装时间不短。
一.fullnat模式构建
下载安装kernel包
#rpm -ivh kernel-2.6.32-220.23.1.el6.src.rpm
#yum install -y rpm-build rng-tools
#rngd -r /dev/urandom //加快编译速度
#cd ~/rpmbuild/SPECS
#rpmbuild -bp kernel.spec //解开源码包并打补丁,即只做准备
这时会提示缺很多组件,安装之。
#rpmbuild -bp kernel.spec
#cd ~/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6
#tar zxf Lvs-fullnat-synproxy.tar.gz
#cd lvs-fullnat-synproxy
#cp lvs-2.6.32-220.23.1.el6.patch ../linux-2.6.32-220.23.1.el6.x86_64/
#cd linux-2.6.32-220.23.1.el6.x86_64/
#yum install -y patch
#vim .config
将CONFIG_OUTPUT_FORMAT改为“elf64-x86_64”
将CONFIG_ARCH_DEFCONFIG=”arch/x86/configs/x86_64_defconfig”
#vim Makefile
将EXTRAVERSION改为-220.23.1.el6
#patch -p1<lvs-2.6.32-220.23.1.e16.patch //选项要忽略掉第一层目录,从当前目录开始查找,-p0 选项要从当前目录查找目的文件(夹)
#cd configs
#make -j4 //以四核编译
漫长等待……
#make modules_install
#make install
#vim /boot/grub/grub.conf
将default改为0 ,默认启动新内核
#reboot
#tar zxf lvs-tools.tar.gz -C ~
安装keepalived
#cd ~/tools/keepalived
#./configure --with-kernel-dir=”/lib/modules/`uanme -r`/build”
#make && make install
安装ipvsadm
#cd ~/tools/ipvsadm
#make && make install
pacemaker配置
pacemaker是一个群集资源管理器。它实现最大可用性群集服务(亦称资源管理)的节点和资源级故障检测和恢复使用您的首选集群基础设施(OpenAIS的或Heaerbeat)提供的消息和成员能力。它可以做乎任何规模的集群,并配备了一个强大的依赖模型,使管理员能够准确地表达群集资源之间的关系(包括顺序和位置)。几乎任何可以编写脚本,可以管理作为心脏起搏器集群的一部分。pacemaker作为一个资源管理器,不提供心跳信息。pacemaker是一个延续的CRM(亦称Heartbeat V2资源管理器),最初是为心跳,但已经成为独立的项目。
Heartbeat 到了V3版本后,拆分为多个项目,其中pacemaker就是拆分出来的资源管理器。
Heartbeat 3.0拆分之后的组成部分:
·Heartbeat:将原来的消息通信层独立为heartbeat项目,新的heartbeat只负责维护集群各节点的信息以及它们之前通信;
·Cluster Glue:相当于一个中间层,它用来将heartbeat和pacemaker关联起来,主要包含2个部分,即为LRM和STONITH。
·Resource Agent:用来控制服务启停,监控服务状态的脚本集合,这些脚本将被LRM调用从而实现各种资源启动、停止、监控等等。
Pacemaker : 也就是Cluster Resource Manager (简称CRM),用来管理整个HA的控制中心,客户端通过pacemaker来配置管理监控整个集群。
安装
在server1和server2上
#yum install -y pacemaker corosync
Coreosync:实现HA心跳信息传输。在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。它是一个新兴的软件,2008年推出,但其实它并不是一个真正意义上的新软件,在2002年的时候有一个项目Openais它由于过大,分裂为两个子项目,其中可以实现HA心跳信息传输的功能就是Corosync ,它的代码60%左右来源于Openais. Corosync可以提供一个完整的HA功能,但是要实现更多,更复杂的功能,那就需要使用Openais了。Corosync是未来的发展方向。在以后的新项目里,一般采用Corosync,而hb_gui可以提供很好的HA管理功能,可以实现图形化的管理。另外相关的图形化有RHCS的套件luci+ricci.
在server1上,
#cd /etc/corosync/
#cp corosync.conf.example corosync.conf
#vim corosync.conf
bindnetaddr: 172.25.9.0 #设定网段
mcastaddr: 226.94.1.1 #多波地址
mcastport:5405 #多波端口
service{
name:pacemaker #添加pacemaker服务
ver:0 #0为启动corsync时自动启动pacemaker服务,1为不接管服务
}
#/etc/init.d/corosync start
在server2上执行同样操作。
pacemaker本身只是一个资源管理器,我们需要一个接口才能对pacemker上的资源进行定义与管理,而crmsh即是pacemaker的配置接口,从pacemaker 1.1.8开始,crmsh 发展成一个独立项目,pacemaker中不再提供。crmsh提供了一个命令行的交互接口来对Pacemaker集群进行管理,它具有更强大的管理功能,同样也更加易用,在更多的集群上都得到了广泛的应用,类似软件还有 pcs;
注:在crm管理接口所做的配置会同步到各个节点上(commit命令之后)
安装crm
在server1和server2上
#yum install -y crmsh-1.2.6.0.rc2.2.1.x86_64.rpm pssh-2.3.1-2.1.x86_64.rpm
资源代理类型: lsb, ocf, stonith, service
资源代理的提供程序: heartbeat , pacemaker
资源代理名称:即resource agent, 如:IPaddr2,httpd, mysql
crm中configure的常用命令
node define a cluster node # 定义一个集群节点
primitive define a resource # 定义资源
monitor add monitor operation to a primitive # 对一个资源添加监控选项(如超时时间,启动失败后的操作)
group define a group # 定义一个组类型(将多个资源整合在一起)
clone define a clone # 定义一个克隆类型(可以设置总的克隆数,每一个节点上可以运行几个克隆)
ms define a master-slave resource # 定义一个主从类型(集群内的节点只能有一个运行主资源,其它从的做备用)
order order resources # 资源的启动的先后顺序
property set a cluster property # 设置集群属性
rsc_defaults set resource defaults # 设置资源默认属性(粘性)
fencing_topology node fencing order # 隔离节点顺序
op_defaults set resource operations defaults # 设置资源默认选项
show display CIB objects # 显示集群信息库对
commit commit the changes to the CIB # 将更改后的信息提交写入CIB
verify verify the CIB with crm_verify # CIB语法验证
upgrade upgrade the CIB to version 1.0
save save the CIB to a file # 将当前CIB导出到一个文件中(导出的文件存于切换crm 之前的目录)
load import the CIB from a file # 从文件内容载入CIB
help show help (help topics for list of topics) # 显示帮助信息
end go back one level # 回到第一级(crm(live)#)
在server2上
#crm_mon //监控crm
在server1上
#crm configure
#show
#property stonith-enabled=false //关闭stonith
注:fence机制--Stonith概述
stonith是“shoot the other node in the head”的首字母简写,它是Heartbeat软件包的一个组件,它允许使用一个远程或“智能的”连接到健康服务器的电源设备自动重启失效服务器的电源,stonith设备可以关闭电源并响应软件命令,运行Heartbeat的服务器可以通过串口线或网线向stonith设备发送命令,它控制高可用服务器对中其他服务器的电力供应,换句话说,主服务器可以复位备用服务器的电源,备用服务器也可以复位主服务器的电源。
注意:尽管理论上连接到远程或“智能的”循环电源系统的电力设备的数量是没有限制的,但大多数stonith实现只使用两台服务器,因为双服务器stonith配置是最简单的,最容易理解,它能够长时间运行且不会降低系统的可靠性和高可用性。
#commit //提交配置使配置生效,修改后没提交系统不会保存更改的信息
添加vip服务
#primitive vip ocf::heartbeat::IPaddr2 params ip=172.25.0.100 cidr_netmask=32 op monitor interval=30s //定义资源vip 172.25.0.100,子网掩码为255.255.255.255 ,每隔30秒监控
#cmomit
server2上监控如下:
忽略法定节点数:(集群不会以为节点不够而失效)
在server1上
#property no-quorum-policy=ignore#commi #将修改同步到其他节点
#bye //退出crm
#/etc/init.d/corosync stop
这时监控如下
server1的pacemaler关掉后vip由server2接管,体现了pacemaker的高可用性
#/etc/init.d/corosync start
添加apache服务
#primitive website ocf::heartbeat:apache params configfile=/etc/httpd/conf/httpd.conf op monitor interval=60s
#commit
注意为了监控Apache的健康状态,并在它挂掉的时候恢复Apache服务,server-status URL是可用的:
在server1和server2上
vim /etc/httpd/conf/httpd.conf
<Location /server-status>
SetHandler server-status
Order deny,allow
Allow from 127.0.0.1
</Location>
粘滞服务(使得服务与vip在同一主机上运行)
colocation httpd-with-ip inf: httpd vip #方法一
group apache vip httpd #方法二
commi #将修改同步到server2
删除服务:
#delete website-with-ip
#commit
#cd
#node //进入节点设置
#standby server2.example.com //使server2离线
#online server2.example.com // 使server2在线
#bye
添加drbd
#drbdadm primary sqldata
#crm configure
#primitive sqldata ocf:linbit:drbd params drbd resource=sqldata op monitor interval=60s
#ms sqldataclone sqldata meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
#bye
启动fence
#crm configure
#property stonith-enabled=true
#primitive vmfence stonith:fence_xvm params pcmk_host_map=”server1.example.com:vm1;server2.example.com:vm2” // server1.example.com、server2.example.com是节点名,vm1/2为虚拟机名称
#commit
添加文件系统
#primitive sqlfs ocf:heartbeat:Filesystem params device=/dev/drbd1 directory=/var/lib/mysql fstype=ext4
#colocation sqlfs_on_drbd inf: sqlfs sqldataclone:Master #order sqlfs-after-sqldata inf: sqldataclone:promote sqlfs:start
#commit
添加mysql
#primitive mysql lsb:mysqld op monitor interval=60s#group mygroup vip sqlfs mysql #将vip,文件系统,mysql进行粘滞
#commit