corosync+pacemaker

corosync:由OpenAIS独立出来的一个开源项目,用于实现集群底层心跳信息传递
         和redhat的cman一样,一般结合pacemaker,而pacemaker是属于
         heartbeat的一个套件
什么是Pacemaker?
Pacemaker是一个集群资源管理者。他用资源级别的监测和恢复来保证集群服务(aka. 资源)的最大可用
性。它可以用你所擅长的基础组件(Corosync或者是Heartbeat)来实现通信和关系管理。
Pacemaker包含以下的关键特性:
监测并恢复节点和服务级别的故障
存储无关,并不需要共享存储
资源无关,任何能用脚本控制的资源都可以作为服务
支持使用STONITH2来保证数据一致性。
支持大型或者小型的集群
clusters 支持 quorate(法定人数)3 或 resource(资源)4 驱动的集群
支持任何的 冗余配置5
自动同步各个节点的配置文件
可以设定集群范围内的ordering, colocation and anti-colocation
Support for advanced service types
Clones:为那些要在多个节点运行的服务所准备的
Multi-state:为那些有多种模式的服务准备的。(比如.主从, 主备)

Pacemaker本身由四个关键组件组成:
CIB (aka. 集群信息基础)
CRMd (aka. 集群资源管理守护进程)
PEngine (aka. PE or 策略引擎)
STONITHd

CIB用XML来展示集群的配置和资源的当前状态。 CIB的内容会自动地在集群之间同步,并被PEngine用
来来计算集群的理想状态和如何达到这个理想状态。
这个指令列表然后会被交给DC(指定协调者)。 Pacemaker会推举一个CRMd实例作为master来集中做出所
有决策。如果推举的CRMd繁忙中,或者这个节点不够稳定... 一个新的master会马上被推举出来。
DC会按顺序处理PEngine的指令,然后把他们发送给LRMd(本地资源管理守护进程) 或者通过集群消息层
发送给其他CRMd成员(就是把这些指令依次传给LRMd)。
节点会把他们所有操作的日志发给DC,然后根据预期的结果和实际的结果(之间的差异), 执行下一个
等待中的命令,或者取消操作,并让PEngine根据非预期的结果重新计算集群的理想状态。
在某些情况下,可能会需要关闭节点的电源来保证共享数据的完整性或是完全地恢复资源。为此
Pacemaker引入了STONITHd。STONITH是 Shoot-The-Other-Node-In-The-Head(爆其他节点的头)的缩写
,并且通常是靠远程电源开关来实现的。在Pacemaker中,STONITH设备被当成资源(并且是在CIB中配置
)从而轻松地监控,然而STONITHd会注意理解STONITH拓扑,比如它的客户端请求隔离一个节点,它会重
启那个机器


第一版

wKiom1NVAgKRMWn0AABqAiEIhD4827.png


第二版

wKiom1NVBKSgk5XjAABjCBAdivU161.png


编译安装httpd-2.4
解压
# tar -xf httpd-2.4.9.tar.bz2 -C /usr/local/src
查看帮助
./configure --help
执行./configure
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event
# make && make install

3, 输出命令
# vim /etc/profile.d/httpd.sh
写入
export PATH=/usr/local/apache/bin:$PATH

4,测试启动
# apachectl start
写一个一个脚本使httpd可以用service启动
#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: The Apache HTTP Server is an efficient and extensible  \
#           server implementing the current HTTP standards.

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
       . /etc/sysconfig/httpd
fi

# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}

# are expected to behave here.
start() {
       echo -n $"Starting $prog: "
       LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
       RETVAL=$?
       echo
       [ $RETVAL = 0 ] && touch ${lockfile}
       return $RETVAL
}
# httpd parent to SIGKILL any errant children.
stop() {
   echo -n $"Stopping $prog: "
   killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
   RETVAL=$?
   echo
   [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
   echo -n $"Reloading $prog: "
   if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
       RETVAL=6
       echo $"not reloading due to configuration syntax error"
       failure $"not reloading $httpd due to configuration syntax error"
   else
       # Force LSB behaviour from killproc
       LSB=1 killproc -p ${pidfile} $httpd -HUP
       RETVAL=$?
       if [ $RETVAL -eq 7 ]; then
           failure $"httpd shutdown"
       fi
   fi
   echo
}

# See how we were called.
case "$1" in
 start)
   start
   ;;
 stop)
   stop
   ;;
 status)
       status -p ${pidfile} $httpd
   RETVAL=$?
   ;;
 restart)
   stop
   start
   ;;
 condrestart|try-restart)
   if status -p ${pidfile} $httpd >&/dev/null; then
       stop
       start
   fi
   ;;
 force-reload|reload)
       reload
   ;;
 graceful|help|configtest|fullstatus)
   $apachectl $@
   RETVAL=$?
   ;;
 *)
   echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
   RETVAL=2
esac

exit $RETVAL

加入pidfile
vim  /etc/httpd/httpd.conf
Pidfile "/var/run/httpd.pid"
chkconfig --add httpd
chkconfig httpd off


编译安装mysql
我没有编译安装
# yum install mysql-server mysql
确保mysql的uid,gid和nfs共享上的一样
vim /etc/my.cf
[mysqld]
datadir=/mysql
innodb_file_per_table = on
log_bin = /var/lib/mysql/bin-log

编译安装php
# ./configure --prefix=/usr/local/php --with-mysql --with-openssl --with-mysqli --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --enable-fpm   --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2


配置httpd和php基于fastcgi通信


测试是否正常
*********************
php-fpm脚本要修改不然在定义集群的时候会出错。服务一直起不来
*********************
安装corosync+pacemaker
# yum -y install corosync pacemaker

下载安装连接配置pacemaker的工具crmsh-1.2.6-4.el6.x86_64.rpm  pssh-2.3.1-2.el6.x86_64.rpm
有依赖关系 yum -y install crmsh-1.2.6-4.el6.x86_64.rpm  pssh-2.3.1-2.el6.x86_64.rpm

修改主机名,同步时间
# vim /etc/hosts
192.168.100.55 node2.xy.com node2
192.168.100.8 node1.xy.com node1
# hostname node2.xy.com
# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node2.xy.com
确保主机名能ping通
[root@node1 etc]# ping node1
PING node1.xy.com (192.168.100.8) 56(84) bytes of data.
64 bytes from node1.xy.com (192.168.100.8): icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from node1.xy.com (192.168.100.8): icmp_seq=2 ttl=64 time=0.046 ms

确保时间一样
[root@node1 etc]# ssh node2 'date';date
root@node2's password:
Thu Apr 17 00:32:31 CST 2014
Thu Apr 17 00:32:31 CST 2014

编辑corosycn配置文件
# cp /etc/corosync/corosync.conf.example  /etc/corosync/corosync.conf
cd /etc/corosync/
vim corosync.conf
compatibility: whitetank

totem {
       version: 2
       secauth: on                         认证是否开启,当然要开启
       threads: 0
       interface {
               ringnumber: 0
               bindnetaddr: 192.168.100.0  集群所在的网段
               mcastaddr: 226.94.1.100     主播地址
               mcastport: 5405
               ttl: 1
       }
}
service {
 ver:  0
 name: pacemaker
#use_mgmtd: yes
   }
aisexec {
   user: root
   group:  root
}

其中service {}可不写手动启动pacdmaker

生成一个各主机在一个主播域内传递心跳信息的密钥
# corosync-keygen


确保另一台主机也有一样的文件
# scp ./corosync.conf ./authkey node2:/etc/corosync

启动corosync服务
[root@node2 ~]# service corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]

查看日志less /var/log/cluster/corosync.log
如果没有启动pacemaker可手动启动
Service failed to load 'pacemaker'.

[root@node2 cluster]# service pacemaker start
Starting Pacemaker Cluster Manager                         [  OK  ]
----------------
在nide2上同样安装
----------------

在两台机器上配置rsync+inotify保证documentroot下的数据一样



在配置集群时先配置nfs



配置集群
[root@node2 cluster]# crm
crm(live)# status
Last updated: Thu Apr 17 01:11:54 2014
Last change: Thu Apr 17 01:05:34 2014 via crmd on node1.xy.com
Stack: classic openais (with plugin)
Current DC: node1.xy.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
0 Resources configured


Online: [ node1.xy.com node2.xy.com ]
crm(live)#

在两个节点的集群中为了避免一个节点挂了,另一个节点因为没有法定
票数而退出集群(此时高可用就失去了意义),
可配置
crm(live)configure# property no-quorum-policy=ignore

在没有stonith设备时的错误 ERROR: unpack_resources: Resource start-up disabled since no STONITH
因为当集群中某个节点需要被隔离的时候,集群就无法工作了
目前,我们禁用这个特性。使用STONITH是非常有必要的。
关闭这个特性就是告诉集群:假装故障的节点已经安全的关机了。一些供应商甚至不允许这个特性被关闭。
因为当发生资源争用时很可能导致数据丢失
将 stonith-enabled设置为 false 来关闭STONITH
crm(live)configure# property stonith-enabled=false

为了避免在服务器上线下线时资源跑来跑去需要定义默认资源黏性
crm(live)configure# rsc_defaults resource-stickiness=100
crmsh在忘记命令时,有帮助直接输入:help
而且可以tab补全,上下建查看历史,功能十分强大
crm(live)configure# verify
crm(live)configure# e
edit    end     erase   exit    
crm(live)configure# edit
crm(live)configure# commit
crm(live)configure#
配置完后要提交才有效commit
verify可以校验语法错误
edit可以vi打开一个配置文件直接编辑

定义资源:
1,定义httpd 有两个资源httpd和httpvip
定义httpvip
crm(live)configure# primitive httpvip ocf:heartbeat:IPaddr2 params ip=192.168.100.200 \
cidr_netmask=24 op monitor interval=30s

定义httpvip更倾向在node1上运行要大于黏性,不然就回不来了这里500
crm(live)configure# location httpvip_node1 httpvip 500: node1.xy.com

定义httpd服务
crm(live)configure# primitive httpd lsb:httpd op monitor interval=60s timeout=30s on-fail=restart

把httpvip和httpd定义到一个组
crm(live)configure# group httpvip_httpd httpvip httpd

在启动的时候让httpvip先启动
crm(live)configure# order httpd_after_httpvip Mandatory: httpvip httpd

2,定义mysql
定义mysqlvip
crm(live)configure# primitive mysqlvip ocf:heartbeat:IPaddr2 params ip=192.168.100.202 cidr_netmask=24 op monitor interval=30s on-fail=restart

定义mysqld服务
crm(live)configure# primitive mysqld lsb:mysqld op monitor interval=60s timeout=30s on-fail=restart

定义更倾向于node2
crm(live)configure# location mysqlvip_node2 mysqlvip 500: node2.xy.com

定义mysql storage
crm(live)configure# primitive mysqlstorage ocf:heartbeat:Filesystem params device="192.168.100.205:/data/mysql/" directory="/mysql/" fstype=nfs op monitor interval=50s timeout=50s op start timeout=60s op stop timeout=60s on-fail=restart

定义mysqld 和mysqlvip msyqlstorage为一个组
crm(live)configure# group mysql_ip_storage mysqlstorage mysqlvip mysqld

定义mysqlvip和mysqld的启动顺序
crm(live)configure# order mysqld_after_mysqlvip_after_mysqlstorage Mandatory: mysqlstorage mysqlvip mysqld



3,定义php-fpm
定义phpvip
crm(live)configure# primitive phpvip ocf:heartbeat:IPaddr2 params ip=192.168.100.201 cidr_netmask=24 op monitor interval=30s timeout=20s on-fail=restart

定义php-fpm
crm(live)configure# primitive php-fpm lsb:php-fpm op monitor interval=30s timeout=20s on-fail=restart

定义phpvip更倾向于node2
crm(live)configure# location phpvip_node2 phpvip 500: node2.xy.com

定义phpvip和php-fpm为一个组
crm(live)configure# group phpvip_group_php-fpm phpvip php-fpm

定义先启动phpvip
crm(live)configure# order php-fpm_after_phpvip Mandatory: phpvip php-fpm


最后配置结果

wKioL1NVA1WhT4PSAAEEHWu-vwU037.png

wKiom1NVA46wRllJAAB16L0NvKs078.png


查看集群状态

wKioL1NVAreTNVfWAABpkDuKzxk205.png


当节点一下线时

wKiom1NVAxrBsQtrAABv2ub5Mjo467.png


当节点二下线时

wKioL1NVAyuxQCuAAABwGKScD4o008.png


服务一直在线

wKioL1NVA4_Ah2h7AACUPFtwvuE315.png


配置nfs共享为mysql准备datadir
1,安装nfs
yum -y install nfs-utils rpcbind
2,编辑配置文件
# vim /etc/exports
/data/mysql/    192.168.100.0/24(rw,no_root_squash)
添加mysql用户,保证其uid.gid和要挂载使用的机器上的uid,gid相同
groupadd -g 27 mysql
useradd -u 27 -g 27 mysql -r
chown -R msyql.mysql /data/mysql
因为mysql初始化或者迁移数据要root写写这个目录所以加了no_root_squash,初始化完后去掉
3,启动nfs
# service nfs start

下载安装heartbeat ,drbd
配置

.......未完

-----------------------
在另外一台nfs上同样安装




你可能感兴趣的:(pacemaker,corosync)