基於LNMP平臺web應用的LB集羣,並將MySQL服務器獨立出來

 這次要做的是在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. # nginx - this script starts and stops the nginx daemon 
  3. # chkconfig:   - 85 15  
  4. # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 
  5. #               proxy and IMAP/POP3 proxy server 
  6. # processname: nginx 
  7. # config:      /etc/nginx/nginx.conf 
  8. # config:      /etc/sysconfig/nginx 
  9. # pidfile:     /var/run/nginx.pid 
  10.   
  11. # Source function library. 
  12. . /etc/rc.d/init.d/functions 
  13.   
  14. # Source networking configuration. 
  15. . /etc/sysconfig/network 
  16.   
  17. # Check that networking is up. 
  18. [ "$NETWORKING" = "no" ] && exit 0 
  19.   
  20. nginx="/usr/sbin/nginx" 
  21. prog=$(basename $nginx) 
  22.   
  23. NGINX_CONF_FILE="/etc/nginx/nginx.conf" 
  24.   
  25. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 
  26.   
  27. lockfile=/var/lock/subsys/nginx 
  28.   
  29. make_dirs() { 
  30.    # make required directories 
  31.    user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
  32.    options=`$nginx -V 2>&1 | grep 'configure arguments:'` 
  33.    for opt in $options; do 
  34.        if [ `echo $opt | grep '.*-temp-path'` ]; then 
  35.            value=`echo $opt | cut -d "=" -f 2` 
  36.            if [ ! -d "$value" ]; then 
  37.                # echo "creating" $value 
  38.                mkdir -p $value && chown -R $user $value 
  39.            fi 
  40.        fi 
  41.    done 
  42.   
  43. start() { 
  44.     [ -x $nginx ] || exit 5 
  45.     [ -f $NGINX_CONF_FILE ] || exit 6 
  46.     make_dirs 
  47.     echo -n $"Starting $prog: " 
  48.     daemon $nginx -c $NGINX_CONF_FILE 
  49.     retval=$? 
  50.     echo 
  51.     [ $retval -eq 0 ] && touch $lockfile 
  52.     return $retval 
  53.   
  54. stop() { 
  55.     echo -n $"Stopping $prog: " 
  56.     killproc $prog -QUIT 
  57.     retval=$? 
  58.     echo 
  59.     [ $retval -eq 0 ] && rm -f $lockfile 
  60.     return $retval 
  61.   
  62. restart() { 
  63.     configtest || return $? 
  64.     stop 
  65.     sleep 1 
  66.     start 
  67.   
  68. reload() { 
  69.     configtest || return $? 
  70.     echo -n $"Reloading $prog: " 
  71.     killproc $nginx -HUP 
  72.     RETVAL=$? 
  73.     echo 
  74.   
  75. force_reload() { 
  76.     restart 
  77.   
  78. configtest() { 
  79.   $nginx -t -c $NGINX_CONF_FILE 
  80.   
  81. rh_status() { 
  82.     status $prog 
  83.   
  84. rh_status_q() { 
  85.     rh_status >/dev/null 2>&1 
  86.   
  87. case "$1" in 
  88.     start) 
  89.         rh_status_q && exit 0 
  90.         $1 
  91.         ;; 
  92.     stop) 
  93.         rh_status_q || exit 0 
  94.         $1 
  95.         ;; 
  96.     restart|configtest) 
  97.         $1 
  98.         ;; 
  99.     reload) 
  100.         rh_status_q || exit 7 
  101.         $1 
  102.         ;; 
  103.     force-reload) 
  104.         force_reload 
  105.         ;; 
  106.     status) 
  107.         rh_status 
  108.         ;; 
  109.     condrestart|try-restart) 
  110.         rh_status_q || exit 0 
  111.             ;; 
  112.     *) 
  113.         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 
  114.         exit 2 
  115. 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.  
  3. lc='/usr/sbin/lvcreate' 
  4. lr='/usr/sbin/lvremove' 
  5. pc='/usr/sbin/pvcreate' 
  6. vc='/usr/sbin/vgcreate' 
  7. echo ' 
  8.  
  9.  
  10.  
  11. +1G 
  12.  
  13. +1G 
  14. 8e 
  15. 8e 
  16. w' | fdisk /dev/sda >/dev/null 2>&1 
  17.  
  18. partprobe /dev/sda 
  19. sleep 3 
  20. mkdir -pv /mydata/data 
  21. $pc /dev/sda5 /dev/sda6 
  22. $vc myvg /dev/sda5 /dev/sda6 
  23. $lc -L 1G -n mylv1 myvg 
  24. mke2fs -j /dev/myvg/mylv1 
  25. mount /dev/myvg/mylv1 /mydata 
  26. echo "mount success..." 
  27. 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.  
  6. # chown -R mysql:mysql  . 
  7. # scripts/mysql_install_db --user=mysql --datadir=/mydata/data 
  8. # 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.  
  19. 並在所支持的主頁面格式中添加php格式的主頁,類似如下: 
  20. location / { 
  21.             root   html; 
  22.             index  index.php index.html index.htm; 
  23.         } 
  24.          
  25. 而後重新載入nginx的配置文件: 
  26. # 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.  
  3. lc='/usr/sbin/lvcreate' 
  4. lr='/usr/sbin/lvremove' 
  5. pc='/usr/sbin/pvcreate' 
  6. vc='/usr/sbin/vgcreate' 
  7. echo ' 
  8.  
  9.  
  10.  
  11. +1G 
  12.  
  13. +1G 
  14. 8e 
  15. 8e 
  16. w' | fdisk /dev/sda >/dev/null 2>&1 
  17.  
  18. partprobe /dev/sda 
  19. sleep 3 
  20. mkdir -pv /mydata/data 
  21. $pc /dev/sda5 /dev/sda6 > /dev/null 2>&1 
  22. $vc myvg /dev/sda5 /dev/sda6  > /dev/null 2>&1 
  23. $lc -L 1G -n mylv1 myvg  > /dev/null 2>&1 
  24. mke2fs -j /dev/myvg/mylv1  >/dev/null 2>&1 
  25. mount /dev/myvg/mylv1 /mydata 
  26. echo "mount success..." 
  27. 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的地址即可。

終於做完了,很不容易啊。這次我終於記得住了,每做一次,就增加一些記憶。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章