阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

HA集群–Corosync+Pacemaker

154次阅读
没有评论

共计 11134 个字符,预计需要花费 28 分钟才能阅读完成。

一、高可用集群的架构

从微观上讲,高可用集群可分为 4 个层次

HA 集群 --Corosync+Pacemaker

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 让主机断电,强行关闭。

 

相关阅读

搭建基于 Corosync+DRBD 的高可用 MySQL 集群 http://www.linuxidc.com/Linux/2013-10/91386.htm

分别基于 NFS 服务和 DRBD 服务利用 Corosync 配置高可用集群 http://www.linuxidc.com/Linux/2013-09/90410.htm

Linux 高可用(HA)集群之 Corosync 详解 http://www.linuxidc.com/Linux/2013-08/88733.htm

pacemaker + Corosync 搭建高可用集群 http://www.linuxidc.com/Linux/2013-06/85972.htm

Corosync+pacemaker+RA 实现 MySQL 高可用 http://www.linuxidc.com/Linux/2012-08/67949.htm

四、安装配置
环境:
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: off
        to_stderr: no    #是否发送标准错误输出
        to_logfile: yes  #是否记录到日志文件中
        to_syslog: no    #是否记录到 syslog,二者选其一即可
        logfile: /var/log/cluster/corosync.log    #日志文件的路径
        debug: off        #是否开启调试信息
        timestamp: on    #日志中是否协商时间戳
        logger_subsys {
                subsys: AMF    #是否记录 AMF
                debug: off    #是否开启 AMF 的调试信息
        }
}
amf {
        mode: disabled        #AMF 的状态
}
service {#corosync 启动时也将 pacemaker 启动
    ver:  0
    name: pacemaker
}
aisexec {#指定 ais 的用户和组的身份
    user:  root
    group:  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 defined
  error: unpack_resources:    Either configure some or disable STONITH with the stonith-enabled option
  error: 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: MYSERVER
    Myip      (ocf::heartbeat:IPaddr):        Started node2.tcnet.com
    Myservice  (lsb:httpd):    Started node2.tcnet.com
# 可以看到服务到 node2 上了

HA 集群 --Corosync+Pacemaker

Linux ���可用 (HA) 集群基本概念详解 http://www.linuxidc.com/Linux/2013-08/88522.htm

Linux 高可用(HA)集群之 Heartbeat 详解 http://www.linuxidc.com/Linux/2013-08/88521.htm

Corosync+Pacemaker+DRBD+MySQL 实现高可用 (HA) 的 MySQL 集群 http://www.linuxidc.com/Linux/2013-08/89036.htm

一、高可用集群的架构

从微观上讲,高可用集群可分为 4 个层次

HA 集群 --Corosync+Pacemaker

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 让主机断电,强行关闭。

 

相关阅读

搭建基于 Corosync+DRBD 的高可用 MySQL 集群 http://www.linuxidc.com/Linux/2013-10/91386.htm

分别基于 NFS 服务和 DRBD 服务利用 Corosync 配置高可用集群 http://www.linuxidc.com/Linux/2013-09/90410.htm

Linux 高可用(HA)集群之 Corosync 详解 http://www.linuxidc.com/Linux/2013-08/88733.htm

pacemaker + Corosync 搭建高可用集群 http://www.linuxidc.com/Linux/2013-06/85972.htm

Corosync+pacemaker+RA 实现 MySQL 高可用 http://www.linuxidc.com/Linux/2012-08/67949.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计11134字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中