高可用的解决方案keepalived只是提供了最简单的高可用功能,真正高级的功能keepalived很难完成。openAIS规范提供完善的解决方案,但是很重量级很多功能考虑的很全面、很细致,了解这些我们才可以更加深入的理解高可用的完整的体系,当遇到特殊的高可用场景我们必须使用这些方案才可以解决。
OpenAIS规范的解决方案
这个规范一直迭代到今天,形成的完整的体系如图1.1
图1.1
既然多个主机要组成一个集群,那么就要有一个软件帮助多个主机间实现心跳信息通告,这个实现通告的在OpenAIS规范中被定义为message layer。
整个集群的服务管理需要一个软件,被规范定义为cluster resource manager集群资源管理。这只是集群资源管理,但是真正到执行操作的时候需要一个可以管理主机服务的接口,这个接口软件被规范定义为location resource manager本地资源管理。这一层才是真正执行操作的,产生这一层的原因基本上所有的服务设计时都没考虑被高可用,但是我们有需要操控这些服务只好制造一个可以调用其他服务器的管理层。
message layer常用组件有:heartbeatv1,2,3,corosync(suse研发),cman(redhat)
cluster resource manager常用组件有:pacemaker(Redhat),heartbeatv1,2
管理接口常用组件:crmsh(suse),pcs(Redhat)
网页管理接口:hawk, LCMC, pacemaker-mgmt
centos6还有RHCS
高级功能
之所以说keepalived的功能简单是因为以下这些
quorum投票功能
法定票数(大于总票数的一半也可以设定不用大于一半) ,用来判定集群分裂的场景中,某些节点是否可以继续以集群方式运行;
当偶数个机器组成的机器分裂,投票可以借助仲裁设备:
ping node
ping node group
quorum disk: qdisk
without quorum之时,如何采取对资源管控的策略:
stopped
ignore
freeze
suicide
资源隔离机制
当计算机故障,防止服务抖动和或者防止同时向共享存储写数据导致存储破坏
节点级别:STONITH
电源交换机
服务硬件管理模块
虚拟化软件关闭虚拟机
资源级别:
共享存储器禁止写数据
资源粘性
资源倾向于留在当前的分数(-oo, +oo)
资源约束
位置约束:资源对某节点运行的倾向性(-oo, +oo)
inf: 正无穷
-inf: 负无穷
n:
-n:
排列约束:定义资源彼此间的倾向性(是否在一起)
inf:
-inf:
n, -n
顺序约束:属于同一服务的多个资源运行在同一节点时,其启动及关闭的次序约束;
A --> B --> C
C --> B --> A
资源组组:组内资源将会组内顺序启动和关闭
RA
resource Agent真正管理service的工具
大致有一下分类lsb,ocf,service,stonith,systemd
由于资源可以这样灵活的组合配置,那么我们可以打造一个极端的应用场景,五台计算机提供四种不同的服务,我们把五台计算机直接组成一个集群,根据资源粘性把四个服务分布运行在不同的计算机上,然后留一台计算机做给其他四个计算机做backup。不仅如此,当五台计算机中两台计算机宕机,我们可以让四种服务运行在三台计算机之上。
corosync和pacemaker
实践
目前有两个比较常用的配置接口一个是crmsh一个pcs,这里我首先使用crmsh构建一个mariadb高可用集群,然后使用pcs构建一个haproxy集群,这里都使用双节点。如图1.2
图1.2
如图vip172.16.29.11在两个node间流转
准备配置
node1的配置
#下载crmsh的yum源的配置文件,以为crmsh没有被被收录到源中 wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/network:ha-clustering:Stable.repo -P /etc/yum.repos.d/ yum install pacemaker crmsh mariadb-server haproxy pcs -y
vim /etc/corosync/corosync.conf #配置文件事例 totem { version: 2 crypto_cipher: aes256 crypto_hash: sha1 interface { ringnumber: 0 #集群主机所在的网段 bindnetaddr: 172.16.0.0 #多播地址 mcastaddr: 239.255.101.99 mcastport: 5405 ttl: 1 } } logging { fileline: off to_stderr: no to_logfile: yes logfile: /var/log/cluster/corosync.log to_syslog: no debug: off timestamp: on logger_subsys { subsys: QUORUM debug: off } } quorum { provider: corosync_votequorum } #配置组成集群的两个主机 nodelist { node { ring0_addr: 172.16.29.10 nodeid: 1 } node { ring0_addr: 172.16.29.20 nodeid: 2 } }
#使用这个命令生成corosync通信的秘钥 corosync-keygen vim /etc/hosts #添加域名解析 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.29.10 node1.org node1 172.16.29.20 node2.org node2 #主机间使用秘钥通信 ssh-keygen -t rsa #这个命令一路按回车就可以了 ssh-copy-id -i .ssh/id_rsa.pub node2 #复制配置文件到node2,这一步需要在node2安装pacemaker后执行 scp -p authkey corosync.conf node2:/etc/corosync/ scp /etc/hosts node2:/etc/
#开启服务,并授权用户登录,创建数据库jim systemctl start mariadb.service mysql <<eof grant all on *.* to ‘tom‘@‘172.16.%.%‘ identified by ‘12345‘; create database jim; eof #设置mariadb开机启动,这一项是pacemaker控制systemd管理的服务根本 systemctl enable mariadb.service #启动服务 systemctl start pacemaker.service corosync.service
node2的配置
#下载crmsh的yum源的配置文件,以为crmsh没有被被收录到源中 wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/network:ha-clustering:Stable.repo -P /etc/yum.repos.d/ yum install pacemaker crmsh mariadb-server pcs -y #开启服务,并授权用户登录,创建数据库tom,两个主机的数据库故意创建不一样方便查看服务器迁移 systemctl start mariadb.service mysql <<eof grant all on *.* to ‘tom‘@‘172.16.%.%‘ identified by ‘12345‘; create database tom; eof #设置mariadb开机启动,这一项是pacemaker控制systemd管理的服务根本 systemctl enable mariadb.service #启动服务 systemctl start pacemaker.service corosync.service
mariadb集群服务配置
mariadb集群服务的配置使用crmsh配置,crmsh配置的集群服务会自动同步到集群的每一个节点,同步的机制是配置信息是首先传送到DC节点,然后通告给其他节点。
crmsh的使用方法是输入crm进入交互接口然后输入配置,这个配置接口和交换机的配置接口使用类似,并且拥有强大的补全功能。具体怎么使用我不介绍了,可以使用help [command]查看帮助信息,帮助信息最底下还有事例。
crm configure #进入crm配置接口 property stonith-enabled=false #关闭stonith,因为我们没有具体的设备 property no-quorum-policy=ignore #不使用法定票数,因为我们配置的是双节点的集群,一个节点故障另一个节点拥有的票数就不会大于半数 primitive vip ocf:heartbeat:IPaddr params ip="172.16.29.11" #定义vip集群资源 primitive mariadb systemd:mariadb #定义mariadb集群资源 group dbservice vip mariadb #把vip和mariadb资源定义为组,一群两个资源运行在同一台主机之上 monitor vip 20s:20s #定义vip的监控,每20s监控一次,延迟20s monitor mariadb 20s:20s commit #保存配置,并使其生效
haproxy集群服务配置
haproxy集群配置使用pcs,pcs不是交互式管理接口,我们可以直接输入管理命令管理
node1的配置
systemctl start pcsd.service #开启pcsd进程 systemctl enable haproxy.service #设置haproxy开机启动,这一项是pacemaker控制systemd管理的服务根本 vim /etc/haproxy/haproxy.cfg #在default中添加如下内容 stats enable stats hide-version stats uri /ha10
node2的配置
systemctl start pcsd.service #开启pcsd进程 systemctl enable haproxy.service #设置haproxy开机启动,这一项是pacemaker控制systemd管理的服务根本 vim /etc/haproxy/haproxy.cfg #在default中添加如下内容 stats enable stats hide-version stats uri /ha20
集群的配置的配置
pcs resource create vip2 ocf:heartbeat:IPaddr params ip="172.16.29.12" op monitor interval=20s timeout=20 #定义vip2资源,并定义监控 pcs resource create haproxy systemd:haproxy op monitor interval=20s timeout=20 #定义haproxy资源,并定义监控 pcs constraint order set vip haproxy #使用顺序约束把vip2和haproxy绑定在一起
测试
然后我们就可以根据两台主机的ip地址情况,测试高可用情况了