主机名 |
接口 |
Ip |
用途 |
|
MASTER |
node1.xmfb.com |
Eth0 |
172.16.4.100 |
提供高可用服务节点 |
BACKUP |
node2.xmfb.com |
Eth0 |
172.16.4.101 |
备用节点,随时准备接替主节点 |
NFS |
NFS |
Eth0 |
172.16.4.200 |
提供共享存储 |
VIP |
Eth0:0 |
172.16.4.1 |
虚拟ip |
配置中所有系统均使用centos6.6 64位
配置HA集群的前提:
(1)节点间时间必须同步:使用ntp协议实现;
[root@node1 ~]# ntpdate 172.16.0.1 #172.16.0.1是我这里的时间服务器 [root@node2 ~]# ntpdate 172.16.0.1
(2) 节点间需要通过主机名互相通信,必须解析主机至IP地址;
(a)建议名称解析功能使用hosts文件来实现;
(b)通信中使用的名字与节点名字必须保持一致:“uname -n”命令,或“hostname”展示出的名字保持一致;
[root@node1 ~]# sed -i's@\(HOSTNAME=\).*@\1node1.xmfb.com@g' /etc/sysconfig/network [root@node1 ~]# hostname node1.xmfb.com [root@node1 ~]# echo "172.16.4.100node1.xmfb.com node1" >> /etc/hosts [root@node1 ~]# echo "172.16.4.101node2.xmfb.com node2" >> /etc/hosts [root@node2 ~]# sed -i's@\(HOSTNAME=\).*@\1node2.xmfb.com@g' /etc/sysconfig/network [root@node2 ~]# hostname node2.xmfb.com [root@node2 ~]# echo "172.16.4.100node1.xmfb.com node1" >> /etc/hosts [root@node2 ~]# echo "172.16.4.101 node2.xmfb.comnode2" >> /etc/hosts
(3)考虑仲裁设备是否会用到;
(4) 建立各节点之间的root用户能够基于密钥认证;
#ssh-keygen -t rsa -P ''
#ssh-copy-id -i /root/.ssh/id_rsa.pub root@HOSTNAME
[root@node1 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa-P '' [root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pubnode2 [root@node2 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa-P '' [root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pubnode1
注意:定义成为集群服务中的资源,一定不能开机自动启动;因为它们将由crm管理;
说明:heartbeat在centos6.6上没有被添加到自带的rpm包中,所以需要去网上自行下载rpm包安装。
Heartbeat安装包功能说明:
heartbeat-2.1.4-12.el6.x86_64.rpm 核心包 heartbeat-debuginfo-2.1.4-12.el6.x86_64.rpm 调试包 heartbeat-devel-2.1.4-12.el6.x86_64.rpm 开发包 heartbeat-gui-2.1.4-12.el6.x86_64.rpm 提供图形配置页面 heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm 为ipvs提供后端健康状态检查的工具 heartbeat-pils-2.1.4-12.el6.x86_64.rpm 依赖的一些库 heartbeat-stonith-2.1.4-12.el6.x86_64.rpm 提供stonith完成节点隔离
安装方法:
[root@node1~]# yum �Cy install net-snmp-libs libnet PyXML [root@node1 ~]# rpm -ivhheartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpmheartbeat-stonith-2.1.4-12.el6.x86_64.rpm [root@node2 ~]# yum install net-snmp-libs libnetPyXML [root@node2 ~]# rpm -ivhheartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpmheartbeat-stonith-2.1.4-12.el6.x86_64.rpm
配置文件:
/etc/ha.d目录下:
ha.cf:主配置文件,定义各节点上的heartbeat HA集群的基本属性;
authkeys:集群内节点间彼此传递消息时使用加密算法及密钥;
haresources:为heartbeat v1提供资源管理器配置接口;v1版本专用的配置接口;
heartbeat没有在/etc/ha.d下面提供配置文件,但是在/usr/share/doc/heartbeat-2.1.4/下面提供了样例配置文件,可以直接拿来使用。
复制配置文件到/etc/ha.d目录下
[root@node1 ~]# cp/usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} /etc/ha.d/ [root@node1 ~]# ll /etc/ha.d/ total 48 -rw-r--r-- 1 root root 645 May 30 10:15 authkeys -rw-r--r-- 1 root root 10539 May 30 10:15 ha.cf -rwxr-xr-x 1 root root 745 Sep 10 2013 harc -rw-r--r-- 1 root root 5905 May 30 10:15 haresources drwxr-xr-x 2 root root 4096 May 30 09:58 rc.d -rw-r--r-- 1 root root 692 Sep 10 2013 README.config drwxr-xr-x 2 root root 4096 May 30 09:58 resource.d -rw-r--r-- 1 root root 7864 Sep 10 2013 shellfuncs
#start #debugfile /var/log/ha-debug #是否启用debug功能 logfile /var/log/ha-log #指定日志文件位置 #logfacility local0 #记录日志的设施,如果local0,没有被指定文件,则无法记录日志 日志推荐设置方法,注释logfacility和debugfile,启用logfile #keepalive 2 #多长时间发一次心跳,单位为秒 #deadtime 30 #死亡时间,30秒接受不到对方心跳信息,则认为对方当机了 #warntime 10 #等待心跳时间,此值需要设置大于keepalived,小于deadtime #initdead 120 #节点启动时等待第二个节点多长时间,如果等待不到不建立集群 #udpport 649 #heartbeat监听的端口 指定传递心跳信息的串行线缆设备 #serial /dev/ttyS0 # Linux #serial /dev/cuaa0 # FreeBSD #serial /dev/cuad0 # FreeBSD 6.x #serial /dev/cua/a # Solaris #设置广播发送心跳信息 bcast eth0 # Linux 在一个网卡广播 #bcast eth1eth2 # Linux 在多个网卡广播 #bcast le0 # Solaris #bcast le1le2 # Solaris mcast eth0 225.0.0.181 694 1 0 #心跳方式 参数解释: Mcast:多播 eth0:指定心跳的网卡 255.0.0.181:多播地址 649:多播端口 1:ttl值 0:多播心跳 #设置单播发送心跳信息(不推荐使用) #ucast eth0 192.168.1.2 #地址填写的是对方的地址 auto_failback on #自动故障转回(主节点坏了,对方接管了,我修好了,是不是自动回来) #设置当前集群的节点,node后面的名字需要和uname �Cr的名字保持一致 node node1.xmfb.com node node2.xmfb.com #ping 10.10.10.254 #指定pingnode #ping_group group1 10.10.10.254 10.10.10.253 #指定多个主机为仲裁设备 #compression bz2 #是否对节点传递的信息进行压缩 #compression_threshold 2 #压缩的起点,小于起点不进行压缩
说明,如果心跳方式设置为多播,需要网卡支持:出现MULTICAST就是支持多播
[root@node1 ~]# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdiscnoqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:22:c5:c2 brd ff:ff:ff:ff:ff:ff
启动网卡多播的命令
[root@node1 ~]# ip link set eth0 multicast on
# Authentication file. Must be mode600 #权限必须为600 # # # Must have exactly one auth directive at thefront. # auth send authentication usingthis method-id # # Then,list the method and key that go with that method-id # # Available methods: crc sha1, md5. Crc doesn't need/want a key. #设置认证方式crc、 sha1、 md5其中Crc的方式不需要密钥 # # Younormally only have one authentication method-id listed in this file # # Putmore than one to make a smooth transition when changing auth # methods and/or keys. # # # sha1 is believed to be the "best",md5 next best. #sha1是最好的,md5下最好 # # crcadds no security, except from packet corruption. #crc不***全 # Use only on physically secure networks. # #auth 1 #1 crc #2 sha1 HI! #3 md5 Hello! 生成md5编码 [root@node1 ~]# dd if=/dev/random count=1 bs=512 |md5sum 0+1 records in 0+1 records out 128 bytes (128 B) copied, 0.000120379 seconds, 1.1MB/s e797b227dba49b6b744f8175b5d7ef52 - #md5编码 设置配置文件,最后两行添加如下内容 [root@node1 ~]# vim /etc/ha.d/authkeys auth 1 #auth的编号和选择的认真方式编号必须一致,如果上面是2下面也必须是2 1 md5e797b227dba49b6b744f8175b5d7ef52 如果是sha1的方式,那么最后两行添加如下内容 auth 1 1 sha147e9336850f1db6fa58bc470bc9b7810eb397f04
设置主节点 设置虚拟IP地址 设置集群服务
node1.xmfb.com IPaddr::192.168.100.10/24/eth0 httpd
部署heartbeat实现web高可用集群
Centos6已经自带了httpd,无需安装,只需要设置不同的页面,测试web是否正常,如果正常就关闭服务,而且不能让服务开机自动启动
[root@node1 ~]# echo "<h1>node1.xmfb.com</h1>" >>/var/www/html/index.html [root@node1 ~]# service httpd start [root@node2 ~]# echo "<h1>node2.xmfb.com</h1>" >>/var/www/html/index.html [root@node2 ~]# service httpd start
访问测试是否正常
[root@node2 ~]# curl http://node1 <h1>node1.xmfb.com</h1> [root@node2 ~]# curl http://node2 <h1>node2.xmfb.com</h1>
关闭服务
[root@node1 ~]# service httpd stop [root@node2 ~]# service httpd stop
配置ha.cf主要就是修改心跳方式和添加集群节点,ping node和日志,其他功能保持默认即可。
logfile /var/log/ha-log #设置日志记录方式 #logfacility local0 mcast eth0 225.0.0.118 694 1 0 #指定心跳方式为多播 node node1.xmfb.com #设置集群节点 node node2.xmfb.com ping 172.16.0.1 #设置仲裁设备为自己的网关
修改authkeys配置文件
设置权限为600,如果不设置会无法启动
[root@node1 ~]# chmod 600 /etc/ha.d/authkeys
生成md5编码
[root@node1 ~]# dd if=/dev/random count=1 bs=512 |md5sum 0+1 records in 0+1 records out 128 bytes (128 B) copied, 0.000120379 seconds, 1.1MB/s e797b227dba49b6b744f8175b5d7ef52 - #md5编码
设置配置文件,最后两行添加如下内容
[root@node1 ~]# vim /etc/ha.d/authkeys auth 1 1 md5 e797b227dba49b6b744f8175b5d7ef52
设置主机点为node1.benet.com 虚拟IP地址为192.168.100.10作用在eth0网卡 集群服务为httpd
[root@node1 ~]# vim /etc/ha.d/haresources node1.xmfb.com IPaddr::172.16.4.1/24/eth0 httpd
[root@node1 ha.d]# scp authkeys haresources ha.cfnode2:/etc/ha.d/ authkeys 100% 652 0.6KB/s 00:00 haresources 100%5951 5.8KB/s 00:00 ha.cf 100% 10KB 10.3KB/s 00:00
[root@node1 ~]# service heartbeat start [root@node1 ~]# ssh node2 'service heartbeat start'
查看主节点已经启动了80服务和VIP地址
[root@node1 ~]# netstat -lnt | grep :80 tcp 0 0 :::80 :::* LISTEN [root@node1 ~]# ifconfig eth0 Link encap:Ethernet HWaddr00:0C:29:22:C5:C2 inet addr:172.16.4.100 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fe22:c5c2/64 Scope:Link UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:125042 errors:0 dropped:0overruns:0 frame:0 TXpackets:27145 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RXbytes:148587982 (141.7 MiB) TXbytes:2926379 (2.7 MiB) eth0:0 Link encap:Ethernet HWaddr00:0C:29:22:C5:C2 inet addr:172.16.4.1 Bcast:172.16.4.255 Mask:255.255.255.0 UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UPLOOPBACK RUNNING MTU:65536 Metric:1 RXpackets:0 errors:0 dropped:0 overruns:0 frame:0 TXpackets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RXbytes:0 (0.0 b) TX bytes:0 (0.0 b)
使用VIP地址访问web正常
/usr/lib64/heartbeat/目录下面有很多的测试脚本,其中hb_standby就是将自己转换为被动节点的脚本
[root@node1 ~]# sh /usr/lib64/heartbeat/hb_standby
设置完成之后查看备节点已经启用web服务和虚拟IP地址
[root@node2 ~]# netstat -lnt | grep 80 tcp 0 0 :::80 :::* LISTEN [root@node2 ~]# ifconfig eth0 Link encap:Ethernet HWaddr00:0C:29:F1:DD:B2 inet addr:172.16.4.101 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fef1:ddb2/64 Scope:Link UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXpackets:26398 errors:0 dropped:0 overruns:0 frame:0 TXpackets:3469 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RXbytes:11756906 (11.2 MiB) TXbytes:454918 (444.2 KiB) eth0:0 Link encap:Ethernet HWaddr00:0C:29:F1:DD:B2 inet addr:172.16.4.1 Bcast:172.16.4.255 Mask:255.255.255.0 UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UPLOOPBACK RUNNING MTU:65536 Metric:1 RXpackets:10 errors:0 dropped:0 overruns:0 frame:0 TXpackets:10 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RXbytes:985 (985.0 b) TX bytes:985 (985.0b)
使用VIP访问web服务,出现的是node2的页面
正常环境,由于VIP地址在node1节点,所以请求会到node1
Node1故障情况:vip地址和httpd以及NFS都会漂移到node2节点继续提供服务。
缺点:在集群中使用NFS就意味这集群中出现了单点,如果生产环境有条件最好使用分布式存储。
[root@NFS ~]# mkdir /www [root@NFS ~]# echo "NFS" >/www/index.html [root@NFS ~]# vim /etc/exports /www 172.16.0.0/16(ro) [root@NFS ~]# service nfs start
查看nfs共享目录,客户端不需要挂载,而是由集群资源管理器完成挂载操作
[root@node1 ~]# showmount -e 172.16.4.200 Export list for 172.16.4.200: /www 172.16.0.0/16
Heartbeat的ha.cf和authority文件不需要做任何修改,只需要修改haresources配置文件即可。
配置之前停止heartbeat服务
[root@node1 ~]# ssh node2 '/etc/init.d/heartbeatstop' [root@node1 ~]# service heartbeat stop
修改haresources文件
[root@node1 ~]# vim /etc/ha.d/haresources node1.xmfb.com IPaddr::172.16.4.1/24/eth0 Filesystem::172.16.4.200:/www::/var/www/html::nfshttpd [root@node1 ~]# scp /etc/ha.d/haresourcesnode2:/etc/ha.d/
配置完成之后启动服务
[root@node1 ~]# service heartbeat start [root@node1 ~]# ssh node2 'service heartbeat start'
说明:如果对haresources中NFS资源定义不是特别了解,可以参考下面手动启动NFS设置。
/etc/ha.d/resource.d/Filesystem 172.16.4.200:/www/var/www/html nfs start
就是在启动脚本后面,添加NFS服务器设备,本地挂载位置,设备类型即可。
NFS挂载验证
[root@node1 ~]# mount 172.16.4.200:/www on /var/www/html type nfs (rw,vers=4,addr=172.16.4.200,clientaddr=172.16.4.1)
Httpd验证
[root@node1 ~]# netstat -lnt | grep 80 tcp 0 0 :::80 :::* LISTEN
虚拟ip地址验证
[root@node1~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:22:C5:C2 inet addr:172.16.4.100 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fe22:c5c2/64 Scope:Link UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXpackets:140118 errors:0 dropped:0 overruns:0 frame:0 TXpackets:35448 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RXbytes:150543131 (143.5 MiB) TXbytes:4462618 (4.2 MiB) eth0:0 Linkencap:Ethernet HWaddr00:0C:29:22:C5:C2 inet addr:172.16.4.1 Bcast:172.16.4.255 Mask:255.255.255.0 UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UPLOOPBACK RUNNING MTU:65536 Metric:1 RXpackets:0 errors:0 dropped:0 overruns:0 frame:0 TXpackets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RXbytes:0 (0.0 b) TX bytes:0 (0.0 b)
访问验证
测试主备切换
[root@node1 ~]# sh /usr/lib64/heartbeat/hb_standby
查看资源是否转移到备节点
[root@node2 ~]# mount 172.16.4.200:/www on /var/www/html type nfs(rw,vers=4,addr=172.16.4.200,clientaddr=172.16.4.1) [root@node2 ~]# netstat -lnt | grep 80 tcp 0 0 :::80 :::* LISTEN [root@node2 ~]# ifconfig eth0:0 eth0:0 Link encap:Ethernet HWaddr00:0C:29:F1:DD:B2 inet addr:172.16.4.1 Bcast:172.16.4.255 Mask:255.255.255.0 UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1
访问vip出现的还是nfs页面