HA集群--corosync+pacemaker
一、高可用集群的架构
从微观上讲,高可用集群可分为4个层次
1、第一层是信息和基础架构层,主要用于节点之间传心跳信息。节点之间通过UDP传递心跳信息,可以通过广播,组播,单播等方式。
2、第二层是成员关系层,作用是主节点通过cluster consensus menbership service(CCM)这种服务由第一层提供的信息,来生产一个完整的成员关系。这层主要是实现承上启下的作用,承上是将下层产生的信息生成成员关系图传递给上层以通知各个节点的工作状态;启下是将上层对于隔离某一设备进行实施。
3、第三层为资源分配层,真正实现集群服务的层。在该层中每个节点都运行一个集群资源管理器(CRM,cluster Resource Manager),它能为实现高可用提供核心组件,包括资源定义,属性等。在每一个节点上CRM都维护有一个集群信息机库(cluster information base,CIB,XML文档)和本地资源管理器(local resource manager,LRM)组件。只有指定协调员(DC, 主节点)上的CIB文档可以修改,其他节点的CIB都是从主节点上复制而来的。对于LRM,是执行CRM传递过来的在本地执行某个资源的执行和停止的具体执行人。CRM最著名的是pacemaker软件。
当某个节点发生故障之后,是由DC通过PE(policy engine)和TE(transition engine)来决定是否抢夺资源。TE通知从节点的LRM,由LRM对这个从节点做出具体的动作。
4、第四层为资源层,资源层包括一个或多个resource agent(RA),RA是一个程序,通常是一个能够管理本节点上的属于集群资源的某一资源的启动,停止和状态信息的脚本,在任何一个节点上RA只能由本地的LRM控制。
RA的种类:
linux standard base(LSB):即在/etc/init.d/目录下的脚本
Open Clustering Framework(OCF):有stop、start和Monitor功能的脚本,比LSB功能强大
STONITH:第三方的脚本
二、corosync和pacemaker简介
Coreosync是集群管理套件的一部分,它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。它是一个新兴的软件,2008年推出,但其实它并不是一个真正意义上的新软件,在2002年的时候有一个项目Openais , 它由于过大,分裂为两个子项目,其中可以实现HA心跳信息传输的功能就是Corosync ,它的代码60%左右来源于Openais。Corosync可以提供一个完整的HA功能,但是要实现更多,更复杂的功能,那就需要使用Openais了。
Pacemaker是一个集群管理器。它利用首选集群基础设施(OpenAIS 或heartbeat)提供的消息和成员能力,由辅助节点和系统进行故障检测和回收,实现性群集服务(亦称资源)的高可用性。
三、基本概念
资源类型:
1)primitive(native): 基本资源,同一时刻只能运行在一个节点,如服务的IP地址
2)group: 资源组
3)clone: 克隆资源(可同时运行在多个节点上),要先定义为primitive后才能进行clone。
4)master/slave: 只能运行2个节点,一主一从
资源粘性stickiness: 表示资源是否倾向于留在当前节点
>0: 倾向于留在当前节点
<0: 倾向于离开此节点
=0: 由HA来决定去留
INFINITY: 正无穷大
-INFINITY: 负无穷大
资源约束: 资源的启动是要有先后次序的,这时就需要对资源进行约束。资源约束是用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:
1)Location(位置): 定义资源可以、不可以或尽可能在哪些节点上运行
2)Collocation(排列): 排列约束用以定义集群资源可以或不可以在某个节点上同时运行
3)Order(顺序): 顺序约束定义集群资源在节点上启动的顺序
法定票数quorum:
集群服务中的每个node都有自己的票数,票数是由DC负责统计,然后形成CIB(集群信息库),然后同步集群信息库到各个节点上,只有quorum大于总票数的二分之一,集群服务才可以继续运行,当quorum小于总票数的二分之一时,会有以下动作:
ignore(忽略): 当集群服务只有两个节点时,无论谁挂了,都需要切换node,所以要忽略法定票数
freeze(冻结): 已经启动的资源继续运行,不允许新的资源启动
stop(停止): 停止集群服务,这是默认值
suicide(自杀): 将所有节点全部隔离
隔离Fence:
多台node在共享存储写同一个文件时,文件系统就会崩溃,所以资源转移之前需要先完成其他节点的隔离,隔离有2个级别:
1)资源隔离: 让被隔离主机不能能再使用这个资源。如让隔离的主机不能访问共享存储。
2)主机隔离: 直接让改主机关机。如通过STONITH让主机断电,强行关闭。
四、安装配置
环境:
node1: 172.16.1.1
node2: 172.16.1.2
VIP: 172.16.1.10
集群资源: VIP、httpd
集群代理(RA): OCF的IPaddr、LSB的httpd
1. node1、node2的准备工作
[root@node1 ~]# vim /etc/hosts 172.16.1.1 node1.tcnet.com node1 172.16.1.2 node2.tcnet.com node2 #这个主机名需要和hostname命令显示的相同 [root@node1 ~]# ssh-keygen -t rsa [root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2 #设定两个节点可以基于密钥进行ssh通信
[root@node1 ~]# service iptables stop #关闭防火墙 iptables: Flushing firewall rules: [ OK ] iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Unloading modules: [ OK ] You have new mail in /var/spool/mail/root [root@node1 ~]# getenforce #关闭selinux Disabled
2. node1、node2安装httpd服务作为测试的服务
[root@node1 ~]# yum install httpd -y [root@node1 ~]# echo "node1.tcnet.com" > /var/www/html/index.html [root@node1 ~]# service httpd start [root@node1 ~]# service httpd stop #测试服务是否正常运行 [root@node1 ~]# chkconfig --list httpd #必须不能开机自动启动 httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
2. node1、node2上安装软件
[root@node1 ~]# yum install openaislib libesmtp cluster-glue corosync pacemaker
3. node1上配置corosync
[root@node1 ~]# cd /etc/corosync/ [root@node1 corosync]# cp corosync.conf.example corosync.conf [root@node1 corosync]# vim corosync.conf compatibility: whitetank totem { #指定心跳信息传递的参数version: 2 secauth: off #是否开启安全认证threads: 0 #开启线程的个数interface {ringnumber: 0 #标识一个通信接口bindnetaddr: 172.16.0.0 #指定心跳报文传输的网段 mcastaddr: 226.94.1.1 #指定心跳报文发送的组播地址mcastport: 5405 #指定端口ttl: 1 #生命周期,跨3层的话需要加大一点,不然对方接收不到,最大255} } logging {fileline: offto_stderr: no #是否发送标准错误输出to_logfile: yes #是否记录到日志文件中to_syslog: no #是否记录到syslog,二者选其一即可logfile: /var/log/cluster/corosync.log #日志文件的路径debug: off #是否开启调试信息timestamp: on #日志中是否协商时间戳logger_subsys {subsys: AMF #是否记录AMFdebug: off #是否开启AMF的调试信息} } amf {mode: disabled #AMF的状态 } service { #corosync启动时也将pacemaker启动ver: 0name: pacemaker } aisexec { #指定ais的用户和组的身份user: rootgroup: root }
4. node1上生成节点间通信时用到的认证密钥文件
[root@node1 ~]# corosync-keygen Corosync Cluster Engine Authentication key generator. Gathering 1024 bits for key from /dev/random. Press keys on your keyboard to generate entropy. Press keys on your keyboard to generate entropy (bits = 128). Press keys on your keyboard to generate entropy (bits = 192). Press keys on your keyboard to generate entropy (bits = 264). Press keys on your keyboard to generate entropy (bits = 328). Press keys on your keyboard to generate entropy (bits = 392). Press keys on your keyboard to generate entropy (bits = 464). Press keys on your keyboard to generate entropy (bits = 528). Press keys on your keyboard to generate entropy (bits = 600). Press keys on your keyboard to generate entropy (bits = 672). Press keys on your keyboard to generate entropy (bits = 736). Press keys on your keyboard to generate entropy (bits = 800). Press keys on your keyboard to generate entropy (bits = 864). Press keys on your keyboard to generate entropy (bits = 928). Press keys on your keyboard to generate entropy (bits = 992). Writing corosync key to /etc/corosync/authkey. #系统刚开机,/dev/random中的随机数不足,阻塞了当前的程序,直 #到根据熵池产生新的随机字节之后才返回。可以一直等,系统运行也 #会产生随机数,也可以随便敲一些键值。 [root@node1 ~]# cd /etc/corosync/ [root@node1 corosync]# ll total 24 -r--------. 1 root root 128 Mar 9 22:43 authkey #权限为400 -rw-r--r--. 1 root root 520 Mar 9 21:57 corosync.conf -rw-r--r--. 1 root root 445 Feb 22 2013 corosync.conf.example -rw-r--r--. 1 root root 1084 Feb 22 2013 corosync.conf.example.udpu drwxr-xr-x. 2 root root 4096 Feb 22 2013 service.d [root@node1 corosync]# scp -p authkey corosync.conf node2:/etc/corosync/ authkey 100% 128 0.1KB/s 00:00 corosync.conf 100% 520 0.5KB/s 00:00 #拷贝一份到node2上
5. node1、node2上启动集群服务
[root@node1 ~]# /etc/init.d/corosync start Starting Corosync Cluster Engine (corosync): [ OK ] [root@node1 ~]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log #查看corosync引擎是否正常启动 [root@node1 ~]# grep TOTEM !$ #查看初始化成员节点通知是否正常发出 [root@node1 ~]# grep pcmk_startup !$ #查看pacemaker是否正常启动 [root@node1 ~]# grep ERROR: !$ #检查启动过程中是否有错误产生 [root@node1 ~]# ssh node2 '/etc/init.d/corosync start' Starting Corosync Cluster Engine (corosync): [ OK ] #在node2上启动服务并查看日志信息
6. 查看集群状态
[root@node1 ~]# crm_mon Attempting connection to the cluster... Last updated: Sun Mar 9 23:33:37 2014 Last change: Sun Mar 9 23:28:22 2014 via crmd on node2.tcnet.com Stack: classic openais (with plugin) Current DC: node2.tcnet.com - partition with quorum Version: 1.1.8-7.el6-394e906 2 Nodes configured, 2 expected votes 0 Resources configured. Online: [ node1.tcnet.com node2.tcnet.com ]
7. node1上安装crmsh,因为crmsh依赖于pssh,所以直接用yum安装
[root@node1 ~]# yum --nogpgcheck localinstall crmsh-1.2.6-6.1.x86_64.rpm pssh-2.3.1-3.2.x86_64.rpm
8. 开始配置资源
[root@node1 ~]# crm crm(live)# configure #进入配置模式 crm(live)configure# verify #查看错误信息error: unpack_resources: Resource start-up disabled since no STONITH resources have been definederror: unpack_resources: Either configure some or disable STONITH with the stonith-enabled optionerror: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity Errors found during check: config not valid-V may provide more details crm(live)configure# property stonith-enabled=false #关闭stonith,因为实验环境没有stonish设备 crm(live)configure# commint crm(live)configure# verify crm(live)configure# primitive Myip ocf:IPaddr params ip=172.16.1.10 #定义IP资源 crm(live)configure# primitive Myservice lsb:httpd #定义服务资源 crm(live)configure# commit crm(live)configure# group MYSERVER Myip Myservice #定义资源组 crm(live)configure# commit crm(live)configure# property no-quorum-policy=ignore #法定票权不到一半时的策略 crm(live)configure# commit
9. 测试
[root@node2 ~]# ssh node1 '/etc/init.d/corosync stop' Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ] Waiting for corosync services to unload:...[ OK ] #在node2上停止node1的服务 [root@node2 ~]# crm_mon Attempting connection to the cluster... Last updated: Mon Mar 10 01:31:18 2014 Last change: Mon Mar 10 01:03:43 2014 via cibadmin on node1.tcnet.com Stack: classic openais (with plugin) Current DC: node2.tcnet.com - partition WITHOUT quorum Version: 1.1.8-7.el6-394e906 2 Nodes configured, 2 expected votes 2 Resources configured. Online: [ node2.tcnet.com ] OFFLINE: [ node1.tcnet.com ]Resource Group: MYSERVERMyip (ocf::heartbeat:IPaddr): Started node2.tcnet.comMyservice (lsb:httpd): Started node2.tcnet.com #可以看到服务到node2上了
转载于:https://blog.51cto.com/svenman/1371434
HA集群--corosync+pacemaker相关推荐
- Linux高可用集群(Corosync+Pacemaker)
说在前面: 这个编辑器也太霸道了,,两个浏览器,,一个不能粘贴,一个不能上图,只能保存草稿之后切换, 造孽啊! 写博不易,且看且珍惜 [蜡烛] ntp服务器配置 # vim /etc/ntf. ...
- pacemaker的HA集群无法启动listener监听故障的处理
项目场景: 提示:这里简述项目相关背景: 之前帮客户在Oracle Linux 7.9下搭建了一套HA集群(pacemaker),最近做测试时候发现了一个集群切换后的BUG. 因为软件安装完全在共享存 ...
- corosync+pacemaker实现高可用(HA)集群(二)
部署方案二(推荐):corosync+pacemaker 利用ansible自动安装corosync和pacemaker 注:关于ansible的具体使用可参见"ansible实现自动化自动 ...
- HA集群之三:corosync+pacemaker实现httpd服务的高可用
一.基础概念 1.集群的组成结构 HA Cluster: Messaging and Infrastructure Layer|Heartbeat Layer 集群信息事务层 Membership L ...
- Linux 高可用(HA)集群之Pacemaker详解
大纲 说明:本来我不想写这篇博文的,因为前几篇博文都有介绍pacemaker,但是我觉得还是得写一下,试想应该会有博友需要,特别是pacemaker 1.1.8(CentOS 6.4)以后,pacem ...
- HA应用之 -- corosync+pacemaker
前言:heartbeat虽然为Linux-HA开源项目发布的高可靠应用环境集群服务的核心软件,但是corosync作为后期之秀越来越受到人们的青睐,越来越多的人在构建新的HA应用选择使用corosyn ...
- 对HA的简单认识以及HA集群删除
高可用集群HA,英文全称为High Availability,简单来说,集群就是一组计算机,它们作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点. 高可用集群的出现就是为了使集群 ...
- Linux HA集群
我们先说一下几个概念: 服务(Service),是HA集群中提供的资源,包括Float IP,共享的存储,apache等等. 成员服务器(Member Server) 也叫节点(Node),是HA中实 ...
- Hadoop-2.8.5的HA集群搭建
一.Hadoop HA 机制的学习 1.1.Hadoop 2.X 的架构图 2.x版本中,HDFS架构解决了单点故障问题,即引入双NameNode架构,同时借助共享存储系统来进行元数据的同步,共享存储 ...
最新文章
- android 21点游戏代码,Android 21点
- SpringBoot+thymeleaf实现文件下载(已实践,全流程)
- linux网络编程之广播详细代码及文档说明 -,Linux网络编程之广播
- 4.4.5 清除变量内容
- C++ 链表 leetcode习题总结
- 腾讯网易禁止未成年人本周六玩游戏
- linux patch
- linux关闭端口进程命令,windows Linux 下命令行查看端口占用情况并且关闭进程
- 软件设计师教程笔记 持续更新
- 百度快速排名软件到底是如何实现的?
- 免费好用的节假日API
- isilon SMB 控制允许IP访问
- java 正整数类型_跟我学java编程—认识java的整数类型
- ttf,eot,woff,svg,字体格式介绍及使用方法
- 【小迪安全】web安全|渗透测试|网络安全 | 学习笔记-5
- 容联云CFO李亦鹏:智能化、国产化大势所趋 多业务云通讯构筑行业壁垒
- 听新闻学英语android版,听新闻学英语
- linuxMint在虚拟机下装VMware Tolls
- 接口电路——原理,应用,分类,处理过程
- 云服务器增加虚拟内存
热门文章
- 【东师软工】第二次成绩排行榜
- javascript-从toString方法在判断复杂数据类型上的妙用,引申到对原型链的理解...
- CA服务器的简单搭建
- hibernate相关知识
- mysql “Access denied for user 'root'@'localhost'
- C语言中的逗号操作符
- 【暴力】LeetCode 300. Longest Increasing Subsequence
- LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
- 【异或】LeetCode 136. Single Number
- map() 与 nest.map_structure() 的区别及用法