e23ewe 发表于 2014-4-19 20:25:06

基于lvs的DR模型搭建高可用的web服务,并部署wordpress,(附...

基于lvs的DR模型搭建高可用的web服务,并部署wordpress,(附有脚本实现健康状态检测的代码)
试验环境:


# uname -ro
2.6.32-358.el6.i686 GNU/Linux

基于lvs的DR模型搭建高可用的web服务,部署wordpress如下图   
1.分别为在个服务器中同步时间,防止数据不同步。


# ntpdate 172.16.0.1
# crontab -e
no crontab for root - using an empty one
*/5 * * * * /usr/sbin/ntpdate 172.16.0.1

2.在172.16.1.1搭建基于fcgi的LAMP平台提供web服务。(具体实现过程可以参见基于fcgI编译安装LAMP实现层次化:httpd 2.4.9 + mysql-5.5.33 + php-5.4.26)

3.在172.16.19.101中搭建nfs,作为web1和web2的共享文件服务器


centos6.4自带nfs服务
1.新添加一块磁盘,创建逻辑卷,作为文件共享存储,并挂载/data目录下:具体过程可以参见以前的博客

2.编辑nfs的配置文件/etc/exports,添加如下代码:
# vim /etc/exports
/data   172.16.0.0/16(rw,no_root_squash)
3.启动nfs服务
# service nfs start

4.将NFS文件系统挂分别载至web1和web2服务器的 /usr/local/apache/htdocs目录下,共享web目录
# vim /etc/fstab
172.16.19.1:/data       /usr/local/apache/htdocs                        nfs   defaults,acl    0 0
4.设置共享文件的权限:
#setfacl -m -u:apache:rwx /data
NFS服务基于RPC(远程过程调用)实现网络文件共享

4.在172.16.1.101源码安装mariadb-10.0.10-linux-i686,做为web1和web2的mysql数据库服务器(聚过程可以参见上一篇博客)


为wordpress授权,使其能够操作数据库
MariaDB [(none)]> grant all privileges on *.* to "wordpress"@'172.16.%.%' identified by 'wordpress';
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)

5为web服务提供测试页,测试web1和web2


# vim /usr/local/apache/htdocs/index.php
<?php
phpinfo();
?>








   
6.搭建基于DR模型的lvs服务在Director中进行如下配置
1.清空iptables中的规则# iptables -t filter -F# yum -y install ipvsadm
2.配置vip# ifconfig eth0:0 172.16.19.100/16 up
3.配置web1(RS1)# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
4.隐藏RS1中的VIP,使RS1基于VIP正常与客户端通信# ifconfig lo:0 172.16.1.100 netmask 255.255.255.255 broadcast 172.16.19.100 up# route add -host 172.16.19.100 dev lo:0
5.配置web2(RS2)# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
6.隐藏RS1中的VIP,使RS1基于VIP正常与客户端通信# ifconfig lo:0 172.16.1.100 netmask 255.255.255.255 broadcast 172.16.19.100 up# route add -host 172.16.19.100 dev lo:0
7.在Director中添加集群规则:实现session绑定# ipvsadm-A -t 172.16.19.100:80 -s wlc -p 86400# ipvsadm-a -t 172.16.19.100:80 -r 172.16.1.10 -g# ipvsadm-a -t 172.16.19.100:80 -r 172.16.1.11 -g
7.在nfs服务器中部署wordpress   

1 # cd /data/
下载wordpresslftp 172.16.0.1:/> get pub/Sources/5.i386/new_lamp/wordpress-3.3.1-zh_CN.zip2解压wordpress# uzip wordpress-3.3.1-zh_CN.zip
3.修改wordpress所有文件的权限# chmod 777/data/wordpress/*
4 初始化wordpress,并安装部署wordpress为wordpress创建数据库# MariaDB [(none)]> create databasewordpress ;5.为其提供配置脚本# vim /data/wordpress/wp-config.php<?phpdefine('DB_NAME', 'wordpress');define('DB_USER', 'dis');define('DB_PASSWORD', 'dis');define('DB_HOST', '172.16.19.101');define('DB_CHARSET', 'utf8');define('DB_COLLATE', '');define('AUTH_KEY',         '{};kK-laXdILf#|3:0$dX_o( u*.SU9!B2!x,@,Zi!PK^-MQw;=o2P3SCk@0wRoK');define('SECURE_AUTH_KEY','@AkI-VJs-WUVz+]A,n<hClqe.(nJ xsdfqOe:5SxH|UwV:tnU+qyVjCpzG2T/m*j');define('LOGGED_IN_KEY',    '^8]94US~HTZ,1}K 0q6.Lg.y6,Deq,}7P*PK3I@]x)YxCQ<YVezqs]f!ah>%/* S');define('NONCE_KEY',      'H wWh@]>p,define('AUTH_SALT',      'ta:l97{$5{}tuH3&H_JEkR*6f^+AD&Iwv{&v$JXu`/1}dbixz=$sWAtiT]7D(aVt');define('SECURE_AUTH_SALT', '-GH*Z=2]`6!jEiYfPe$XHk3Y/ItzD,81`4k`zjTjdefine('LOGGED_IN_SALT',   'SLML{Uuo4BX*{!Q.VRA&O3:JaWIYLT>GX{#_OsWS=IJO/bY^PciYjFQ_d{S}F(jp');define('NONCE_SALT',       'EmkqCx,4<9C;J4]Fr(:2rr4TrgaW4F`R+k,<9K{Et5*i90T+C%#%!$table_prefix= 'wp_';define('WPLANG', 'zh_CN');define('WP_DEBUG', false);if ( !defined('ABSPATH') )      define('ABSPATH', dirname(__FILE__) . '/');require_once(ABSPATH . 'wp-settings.php');define('WP_ALLOW_REPAIR', true);?>
Wordpress部署成功   
   8.基于LAMP平台的DR模型的LVS集群搭建成功


# ipvsadm -L -n --connectionIPVS connection entriespro expire state       source             virtual            destinationTCP 1385:22 NONE      172.16.0.102:0   172.16.19.100:80   172.16.1.11:80TCP 1313:11 NONE      172.16.19.2:0      172.16.19.100:80   172.16.1.10:80
# ipvsadm -L -n --statsIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port               Conns   InPktsOutPktsInBytes OutBytes-> RemoteAddress:PortTCP172.16.19.100:80                  310   2958      0   256017      0-> 172.16.1.10:80                  196   1624      0   132126
9.为基于LAMP平台的LVS集群提供健康状态检测脚本,运行在LVS中的每一个节点

# vim checkhealth.sh   #!/bin/bash      #      VIP=172.16.19.100      CPORT=80      FAIL_BACK=127.0.0.1      RS=("172.16.1.10" "172.16.1.11")      declare -a RSSTATUS      RW=("2" "1")      RPORT=80      TYPE=g      CHKLOOP=3      LOG=/var/log/ipvsmonitor.log      addrs() {          ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2          [ $? -eq 0 ] && return 0 || return 1      }      delrs() {          ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT          [ $? -eq 0 ] && return 0 || return 1      }      checkrs() {          local I=1          while [ $I -le $CHKLOOP ]; do            if curl --connect-timeout 1 http://$1 | grep OK&> /dev/null; then            return 0            fi            let I++          done          return 1      }      initstatus() {          local I          local COUNT=0;          for I in ${RS[*]}; do            if ipvsadm -L -n | grep "$I:$RPORT" &> /dev/null ; then            RSSTATUS[$COUNT]=1            else            RSSTATUS[$COUNT]=0            fi          let COUNT++          done      }      initstatus      while true; do          let COUNT=0          for I in ${RS[*]}; do            if checkrs $I; then            if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then               addrs $I ${RW[$COUNT]}               [ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG            fi            else            if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then               delrs $I               [ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG            fi            fi            let COUNT++          done          sleep 5      done
10.测试健康状态检测机制   手动停止web2服务,lvs健康状态记录的查看日志文件# service httpd24 stop   
# service httpd24 start

   查看健康状态检测脚本记录日志:   



总结:
   基于lvs的DR模型搭建高可用的web服务,基于lvs的调度算法实现负载均衡,使用脚本可以实现web健康状态的检测。适合在小规模的生产情景中,此架构成本比较低,易于实现,能够实现一定的并发访问。   在搭建nfs文件系统是应该使用no_root_squash,否则不能初始化安装wordpress,并且自动挂载时应该使用acl,使其能够更好的控制共享文件系统的权限。
   配置基于DR的LVS时,对于RS应该隐藏vip,能够使web服务的访问能够更加安全。
页: [1]
查看完整版本: 基于lvs的DR模型搭建高可用的web服务,并部署wordpress,(附...