设为首页 收藏本站
查看: 2501|回复: 1

[经验分享] Corosync+pacemaker高可用集群实现

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-5-26 08:52:53 | 显示全部楼层 |阅读模式
目录:


    • 实验规划
    • 实验准备
    • 软件安装
    • 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        [iyunv@RS1 ~]# service  iptables stop        [iyunv@RS1 ~]# setenforce 0                [iyunv@RS2 ~]# service  iptables stop        [iyunv@RS1 ~]# setenforce 0
4. 软件安装


    • 首先要解决安装包之间的依赖。

        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
5.  配置Corosync
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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
    这个可能熵池中的随机数不够,可以这样
    [iyunv@RS1 corosync]# mv /dev/random /dev/m
    [iyunv@RS1 corosync]# ln /dev/urandom /dev/random
    [iyunv@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.
    [iyunv@RS1 corosync]# rm -ef /dev/random
    rm: invalid option -- 'e'
    Try `rm --help' for more information.
    [iyunv@RS1 corosync]# rm -rf /dev/random
    [iyunv@RS1 corosync]# mv /dev/m /dev/random
4.将配置好的文件发给其他节点:
    # scp /etc/corosync/{authkey,corosync.conf} RS2:/etc/corosync/
5.在节点上建立日志文件存的地方
[iyunv@RS1 corosync]# mkdir /var/log/cluster
[iyunv@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(远程启动)
   [iyunv@RS1 corosync]# ssh RS2 '/etc/init.d/corosync start'
   Starting Corosync Cluster Engine (corosync): [  OK  ]
6.查看启动情况:
    [iyunv@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 ]



6.  高可用功能实现
    1)由于这里没有STONITH设备,所以关闭STONITH设备
wKioL1VhlxCiI_c4AAEwgx1hjh0379.jpg
    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
           配置命令:         
1
            # crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=192.168.1.122



wKioL1Vh2i7yTUg-AAFQ1f_1ug0921.jpg
            如果想要在RS1上看WebIP的信息;

            可以再RS1上直接 #ip addr show;  
wKioL1Vh2rbxFGxCAAKAQsZMjyA130.jpg
            现在如果将RS1的Corosync关闭之后就可以看到高可用的作用,如下:(在RS2上关闭RS1的服务) 此时注意在cib中不能有location cli-prefer-WebIP WebIP role=Started inf: RS1,这个是资源粘性,说明即使是RS1宕机之后也不能转移资源。
1
2
3
4
    [iyunv@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,所以这里可以配置参数
1
2
     # crm configure property no-quorum-policy=ignore
     这里表示如果集群分裂的话就忽略,运行的结点继续提供服务。



wKioL1VilIrRUBNMAAFvAohHWrc339.jpg
7.    资源粘性
        由上图看出,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
                注意:安装完成之后将
                 [iyunv@RS1]# echo RS1 > /var/www/html/index.html
                 [iyunv@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
wKioL1VimW6zYrkwAAHmMiODx1w728.jpg
           此时查看状态会发现,资源默认的分配方式是平均分配,也是就说会将资源轮着分给每一个结点:   

wKiom1VimGXRKEc6AAB8r2pOMao081.jpg
      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
wKioL1VingDxF6djAACNeVty10Y558.jpg
         可以看到现在资源在一个节点上运行。   

        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 + 命令来查询。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-70744-1-1.html 上篇帖子: 高可用集群架构详解(基于corosync) 下篇帖子: (tengine+keepalived)+(apache+tomcat)+memcached+mysql实现高可用、负载均衡、可扩展架构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表