高可用集群的基本概念
一、什么是高可用集群:
所谓高可用集群就是在其出现故障时,可以把业务自动转移到其他主机上并让服务正常运行的集群架构。
二、heartbeat的概念
Linux-HA的全称是High-Availability Linux,它是一个开源项目,这个开源项目的目标是:通过社区开发者的共同努力,提供一个增强LInux可靠性(reliability)、可用性(availability)和可服务性(serviceability)(RAS)的群集解决方案。其中heartbeat就是Linux-HA项目中的一个组件,也是目前开源HA项目中比较成功的一个例子,它提供了所有HA软件所需要的基本功能,比如心跳检测和资源接管、监测集群中的系统服务、在集群中的节点间转移共享IP地址的所有者等,自1999年开始到现在,Heartbeat在行业内得到了广泛的使用,也发行了很多的版本,可以从linux-HA的官方网站www.linux-ha.org下载到Heartbeat的最新版本。
三、高可用集群的构架层次
1、后端主机层:这一层主要是正在运行在物理主机上的服务。
2、Message Layer:信息传递层,主要传递心跳信息。
3、Cluster Resources Manager(CRM):集群资源管理器层,这一层是心跳信息传递层管理器。用于管理信息的传递和收集。
4、Local Resources Manager(LRM):本地资源管理器,用于对于收集到的心跳信息进行资源决策调整,是否转移服务等等。
5、Resource Agent(RA):资源代理层,这一层主要是具体启动或停止具体资源的脚本。遵循{start|stop|restart|status}服务脚本使用格式。
四、HA集群的工作模式
1、A/P:two node:主被模型,要借助于ping node工作
2、N-M:N个节点M个服务,N>M,活动节点为N,备用节点为N-M
3、N-N:N个节点N个服务,N节点都有服务,如果一个坏了,会有一个节点运行多个服务。
4、A/A:双主模型,两个节点都是活动的,两个节点运行两个不同的服务。也可以是同一个服务,比如ipvs,前端基于DNS轮训。
五、配置Heartbeat集群
1、基于Heartbeat V1版harousce配置httpd高可用
#安装前准备: 1、ssh多节点互信 [root@node1 ~]# ssh-keygen -t rsa [root@node1 ~]# ssh-copy-id -i root@node2 2、节点时间一致检查 [root@node1 ~]# date ;ssh node2 'date' 2016年 08月 09日 星期二 10:57:30 CST 2016年 08月 09日 星期二 10:57:30 CST 3、多节点名称解析 [root@node1 ~]# uname -n;ssh node2 'uname -n' node1.bjwf.com node2.bjwf.com 4、安装heartbeat [root@node1 ~]# yum install perl-TimeDate PyXML libnet net-snmp-libs libtool-ltdl -y [root@node1 ~]# rpm -ivh heartbeat-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 Preparing... ########################################### [100%] 1:heartbeat-pils ########################################### [ 33%] 2:heartbeat-stonith ########################################### [ 67%] 3:heartbeat ########################################### [100%] #另一个节点一样的方法 5、准备Heartbeat的配置文件 [root@node1 ~]# cd /usr/share/doc/heartbeat-2.1.4/ [root@node1 heartbeat-2.1.4]# cp authkeys ha.cf haresources /etc/ha.d/ [root@node1 heartbeat-2.1.4]# cd /etc/ha.d/ [root@node1 ha.d]# vim authkeys #配置节点信息通信密码 auth 2 2 sha1 woleigequ@xyoaq`!;q [root@node1 ha.d]# chmod 600 authkeys [root@node1 ha.d]# vim ha.cf logfile /var/log/ha-log #定义日志格式 keepalive 2 #指定心跳使用间隔时间为2秒(即每两秒钟发送一次广播) deadtime 30 #指定备用节点在30s内没有收到主节点的心跳信息号,则立即接管主节点的服务资源 warntime 10 #指定心跳延迟的时间为10s,当10s钟内备份节点不能接收到主节点的心跳信号时,就会 往日志中写入一个警告日志,但此时不会切换服务。 udpport 694 #监听端口 mcast eth0 225.7.1.1 694 1 0 #节点多播方式传递心跳信息 auto_failback on #用来定义主节点恢复后,是否将服务自动切回 node node1.bjwf.com #Heartbeat集群节点 node node2.bjwf.com ping 192.168.120.254 #ping节点仲裁 compression bz2 compression_threshold 2 [root@node1 ha.d]# vi haresources node1 192.168.120.10/24/eth0 httpd #以node1为dc,定义集群VIP及资源httpd服务 [root@node1 ha.d]# scp authkeys ha.cf haresources node2:/etc/ha.d authkeys 100% 659 0.6KB/s 00:00 ha.cf 100% 10KB 10.4KB/s 00:00 haresources 100% 5940 5.8KB/s 00:00 6、安装httpd服务 [root@node1 ha.d]# yum -y install httpd [root@node1 ha.d]# echo "node1.bjwf.com" > /var/www/html/index.html [root@node1 ha.d]# chkconfig httpd off [root@node1 ha.d]# service httpd stop 停止 httpd: [确定] [root@node2 ha.d]# yum -y install httpd [root@node2 ha.d]# echo "node2.bjwf.com" > /var/www/html/index.html [root@node2 ha.d]# chkconfig httpd off [root@node2 ha.d]# service httpd stop 停止 httpd: [确定] 7、启动Heartbeat服务,并测试 [root@node1 ha.d]# service heartbeat start;ssh node2 'service heartbeat start' logd is already running Starting High-Availability services: 2016/08/09_11:55:15 INFO: Resource is stopped Done. logd is already running Starting High-Availability services: 2016/08/09_11:55:15 INFO: Resource is stopped Done. [root@node1 ha.d]# netstat -tunlp;ssh node2 'netstat -tunlp' Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1331/sshd tcp 0 0 :::80 :::* LISTEN 2292/httpd tcp 0 0 :::22 :::* LISTEN 1331/sshd udp 0 0 0.0.0.0:36099 0.0.0.0:* 1900/heartbeat: wri udp 0 0 225.7.1.1:694 0.0.0.0:* 1900/heartbeat: wri Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1331/sshd tcp 0 0 :::80 :::* LISTEN 1642/httpd tcp 0 0 :::22 :::* LISTEN 1331/sshd udp 0 0 0.0.0.0:45834 0.0.0.0:* 1886/heartbeat: wri udp 0 0 225.7.1.1:694 0.0.0.0:* 1886/heartbeat: wri [root@node3 ~]# curl http://192.168.120.10 #在node3上测试 node1.bjwf.com [root@node1 ha.d]# ifconfig #查看VIP是否在node1上 eth0 Link encap:Ethernet HWaddr 00:0C:29:20:EC:07 inet addr:192.168.120.100 Bcast:192.168.120.255 Mask:255.255.255.0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:20:EC:07 inet addr:192.168.120.10 Bcast:192.168.120.255 Mask:255.255.255.0 [root@node1 ha.d]# service heartbeat stop #停掉node1,查看是否会自动转移 Stopping High-Availability services: Done. [root@node3 ~]# curl http://192.168.120.10 node2.bjwf.com #服务已经转移 [root@node2 ~]# ifconfig #VIP已经转移 eth0 Link encap:Ethernet HWaddr 00:0C:29:25:07:08 inet addr:192.168.120.101 Bcast:192.168.120.255 Mask:255.255.255.0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:25:07:08 inet addr:192.168.120.10 Bcast:192.168.120.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 8、在Node3上安装nfs服务,实现节点间自动切换 [root@node3 ~]# yum -y install nfs-utils #安装服务 [root@node3 ~]# vim /etc/exports #修改配置文件 /data/html 192.168.120.0/24(rw,no_root_squash,async) [root@node3 ~]# echo "NFS server" > /data/html/index.html [root@node3 ~]# service rpcbind start #nfs依赖这个服务 [root@node3 ~]# service nfs start #启动nfs [root@node1 ~]# showmount -e 192.168.120.102;ssh node2 'showmount -e 192.168.120.102' Export list for 192.168.120.102: /data/html 192.168.120.0/24 #node1上测试 Export list for 192.168.120.102: /data/html 192.168.120.0/24 #node2上测试 [root@node1 ~]# mount -t nfs 192.168.120.102:/data/html/ /var/www/html [root@node1 ~]# curl http://192.168.120.100 NFS server [root@node2 ~]# mount -t nfs 192.168.120.102:/data/html/ /var/www/html [root@node2 ~]# curl http://192.168.120.101 NFS server #修改node1和node2的haresources配置文件,是Heartbeat能自动挂载目录 [root@node1 ~]# vim /etc/ha.d/haresources node1.bjwf.com 192.168.120.10/24/eth0 Filesystem::192.168.120.102:/data/html::/var/www/html::nfs httpd [root@node1 ~]# scp /etc/ha.d/haresources node2:/etc/ha.d/ #改完后传给node2一份 haresources 100% 6008 5.9KB/s 00:00 停止heartbeat,httpd服务并卸载nfs共享目录之后在重启Heartbeat服务 [root@node1 ~]# umount /var/www/html;ssh node2 'umount /var/www/html’ [root@node1 ~]# service httpd stop;ssh node2 'service httpd stop' [root@node1 ~]# service heartbeat start;ssh node2 'service heartbeat start' Starting High-Availability services: 2016/08/09_14:42:59 INFO: Resource is stopped Done. Starting High-Availability services: 2016/08/09_14:42:59 INFO: Resource is stopped Done. #重启Heartbeat服务 [root@node1 ~]# ifconfig #节点一上查看资源情况 eth0 Link encap:Ethernet HWaddr 00:0C:29:20:EC:07 inet addr:192.168.120.100 Bcast:192.168.120.255 Mask:255.255.255.0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:20:EC:07 inet addr:192.168.120.10 Bcast:192.168.120.255 Mask:255.255.255.0 [root@node1 ~]# mount |grep html #文件系统已经挂载 192.168.120.102:/data/html on /var/www/html type nfs (rw,vers=4,addr=192.168.120.102,clientaddr=192.168.120.100) [root@node1 ~]# curl http://192.168.120.10 NFS server #服务也正常 [root@node1 ~]# service heartbeat stop #关掉节点1,查看节点2是否已经切换 Stopping High-Availability services: Done. [root@node2 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:25:07:08 inet addr:192.168.120.101 Bcast:192.168.120.255 Mask:255.255.255.0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:25:07:08 inet addr:192.168.120.10 Bcast:192.168.120.255 Mask:255.255.255.0 [root@node2 ~]# mount |grep html 192.168.120.102:/data/html on /var/www/html type nfs (rw,vers=4,addr=192.168.120.102,clientaddr=192.168.120.101) [root@node2 ~]# netstat -tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1331/sshd tcp 0 0 0.0.0.0:48665 0.0.0.0:* LISTEN - tcp 0 0 :::80 :::* LISTEN 3370/httpd tcp 0 0 :::22 :::* LISTEN 1331/sshd tcp 0 0 :::43097 :::* LISTEN - [root@node2 ~]# curl http://192.168.120.10 NFS server #资源已经正常切换至节点2
2、基于Heartbeat V2版配置httpd高可用(crm、heartbeat-gui工具)
1、关闭Heartbeat服务,并修改配置 [root@node1 ~]# service heartbeat stop [root@node2 ~]# service heartbeat stop [root@node1 ha.d]# vim ha.cf crm on [root@node1 ha.d]# scp ha.cf node2:/etc/ha.d ha.cf 100% 10KB 10.4KB/s 00:00 2、安装Heartbeat-gui工具 [root@node1 ~]# yum -y install pygtk2-libglade [root@node1 heartbeat2]# rpm -ivh heartbeat-gui-2.1.4-12.el6.x86_64.rpm [root@node2 ~]# yum -y install pygtk2-libglade [root@node2 heartbeat2]# rpm -ivh heartbeat-gui-2.1.4-12.el6.x86_64.rpm 3、启动Heartbeat服务 [root@node1 heartbeat2]# passwd hacluster [root@node1 heartbeat2]# service heartbeat start [root@node1 heartbeat2]# yum -y install xorg-x11-xauth [root@node2 heartbeat2]# passwd hacluster [root@node2 heartbeat2]# service heartbeat start [root@node2 heartbeat2]# yum -y install xorg-x11-xauth [root@node1 ~]# hb_gui & #启动图形报错,这块需要安装xmanager Traceback (most recent call last): File "/usr/bin/hb_gui", line 41, inimport gtk, gtk.glade, gobject File "/usr/lib64/python2.6/site-packages/gtk-2.0/gtk/__init__.py", line 64, in _init() File "/usr/lib64/python2.6/site-packages/gtk-2.0/gtk/__init__.py", line 52, in _init _gtk.init_check() RuntimeError: could not open display #Xshell里面设置-文件-属性-SSH-隧道-勾上转发X11连接到xmanager
(1)连接上gui工具
(2)查看状态信息
(3)定义一个组资源
#定义一个VIP
#定义一个服务
#启动组资源
#查看运行节点 [root@node3 ~]# curl http://192.168.120.10 node1.bjwf.com
#切换资源
[root@node3 ~]# curl http://192.168.120.10 node2.bjwf.com
(4)重新定义组资源(NFS)
#注意:这块需要把刚才定义的组资源里面的webserver删了,先添加filesystem资源
[root@node3 ~]# curl http://192.168.120.10 NFS server [root@node2 ~]# ifconfig #查看资源 eth0 Link encap:Ethernet HWaddr 00:0C:29:25:07:08 inet addr:192.168.120.101 Bcast:192.168.120.255 Mask:255.255.255.0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:25:07:08 inet addr:192.168.120.10 Bcast:192.168.120.138 Mask:255.255.255.255 [root@node2 ~]# mount |grep --color "html" 192.168.120.102:/data/html on /var/www/html type nfs (rw,vers=4,addr=192.168.120.102,clientaddr=192.168.120.101) [root@node2 ~]# netstat -tnlp|grep 80 tcp 0 0 :::80 :::* LISTEN 4652/httpd
#切换一下机器
[root@node3 ~]# curl http://192.168.120.10 NFS server [root@node1 ~]# ifconfig #可以看到资源已经切换 eth0 Link encap:Ethernet HWaddr 00:0C:29:20:EC:07 inet addr:192.168.120.100 Bcast:192.168.120.255 Mask:255.255.255.0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:20:EC:07 inet addr:192.168.120.10 Bcast:192.168.120.138 Mask:255.255.255.255 [root@node1 ~]# mount |grep --color "html" 192.168.120.102:/data/html on /var/www/html type nfs (rw,vers=4,addr=192.168.120.102,clientaddr=192.168.120.100) [root@node1 ~]# netstat -tnlp|grep 80 tcp 0 0 :::80 :::* LISTEN 5494/httpd
3、基于Heartbeat V1+Ldirectord实现LVS集群高可用
1、实验环境 node1:node1.bjwf.com 192.168.120.100 node2:node2.bjwf.com 192.168.120.101 Real Server1:node3.bjwf.com 192.168.120.102 Real Server2:node4.bjwf.com 192.168.120.103 2、注意事项 (1)时间同步 (2)节点通信(ssh认证) (3)解析节点须在/etc/hosts文件中,可用uname -n查看主机名 (4)ping node (偶数节点需要) 3、安装所需安装包 #在node1和node2上安装heartbeat软件包 [root@node1 ~]# yum install perl-TimeDate net-snmp-libs libnet PyXML -y [root@node1 heartbeat2]# rpm -ivh heartbeat-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 Preparing... ########################################### [100%] 1:heartbeat-pils ########################################### [ 33%] 2:heartbeat-stonith ########################################### [ 67%] 3:heartbeat ########################################### [100%] [root@node1 heartbeat2]# yum -y install heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm #配置Heartbeat [root@node1 heartbeat2]# cd /usr/share/doc/heartbeat-2.1.4/ [root@node1 heartbeat-2.1.4]# cp ha.cf authkeys haresources /etc/ha.d [root@node1 heartbeat-2.1.4]# chmod 600 authkeys [root@node1 heartbeat-2.1.4]# openssl rand -hex 8 #生产密钥 264708ac8cbb46d1 [root@node1 heartbeat-2.1.4]# vim /etc/ha.d/authkeys auth 2 2 sha1 264708ac8cbb46d1 #配置主配置文件 [root@node1 ~]# vim /etc/ha.d/ha.cf logfile /var/log/ha-log #日志存放位置 keepalive 2 #指定心跳使用间隔时间 deadtime 30 #指定备用节点接管主节点服务资源超时时间 warntime 10 #指定心跳延迟的时间 initdead 120 #解决网络启动延时 udpport 694 #设置广播通信端口 mcast eth0 225.0.35.1 694 1 0 #定义广播地址 auto_failback on #定义当主节点恢复后,是否将服务自动切回 node node1.bjwf.com #主节点 node node2.bjwf.com #备用节点 ping 192.168.120.254 #仲裁设备 compression bz2 #压缩方式 compression_threshold 2 #超过多少k启用压缩 #配置资源管理器 [root@node1 ha.d]# vim haresources node1.bjwf.com 172.16.10.10/32/eth0/172.16.10.10 ldirectord::/etc/ha.d/ldirectord.cf #将配置文件传送给备用节点 [root@node1 ha.d]# scp ha.cf authkeys haresources node2:/etc/ha.d ha.cf 100% 10KB 10.3KB/s 00:00 authkeys 100% 656 0.6KB/s 00:00 haresources 100% 5990 5.9KB/s 00:00 #配置ldirectord [root@node1 ha.d]# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d [root@node1 ha.d]# vim /etc/ha.d/ldirectord.cf checktimeout=3 #探测超时时间 checkinterval=1 #探测间隔时间 autoreload=yes #修改配置文件,无需重启服务就能自动重载 logfile="/var/log/ldirectord.log" #日志文件 quiescent=yes #real server 宕机后从lvs列表中删除,恢复后自动添加进列表 # Sample for an http virtual service virtual=172.16.10.10:80 #VIP real=192.168.120.102:80 gate #real server real=192.168.120.103:80 gate #real server fallback=127.0.0.1:80 gate #如果RS节点都宕机,则启用本地环回口地址 service=http #基于http协议探测 request=".test.html" #探测文件 receive="Test Page" #探测内容,判断RS是否存活 scheduler=rr #调度算法 #persistent=600 #netmask=255.255.255.255 [root@node1 ha.d]# scp -p /etc/ha.d/ldirectord.cf node2:/etc/ha.d ldirectord.cf 100% 7632 7.5KB/s 00:00 [root@node1 ha.d]# chkconfig ldirectord off;ssh node2 'chkconfig ldirectord off' #准备fallback文件 [root@node1 ha.d]# echo "Sorry" > /var/www/html/index.html [root@node1 ha.d]# service httpd start [root@node1 ha.d]# curl http://localhost Sorry [root@node2 heartbeat2]# echo "Sorry" > /var/www/html/index.html [root@node2 heartbeat2]# service httpd start [root@node2 heartbeat2]# curl http://localhost Sorry 4、RS设置 #配置内核参数 [root@node3 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore [root@node3 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@node3 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce [root@node3 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@node3 ~]# ifconfig lo:0 172.16.10.10 netmask 255.255.255.0 broadcast 172.16.10.10 up [root@node3 ~]# route add -host 172.16.10.10 dev lo:0 [root@node4 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore [root@node4 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@node4 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce [root@node4 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@node4 ~]# ifconfig lo:0 172.16.10.10 netmask 255.255.255.255 broadcast 172.16.10.10 [root@node4 ~]# route add -host 172.16.10.10 dev lo:0 #准备健康检测文件和站点文件 [root@node3 ~]# echo "Test Page" > /var/www/html/.test.html [root@node3 ~]# echo "node3.bjwf.com" > /var/www/html/index.html [root@node3 ~]# service httpd start [root@node4 ~]# echo "Test Page" > /var/www/html/.test.html [root@node4 ~]# echo "node4.bjwf.com" > /var/www/html/index.html [root@node4 ~]# service httpd start #测试页面 [root@node1 ~]# curl http://192.168.120.102 node3.bjwf.com [root@node1 ~]# curl http://192.168.120.103 node4.bjwf.com #启动Heartbeat [root@node1 ~]# service heartbeat start;ssh node2 'service heartbeat start' logd is already running Starting High-Availability services: 2016/08/10_15:18:50 INFO: Resource is stopped Done. logd is already running Starting High-Availability services: 2016/08/10_15:18:50 INFO: Resource is stopped Done. #查看资源是否生效 [root@node1 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.10.10:80 rr -> 127.0.0.1:80 Local 1 0 0 -> 192.168.120.102:80 Route 0 0 0 -> 192.168.120.103:80 Route 0 0 0 [root@node1 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:20:EC:07 inet addr:192.168.120.100 Bcast:192.168.120.255 Mask:255.255.255.0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:20:EC:07 inet addr:172.16.10.10 Bcast:172.16.10.10 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
###今天先写到这,还有几张图,暂时截取不了。所以只能等晚上更新了。还有高可用mysql,其实是一个道理,所以这就不写了!以上仅为个人学习整理,如有错漏,大神勿喷~~~