首页 > Linux, 服务器 > 基于LNMP平台web应用的LB集群,并将MySQL服务器独立出来

基于LNMP平台web应用的LB集群,并将MySQL服务器独立出来

2012年4月17日 发表评论 阅读评论 阅读680 次   

 

 这次要做的是在LNMP平台上的LB集群,实现将MySQL服务独立出来,然后由两个realserver提供web服务。

说明:

DirectorVIP 172.16.7.10

DIP 172.16.7.1

Realserver1: 172.16.7.100

Realserver2:172.16.7.200

MySQL:172.16.7.110

lvs-DR  IP路由

 

一、首先将两个realserver上的LNMP平台搭建好。

realserver1 为例,进行平台的搭建。

1、解决依赖关系

 

编译安装nginx需要事先需要安装开发包组“Development Tools”和 “Development Libraries”。同时,还需要专门安装pcre-devel包:

# yum -y install pcre-devel

 

2、安装

 

首先添加用户nginx,实现以之运行nginx服务进程:

  1. # groupadd -r nginx
  2. # useradd -r -g nginx -s /bin/false -M nginx

 

接着开始编译和安装:

 

  1. # ./configure \
  2.   –prefix=/usr \
  3.   –sbin-path=/usr/sbin/nginx \
  4.   –conf-path=/etc/nginx/nginx..conf \
  5.   –error-log-path=/var/log/nginx/error.log \
  6.   –http-log-path=/var/log/nginx/access.log \
  7.   –pid-path=/var/run/nginx/nginx.pid  \
  8.   –lock-path=/var/lock/nginx.lock \
  9.   –user=nginx \
  10.   –group=nginx \
  11.   –with-http_ssl_module \
  12.   –with-http_flv_module \
  13.   –with-http_stub_status_module \
  14.   –with-http_gzip_static_module \
  15.   –http-client-body-temp-path=/var/tmp/nginx/client/ \
  16.   –http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  17.   –http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  18.   –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  19.   –http-scgi-temp-path=/var/tmp/nginx/scgi \
  20.   –with-pcre
  21. # make && make install

 

3、为nginx提供SysV init脚本:

 

新建文件/etc/rc.d/init.d/nginx,内容如下:

 

 

 

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

 

而后为此脚本赋予执行权限:

  1. # chmod +x /etc/rc.d/init.d/nginx

 

添加至服务管理列表,并让其开机自动启动:

 

  1. # chkconfig –add nginx
  2. # chkconfig nginx on

 

而后就可以启动服务并测试了:

 

 

 

  1. # service nginx start

 

安装mysql-5.5.20

 

1、准备数据存放的文件系统

 

新建一个逻辑卷,并将其挂载至特定目录即可。这里不再给出过程。

 

这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。参考我下面给出的脚本:

 

 

 

  1. #!/bin/bash
  2. lc=’/usr/sbin/lvcreate’
  3. lr=’/usr/sbin/lvremove’
  4. pc=’/usr/sbin/pvcreate’
  5. vc=’/usr/sbin/vgcreate’
  6. echo ’
  7. n
  8. e
  9. n
  10. +1G
  11. n
  12. +1G
  13. t
  14. 5
  15. 8e
  16. t
  17. 6
  18. 8e
  19. p
  20. w’ | fdisk /dev/sda >/dev/null 2>&1
  21. partprobe /dev/sda
  22. sleep 3
  23. mkdir -pv /mydata/data
  24. $pc /dev/sda5 /dev/sda6
  25. $vc myvg /dev/sda5 /dev/sda6
  26. $lc -L 1G -n mylv1 myvg
  27. mke2fs -j /dev/myvg/mylv1
  28. mount /dev/myvg/mylv1 /mydata
  29. echo ”mount success…”
  30. sleep 3

2、新建用户以安全方式运行进程:

 

  1. # groupadd -r mysql
  2. # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
  3. # chown -R mysql:mysql /mydata/data

 

3、安装并初始化mysql-5.5.20

 

首先下载平台对应的mysql版本至本地,这里是32位平台,因此,选择的为mysql-5.5.20-linux2.6-i686.tar.gz,其下载位置为我们学习用的ftp://172.16.0.1/pub/Sources/mysql-5.5

 

  1. # tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local
  2. # cd /usr/local/
  3. # ln -sv mysql-5.5.20-linux2.6-i686  mysql
  4. # cd mysql
  5. # chown -R mysql:mysql  .
  6. # scripts/mysql_install_db –user=mysql –datadir=/mydata/data
  7. # chown -R root  .

 

4、为mysql提供主配置文件:

 

# cd /usr/local/mysql

# cp support-files/my-large.cnf  /etc/my.cnf

 

并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:

thread_concurrency = 2

 

另外还需要添加如下行指定mysql数据文件的存放位置:

datadir = /mydata/data

 

 

 

 

5、为mysql提供sysv服务脚本:

 

 

 

  1. # cd /usr/local/mysql
  2. # cp support-files/mysql.server  /etc/rc.d/init.d/mysqld

 

添加至服务列表:

# chkconfig –add mysqld

# chkconfig mysqld on

 

而后就可以启动服务测试使用了。

 

编译安装php-5.3.10

 

1、解决依赖关系:

 

请配置好yum源(可以是本地系统光盘)后执行如下命令:

# yum -y groupinstall ”X Software Development”

 

如果想让编译的php支持mcryptmcryptmhash扩展和libevent,此处还需要下载ftp://172.16.0.1/pub/Sources/ngnix目录中的如下几个rpm包并安装之:

libmcrypt-2.5.8-4.el5.centos.i386.rpm

libmcrypt-devel-2.5.8-4.el5.centos.i386.rpm

mhash-0.9.9-1.el5.centos.i386.rpm

mhash-devel-0.9.9-1.el5.centos.i386.rpm

libevent-2.0.17-2.i386.rpm

libevent-devel-2.0.17-2.i386.rpm

mcrypt-2.6.8-1.el5.i386.rpm

 

最好使用升级的方式安装上面的rpm包,命令格式如下:

# rpm -Uvh

 

2、编译安装php-5.3.10

 

首先下载源码包至本地目录。

 

  1. # tar xf php-5.3.10.tar.bz2
  2. # cd php-5.3.10
  3. #  ./configure –prefix=/usr/local/php4nginx –with-mysql=/usr/local/mysql \
  4.  –with-openssl –enable-fpm –enable-sockets –enable-sysvshm \
  5.   –with-mysqli=/usr/local/mysql/bin/mysql_config –enable-mbstring \
  6.    –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib-dir \
  7.    –with-libxml-dir=/usr –enable-xml  –with-mhash –with-mcrypt \
  8.     –with-config-file-path=/etc/php –with-config-file-scan-dir=/etc/php \
  9.      –with-bz2 –with-curl –with-mcrypt
  10. # make

    # make test

    # make install

 

php提供配置文件:

# cp php.ini-production /etc/php/php.ini

 

php-fpm提供Sysv init脚本,并将其添加至服务列表:

# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm

# chkconfig –add php-fpm

# chkconfig php-fpm on

 

php-fpm提供配置文件:

# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

 

编辑php-fpm的配置文件:

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

配置pm.的相关选项为你所需要的值,并启用pid文件(如下最后一行):

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 2

pm.max_spare_servers = 8

pid = /var/run/php-fpm.pid

 

接下来就可以启动php-fpm了:

# service php-fpm start

 

使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):

# ps aux | grep php-fpm

 

 

 

整合nginxphp5

 

1、编辑/etc/nginx/nginx.conf,启用如下选项:

 

 

 

  1. location ~ \.php$ {
  2.             root           html;
  3.             fastcgi_pass   127.0.0.1:9000;
  4.             fastcgi_index  index.php;
  5.             fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
  6.             include        fastcgi_params;
  7.         }

 

2、编辑/etc/nginx/fastcgi_params,将其内容更改为如下内容:

 

 

 

  1. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
  2. fastcgi_param  SERVER_SOFTWARE    nginx;
  3. fastcgi_param  QUERY_STRING       $query_string;
  4. fastcgi_param  REQUEST_METHOD     $request_method;
  5. fastcgi_param  CONTENT_TYPE       $content_type;
  6. fastcgi_param  CONTENT_LENGTH     $content_length;
  7. fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
  8. fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
  9. fastcgi_param  REQUEST_URI        $request_uri;
  10. fastcgi_param  DOCUMENT_URI       $document_uri;
  11. fastcgi_param  DOCUMENT_ROOT      $document_root;
  12. fastcgi_param  SERVER_PROTOCOL    $server_protocol;
  13. fastcgi_param  REMOTE_ADDR        $remote_addr;
  14. fastcgi_param  REMOTE_PORT        $remote_port;
  15. fastcgi_param  SERVER_ADDR        $server_addr;
  16. fastcgi_param  SERVER_PORT        $server_port;
  17. fastcgi_param  SERVER_NAME        $server_name;
  18. 并在所支持的主页面格式中添加php格式的主页,类似如下:
  19. location / {
  20.             root   html;
  21.             index  index.php index.html index.htm;
  22.         }
  23. 而后重新载入nginx的配置文件:
  24. # service nginx reload

 

3、在/usr/html新建index.php的测试页面,测试php是否能正常工作:

# cat > /usr/html/index.php << EOF

<?php

phpinfo();

?>

 

接着就可以通过浏览器访问此测试页面了。

 

 

 

 

二、由于realserver的配置基本相同,可以采取以上步骤重做一次,也可以克隆一个realserver1,起名叫做realserver2,然后修改一下IP地址即可。

在这里不再重复步骤。

三、两个平台搭建好之后,接下来便要配置装在pmaphpMyAdmin)了。

On 172.16.7.100

php的官方网站下载phpMyAdmin并配置即可,而我们学习则是在自己的ftp目录下载。

文件包名字为:phpMyAdmin-3.4.10.1-all-languages.tar.bz2

 

  1. # mkdir /www/pma -pv
  2. # tar xvf phpMyAdmin-3.4.10.1-all-languages.tar.bz2
  3. # mv phpMyAdmin-3.4.10.1-all-languages /www/pma
  4. # mysqladmin -uroot -hlocalhost -p password’123456′
  5. # cd /www/pma
  6. # cp config.sample.inc.php config.inc.php
  7. # vim config.inc.php

 

然后 输入网址:http://172.16.7.100 查看网页。如图

 

 

On 172.16.7.200

具体的配置与172.16.7.1一致,所以过程不再详述。

输入网址: http://172.16.7.200   测试一下是否成功。

 

 

 

 

然后 要将phpMyAdminlocalhost 指向172.16.7.110;在此之前 的先配置好172.16.7.110mysql服务。

三、on 172.16.7.110

1、准备数据存放的文件系统

 

新建一个逻辑卷,并将其挂载至特定目录即可。这里不再给出过程。可参考下面我个icu的脚本:

 

 

 

  1. #!/bin/bash
  2. lc=’/usr/sbin/lvcreate’
  3. lr=’/usr/sbin/lvremove’
  4. pc=’/usr/sbin/pvcreate’
  5. vc=’/usr/sbin/vgcreate’
  6. echo ’
  7. n
  8. e
  9. n
  10. +1G
  11. n
  12. +1G
  13. t
  14. 5
  15. 8e
  16. t
  17. 6
  18. 8e
  19. p
  20. w’ | fdisk /dev/sda >/dev/null 2>&1
  21. partprobe /dev/sda
  22. sleep 3
  23. mkdir -pv /mydata/data
  24. $pc /dev/sda5 /dev/sda6 > /dev/null 2>&1
  25. $vc myvg /dev/sda5 /dev/sda6  > /dev/null 2>&1
  26. $lc -L 1G -n mylv1 myvg  > /dev/null 2>&1
  27. mke2fs -j /dev/myvg/mylv1  >/dev/null 2>&1
  28. mount /dev/myvg/mylv1 /mydata
  29. echo ”mount success…”
  30. sleep 3

其步骤如上LNMP平台安装mysql一样,不再详述。至此,mysql服务就启动并且已配置完成了。然后新建一个用户 如 ling:

 

 

 

 

建好用户后可用此用户来管理mysql服务器。

五、创建关系,使两个realservermysql服务器可以连接,让他们知道mysql服务器在哪里,从而可到达共享的目的。

On 172.16.7.100

# vim /www/pma/config.inc.php

$cfg['Servers'][$i]['host'] = ’localhost’; 改为$cfg['Servers'][$i]['host'] = ’172.16.7.110′;

 

 

 

mysql服务器上的用户ling登录试试:

 

 

 

On 172.16.7.200

大致配置与上同,在此直接贴图描述:

 

 

(注: 我的phpMyAdmin装的版本不一致,不过没有大碍,因为我不是克隆的,自己一点一点弄的哦…………)

五、在realserver上配置环境,根据我们自己的需要。

On 172.16.7.100

# ifconfig lo down    #lo接口先关闭,因为我们要将VIP配置在lo接口的网卡别名上。

# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

这两句是接口只响应目标地址和请求进来的地址在同一网段内的请求。

# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

这两句是配置内核的arp协议栈,只给同一网络内的主机转发arp请求。

# ifconfig lo up

# ifconfig lo:0 172.16.7.10 broadcast 172.16.7.10 netmask 255..255.255.255 up

# route add -host 172.16.7.10 dev lo:0

On 172.16.7.200

配置如上,没有任何不同的地方。

七、到了最关键的时刻了,我们要配置负载均衡集群了,该Director这个老大出马了,嘻嘻。

1、我们现在做的是LVSDR(直接路由类型)的WLC调度。

所以Director的网卡是桥接的,realserver也得是桥接的。

On 172.16.7.1

# ifconfig eth0:1 172.16.7.10 broadcast 172.16.7.10 netmask 255.255.255.255 up (只给自己家的IP做广播)

# route add -host 172.16.7.10 dev eth0:1     添加主机路由

# sysctl -w net.ipv4.ip_forward=1      # 打开转发功能

# yum -y install ipvsadm

# rpm -ql ipvsadm

# ipvsadm -A -t 172.16.7.10:80 -s rr

# ipvsadm -a -t 172.16.7.10:80 -r 172.1.6.7.100:80 -g

# ipvsadm -a -t 172.16.7.10:80 -r 172.16.7.200 :80-g

至此,所有准备工作已经完成,配置也结束了,接下来看看效果,可以在浏览器里输入VIP的地址即可。

 

 

终于做完了,很不容易啊。这次我终于记得住了,每做一次,就增加一些记忆。

 

 

 

 

 

 

 

 

 

 

 

本文出自 “陈玖玲-无辜de心碎” 博客,请务必保留此出处http://chenjiuling.blog.51cto.com/3057028/835760



|2|left
填写您的邮件地址,订阅我们的精彩内容:
分类: Linux, 服务器 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

无觅相关文章插件,快速提升流量