天天看点

高可用集群 corosync 搭建步骤

实验环境:

    OS :    CentOS 6.6 

    corosync: corosync-1.4.7-1.el6.x86_64

    pacemaker:pacemaker-1.1.12-4.el6.x86_64

    crmsh:crmsh-2.1-1.6.x86_64.rpm 

    pssh:    pssh-2.3.1-2.el6.x86_64.rpm

    node1:

        hostname: node2.1inux.com

        IP     :172.16.66.81

    node2:    

        IP    : 172.16.66.82

一、前期环境配置 

为了配置一台Linux主机成为HA的节点,通常需要做出如下的准备工作:

1)所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:

<code>172.16.66.81  node1.1inux.com node1</code>

<code>172.16.66.82   node2.1inux.com node2</code>

为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:

<code>Node1:</code>

<code># sed -i </code><code>'s@\(HOSTNAME=\).*@\1node1.1inux.com@g'</code>  <code>/etc/sysconfig/network</code>

<code># hostname node1.1inux.com</code>

<code>Node2:</code>

<code># sed -i </code><code>'s@\(HOSTNAME=\).*@\1node2.1inux.com@g'</code> <code>/etc/sysconfig/network</code>

<code># hostname node2.1inux.com</code>

2、设定 node1 、node2基于ssh秘钥的认证的配置

<code>Node1:</code>

<code>[root@node1 ~]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -P </code><code>''</code>

<code>[root@node1 ~]# ssh-</code><code>copy</code><code>-id -i /root/.ssh/id_rsa.pub [email protected]</code>

<code>[root@node2 ~]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -P </code><code>''</code>

<code>[root@node2 ~]# ssh-</code><code>copy</code><code>-id -i /root/.ssh/id_rsa.pub [email protected]</code>

3、时间同步配置

<code>[root@node1 yum.repos.d]# ntpdate 172.16.0.1 ; ssh node2 </code><code>'ntpdate 172.16.0.1'</code>

<code>30 May 16:20:20 ntpdate[2351]: adjust time server 172.16.0.1 offset 0.195961 sec</code>

<code>30 May 16:20:21 ntpdate[1994]: step time server 172.16.0.1 offset 1.033553 sec</code>

<code>[root@node1 yum.repos.d]#</code>

验证时间同步:

<code>[root@node2 ~]# </code><code>date</code><code>; ssh node1 </code><code>"date"</code>

<code>Sat May 30 16:51:13 CST 2015</code>

<code>[root@node2 ~]#</code>

二、安装配置 corosync 、pacemaker 

1、安装corosync  pacemaker 

<code>在node1 上面安装:</code>

<code>[root@node1 ~]# yum -y install corosync pacemaker</code>

<code>在node2上安装</code>

<code>[root@node2 ~]# yum -y install corosync pacemaker</code>

<code>===========================</code>

<code>查看安装生成的文件</code>

<code>[root@node2 ~]# rpm -ql corosync</code>

<code>/etc/corosync</code>

<code>/etc/corosync/corosync.conf.example        </code><code>//样例配置文件</code>

<code>/etc/corosync/corosync.conf.example.udpu    </code><code>//</code>

<code>/etc/corosync/service.d        </code><code>//服务脚本</code>

<code>/etc/corosync/uidgid.d</code>

<code>/etc/dbus-1/system.d/corosync-signals.conf</code>

<code>/etc/rc.d/init.d/corosync        </code><code>//服务文件</code>

<code>/etc/rc.d/init.d/corosync-notifyd</code>

<code>/etc/sysconfig/corosync-notifyd</code>

<code>/usr/bin/corosync-blackbox</code>

<code>/usr/libexec/lcrso</code>

<code>...</code>

<code>/usr/sbin/corosync</code>

<code>/usr/sbin/corosync-cfgtool</code>

<code>/usr/sbin/corosync-cpgtool</code>

<code>/usr/sbin/corosync-fplay</code>

<code>/usr/sbin/corosync-keygen</code>

<code>/usr/sbin/corosync-notifyd</code>

<code>/usr/sbin/corosync-objctl</code>

<code>/usr/sbin/corosync-pload</code>

<code>/usr/sbin/corosync-quorumtool</code>

<code>....</code>

<code>/</code><code>var</code><code>/lib/corosync</code>

<code>/</code><code>var</code><code>/log/cluster</code>

2、配置corosync ,以下操作在在node2 上操作

<code>[root@node2 ~]# cd /etc/corosync/</code>

<code>[root@node2 corosync]# cp corosync.conf.example corosync.conf</code>

<code>[root@node2 corosync]# vim corosync.conf</code>

<code># Please read the corosync.conf.5 manual page</code>

<code>compatibility: whitetank</code>

<code>totem {</code>

<code>    </code><code>version: 2</code>

<code>    </code><code># secauth: Enable mutual node authentication. If you choose to</code>

<code>    </code><code># enable this (</code><code>"on"</code><code>), then </code><code>do</code> <code>remember to create a shared</code>

<code>    </code><code># secret with </code><code>"corosync-keygen"</code><code>.</code>

<code>    </code><code>secauth: on        </code><code>//开启安全认证 </code>

<code>    </code><code>threads: 0        </code><code>//线程数 0 表示不基于线程模式工作而是进程</code>

<code>    </code><code># </code><code>interface</code><code>: define at least one </code><code>interface</code> <code>to communicate</code>

<code>    </code><code># over. If you define more than one </code><code>interface</code> <code>stanza, you must</code>

<code>    </code><code># also set rrp_mode.</code>

<code>    </code><code>interface</code> <code>{</code>

<code>                </code><code># Rings must be consecutively numbered, starting at 0.</code>

<code>        </code><code>ringnumber: 0        </code><code>//环数目   一般保持为0</code>

<code>        </code><code># This is normally the *network* address of the</code>

<code>        </code><code># </code><code>interface</code> <code>to bind to. This ensures that you can </code><code>use</code>

<code>        </code><code># identical instances of this configuration file</code>

<code>        </code><code># across all your cluster nodes, without having to</code>

<code>        </code><code># modify this option.</code>

<code>        </code><code>bindnetaddr: 172.16.0.0        </code><code>//网络地址     更改为主机所在网络的网络地址</code>

<code>        </code><code># However, </code><code>if</code> <code>you have multiple physical network</code>

<code>        </code><code># interfaces configured </code><code>for</code> <code>the same subnet, then the</code>

<code>        </code><code># network address alone is not sufficient to identify</code>

<code>        </code><code># the </code><code>interface</code> <code>Corosync should bind to. In that </code><code>case</code><code>,</code>

<code>        </code><code># configure the *host* address of the </code><code>interface</code>

<code>        </code><code># instead:</code>

<code>        </code><code># bindnetaddr: 192.168.1.1</code>

<code>        </code><code># When selecting a multicast address, consider RFC</code>

<code>        </code><code># 2365 (which, among other things, specifies that</code>

<code>        </code><code># 239.255.x.x addresses are left to the discretion of</code>

<code>        </code><code># the network administrator). Do not reuse multicast</code>

<code>        </code><code># addresses across multiple Corosync clusters sharing</code>

<code>        </code><code># the same network.</code>

<code>        </code><code>mcastaddr: 239.235.88.8        </code><code>//多播地址  </code>

<code>        </code><code># Corosync uses the port you specify here </code><code>for</code> <code>UDP</code>

<code>        </code><code># messaging, </code><code>and</code> <code>also the immediately preceding</code>

<code>        </code><code># port. Thus </code><code>if</code> <code>you set this to 5405, Corosync sends</code>

<code>        </code><code># messages over UDP ports 5405 </code><code>and</code> <code>5404.</code>

<code>        </code><code>mcastport: 5405        </code><code>//多播地址监听端口</code>

<code>        </code><code># Time-to-live </code><code>for</code> <code>cluster communication packets. The</code>

<code>        </code><code># number of hops (routers) that this ring will allow</code>

<code>        </code><code># itself to pass. Note that multicast routing must be</code>

<code>        </code><code># specifically enabled on most network routers.</code>

<code>        </code><code>ttl: 1</code>

<code>    </code><code>}</code>

<code>}</code>

<code>logging {</code>

<code>    </code><code># Log the source file </code><code>and</code> <code>line where messages are being</code>

<code>    </code><code># generated. When in doubt, leave off. Potentially useful </code><code>for</code>

<code>    </code><code># debugging.</code>

<code>    </code><code>fileline: off</code>

<code>    </code><code># Log to standard error. When in doubt, set to no. Useful when</code>

<code>    </code><code># running in the foreground (when invoking </code><code>"corosync -f"</code><code>)</code>

<code>    </code><code>to_stderr: no</code>

<code>    </code><code># Log to a log file. When set to </code><code>"no"</code><code>, the </code><code>"logfile"</code> <code>option</code>

<code>    </code><code># must not be set.</code>

<code>    </code><code>to_logfile: yes        </code><code>//是否记录日志 </code>

<code>    </code><code>logfile: /</code><code>var</code><code>/log/cluster/corosync.log        </code><code>//日志文件保存位置</code>

<code>    </code><code># Log to the system log daemon. When in doubt, set to yes.</code>

<code>    </code><code>to_syslog: no        </code><code>//是否记录系统日志  一般只记录一份  设置为NO </code>

<code>    </code><code># Log debug messages (very verbose). When in doubt, leave off.</code>

<code>    </code><code>debug: off</code>

<code>    </code><code># Log messages with time stamps. When in doubt, set to on</code>

<code>    </code><code># (unless you are only logging to syslog, where double</code>

<code>    </code><code># timestamps can be annoying).</code>

<code>    </code><code>timestamp: on         </code><code>//是否开启时间戳功能</code>

<code>    </code><code>logger_subsys {</code>

<code>        </code><code>subsys: AMF</code>

<code>        </code><code>debug: off</code>

<code>//添加如下行 使pacemaker 以corosync插件方式运行    </code>

<code>service {</code>

<code>  </code><code>ver:  0</code>

<code>  </code><code>name: pacemaker</code>

<code>  </code><code>use_mgmtd: yes</code>

<code>   </code><code>}</code>

<code>  </code> 

<code>aisexec {</code>

<code>  </code><code>user: root</code>

<code>  </code><code>group:  root</code>

<code>      </code><code>}</code>

<code>=======================================</code>

生成corosync的密钥文件 

查看 # corosync-keygen使用方法:

corosync-keygen是从/dev/random中读取随机数,如果此熵池中随机数过少,可能导致无法生成密钥,但可以通过下载软件或其他方案来产生大量I/O从而增加熵池中的随机数,编译生成密钥 

<code>[root@node2 ~]# corosync-keygen</code>

<code>.....</code>

<code>Press keys on your keyboard to generate entropy (bits = 896).</code>

<code>Press keys on your keyboard to generate entropy (bits = 960).</code>

<code>Writing corosync key to /etc/corosync/authkey.   </code><code>//生成的密钥文件保存的位置</code>

3、查看网卡是否开启了组播MULTICAST功能如果没有开启,要手动开启  

<code>[root@node2 corosync]# ip link show</code>

<code>1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN </code>

<code>    </code><code>link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</code>

<code>2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>

<code>    </code><code>link/ether 00:0c:29:3d:a9:a1 brd ff:ff:ff:ff:ff:ff</code>

<code>[root@node2 corosync]#</code>

4、将corosync.conf 和authkey复制到node1中 

<code>[root@node2 corosync]# scp authkey corosync.conf node1:/etc/corosync/</code>

<code>authkey                                                                                                    100%  128     0.1KB/s   00:00    </code>

<code>corosync.conf                                                                                              100% 2773     2.7KB/s   00:00    </code>

三、安装crmsh

RHEL自6.4起不再提供集群的命令行配置工具crmsh,转而使用pcs;所以如果想使用crmsh可以自行安装:

分别在node1和node2 上安装crmsh和pssh

<code>[root@node2 ~]# ls</code>

<code>anaconda-ks.cfg  crmsh-2.1-1.6.x86_64.rpm  install.log  install.log.syslog  pssh-2.3.1-2.el6.x86_64.rpm</code>

<code>[root@node2 ~]#  yum --nogpgcheck localinstall crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm</code>

将此两个安装文件复制到node1上进行安装

<code>[root@node2 ~]# scp crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm node1:/root/</code>

<code>[root@node1 ~]#  yum --nogpgcheck localinstall crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm</code>

查看安装crmsh生成的文件

<code>----------------------</code>

<code>[root@node1 ~]# rpm -ql crmsh</code>

<code>/etc/bash_completion.d/crm.sh</code>

<code>/etc/crm</code>

<code>/etc/crm/crm.conf</code>

<code>/usr/sbin/crm</code>

<code>/usr/share/crmsh</code>

<code>/</code><code>var</code><code>/cache/crm</code>

<code>---------------------------</code>

查看pssh生成的文件 

<code>[root@node1 ~]# rpm -ql pssh</code>

<code>/usr/bin/pnuke</code>

<code>/usr/bin/prsync</code>

<code>/usr/bin/pscp.pssh</code>

<code>/usr/bin/pslurp</code>

<code>/usr/bin/pssh</code>

<code>/usr/libexec/pssh</code>

<code>/usr/libexec/pssh/pssh-askpass</code>

<code>[root@node1 ~]#</code>

四、验证:

1、启动 corosync    

<code>[root@node1 ~]# service corosync start</code>

<code>Starting Corosync Cluster Engine (corosync):               [  OK  ]</code>

2、验证端口:

<code>[root@node1 log]# ss -tunl | grep :5405</code>

<code>udp    UNCONN     0      0           172.16.66.82:5405                  *:*     </code>

<code>udp    UNCONN     0      0            239.235.1.8:5405                  *:*     </code>

<code>[root@node2 log]#</code>

3、查看corosync引擎是否正常启动:

<code># grep -e </code><code>"Corosync Cluster Engine"</code> <code>-e </code><code>"configuration file"</code> <code>/</code><code>var</code><code>/log/cluster/corosync.log</code>

如图 3

<a href="http://s3.51cto.com/wyfs02/M00/6E/0C/wKiom1VySLagJG-EAAEPxmZ_ci4947.jpg" target="_blank"></a>

4、查看初始化成员节点通知是否正常发出:

如图4

<a href="http://s3.51cto.com/wyfs02/M01/6E/08/wKioL1VySm3BrmemAAD6VlsYOaQ933.jpg" target="_blank"></a>

5、检查启动过程中是否有错误产生。下面的错误信息表示packmaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务;此处可安全忽略。

图5 

<a href="http://s3.51cto.com/wyfs02/M01/6E/0C/wKiom1VySN_zticiAAGkyQFoPCg370.jpg" target="_blank"></a>

6、查看pacemaker是否正常启动,图6 

<a href="http://s3.51cto.com/wyfs02/M02/6E/0C/wKiom1VySPrwiP_9AACIIVwqar4196.jpg" target="_blank"></a>

如果上面命令执行均没有问题,接着可以执行如下命令启动node2上的corosync

[root@node1 ~]# ssh node2 -- /etc/init.d/corosync start

注意:启动node2需要在node1上使用如上命令进行,不要在node2节点上直接启动。

使用crmsh命令查看集群节点的启动状态

图7

<a href="http://s3.51cto.com/wyfs02/M02/6E/08/wKioL1VyStvgfjz_AAEuHwIoBrc381.jpg" target="_blank"></a>

五、配置集群的工作属性

1、corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用,这可以通过如下命令验正:

<a href="http://s3.51cto.com/wyfs02/M00/6E/08/wKioL1VySy_RE0iAAAFNqqYMgRE553.jpg" target="_blank"></a>

禁用后查看

# crm configure property stonith-enabled=false

图9  

<a href="http://s3.51cto.com/wyfs02/M00/6E/0C/wKiom1VySaODiK0TAABdtfBhbs0751.jpg" target="_blank"></a>

2、使用crmsh命令查看当前的配置信息 

图10

<a href="http://s3.51cto.com/wyfs02/M01/6E/08/wKioL1VyS1DDkDMIAADvotVATXU738.jpg" target="_blank"></a>

[root@node1 ~]# crm configure show

node node1.1inux.com

node node2.1inux.com

property cib-bootstrap-options: \

    dc-version=1.1.11-97629de \

    cluster-infrastructure="classic openais (with plugin)" \

    expected-quorum-votes=2 \

    stonith-enabled=false   //stonith  已被禁用

[root@node1 ~]# 

也可以进入crm命令模式关闭 图13

<a href="http://s3.51cto.com/wyfs02/M02/6E/08/wKioL1VyS5KxycmyAALHP1G-NZ0291.jpg" target="_blank"></a>

将no-quorum-policy 设置为ignore 

<code>crm(live)configure# property no-quorum-policy=ignore</code>

<code>crm(live)configure# show</code>

<code>node node1.1inux.com \</code>

<code>    </code><code>attributes standby=off</code>

<code>node node2.1inux.com \</code>

<code>property cib-bootstrap-options: \</code>

<code>    </code><code>dc-version=1.1.11-97629de \</code>

<code>    </code><code>cluster-infrastructure=</code><code>"classic openais (with plugin)"</code> <code>\</code>

<code>    </code><code>expected-quorum-votes=2 \</code>

<code>    </code><code>stonith-enabled=false \</code>

    no-quorum-policy=ignore

3、为集群添加集群资源

corosync支持heartbeat,LSB和ocf等类型的资源代理,目前较为常用的类型为LSB和OCF两类,stonith类专为配置stonith设备而用;

可以通过如下命令查看当前集群系统所支持的类型:

[root@node1 ~]# crm ra classes

<a href="http://s3.51cto.com/wyfs02/M00/6E/08/wKioL1VyS8-wx-c4AABUxq4Owns597.jpg" target="_blank"></a>

如果想要查看某种类别下的所用资源代理的列表,可以使用类似如下命令实现:

# crm ra list lsb

# crm ra list ocf heartbeat

# crm ra list ocf pacemaker

# crm ra list stonith

# crm ra info [class:[provider:]]resource_agent

例如:

# crm ra info ocf:heartbeat:IPaddr

图12 

<a href="http://s3.51cto.com/wyfs02/M00/6E/0C/wKiom1VySkqAjN0tAAPYJAqxXKg201.jpg" target="_blank"></a>

六、配置高可用的Web集群

1、为web集群创建一个IP地址资源,以在通过集群提供web服务时使用

<code>crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=172.16.66.100 nic=eth0 cidr_netmask=16 op monitor interval=10 timeout=20s</code>

<code>crm(live)configure# verify</code>

<code>crm(live)configure# commit</code>

<code>crm(live)configure#</code>

<a href="http://s3.51cto.com/wyfs02/M02/6E/08/wKioL1VyTDexVu9OAAI6wC9jxag338.jpg" target="_blank"></a>

进入crm 命令行  下线node1  操作

crm(live)node# standby

<a href="http://s3.51cto.com/wyfs02/M02/6E/0C/wKiom1VySrqQCIf5AAKE83wp84M733.jpg" target="_blank"></a>

然后查看node节点状态信息

图15

<a href="http://s3.51cto.com/wyfs02/M00/6E/0C/wKiom1VyStzzUzh5AAExfy15SDQ908.jpg" target="_blank"></a>

图15 可以看到node1 已经下线 现在在线的是node2

查看node2  IP 图19  

<a href="http://s3.51cto.com/wyfs02/M01/6E/0C/wKiom1VySuywa5IrAAGdg8urFNQ524.jpg" target="_blank"></a>

OK   IP配置完成,接下来我们配置httpd

2、高可用集群Web的配置

使用yum源分别在node1、node2 安装httpd

分别启动node1、node2上的httpd,并为其创建相应的主页

<code>node1:</code>

<code>[root@node1 ~]# service httpd start</code>

<code>Starting httpd:                                            [  OK  ]</code>

<code>[root@node1 ~]# </code><code>echo</code> <code>"&lt;h1&gt;node1.1inux.com&lt;/h1&gt;"</code> <code>&gt; /</code><code>var</code><code>/www/html/index.html</code>

<code>[root@node1 ~]# curl 172.16.66.81</code>

<code>&lt;h1&gt;node1.1inux.com&lt;/h1&gt;</code>

<code>[root@node1 ~]# chkconfig httpd off</code>

<code>[root@node1 ~]# service httpd stop</code>

<code>node2:</code>

<code>[root@node2 ~]# service httpd start</code>

<code>[root@node2 ~]# </code><code>echo</code> <code>"&lt;h1&gt;node2.1inux.com&lt;/h1&gt;"</code> <code>&gt; /</code><code>var</code><code>/www/html/index.html</code>

<code>[root@node2 ~]# curl 172.16.66.82</code>

<code>&lt;h1&gt;node2.1inux.com&lt;/h1&gt;</code>

<code>[root@node2 ~]# service httpd stop</code>

<code>[root@node2 ~]# chkconfig httpd off</code>

然后再node1 上配置如下  

<code>configure # primitive webserver lsb:httpd  op monitor interval=10 timeout=20s</code>

<code>crm(live)configure# group ip_web webip webserver            </code><code>//创建组 </code>

<code>primitive webip IPaddr \</code>

<code>    </code><code>params ip=172.16.66.100 nic=eth0 cidr_netmask=16 \</code>

<code>    </code><code>op monitor interval=10 timeout=20s</code>

<code>primitive webserver lsb:httpd \</code>

<code>group ip_web webip webserver</code>

<code>    </code><code>no-quorum-policy=ignore</code>

<code>crm(live)configure# cd ..</code>

<code>crm(live)# status</code>

<code>Last updated: Sun May 31 00:27:05 2015</code>

<code>Last change: Sun May 31 00:24:37 2015</code>

<code>Stack: classic openais (with plugin)</code>

<code>Current DC: node2.1inux.com - partition with quorum</code>

<code>Version: 1.1.11-97629de</code>

<code>2 Nodes configured, 2 expected votes</code>

<code>2 Resources configured</code>

<code>Online: [ node1.1inux.com node2.1inux.com ]</code>

<code> </code><code>Resource Group: ip_web</code>

<code>     </code><code>webip    (ocf::heartbeat:IPaddr):    Started node1.1inux.com </code>

<code>     </code><code>webserver    (lsb:httpd):    Started node1.1inux.com            </code><code>//就可以看到此时 webip   webserver  都在node1上面了 </code>

<code>crm(live)#</code>

然后我们访问http://172.16.66.100,如图20 ,显示的是node1页面 

<a href="http://s3.51cto.com/wyfs02/M02/6E/08/wKioL1VyTOGSlsBKAADCreu2TpM142.jpg" target="_blank"></a>

然后我们在node1上运行如下命令,然后再访问 http://172.16.66.100

[root@node1 ~]# service corosync stop

Signaling Corosync Cluster Engine (corosync) to terminate: [  OK  ]

Waiting for corosync services to unload:.                  [  OK  ]

<a href="http://s3.51cto.com/wyfs02/M02/6E/0C/wKiom1VyS2CwjhnjAACw6QHT4KE783.jpg" target="_blank"></a>

此时访问的页面已经变成了node2

OK  基于heartbeat,crmsh的高可用集群已经搭建完毕

本文转自 1inux 51CTO博客,原文链接:http://blog.51cto.com/1inux/1659046

继续阅读