corosync+pacemaker+drbd 实现lamp(Discuz)高可用集群_第1张图片

实验平台:

CentOS 6.4


实现功能:

利用drbd实现两台Discuz站点的web数据及mysql数据的同步

利用corosync+pacemaker完成lamp平台的高可用,并安装Discuz论坛进行测试。



实验步骤:

1、

同步双方hosts文件,加入node6与node7的解析

10.32.9.56 node6

10.32.9.57 node7


实现SSH双机互信

node1
ssh-keygen -t rsa --- 生成一对公私钥文件,默认放在/root/.ssh/id_rsa目录下
ssh-copy-id myroot@node6---默认将/root/.ssh/id_rsa的公钥文件发送的对端相应目录
node2
ssh-keygen -t rsa 
ssh-copy-id myroot@node7



高可用集群各节点时间需同步

ntpdate 0.centos.pool.ntp.org  ----调整时间为ntp服务器ntpdate 0.centos.pool.ntp.org上的时间

生产环境时间建议使用ntpd加快时间步伐进行调整,使用ntpdate改时间容易出现问题



2、分别为双机提供lamp的平台

yum install -y httpd  ------------ 安装apache服务
yum install -y mysql.x86_64 mysql-server.x86_64 php-mysql.x86_64  mysql-devel.x86_64 mysql-libs.x86_64 -y  ---- 安装mysql服务
yum install -y php-mysql.x86_64 php.x86_64 php-devel.x86_64 php-mbstring.x86_64 ---安装php服务

确保httpd mysqld服务器不会开机自动启动



3、node6 node7分别新建两个相等大小的分区,这里使用添加新硬盘并建立分区的方式。

/dev/sdb1 -- 作为web站点存放路径

/dev/sdb2 -- 作为mysql数据存放路径



4、编译安装drbd并定义drbd资源和属性   

在CentOS6.4上编译安装DRBD

安装用户空间工具

yum -y install gcc kernel-devel kernel-headers flex

wget http://oss.linbit.com/drbd/8.4/drbd-8.4.1.tar.gz  ---- 下载源码包

tar xzf drbd-8.4.1.tar.gz

./configure --prefix=/usr/local/drbd --with-km

make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/

make install

mkdir -p /usr/local/drbd/var/run/drbd

cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d ---- 复制SysV启动脚本



安装内核模块

至解压后的源代码目录下

make clean

make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/

cp drbd.ko /lib/modules/`uname -r`/kernel/lib/

depmod

modprobe drbd 装载drbd模块



定义DRBD默认属性及配置,编辑配置文件global_common.conf(node6 node7配置文件需一致)

handlers配置如下

pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

disk配置

on-in-error  detach   ----------------一旦发生错误则拆除

net配置

protocal  C   ----- 采用同步协议来同步数据

cram-hmac-alg "sha1"   ---- 采用的加密算法

shared-secret  "abc123#"  ---- 共享秘钥

syncer配置

rate  1000M    ----- 定义同步传输的速率



定义DRBD资源/usr/local/drbd/etc/drbd.d/web.res (node6 node7配置文件一致)

resource web {
   on node6 {
       device   /dev/drbd0;  ----------节点1设备文件名
       disk  /dev/sdb1;  -------所用到的磁盘设备,按位同步因此需要DRBD初始化后才能格式化
       address  10.32.9.56:7789;  ----监听的套接字
       meta-disk internal;  --------DRBD元数据放在当前磁盘上,也可以放在外部磁盘上
              }
    on node7 {  ----对端节点
         device /dev/drbd0;
         disk  /dev/sdb1;
         address   10.32.9.57:7789;
         meta-disk internal;
              }
          }

定义DRBD资源/usr/local/drbd/etc/drbd.d/mysql.res (node6 node7配置文件一致)

resource mysql {
    on node6 {
        device  /dev/drbd1;
        disk   /dev/sdb2;
        address 10.32.9.56:7799;
        meta-disk internal;
              }
    on node7 {
        device  /dev/drbd1;
        disk   /dev/sdb2;
        address  10.32.9.57:7799;
        meta-disk internal;
              }
          }

service drbd start  ------------启动drbd服务 

在一个节点提升为primary并初始化资源

drbdadm -- --overwrite-data-of-peer  primary  resourcename

drbdadm create-md  resourcename


在主节点上挂载并格式化/dev/drbd0  /dev/drbd1 设备后卸载设备并确保两个节点的drbd服务不开机自动启动




5、安装corosync及pacemaker

yum install -y corosync pacemaker (这里使用corosync 1.4.1    pacemaker 1.1.8)

yum install crmsh-1.2.6-0.rc2.2.1.x86_64.rpm   ------- 安装pacemaker(CRM)命令行工具




6、配置高可用集群底层corosync

cp corosync.conf.example corosync.conf  ----- /etc/corosync下复制样例配置文件为配置文件

corosync-keygen  在/etc/corosync下生成秘钥文件authkey,确保该文件的权限为400 


编辑配置文件/etc/corosync.conf,主要做如下修改

secauth: on ---- 开启秘钥验证
bindnetaddr: 10.32.9.0 ---- 绑定的网络地址
mcastaddr: 226.94.3.33 ---- 选定一个组播地址
to_syslog: yes  ---- 关闭多余的发送到系统日志

添加如下配置,这样corosync在启动时会同时启动pacemaker

service {
   ver:  0
   name: pacemaker
   # use_mgmtd: yes
}
aisexec {
   user: root
   group:  root
}

最后同步秘钥及配置文件到集群中的其他节点

scp authkey corosync.conf node7:/etc/corosync/



7、利用crmsh工具配置及管理集群资源

crm configure property stonith-enabled=false ----- 关闭stonith设备,由于虚拟环境没有stonith设备需要关闭该功能以防止报错

crm configure property no-quorum-policy=ignore ----- 由于该集群为2个节点的集群,当一台主机挂时另外一台主机由于不够法定票数将不会出现资源的转移,这里设置为ignore意指当不满足法定票数时忽略,既可完成资源转移


7.1 定义集群虚拟IP资源

crm configure primitive vip ocf:IPaddr2 params ip="10.32.9.111" 


7.2 定义集群http服务资源

crm configure primitive webser lsb:httpd


7.3 定义集群mysql服务资源

crm configure primitive mysqld lsb:mysqld


7.4 定义集群drbd服务资源drbdres1(对应于drbd的web资源)

crm configure primitive drbdres1 ocf:linbit:drbd params drbd_resource="web" drbdconf="/usr/local/drbd/etc/drbd.conf" op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s op start timeout=240 op stop timeout=100

定义主从类资源(资源必须先是主资源才能定义为主从资源,定义为主从资源后引用一般就用主从资源,meta后为该资源的属性信息)

crm configure ms ms_drbdres1 drbdres1  meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"


7.5 定义集群drbd服务资源mysql(对应drbd的mysql资源)

crm configure primitive drbdres2 ocf:linbit:drbd params drbd_resource="mysql" drbdconf="/usr/local/drbd/etc/drbd.conf" op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s    op start timeout=240 op stop timeout=100

定义主从类资源

crm configure ms ms_drbdres2 drbdres2  meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"


7.6 定义Filesystem资源,既自动挂载点,共享磁盘类资源

crm configure primitive webstore ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/var/www/html" fstype="ext3" op start timeout=60 op stop timeout=60
crm configure primitive mysqlstore ocf:heartbeat:Filesystem params device="/dev/drbd1" directory="/mydata" fstype="ext3" op start timeout=60 op stop timeout=60

注意这里的/var/www/html目录定义为httpd服务存放数据的目录,需要修该为apache主apache组,node6 node7该目录均需要相同设置。

注意这里的mydata目录定义为mysql服务存放数据的目录,需要修该为mysql主mysql组,node6 node7该目录均需要相同设置。另外请确保/etc/my.cnf的datadir变量值为/mydata后执行mysql_install_db重新初始化并生成数据库至/mydata文件夹


7.7定义order资源启动的顺序约束及colocation资源间的相互依赖性(排列约束)


对于web服务而言有以下的order及colocation需求,启动次序从上至下且都必须在同一节点启动

一、drbd服务(其对应的资源是ms_drbdres1)

二、文件系统挂载(其对应的服务是webstore,文件系统挂载的前提是ms_drbdres1成为Master端)

三、虚拟IP设置(对应的资源是vip)

四、web服务的启动(对应资源是webser)

crm configure colocation webstore-with-ms_drbdres1_master inf: webstore ms_drbdres1:Master (webstore必须跟drbdres1的Master在一起)
crm configure order lamp1 Mandatory: ms_drbdres1:promote webstore:start vip webser (启动顺序)
crm configure colocation vip-with-webstore inf: vip webstore  ----- vip必须跟webstore在一起
crm configure colocation webser-with-vip inf: webser vip  ---- webser必须跟vip在一起


对于mysql服务而言有以下order及colocation需求,启动次序从上到下

一、drbd服务 (其对应的资源是ms_drbdres2)

二、文件系统挂载(其对应的服务是mysqlstore,文件系统挂载的前提是ms_drbdres2成为Master端)

三、mysql服务的启动(对应资源是mysqld)

crm configure colocation mysqlstore-with-ms_drbdres2_master inf: mysqlstore  ms_drbdres2:Master (mysqlstore必须跟drbdres2的Master在一起)
crm configure order lamp2 Mandatory: ms_drbdres2:promote mysqlstore:start mysqld (启动顺序)
crm configure collocation mysqld-with-webser inf: mysqld webser (mysql服务必须跟web服务在一起,主要为了将web服务与mysql服务串在一起,设置其必须在同一节点)


8、安装Discuz论坛并测试

资源全部再node 6运行,此时测试Discuz论坛访问正常

corosync+pacemaker+drbd 实现lamp(Discuz)高可用集群_第2张图片

corosync+pacemaker+drbd 实现lamp(Discuz)高可用集群_第3张图片



手动执行crm node standby node6后可以发现资源全部转移到node7,node7访问正常,从而实现了高可用

corosync+pacemaker+drbd 实现lamp(Discuz)高可用集群_第4张图片

发一帖子并重新切为node6时数据及论坛访问正常

corosync+pacemaker+drbd 实现lamp(Discuz)高可用集群_第5张图片


如果需要定义整体lamp更倾向运行于哪个节点上可以直接定义初始drbd服务的location约束。

crm configure location l1 ms_drbdres1 inf: node6  ----- 无限倾向运行在node6

crm configure location l2 ms_drbdres2 inf: node6


done!