理论部分:http://caduke.blog.51cto.com/3365689/1545211
实验环境:
node1.yh.com:172.16.100.15/16/eth0(vmnet1)
node2.yh.com:172.16.100.16/16/eth0(vmnet1)
win7:172.16.100.101/16(vmnet1,ping node)
实验目的:
使用haresource(heatbeat V1)格式的RA和crm牌(heatbeat V2)的CRM进行高可用实验
准备工作:
1、各个节点的uname -n与hostname要一样,最好修改/etc/sysconfig/network主机名
2、在/etc/hosts文件中写入所有HA节点的IP和对应主机名。
3、使用ntp服务器和crontab来保证各节点的时间保持一致。
/etc/ntp.conf的配置如下即可:
driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict 172.16.0.0 mask 255.255.0.0
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
# crontab -l
*/2 * * * * /usr/sbin/ntpdate 172.16.100.15
4、建立双机互信:(2个节点都做)
# ssh-keygen -t rsa -P ''
#ssh-copy-id -i .ssh/id_rsa.pub root@node2.yh.com(节点2执行node1.yh.com)
# date ; ssh node2.yh.com 'date'
5、安装用于测试的服务,比如httpd,但是一定保证开机不能自动启动
# chkconfig httpd off
6、解决依赖关系:
制作rpm包时,解决依赖关系需要安装如下程序包。
# yum -y install glib2-devel libnet-devel libtool-ltdl-devel net-snmp-devel bzip2-devel libxml2-devel openhpi-libs gnutls-devel python-devel
安装制作好的rpm包时,解决依赖关系需要安装如下程序包。
#yum -y install perl-MailTools net-snmp-libs
# yum install PyXML libnet ipvsadm –y
# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
实验配置:
软件安装好以后,所有的配置模板都在/usr/share/doc/heart-2.1.4中,需要复制。
# cp /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} /etc/ha.d/
修改防止主机随意加入的密钥:
/etc/ha.d/authkeys:
auth 1去掉前面的注释符,然后表示使用第几个验证方式。这里选择使用第二种。然后使用openssl产生一个加密字符串放在sha1后面
#1 crc
2 sha1 19d7faa993912bf4
#3 md5 Hello!
#openssl rand -hex 8
19d7faa993912bf4
# chmod 600 authkeys
修改主配置文件:
/etc/ha.d/ha.cf(下面只需要注意不带注释符的即可)
logfile /var/log/ha-log如果不使用messages日志,可以单独使用日志文件
#keepalive 2 心跳时间,默认单位是秒。如果使用毫秒,必须加单位
#deadtime 30 死亡时间,多长时间联系不到,就认为它挂了。不能小于keepalive
#warntime 10 警告时间,多久没有收到心跳了
#initdead 20 一个节点时不成立的,所以这里是等待第二个节点上线的时间。
#udpport 694基于单播或多播传递心跳的端口
#baud 19200指定串行线缆的速率的
#bcast eth0广播方式传递心跳
mcast eth0 225.0.0.1 694 1 0在哪个网卡上监听哪个组播IP的组播端口,后面默认即可。组播地址如果是多人实验环境,那么最好不要使用一个组播IP。225不要动,其他可以改,但也是有范围的。
如果在多块网卡上都提供多播信息,后面的2个值必须配置
第一个是TTL,表示只向下传递几跳。这里表示只能传递1次,避免循环
第二个是loop,0表示不能循环。
最好的方式
mcast eth0 225.4.40.3 694 1 0
#ucast eth0 192.168.1.2单播,后面跟的是对方的IP地址。这种方式不好。如果有多个,需要些多个。由于配置是有所变动的,所以并不是直接复制的。
auto_failback on是不是自动执行故障转回的。当node1为主节点,但是挂掉后,再恢复时,会自动恢复其主节点地位。
#stonith baytech /etc/ha.d/conf/stonith.baytech
命令行中stonith -L 可以列出所有支持stonith的RA资源代理。
每个不同的设备都有自己的配置参数。
可以使用meatware。
这里是实验环境也可以不使用。但有些环境必须使用才能启动服务。
#watchdog /dev/watchdog帮助主进程监视子进程的。如果子进程挂掉,可以自动重启,但是要启动,必须保证内核能够支持这个虚拟设备。如果自己收不到自己的心跳信息,就会将自己的主机重启。
node key3这里的key3是主机名,而且这个主机名必须和uname -n一样。
而且写出所有的节点。
node node1.yh.com
node node2.yh.com
ping 172.16.100.101这里是ping node.后面还可以ping组
compression bz2使用什么压缩
compression_threshold 2当报文大于多少时才压缩,否则浪费CPU。
修改资源配置文件:
/etc/ha.d/haresource:
这里面的内容定义了资源优先在哪个节点上启动,所以只需要定义一个节点即可。
node1.yh.com 172.16.100.10/16/eth0 httpd
这里定义了IP/netmask/配置网卡,httpd服务。当然还可以有文件系统,比如nfs
node1.yh.com 172.16.100.10/16/eth0 Filesystem::172.16.100.1:/web/htdocs::nfs(选用)
文件系统的定义方法:Filesystem::nfsIP:/目录::本地挂载目录::文件系统类型
注意:OCF的RA相比LSB格式的脚本功能更加强大,但如果使用IPaddr2格式的RA在使用ifconfig命令时看不到的,因为他使用的是ip addr设置的。
复制配置文件:
# scp ha.cf authkeys haresources 172.16.100.16:/etc/ha.d
启动heartbeat服务:
# service heartbeat start
# ssh node2.yh.com ‘service heartbeat start’(有必要这样做)
# ss -lanpu | grep 694(已经被监听)
# 在节点上查看httpd服务器的状态。
使用node1.yh.com成为备用节点:
# /usr/lib64/heartbeat/hb_standby(node1上执行,然后node2称为了主节点)
# /usr/lib64/heartbeat/hb_tabkeover(node1上执行,node1继续成为主节点)
/usr/lib64/heartbeat/目录下还有其他命令,比如情况arp缓存的命令。
当然,也可以使node1直接宕机,使得node2成为主节点。
但由于配置了auto_failback,node1恢复正常时,node1会再次成为主节点。
使用图形界面的配置工具:
1、/etc/ha.d/ha.cf中添加’crm on或者是’crm respawn’,并复制到node2.yh.com,
然后重启两个节点的服务。这时/etc/ha.d/haresource中的配置便失效了。
2、由于打开图形界面需要用户hacluster,所以需要给此用户加一个密码。
而且这个用户只能使用这个密码在这个主机上登录,并不是通用的。
# passwd hacluster
3、启动图形界面
# hb_gui &
配置图形界面下的高可用服务:
Connection→输入密码→OK
使用Resources添加单个资源:
增加IP资源:
右击Reasource→Add New Item→native→Resource ID:webip、
Type:IPaddr(选中任意选项,输入ip进行快速搜索,属于LSB格式,ifconfig查看。
IPaddr2必须使用ip addr查看,且ipaddr2与lvs有冲突)
Parameters:ip输入172.16.100.10,Add parameters增加参数可以选择网卡nic,
cidr_netmask选择使用子网掩码;broadcast选择使用广播地址;
lvs_support选择添加lvs支持,然后Value中添加true
在最下面也可以定克隆和主从资源。
最后Add。
选中资源webip,然后在右侧栏中有Attributes有target_role,
其值started表示集群启动时就启动资源。stopped表示集群启动时不启动资源。
增加文件系统资源:
Resource ID:webstore
device: 172.16.100.1:/web/htdocs(nfs资源)
directory: /web/htdocs(节点上挂载点)
fstype: nfs(文件系统类型,当然也可以添加集群文件系统ocfs2)
增加web服务:
Resource ID:webserver
httpd选中即可点击Add。
定义资源约束:
定义好上面的资源后,会发现各个服务是分别运行在不同的节点上的,且无法改变。
这时就需要使用group来将其绑定,但是只有组资源是无法加入现有资源的。
所以定义资源约束是最好的选择。
定义排列约束colocations:使得web资源都在同一个节点运行
Constraints→colocations→Item Type:colocation→ID:webip_with_webstore
From:webip To:webstore Score:INFINITY
在下面的描述中可以看到,此配置时以To:webstore为准的。
1:确保webip和webstore在相同的节点上。
2:假如webstore不能配置在某节点上,webip同样不能配置在那个节点上。
3:假如webip不能配置在某个节点上,webstore不会受到影响。
Constraints→colocations→Item Type:colocation→ID:webstore_with_webserver
From:webstore To:webserver Score:INFINITY
定义顺序约束Orders:使得web资源启动按照IP→Filesystem→httpd
Constraints→Order→Item Type:order→ID:webstore_after_webip
From:webstore To:webip
描述:此时已webip为准。
1、webip先启动,webstore后启动。
2、假如webip不能启动,webstore也不用启动。
3、先停止webstore,再停止webip。
4、假如不能停止webstore,那么webip也不能停止。
定义资源组group:
Resources→Item Type:group→ID:mysqlservice→Resource ID:mysqlip
Type:IPaddr2 ip:172.16.100.11 nic:eth0
mysqlservice→Item Type:native→Resource ID:mysqlstore
Type:Filesystem
device :172.16.100.1:/mysqldata
directory:/mydata/
fstype :nfs
mysqlservice→Item Type:native→Resource ID:mysqlserver
Type:mysqld(使用lsb格式即可)
定义nfs服务:
在定义web服务时,只需要将nfs输出目录输出即可。但是定义mysql服务却又诸多限制。
mysql服务一般不会使用nfs,因为nfs是文件级别的文件系统,性能差等
一般mysql会使用SAN块设备,廉价的可以是drbd分布式块。
但这里为了实验,也可以使用nfs。但需要注意以下几点:
1、mysql用户的ID、GID包括nfs设备在内的节点都要相同
2、/etc/exports文件:/mysqldata 172.16.0.0/16(rw,async,no_root_squash)
3、在某一个节点挂载并初始化mysql后,需要将的属主、属组都改为mysql
# chown –R mysql.mysql /mysqldata/data(mysql产生的目录)
4、如果还有其他服务使用nfs,不能重启nfs,需要重新输出即可
# exportfs -arv
将以上HA节点当做lvs的分发器的实现:
1、在任意节点将ipvsadm规则做出来,复制到各HA节点,并清空运行规则
当然其他配置照旧,比如打开路由转发等。
# service ipvsadm save
# scp /etc/sysconfig/ipvsadm node2.yh.com:/etc/sysconfig
# ipvsadm –C
2、添加ipvs的group:
在普通的LVS配置时,需要手动配置VIP和ipvs规则,所以这里仍然是分开的:
ipvs提供规则,VIP需要单独配置
ipvsservice→ipvsIP→ipvsIP:
IPaddr2→ip:172.16.100.11,nic:eth0,cidr_netmask:32,lvs_support:true
ipvsservice→ipvsrules→ipvsrules:
ipvsadm添加即可
关于LSB脚本:
如果手动写LSB脚本,那么这个状态必须有固定输出格式:
running正在运行
stopped已经停止,不能写为not running,因为不识别not。
将以上面的ipvs高可用使用ldirectord进行高可用:
说明:在生产环境中,如果不是自己提供监控脚本,ipvsadm的实用性并不高。因为ipvs不能实时监测后端RS的健康状态,所以后续又出现了ldirectord项目,它可以针对不同的后端服务采用不同的监测手段,而不是简单的探测RS的存活状态。比如提供http、https、imap、mysql、smtp等监测手段。所以相比ipvsadm,ldirectord更为实用。
但是ldirector只是调用ipvs,并提供健康状态监测。
ldirectord可以脱离heartbeat高可用服务单独使用,且由于其在/etc/init.d/ldirectord有服务脚本,所以可以当做服务启动、关闭。
在配置ldirector高可用时,类似于ipvs的高可用,依然需要在heartbeat配置VIP,然后ldirectord提供规则。
安装:# rpm -ivh heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm
查看:# rpm -ql heartbeat-ldirectord
/etc/ha.d/resource.d/ldirectord 这是一个OCF的RA代理脚本
/etc/init.d/ldirectord可以直接使用service 启动、停止
/etc/logrotate.d/ldirectord日志滚动工具
/usr/sbin/ldirectord
/usr/share/doc/heartbeat-ldirectord-2.1.4
/usr/share/doc/heartbeat-ldirectord-2.1.4/COPYING
/usr/share/doc/heartbeat-ldirectord-2.1.4/README
/usr/share/man/man8/ldirectord.8.gz帮助文档
/usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf配置样例,需要复制到/etc/ha.d下修改。
配置:
1、# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d
2、# vim /etc/ha.d/ldirectord.cf
# Global Directives 全局配置
checktimeout=3 为防止RS负载过大等情况造成短时间失联,允许多等待的时间
checkinterval=1 检查健康状况的时间间隔
#fallback=127.0.0.1:80
autoreload=yes 改动配置文件时,程序会自动重新载入配置,无需手动干预
logfile="/var/log/ldirectord.log" 在本机上使用单独的日志
#logfile="local0" syslog或rsyslog的日志
#emailalert="admin@x.y.z" 出现问题时接受报警信息的Email
#emailalertfreq=3600 邮件发送频率
#emailalertstatus=all 发送最详细的错误信息
quiescent=yes 以静默模式工作。下面有详细解释。
# Sample for an http virtual service定义单个服务的虚拟主机。
virtual=172.16.100.8:80 定VIP:port,而下面的内容不能顶头写
real=172.16.100.1:80 gate 10
定义RS的IP:port,lvs模式为DR,权重为10。权重默认为1,未写
real=172.16.100.172:80 gate 11
fallback=127.0.0.1:80 gate
当所有RS宕机时,提供ldirectord服务的主机返回的错误信息
service=http 定义健康状态监测时具体检测哪项服务。详见下面解释
checktype=negotiate 定义检测RS健康状态时的机制。详见下面解释
request=".test.html" 测试请求RS的httpd服务的哪个页面。此lvs服务的全局配置
receive="OK" 使用正则表达式检测".test.html"中是否包含"OK"
virtualhost=172.16.100.8
如果VIP提供的是多个虚拟主机,则在这里写。
由于这里是测试环境,所以直接写VIP。
当只有一个virtualhost时,后面不能再加一个假的
而且后面的request和receive可以删除
scheduler=wrr 调度方法
#persistent=600 定义持久连接时间
#netmask=255.255.255.255
protocol=tcp 见详解
checkport=80
详解:
quiescent = yes|no
当为yes时,即使RS宕掉,ldirectord依然会基于持久连接模板向发送数据。
所以需要改为no。或者采用以下方法清除持久连接模板中的数据:
echo 1 > /proc/sys/net/ipv4/vs/expire_quiescent_template
protocol = tcp|upd|fwm
fwm为防火墙标记,需要使用iptables的mangle表的PREROUTING进行打标记。
后面“virtual=1”就是表示使用防火墙标记。
checktype = connect|external|negotiate|off|ping|checktimeout
connect:纯粹的连接测试
external:调用自己的检测脚本。需指定路径checkcommand=/path/to/script
negotiate:自动协商。
service = dns|ftp|http|https||imap|imaps|ldap|mysql|nntp|none|oracle|pgsql|
pop|pops|radius|simpletcp|sip|smtp
当checktype = negotiate时,会使用以上服务进行检测。
所有ldirectord节点的其他配置:
1、# scp /etc/ha.d/ldirectord.cf node2.yh.com:/etc/ha.d
2、# service httpd start
实验环境时,各ldirectord节点httpd需要启动,且提供的错误页面最好不同。
使用CRM图形界面配置ldirectord的服务:
以上内容只是为ldirectord提供了一个ipvs规则和其运行环境。
真正使ldirectord服务变的高可用,就需要将其加入HA服务。否则只能单机使用。
具体步骤:
Ressources→Item Type:group→ID:ldirectordcluster→Resource ID:webip
Type→IPaddr2→ip:172.16.100.11,nic:eth0,cidr_netmask:32,lvs_support:true
ldirectordcluster→Item Type:native→Resource ID:ldirectord
Type→ldirectord(ocf)→configfile:/etc/ha.d/ldirectord.cf
后端RS上的操作:
1、定义arp_ignore和arp_announce
2、添加VIP
3、添加主机路由,使得从RS的eth0接口出去的数据包源IP是VIP