目录:
实验准备
软件安装
Corosync配置文件
高可用功能实现
资源粘性实例
注意事项
-
有两个结点分别为RS1和RS2 IP地址分别为192.168.1.127和192.168.1.128
高可用的访问VIP地址为192.168.1.122
高可用服务为httpd服务、
系统为CentOS Linux release 6.0 (Final)
1.配置RS1的IP地址(/etc/sysconfig/network-scripts/ifcfg-eth0) DEVICE="eth0" NM_CONTROLLED="yes" ONBOOT="yes" BOOTPROTO=static IPADDR=192.168.1.127 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=192.168.1.1 同理:RS2的配置如下: DEVICE="eth0" NM_CONTROLLED="yes" ONBOOT="yes" BOOTPROTO=static IPADDR=192.168.1.128 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=192.168.1.1 2.配置主机名和/etc/hosts文件 vim /etc/sysconfig/network 中的HOSTNAME=RS1,同理将RS2中的改为RS2. vim /etc/hosts 文件把自己127.0.0.1解析为自己,并添加 192.168.1.127 RS1 192.168.1.128 RS2这两行。 3.设置两个主机能够进行ssh密钥认证通信。 在RS1和RS2上执行同样的操作 #ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' #ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1 测试成功: #ssh RS1 'ifconfig' 4.同步时间: 在RS1上安装ntp并开启服务同步 #yum install ntp -y #/etc/init.d/ntpd start 注意RS2无法进行ntpdate同步,出现no server suitable for synchronization found错误: 则修改:/etc/ntp.conf,在最后加入 server 127.127.1.0 fudge 127.127.1.0 stratum 8 在RS2上安装ntpdate: #yum install ntpdate -y #crontab -e */5 * * * * /usr/sbin/ntpdate 192.168.1.127 5.此处关闭两个节点的防火墙和selinux [root@RS1 ~]# service iptables stop [root@RS1 ~]# setenforce 0 [root@RS2 ~]# service iptables stop [root@RS1 ~]# setenforce 0
首先要解决安装包之间的依赖。
libibverbs, librdmacm, lm_sensors, libtool-ltdl, openhpi-libs, openhpi, perl-TimeDate
#yum install libibverbs librdmacm lm_sensors libtool-ltdl openhpi-libs openhpi perl-TimeDate
b. 安装corosync和pacemaker,下载所需要如下软件包至本地.
注意:由于pacemaker对heartbeat有依赖作用,所以要安装上heartbeat。
cluster-glue cluster-glue-libs heartbeat resource-agents corosync heartbeat-libs pacemaker corosynclib libesmtp pacemaker-libs pssh python-pssh crmsh 我们要想使用pacemaker配置的话需要安装一个pacemaker的接口,它的这个程序的接口叫crmshell,它在新版本的 pacemaker已经被独立出来了,不再是pacemaker的组成部分了,早期装上pacemaker就会自带有crmshell,因此要想用 crmshell的话得去安装crmshell,而安装crmshell又依赖于pssh的相关包,因此得安装这两个组件,(这里的这两个包是自己制件 的),哪个节点配置就安装在哪个节点上就可以了,也无需两个节点都安装这两个包。 #yum localinstall --nogpgcheck *.rpm
1.首先复制一个配置文件: #cp corosync.conf.example corosync.conf 2.修改配置文件内容: # vim /etc/corosync/corosync.conf 编辑配置文件修改如下内容 compatibility: whitetank #这个表示是否兼容0.8之前的版本 totem { #图腾,这是用来定义集群中各节点中是怎么通信的以及参数 version: 2 #图腾的协议版本,它是种协议,协议是有版本的,它是用于各节点互相通信的协议,这是定义版本的 secauth: on #表示安全认证功能是否启用的 threads: 0 #实现认证时的并行线程数,0表示默认配置 interface { # 指定在哪个接口上发心跳信息的,它是个子模块 ringnumber: 0 #环号码,集群中有多个节点,每个节点上有多个网卡,别的节点可以接收,同时我们本机的别一块网卡也可以接收,为了避免这些信息在这样的环状发送,因此要为这个网卡定义一个唯一的环号码,以避免心跳信息环发送。这里只有一张网卡,就不会形成环路。 bindnetaddr: 192.168.1.0 # 绑定的网络地址 mcastaddr: 226.94.1.1 #多播地址,一对多通信 mcastport: 5405 # 多播端口 ttl: 1 # 表示只向外播一次 } } logging { # 跟日志相关 fileline: off to_stderr: no # 表示是否需要发送到错误输出 to_logfile: yes #是不是送给日志文件 to_syslog: no #是不是送给系统日志 logfile: /var/log/cluster/corosync.log #日志文件路径 debug: off #是否启动调试 timestamp: on #日志是否需要记录时间戳 logger_subsys { #日志的子系统 subsys: AMF debug: off } } amf { # 跟编程接口相关的 mode: disabled } service { #定义一个服务来启动pacemaker ver: 0 #定义版本 name: pacemaker #这个表示启动corosync时会自动启动pacemaker } aisexec { #表示启动ais的功能时以哪个用户的身份去运行的 user: root group: root #其实这个块定义不定义都可以,corosync默认就是以root身份去运行的 } 3.生成节点之间通信的密钥文件: # corosync-keygen 这个可能熵池中的随机数不够,可以这样 [root@RS1 corosync]# mv /dev/random /dev/m [root@RS1 corosync]# ln /dev/urandom /dev/random [root@RS1 corosync]# corosync-keygen Corosync Cluster Engine Authentication key generator. Gathering 1024 bits for key from /dev/random. Press keys on your keyboard to generate entropy. Writing corosync key to /etc/corosync/authkey. [root@RS1 corosync]# rm -ef /dev/random rm: invalid option -- 'e' Try `rm --help' for more information. [root@RS1 corosync]# rm -rf /dev/random [root@RS1 corosync]# mv /dev/m /dev/random 4.将配置好的文件发给其他节点: # scp /etc/corosync/{authkey,corosync.conf} RS2:/etc/corosync/ 5.在节点上建立日志文件存的地方 [root@RS1 corosync]# mkdir /var/log/cluster [root@RS1 corosync]# ssh RS2 'mkdir /var/log/cluster' 6.启动Corosync 1.查看corosync引擎是否正常启动: # grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages 2.查看初始化成员节点通知是否正常发出: # grep TOTEM /var/log/messages 3.检查启动过程中是否有错误产生: # grep ERROR: /var/log/messages | grep -v unpack_resources 4.查看pacemaker是否正常启动: # grep pcmk_startup /var/log/messages 5.如果以上没有问题那么启动RS2(远程启动) [root@RS1 corosync]# ssh RS2 '/etc/init.d/corosync start' Starting Corosync Cluster Engine (corosync): [ OK ] 6.查看启动情况: [root@RS1 ~]# crm status Last updated: Sun May 24 15:58:18 2015 Last change: Sun May 24 15:55:52 2015 Stack: classic openais (with plugin) Current DC: RS1 - partition with quorum Version: 1.1.11-97629de 2 Nodes configured, 2 expected votes 0 Resources configured Online: [ RS1 RS2 ]
1)由于这里没有STONITH设备,所以关闭STONITH设备
2)为集群添加资源
corosync支持heartbeat,LSB和ocf等类型的资源代理,目前较为常用的类型为LSB和OCF两类,stonith类专为配置stonith设备而用;
1)可以通过如下命令查看当前集群系统所支持的类型:
# crm ra classes
heartbeat
lsb
ocf / heartbeat pacemaker
stonith
2)如果想要查看某种类别下的所用资源代理的列表,可以使用类似如下命令实现:
# crm ra list lsb
# crm ra list ocf heartbeat
# crm ra list ocf pacemaker
# crm ra list stonith
3)配置web集群的IP地址资源,cib的语法如下:
语法:
primitive <rsc> [<class>:[<provider>:]]<type>
[params attr_list]
[operations id_spec]
[op op_type [<attribute>=<value>...] ...
op_type :: start | stop | monitor
例子:
primitive apcfence stonith:apcsmart \
params ttydev=/dev/ttyS0 hostlist="node1 node2" \
op start timeout=60s \
op monitor interval=30m timeout=60s
配置命令:
# crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=192.168.1.122
如果想要在RS1上看WebIP的信息;
可以再RS1上直接 #ip addr show;
现在如果将RS1的Corosync关闭之后就可以看到高可用的作用,如下:(在RS2上关闭RS1的服务) 此时注意在cib中不能有location cli-prefer-WebIP WebIP role=Started inf: RS1,这个是资源粘性,说明即使是RS1宕机之后也不能转移资源。
[root@RS2 ~]# ssh RS1 '/etc/init.d/corosync stop' Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ] Waiting for corosync services to unload:.[ OK ] You have new mail in /var/spool/mail/root
但是这里并没有转移,这个就是因为quorum法定票数的问题,由于现在来说,两个节点的票数都是一样多的,所以这里就默认,两边节点票数一样多的话就会stop,所以这里可以配置参数
# crm configure property no-quorum-policy=ignore 这里表示如果集群分裂的话就忽略,运行的结点继续提供服务。
由上图看出,RS1上线之后并没有进行资源的转移,这是由于资源粘性的原因:
如下是关于资源粘性的解释:
0:这是默认选项。资源放置在系统中的最适合位置。这意味着当负载能力“较好”或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;
大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;
小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;
INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;
-INFINITY:资源总是移离当前位置;
1)下面修改一下默认的资源粘性,这样的话一开始在运行的结点上设置默认的资源粘性为100
# crm configure rsc_defaults resource-stickiness=100
此时WebIP资源又转移到了RS1上,那么重新上线之后的结果也是没有转移到RS2上,因为此时的默认的资源粘性都是100,如果要是将在RS2上对WebIP的资源粘性比100大的话,那么会转移到RS2上。
2)下面再配置一个httpd(web)的资源,
首先,在两个结点上都安装上httpd服务,
# yum install httpd -y
注意:安装完成之后将
[root@RS1]# echo RS1 > /var/www/html/index.html
[root@RS2]# echo RS2 > /var/www/html/index.html
service httpd start 开启服务
chkconfig httpd off 去掉开机自动启动,方便集群的管理。
测试httpd是否成功(用浏览器),也可以用curl命令,例如:
curl http://192.168.1.127
其次,配置httpd资源
#crm configure primitive httpd lsb:httpd
此时查看状态会发现,资源默认的分配方式是平均分配,也是就说会将资源轮着分给每一个结点:
3)调整资源约束:
WebIP和httpd服务要在一个节点上才能够提供服务,那么如何约束结点之间的行为,那就是资源约束的功能:
资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:
1、Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;
2、Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行;
3、Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;
定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分。其实,从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式修改分数来实现的。分数按每个资源来计算,资源分数为负的任何节点都无法运行该资源。在计算出资源分数后,集群选择分数最高的节点。INFINITY(无穷大)目前定义为 1,000,000。
加减无穷大遵循以下3个基本规则:
1)任何值 + 无穷大 = 无穷大
2)任何值 - 无穷大 = -无穷大
3)无穷大 - 无穷大 = -无穷大
定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。
4)对WebIP和httpd可要在一起资源的约束
#crm configure collocation http-with-WebIP INFINITY: httpd WebIP
可以看到现在资源在一个节点上运行。
5)先启动WebIP然后启动httpd服务。
#crm configure order httpd-after-WebIP mandatory: WebIP WebSite
6)如果两个节点的性能不一样,总是希望服务能够运行在RS1则个高性能的结点上,那么要定位置约束,例如:
#crm configure location prefer-RS1 httpd rule 200: #uname eq RS1
当RS1宕机之后重新上线就会引起资源重新回到RS1。
1.在Corosync的配置文件中可以进行多播地址的修改,下面是多播地址的知识:
多播地址(multicast address)即组播地址,是一组主机的标示符,它已经加入到一个多播组中。在以太网中,多播地址是一个48位的标示符,命名了一组应该在这个网络中应用接收到一个分组的站点。在IPv4中,它历史上被叫做D类地址,一种类型的IP地址,它的范围从224.0.0.0到239.255.255.255,或,等同的,在224.0.0.0/4。在IPv6,多播地址都有前缀ff00::/8。
多播是第一个字节的最低位为1的所有地址,例如01-12-0f-00-00-02。广播地址是全1的48位地址,也属于多播地址。但是广播又是多播中的特例,就像是正方形属于长方形,但是正方形有长方形没有的特点。
2.crmshell中如果不会使用某一个指令可以用help + 命令来查询。
转载于:https://blog.51cto.com/wuxiangdong/1654925