LEMP环境+corosync+pacemaker+drbd 小菜带你玩转高可用集群

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

实验开始前先做以下准备:

实验环境:RHEL6.4

    节点1:admin1.tuchao.com 192.168.18.201

    节点2:admin2.tuchao.com 192.168.18.202


首先两个节点安装DRBD,准备相同大小的分区。

yum install drbd-8.4.3-33.el6.i686.rpm  drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.i686.rpm -y

分区 (略)

接下来操作admin1.tuchao.com

1、配置/etc/drbd.d/global-common.conf

global {

        usage-count no;

        # minor-count dialog-refresh disable-ip-verification

}


common {

        protocol C;


        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";

                # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";

                # split-brain "/usr/lib/drbd/notify-split-brain.sh root";

                # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";

                # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";

                # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;

        }


        startup {

                #wfc-timeout 120;

                #degr-wfc-timeout 120;

        }


        disk {

                on-io-error detach;

                #fencing resource-only;

        }


        net {

                cram-hmac-alg "sha1";

                shared-secret "mydrbdlab";

        }


        syncer {

                rate 1000M;

        }

}

2、定义资源

vim /etc/drbd.d/mydrbd.res

resource mydrbd {

 on admin1.tuchao.com {

  device        /dev/drbd0;

  disk          /dev/sdb1;

  address       192.168.18.201:7789;

  meta-disk     internal;

}

 on admin2.tuchao.com {

  device        /dev/drbd0;

  disk          /dev/sdb1;

  address       192.168.18.202:7789;

  meta-disk     internal;

}

}

3、将配置文件同步到另一个节点

scp global_common.conf mydrbd.res  admin2:/etc/drbd.d/

4、在两个节点上初始化已定义的资源并启动服务

drbdadm create-md mydrbd

/etc/init.d/drbd start

查看状态,也可以使用drbd-overview命令来查看

cat /proc/drbd

version: 8.4.3 (api:1/proto:86-101)

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-05-27 06:20:13

 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----

    ns:0 nr:4 dw:4 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

由此看出,目前两个节点都是(secondary)备用状态。

将admin1节点提升为(primary)主状态

drbdadm primary --force mydrbd

wKioL1PZ-M7ittS0AAGVU1gKATM160.jpg

同步完成

0:mydrbd/0  Connected Primary/Secondary UpToDate/UpToDate C r----- 

创建文件系统在一个节点上操作就可以了,挂载。

mkfs.ext4 /dev/drbd0

mkdir /mnt/drbd

mount /dev/drbd0 /mnt/drbd

drbd基本配置完成,我们在里面创建一个文件夹。

mkdir /mnt/drbd/mydata

卸载/dev/drbd0,将状态转为备。

umount /dev/drbd0

drbdadm secondary mydrbd

在admin2上,把状态提升为primary

drbdadm primary --force mydrbd

mkdir /mnt/drbd

mount /dev/drbd0 /mnt/drbd

ls /mnt/drbd

wKiom1PZ-0jzjqwQAADmrbG3tI8969.jpg

这时我们再到两个节点上添加一个分区sdb3,做成drbd,用于存放网页数据。

资源配置文件如下:

wKioL1Pa8xCCx83QAAJNL5aqkZQ342.jpg

接下来初始化设备,提升状态,创建文件系统都和前面一样,这里略。



两个节点安装配置corosync+pacemaker(略)这个过程我在早期文章有详细介绍这里不再重复。

请参考:http://tchuairen.blog.51cto.com/3848118/1439759


Nginx,PHP安装过程(略),这个内容较多,不是这篇文章的重点,我早期文章也有介绍。

请参考http://tchuairen.blog.51cto.com/3848118/1437530



MySQL安装配置(略)请参考http://tchuairen.blog.51cto.com/3848118/1422258



drbd资源mydrbd:

/dev/drbd0 挂载至  /mnt/drbd  

/mnt/drbd/mydata  --用于存放MySQL数据。

drbd资源webdrbd:

drbd1 挂载至  /mnt/http

/mnt/http/wordpress  --用于存放博客站点数据

/mnt/http/myadmin  --用于存放phpMyAdmin


提升primary状态,挂载文件系统,初始化数据库,测试启动数据库。

drbdadm primary --force mydrbd

./scripts/mysql_install_db --user=mysql --datadir=/mnt/drbd/mydata/

/etc/init.d/mysqld start

创建wpdb库,授权连接用户,用做博客站点。

create database wpdb;

grant all privileges on wpdb.* to 'wpuser'@'127.0.0.1' identified by '123456';

停止数据库,卸载drbd0,状态转为备用。

到另一个节点,提升为primary状态,挂载文件系统,启动服务。

注意这里不需要再次初始化数据库了,在一个节点上做了就可以了,数据会同步过来的。

要保证节点提升为primary挂载文件系统正常,MySQL能启动,MySQL这边就差不多完事了。



webdrbd资源提升primary,挂载文件系统,导入博客站点数据。

drbdadm primary --force webdrbd

mkdir /mnt/http

mkfs.ext4 /dev/drbd1

mount /dev/drbd1  /mnt/http/

tar zxvf wordpress-3.9-zh_CN.tar.gz

mkdir /mnt/http/wordpress

mkdir /mnt/http/myadmin

mv wordpress/* /mnt/http/wordpress/

配置wordpress 数据库接口。

cp config.sample.inc.php  config.inc.php 

vim config.inc.php

wKioL1PbLErQAXHzAAFWdnG5Ew8060.jpg

导入phpMyAdmin数据。

unzip phpMyAdmin-4.0.5-all-languages.zip 
cd phpMyAdmin-4.0.5-all-languages

mv phpMyAdmin-4.0.5-all-languages/* /mnt/http/myadmin/

生成一串随机数加入到config.inc.php文件。


配置php-fpm

vim /usr/local/php/etc/php-fpm.conf

wKiom1PbMMuBriAPAAGCsUBOweE241.jpg

完成后保存,启动php-fpm。


接下来配置Nginx,包含vhost目录下所有以.conf结尾的文件。

在http段中加入:

include vhost/*.conf;

为wordpress博客添加虚拟主机

vim /etc/nginx/vhost/www.tuchao.com.conf

wKioL1PbL2yBCOslAAElkTl150s689.jpg

为phpMyAdmin添加虚拟主机。

wKiom1PbLrqzk0h9AAEQy9rCjYo796.jpg

然后重启nginx服务,访问页面测试。

www.tuchao.com

wKioL1PbMSqxG6mUAAFw4N2Olic582.jpg

www.myadmin.com

wKiom1PbMCXg27gbAAFwSz6RbA0937.jpg



另一个节点安装好相应的应用程序,把配置文件同步过去。

数据则是通过drbd切换过去,然后把服务都启动起来测试一下能否正常工作,这里一定要测试。

这里我测试都工作正常,博客和php-MyAdmin都可以正常访问,操作和前面差不多,我就省略了。


资源定义有常用的两个工具,crmsh和pcs,这里介绍下pcs简单用法。

pcs property set stonith-enabled=false

pcs property set no-quorum-policy=ignore

pcs resource create vip ocf:heartbeat:IPaddr params ip=192.168.18.254 cidr_netmask=24

pcs resource create //创建资源

pcs constraint order vip then webstore then httpd  //定义顺序约束

pcs resource group add myservice  <res> <res> ... //定义资源组


在定义php-fpm为集群资源出错时,解决方法请参考:http://tchuairen.blog.51cto.com/3848118/1534231


接下来进入正题,定义资源,实现两个节点高可用。


我们需要定义的资源:

vip:192.168.18.254

mydrbd //需要定义为主从,当主节点出现故障后,从节点自动提升为主节点,实现高可用。

webdrbd //同上

为mydrbd定义文件系统挂载点,为MySQL提供存储。

为webdrbd定义文件系统挂载点,为站点程序提供存储。

mysqld //MySQL服务

nginx  //nginx服务

php-fpm //php-fpm服务


查看资源代理使用帮助信息

crm ra meta ocf:linbit:drbd

pcs resource describe ocf:linbit:drbd


由于我们没有stonith设备,所以要关闭stonith不然会报错。

crm configure property stonith-enabled=false

由于我们只有两个节点,配置忽略票数。

crm configure property no-quorum-policy=ignore


定义主从drbd参数。

master-max 有多少个可以提升为主节点的。

master-node-max 在单个节点上最多可以运行几个主资源

clone-max 最多可以运行多少个clone

clone-node-max 单个节点最多可以运行多少个clone

notify 是否启用通知机制


定义mydrbd资源代理

primitive mydrbd ocf:linbit:drbd \

        params drbd_resource="mydrbd" \

        op monitor role="Master" interval="10" timeout="20" \

        op monitor role="Slave" interval="20" timeout="20" \

        op start timeout="240" interval="0" \

        op stop timeout="100" interval="0"

定义mysqld

primitive mysqld lsb:mysqld \

        op monitor interval="15" timeout="15" \

        op start timeout="30" interval="0" \

        op stop timeout="30" interval="0"

定义drbd0挂载资源,为mysql提供数据存储。

primitive mystore ocf:heartbeat:Filesystem \

        params device="/dev/drbd0" directory="/mnt/drbd" fstype="ext4" \

        op monitor interval="60" timeout="50" \

        op start timeout="60" interval="0" \

        op stop timeout="60" interval="0"

定义nginx

primitive nginx lsb:nginx \

        op monitor interval="15" timeout="15" \

        op start timeout="15" interval="0" \

        op stop timeout="15" interval="0"

定义php-fpm

primitive php-fpm lsb:php-fpm

定义vip

primitive vip ocf:heartbeat:IPaddr \

        params ip="192.168.18.254" cidr_netmask="24" \

        op monitor interval="10" timeout="20" on-fail="restart" \

        op start timeout="20" interval="0" \

        op stop timeout="20" interval="0"

定义webdrbd资源代理

primitive webdrbd ocf:linbit:drbd \

        params drbd_resource="webdrbd" \

        op monitor role="Master" interval="10" timeout="20" \

        op monitor role="Slave" interval="20" timeout="20" \

        op start timeout="240" interval="0" \

        op stop timeout="100" interval="0"

定义webdrbd挂载资源,为网站程序提供数据存储。

primitive webstore ocf:heartbeat:Filesystem \

        params device="/dev/drbd1" directory="/mnt/http" fstype="ext4" \

        op monitor interval="60" timeout="50" \

        op start timeout="60" interval="0" \

        op stop timeout="60" interval="0"

定义资源组

group webserver mysqld nginx vip php-fpm

将mydrbd定义为主从类型

ms ms_mydrbd mydrbd \

        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"

将webdrbd定义为主从类型

ms ms_webdrbd webdrbd \

        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"


排列约束


定义mysql与mystore在同一节点运行

colocation mysqld_with_mystore inf: mystore mysqld

定义mystore与ms_mydrbd的主节点在同一节点运行

colocation mystore_with_ms_mydrbd inf: ms_mydrbd:Master mystore

定义webstore与ms_webdrbd的主节点在同一节点运行

colocation webstore_with_ms_webdrbd inf: webstore ms_webdrbd:Master

定义nginx与webstore在同一节点运行

colocation webstore_with_nginx inf: webstore nginx


顺序约束


定义先启动mystore,再启动mysqld。

order mysqld_after_mystore inf: mystore mysqld

定义先启动ms_mydrbd,再启动mystore。

order mystore_after_ms_mydrbd inf: ms_mydrbd:promote mystore:start

定义先启动webstore,再启动nginx。

order nginx_after_webstore inf: webstore nginx

定义先启动ms_webdrbd,再启动webstore。

order webstore_after_ms_webdrbd inf: ms_webdrbd:promote webstore:start


以下是crm configure show 整体信息:

wKioL1PcmPfwnibsAAMu0XI4LQc584.gif

查看集群状态信息

wKioL1Pcmm2QK-eIAARj7Ghm63E395.jpg


我们去节点一检测:

wKioL1PcnF_TDZEMAAPapclTA2E156.jpgwKiom1Pcm1DxizVwAAOshZY8XA0089.jpg

wKioL1PcnHOTSjBUAAHyCbj1uXk157.jpg

wKiom1Pcm2PgnzOSAAGGMYwiQws027.jpg

访问博客站点

wKiom1PcnCTQabsrAAHPLjcMZXE460.jpg

php-MyAdmin可以正常登录

wKioL1PcnWCAE8uIAAKtdoq9Jjc533.jpg


这时我们把节点一关机,然后查看状态。

wKioL1Pcn9zAZ1w4AARcgsy939w122.jpg

服务访问也正常。


实验到这里就完成了,我这里漏了一点,在定义资源监控的时候没有在后面加on-fail="restart" 这个可以实现,资源在运行过程中停止了,资源管理器会自动把资源重启的。


有更好的建议欢迎与我交流QQ:1183710107


本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1534215


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章