你的位置:首页 > 操作系统

[操作系统]基于corosync+pacemaker+drbd+LNMP做web服务器的高可用集群


实验系统:CentOS 6.6_x86_64

实验前提:

  1)提前准备好编译环境,防火墙和selinux都关闭;

  2)本配置共有两个测试节点,分别coro1和coro2,对应的IP地址分别为192.168.19.55和192.168.19.98;

  3)集群服务为nginx服务;

  4)提供web服务的地址为192.168.19.150,即VIP;

实验软件:corosync-0:1.4.7-1.el6 pacemaker-0:1.1.12-4.el6 crmsh-2.1-1.6 drbd-8.4.4 php-5.6.11 mariadb-10.0.20 tengine-2.1.0

软件下载:http://pan.baidu.com/s/116gQq

注意事项:单主机操作会有标注,除此之外的是两台主机都要完成的

实验拓扑:

 

一、准备工作

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

     

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

    coro1上:

1 sed -i 's@\(HOSTNAME=\).*@\1coro1@g' /etc/sysconfig/network2 hostname coro1

    coro2上:

1 sed -i 's@\(HOSTNAME=\).*@\1coro2@g' /etc/sysconfig/network2 hostname coro2

  3.设定两个节点可以基于密钥进行ssh通信,并测试:

    coro1上:

1 ssh-keygen -t rsa2 ssh-copy-id -i ~/.ssh/id_rsa.pub root@coro2

    coro2上:

ssh-keygen -t rsassh-copy-id -i ~/.ssh/id_rsa.pub root@coro1

    

  4.两个节点时间必须同步:一般使用ntpdate进行操作,这里不再演示。

二、安装corosync和pacemaker并配置

  1.安装epel源:

1 yum -y install epel*

  2.安装corosync和pacemaker:

1 yum -y install corosync pacemaker

  3.在coro1上编辑/etc/corosync.conf

 1 cd /etc/corosync/ 2 cp corosync.conf.example corosync.conf 3 vim corosync.conf 4 ------------------------------------ 5 bindnetaddr: 192.168.19.0    //为你的网卡所在网络的网络地址 6 mcastaddr: 239.255.19.1     //组播地址 7 service {            //添加此部分 8  ver: 0 9  name: pacemaker10  # use_mgmtd: yes11 }

  4.在coro1上生成节点间通信时用到的认证密钥文件:

1 corosync-keygen

  5.将corosync.conf和authkey复制至coro2上:

1 scp -p corosync.conf authkey coro2:/etc/corosync/

三、安装crmsh并启动corosync

  1.安装crmsh,需要提前下好rpm包:

1 yum -y install crmsh-2.1-1.6.x86_64.rpm

  2.启动corosync(在coro1上执行):

1 service corosync start

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

1 grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log

    

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

1 grep TOTEM /var/log/cluster/corosync.log

    

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

1 grep ERROR: /var/log/cluster/corosync.log

  6.查看pacemaker是否正常启动:

1 grep pcmk_startup /var/log/cluster/corosync.log

    

  7.如果上面命令执行均没有问题,接着可以在coro1上执行如下命令启动coro2上的corosync:

1 ssh coro2 'service corosync start'

  8.如果安装了crmsh,可使用如下命令查看集群节点的启动状态。从下面的信息可以看出两个节点都已经正常启动,并且集群已经处于正常工作状态:

1 crm status

    

四、编译安装drbd并配置

  drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。

  1.安装用户空间工具:

1 tar xf drbd-8.4.4.tar.gz 2 cd drbd-8.4.43 ./configure --prefix=/usr/local/drbd --with-km4 make KDIR=/usr/src/kernels/2.6.32-504.30.3.el6.x86_64   //换成自己的内核版本5 make install6 mkdir -pv /usr/local/drbd/var/run/drbd7 cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d8 chkconfig --add drbd9 chkconfig drbd off                       //一会作为corosync的资源,所以不要开机自动启动

  2.安装drbd模块:

1 cd drbd2 make clean3 make KDIR=/usr/src/kernels/2.6.32-504.30.3.el6.x86_64   //换成自己的内核版本4 cp drbd.ko /lib/modules/`uname -r`/kernel/lib5 depmod

  3.给主机分区,大小为5G。这里不再给出具体步骤,两台主机的/dev/sda7为一会要使用的分区:

    

  4.配置drbd(在coro1上操作):

    drbd的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d/目录中,主配置文件中仅使用"include"指令将这些配置文件片断整合起来。通常/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。

    在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。
    注意:由于本试验中drbd是编译安装的,因此默认配置文件所在路径为:/usr/local/drbd/etc
 1 cd /usr/local/drbd/etc/drbd.d/ 2 vim global_common.conf 3 -------------------------------------- 4 global { 5     usage-count no; 6     # minor-count dialog-refresh disable-ip-verification 7 } 8  9 common {10     protocol C;11 12     handlers {13         # These are EXAMPLE handlers only.14         # They may have severe implications,15         # like hard resetting the node under certain circumstances.16         # Be careful when chosing your poison.17 18         # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /p19 roc/sysrq-trigger ; reboot -f";20         # pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /p21 roc/sysrq-trigger ; reboot -f";22         # local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-23 trigger ; halt -f";24 # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";25         # split-brain "/usr/lib/drbd/notify-split-brain.sh root";26         # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";27         # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";28         # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;29     }30 31     startup {32         # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb33     }34 35     options {36         # cpu-mask on-no-data-accessible37     }38 39     disk {40         #on-io-error detach;41         # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes42         # disk-drain md-flushes resync-rate resync-after al-extents43         # c-plan-ahead c-delay-target c-fill-target c-max-rate44         # c-min-rate disk-timeout45     }46     net {47         #cram-hmac-alg "sha1";48         #shared-secret "mydrbd";49         # protocol timeout max-epoch-size max-buffers unplug-watermark50         # connect-int ping-int sndbuf-size rcvbuf-size ko-count51         # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri52         # after-sb-1pri after-sb-2pri always-asbp rr-conflict53         # ping-timeout data-integrity-alg tcp-cork on-congestion54         # congestion-fill congestion-extents csums-alg verify-alg55         # use-rle56     }57 }  


  5.定义一个资源,web是资源名,可以自己改:

 1 vim /usr/local/drbd/etc/drbd.d/web.res 2 -------------------------------------- 3 resource web { 4  on coro1 { 5   device  /dev/drbd0; 6   disk   /dev/sda7; 7   address  192.168.19.55:7789; 8   meta-disk internal; 9  }10  on coro2 {11   device  /dev/drbd0;12   disk   /dev/sda7;13   address  192.168.19.98:7789;14   meta-disk internal;15  }16 }

  6.以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至coro2节点:

1 scp /usr/local/drbd/etc/drbd.d/* coro2:/usr/local/drbd/etc/drbd.d/

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

1 drbdadm create-md web2 service drbd start

  8.查看启动状态,从下面的信息中可以看出此时两个节点均处于Secondary状态:

1 cat /proc/drbd

    

   9.我们接下来需要将其中一个节点设置为Primary,在要设置为Primary的节点上执行如下命令,这里在coro1上操作:

1 drbdadm primary --force web2 cat /proc/drbd

    

    而后再次查看状态,可以发现数据同步过程已经开始。等数据同步完成以后再次查看状态,可以发现主次位置显示是不一样的。斜线前面的代表当前主机,后面的代表对方主机。

      在coro1上查看:

    

      在coro2上查看:

    

  10.创建文件系统并挂载:

    文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化,这里在coro1上进行操作。

1 mke2fs -t ext4 -L DRBD /dev/drbd02 mkdir /mydata             //创建挂载点3 mount /dev/drbd0 /mydata/4 mkdir /mydata/www           //创建网页目录5 mkdir /mydata/data          //创建数据库目录

  11.切换Primary和Secondary节点:

    对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary。

      在coro1上:

1 umount /mydata/2 drbdadm secondary web        //变为secondary节点

      在coro2上:

1 drbdadm primary web          //变为primary节点2 cat /proc/drbd3 mkdir /mydata             //创建挂载点4 mount /dev/drbd0 /mydata/5 ls /mydata/

    可以看到,coro2已经成为了Primary,之前在coro1上创建的目录也能够访问到。测试完成后,再次将coro1变为Primary并挂载。

    

    

五、准备LNMP环境

   1.编译安装tengine:

1 yum -y install pcre-devel2 useradd -r nginx          //要保证两台主机的nginx用户id和组id完全一致3 tar xf tengine-2.1.0.tar.gz4 cd tengine-2.1.05 ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre6 make && make install

  2.为tengine提供脚本:

 1 vim /etc/init.d/nginx 2 ------------------------------------ 3 #!/bin/sh 4 # 5 # nginx - this script starts and stops the nginx daemon 6 # 7 # chkconfig:  - 85 15  8 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ 9 #        proxy and IMAP/POP3 proxy server 10 # processname: nginx 11 # config:   /etc/nginx/nginx.conf 12 # config:   /etc/sysconfig/nginx 13 # pidfile:   /var/run/nginx.pid 14  15 # Source function library. 16 . /etc/rc.d/init.d/functions 17  18 # Source networking configuration. 19 . /etc/sysconfig/network 20  21 # Check that networking is up. 22 [ "$NETWORKING" = "no" ] && exit 0 23  24 nginx="/usr/local/nginx/sbin/nginx" 25 prog=$(basename $nginx) 26  27 NGINX_CONF_FILE="/etc/nginx/nginx.conf" 28  29 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 30  31 lockfile=/var/lock/subsys/nginx 32  33 make_dirs() { 34  # make required directories 35  user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 36  options=`$nginx -V 2>&1 | grep 'configure arguments:'` 37  for opt in $options; do 38    if [ `echo $opt | grep '.*-temp-path'` ]; then 39      value=`echo $opt | cut -d "=" -f 2` 40      if [ ! -d "$value" ]; then 41        # echo "creating" $value 42        mkdir -p $value && chown -R $user $value 43      fi 44    fi 45  done 46 } 47  48 start() { 49   [ -x $nginx ] || exit 5 50   [ -f $NGINX_CONF_FILE ] || exit 6 51   make_dirs 52   echo -n $"Starting $prog: " 53   daemon $nginx -c $NGINX_CONF_FILE 54   retval=$? 55   echo 56   [ $retval -eq 0 ] && touch $lockfile 57   return $retval 58 } 59  60 stop() { 61   echo -n $"Stopping $prog: " 62   killproc $prog -QUIT 63   retval=$? 64   echo 65   [ $retval -eq 0 ] && rm -f $lockfile 66   return $retval 67 } 68  69 restart() { 70   configtest || return $? 71   stop 72   sleep 1 73   start 74 } 75  76 reload() { 77   configtest || return $? 78   echo -n $"Reloading $prog: " 79   killproc $nginx -HUP 80   RETVAL=$? 81   echo 82 } 83  84 force_reload() { 85   restart 86 } 87  88 configtest() { 89  $nginx -t -c $NGINX_CONF_FILE 90 } 91  92 rh_status() { 93   status $prog 94 } 95  96 rh_status_q() { 97   rh_status >/dev/null 2>&1 98 } 99 100 case "$1" in101   start)102     rh_status_q && exit 0103     $1104     ;;105   stop)106     rh_status_q || exit 0107     $1108     ;;109   restart|configtest)110     $1111     ;;112   reload)113     rh_status_q || exit 7114     $1115     ;;116   force-reload)117     force_reload118     ;;119   status)120     rh_status121     ;;122   condrestart|try-restart)123     rh_status_q || exit 0124       ;;125   *)126     echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"127     exit 2128 esac129 ------------------------------------130 chmod +x /etc/init.d/nginx131 chkconfig --add nginx132 chkconfig nginx off           //一会作为corosync的资源,所以不要开机自动启动

  3.安装mysql,man和path路径输出这里不再演示:

1 useradd -r mysql                        //保证两台主机的mysql用户id和组id完全一致2 tar xf mariadb-10.0.20-linux-x86_64.tar.gz -C /usr/local/3 cd /usr/local/4 ln -sv mariadb-10.0.20-linux-x86_64 mysql5 cd mysql/6 chown -R root:mysql .7 ln -sv /usr/local/mysql/include /usr/include/mysql      //输出mysql的头文件至系统头文件路径8 echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf   //输出mysql的库文件给系统库查找路径9 ldconfig

    本试验中coro1为drbd的Primary,所以下面的操作在coro1上进行,提前将/dev/brbd0挂载至/mydata:

 1 chown -R mysql:mysql /mydata/data/ 2 /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data/  //初始化mysql 3 cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf              //提供配置文件 4 vim /etc/my.cnf 5 ------------------------------------ 6 datadir = /mydata/data                                 //增加此项 7 ------------------------------------ 8 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld        //提供服务脚本 9 scp -p /etc/init.d/mysqld coro2:/etc/init.d/10 scp -p /etc/my.cnf coro2:/etc/11 chkconfig --add mysqld12 chkconfig mysqld off                                  //一会作为corosync的资源,所以不要开机自动启动13 service mysqld start14 /usr/local/mysql/bin/mysql                               //连接mysql15 ------------------------------------16 CREATE DATABASE abcd;                                  //创建abcd数据库17 SHOW DATABASES;                                     //显示数据库列表

    

    停掉mysql,让drbd主节点切换至coro2并挂载,在coro2上连接mysql,切换主次步骤请参考前面:

1 chkconfig --add mysqld2 chkconfig mysqld off3 service mysqld start4 /usr/local/mysql/bin/mysql5 -----------------------------------6 SHOW DATABASES;

    

    mysql测试成功,coro2上也可以看到coro1创建的数据。停掉mysql,让主节点再次切换到coro1上并挂载/dev/drbd0。

  4.编译安装php:

1 yum -y install libbzip2-devel libcurl-devel libmcrypt-devel2 tar xf php-5.6.11.tar.bz2 3 cd php-5.6.114 ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libdir=/usr --enable-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl --with-pdo-mysql=/usr/local/mysql5 make && make install

  5.为php和php-fpm提供配置文件:

 1 cp php.ini-production /etc/php.ini                       //提供php配置文件 2 cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm                   //提供脚本 3 chmod +x /etc/init.d/php-fpm 4 chkconfig --add php-fpm 5 chkconfig php-fpm off                               //一会作为corosync的资源,所以不要开机自动启动 6 cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf  //提供php-fpm配置文件 7 vim /usr/local/php/etc/php-fpm.conf 8 --------------------------------------------------- 9 pm.max_children = 15010 pm.start_servers = 811 pm.min_spare_servers = 512 pm.max_spare_servers = 1013 pid = /usr/local/php/var/run/php-fpm.pid14 user = nginx15 group = nginx16 listen = 192.168.19.150:9000                             //监听在VIP的9000端口

六、LNMP与DRBD结合

  1.现在试验中coro1为drbd的Primary节点,所以以下操作在coro1上进行:

 1 chown -R nginx:nginx /mydata/www/ 2 vim /etc/nginx/nginx.conf 3 ---------------------------------------- 4 location / { 5        root  /mydata/www; 6        index index.php index.html index.htm; 7      } 8 location ~ \.php$ { 9       root  /mydata/www;10       fastcgi_pass  192.168.19.150:9000;11        fastcgi_index index.php;12       fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;13        include    fastcgi_params;14      }15 ----------------------------------------16 vim /etc/nginx/fastcgi_params          //将此文件内容改为如下几行17 ----------------------------------------18 fastcgi_param GATEWAY_INTERFACE CGI/1.1;19 fastcgi_param SERVER_SOFTWARE  nginx;20 fastcgi_param QUERY_STRING    $query_string;21 fastcgi_param REQUEST_METHOD   $request_method;22 fastcgi_param CONTENT_TYPE    $content_type;23 fastcgi_param CONTENT_LENGTH   $content_length;24 fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;25 fastcgi_param SCRIPT_NAME    $fastcgi_script_name;26 fastcgi_param REQUEST_URI    $request_uri;27 fastcgi_param DOCUMENT_URI    $document_uri;28 fastcgi_param DOCUMENT_ROOT   $document_root;29 fastcgi_param SERVER_PROTOCOL  $server_protocol;30 fastcgi_param REMOTE_ADDR    $remote_addr;31 fastcgi_param REMOTE_PORT    $remote_port;32 fastcgi_param SERVER_ADDR    $server_addr;33 fastcgi_param SERVER_PORT    $server_port;34 fastcgi_param SERVER_NAME    $server_name;35 ----------------------------------------36 scp /etc/nginx/nginx.conf coro2:/etc/nginx/37 scp /etc/nginx/fastcgi_params coro2:/etc/nginx/38 ifconfig eth0:0 192.168.19.150/24 up        //手动启动VIP39 service nginx start40 service mysqld start41 service php-fpm start

    在/mydata/www下放入网页文件,此处以wordpress为例。用浏览器打开http://192.168.19.150,如果没问题,则会出现安装页面,按照提示安装即可。我这里手动创建了wordpress数据库,并给root用户添加了密码,安装时就直接使用root。

1 /usr/local/mysql/bin/mysql2 -----------------------------------------3 CREATE DATABASE wordpress;4 UPDATE mysql.user SET Password=PASSWORD(123456) WHERE User='root';5 FLUSH PRIVILEGES;

    

  2.切换drbd的Primary节点为coro2,并测试:

    在coro1上操作:

1 service nginx stop2 service mysqld stop3 service php-fpm stop4 umount /mydata/5 drbdadm secondary web
6 ifconfig eth0:0 down

    在coro2上操作:

1 drbdadm primary web2 mount /dev/drbd0 /mydata/3 ifconfig eth0:0 192.168.19.150/24 up4 service nginx start5 service mysqld start6 service php-fpm start

    手动切换完毕之后,同样打开http://192.168.19.150,进行任何操作均没问题。至此,drbd+LNMP搭建完毕。下一步,就要将corosync和pacemaker整合进来了。现在检查两台主机的VIP、nginx、php-fpm、mysql、drbd均为关闭状态,且不能开机自动启动。

    

 七、使用crmsh为corosync添加资源

  1.创建drbd配置文件的软连接(两台机器均操作):

1 ln -sv /usr/local/drbd/etc/drbd.conf /etc/drbd.conf2 ln -sv /usr/local/drbd/etc/drbd.d /etc/drbd.d

  2.修改php-fpm启动脚本为如下内容,如不修改,则corosync无法识别(两台机器均操作):

 1 #!/bin/sh 2 #======================================================================================= 3 # php-fpm - this script start and stop the php-fpm daemon 4 # 5 # chkconfig 35 on 6 # description: php-fpm is a FastCGI web server. 7 # processname: php-fpm 8 # config: /usr/local/php/etc/php-fpm.conf 9 # pidfile: /var/run/php-fpm.pid 10 #======================================================================================= 11 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 12    13 BINFILE="/usr/local/php/sbin/php-fpm" 14 CFGFILE="/usr/local/php/etc/php-fpm.conf" 15 PIDFILE="/var/run/php-fpm.pid" 16 LOCKFILE="/var/lock/php-fpm.lock" 17    18 RETVAL=0 19    20 start() { 21   [[ -x $BINFILE ]] || exit 5 22   [[ -f $CFGFILE ]] || exit 6 23     24   if [[ `ps aux | grep php-fpm: | grep -v grep | wc -l` -gt 0 ]]; then 25     echo "The php-fpm is already running." 26     return 1 27   fi 28     29   $BINFILE -t >/dev/null 2>&1 30     31   if [[ $? -ne 0 ]]; then 32     echo "The php-fpm configure has error." 33     return 1 34   fi 35     36   echo -n "Starting php-fpm......" 37   $BINFILE -y $CFGFILE -g ${PIDFILE} 38   RETVAL=$? 39   echo 40   [[ $RETVAL -eq 0 ]] && touch $LOCKFILE 41     42   return $RETVAL 43 } 44    45 stop() { 46   if [[ `ps aux | grep php-fpm: | grep -v grep | wc -l` -eq 0 ]]; then 47     echo "The php-fpm is not running." 48     return 1 49   fi 50     51   echo -n "Shutting down php-fpm......" 52     53   if [[ -f $PIDFILE ]]; then 54     kill -QUIT `cat ${PIDFILE}` 55   else 56     kill -QUIT `ps aux | grep php-fpm | awk '/master/{print $2}'` 57   fi 58     59   RETVAL=$? 60   echo 61   [[ $RETVAL -eq 0 ]] && rm -f $LOCKFILE $PIDFILE 62     63   return $RETVAL 64 } 65    66 restart() { 67   stop 68   sleep 1 69     70   while true 71   do 72     if [[ `ps aux | grep php-fpm: | grep -v grep | wc -l` -eq 0 ]]; then 73       start 74       break 75     fi 76     sleep 1 77   done 78     79   RETVAL=$? 80   echo 81     82   return $RETVAL 83 } 84    85 reload() { 86   if [[ `ps aux | grep php-fpm: | grep -v grep | wc -l` -eq 0 ]]; then 87     echo "The php-fpm is not running." 88     return 1 89   fi 90     91   echo -n $"Reloading php-fpm......" 92     93   if [[ -f $PIDFILE ]]; then 94     kill -USR2 `cat ${PIDFILE}` 95   else 96     kill -USR2 `ps aux | grep php-fpm | awk '/master/{print $2}'` 97   fi 98     99   RETVAL=$?100   echo101    102   return $RETVAL103 }104   105 case "$1" in106 start)107   start108   ;;109    110 stop)111   stop112   ;;113    114 restart)115   restart116   ;;117    118 reload)119   reload120   ;;121    122 *)123   echo "Usage: service php-fpm {start|stop|restart|reload}"124   RETVAL=1125 esac126   127 exit $RETVAL

  下面运行crm命令,进入crm命令行模式,非特殊注明情况下操作均在此模式下进行,在一台机器上操作即可。

    

  3.关闭corosync的stonith检测和仲裁:

1 configure               //进入配置菜单2 property stonith-enabled=false    //关闭stonith设备3 property no-quorum-policy=ignore   //关闭仲裁设备4 verify                //语法检测5 commit                //提交

   4.添加资源(configure菜单下):

1 primitive mydrbd ocf:drbd params drbd_resource=web op monitor role=Master interval=20s timeout=30s op monitor role=Slave interval=30s timeout=20s op start timeout=240s op stop timeout=240s   //定义drbd资源2 primitive myfile Filesystem params device="/dev/drbd0" directory="/mydata" fstype="ext4" op monitor interval=30s timeout=60s op start timeout=60s op stop timeout=60s              //定义文件系统资源3 primitive myip IPaddr params ip=192.168.19.150 op monitor interval=30s timeout=60s     //定义VIP资源4 primitive mynginx lsb:nginx op monitor interval=30s timeout=20s              //定义nginx资源5 primitive mysql lsb:mysqld op monitor interval=30s timeout=60s               //定义mysqld资源6 primitive myphp lsb:php-fpm                                //定义php-fpm资源7 group myserver myfile myip mynginx myphp mysql                       //定义资源组8 verify                                           //语法检测,如没问题,先不要提交

  5.添加各种约束:

1 ms ms_mydrbd mydrbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=True   //drbd主从资源配置2 colocation myfile_with_mydrbd_master inf: myfile ms_mydrbd:Master                   //定义排列约束,myfile要和drbd的Master节点在一起3 colocation mysql_with_myfile inf: mysql myfile                            //mysql要和myfile在一起4 order myfile_after_ms_mydrbd_master Mandatory: ms_mydrbd:promote myfile:start             //定义顺序约束,drbd主节点被提升,myfile才能启动5 order myip_after_myfile Mandatory: myfile myip6 order mynginx_after_myip Mandatory: myip mynginx7 verify8 commit

  6.提交之后,可以看到,所有资源已经运行在coro2,打开http://192.168.19.150进行操作也没问题:

    

  7.下面操作让coro2成为备用节点。可以看到,资源全部转移到coro1上了,打开http://192.168.19.150进行各种操作仍然OK:

1 cd ..2 node standby coro2      //coro2成为备用
----------------------------- 等待5秒3 node online coro2 //重新上线4 status //查看状态

    

  至此,实验全部结束。因为时间原因,很多细节有待完善,欢迎大家提供宝贵意见,谢谢! QQ:82800452