DNS實現負載均衡的discuz論壇服務

    這篇文字以搭建discuz論壇展開,但是,本意不是這個,這個實驗,我採用了NFS的文件系統,DNS服務,php的fpm模式,兩個web服務,最後還有一個MariaDB的數據庫,採用分離式的LAMP平臺,實現數據共享。


拓撲圖如下:

實驗的宗旨:
      我們以任意的客戶端發送請求,通過DNS服務器做輪詢的負載均衡,分別會訪問不同的web主機,後端,我將NFS服務器分別掛載至兩臺web服務器和php的服務器,php服務器和web服務器之間通過fpm的形式交互,同時,後端的數據可以爲這個拓撲中的任意主機使用。

實驗流程:

1、搭建web服務器(兩臺web服務器的配置一致)

安裝apr的軟件包

[root@localhost src]# tar jxf apr-1.5.0.tar.bz2 
[root@localhost src]# cd apr-1.5.0
[root@localhost apr-1.5.0]# ./configure –prefix=/usr/local/apr
[root@localhost src]# make && make install

安裝apr-util軟件包

[root@localhost src]# tar jxf apr-util-1.5.3.tar.bz2 
[root@localhost src]# cd apr-util-1.5.3
[root@localhost apr-util-1.5.3]# ./configure  - -prefix=/usr/local/apr-util  - -with-apr=/usr/local/apr/

安裝httpd軟件

先解決關於pcre的問題,安裝pcre的開發包

[root@localhost ~]# yum install pcre-devel
[root@localhost src]# tar jxf httpd-2.4.9.tar.bz2 
[root@localhost src]# cd httpd-2.4.9
[root@localhost httpd-2.4.9]# ./configure  --prefix=/usr/local/apache  --sysconfdir=/etc/httpd2 
--enable-so  --enable-ssl  --enable-cgi  --enable-rewrite  --with-zlib  --with-pcre  
--with-apr=/usr/local/apr  --with-apr-util=/usr/local/apr-util/  --enable-modules=most 
 --enable-mpms-shared=all  --enable-mpm=event
[root@localhost httpd-2.4.9]#make && make install

把httpd服務的命令加入系統的環境變量中

[root@localhost ~]# vim /etc/profile.d/httpd.sh
export  PATH=/usr/local/apache/bin:$PATH
[root@localhost ~]# source /etc/profile.d/httpd.sh


2、MariaDB數據庫服務器搭建

解壓二進制包於指定位置:

[root@localhost src]# tar zxf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/

爲MariaDB添加用戶和組,爲系統用戶

[root@localhost src]# groupadd -r mysql
[root@localhost src]# useradd -g mysql -r mysql

將另一塊磁盤作爲數據存放位置,且做邏輯卷掛載

[root@localhost src]# fdisk -l /dev/sdb
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa295ba74
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        2610    20964793+  8e  Linux LVM

查看新建的磁盤是否被dm服務佔用

[root@localhost src]# dmsetup status
sdb1: 0 41929587 linear

解除佔用

[root@localhost src]# dmsetup remove sdb1

創建物理卷

[root@localhost src]# pvcreate /dev/sdb1
  dev_is_mpath: failed to get device for 8:17
  Physical volume "/dev/sdb1" successfully created

創建卷組

[root@localhost src]# vgcreate myvg /dev/sdb1
  Volume group "myvg" successfully created

創建邏輯卷

[root@localhost src]# lvcreate -L 15G -n mylv myvg
  Logical volume "mylv" created

可以用lvs或lvdisplay命令查看

格式化分區

[root@localhost src]# mke2fs -t ext4 -b 1024 -m 3 -L mysql /dev/myvg/mylv

讓邏輯卷能自動掛載在/MySQL目錄下

[root@localhost src]# mkdir /MySQL
[root@localhost src]# vim /etc/fstab 
LABEL=mysql             /MySQL                  ext4    defaults        0 0
[root@localhost src]# mount -a

可以使用mount命令直接檢測是否已經掛載成功


創建軟鏈接

[root@localhost src]# cd /usr/local/
[root@localhost local]# ln -sv mariadb-5.5.36-linux-x86_64/ mysql
`mysql' -> `mariadb-5.5.36-linux-x86_64/'

爲MariaDB提供配置文件和啓動腳本

[root@localhost local]# cd mysql/support-files/
[root@localhost support-files]# mkdir /etc/mysql
[root@localhost support-files]# cp my-large.cnf /etc/mysql/my.cnf
 
[root@localhost support-files]# cp mysql.server /etc/rc.d/init.d/mysqld
[root@localhost support-files]# chkconfig –add mysqld
[root@localhost support-files]# chkconfig –list mysqld
mysqld          0:off 1:off 2:on 3:on 4:on 5:on 6:off

編輯配置文件,初始化MariaDB服務器

[root@localhost support-files]# mkdir /MySQL/data
[root@localhost support-files]# vim /etc/mysql/my.cnf 
datadir = /MySQL/data
[root@localhost mysql]# pwd
/usr/local/mysql
[root@localhost mysql]# ./scripts/mysql_install_db –user=mysql –datadir=/MySQL/data/

將MariaDB的命令加入到環境變量中

[root@localhost mysql]# vim /etc/profile.d/mysql.sh
export  PATH=/usr/local/msyql/bin:$PATH

重讀配置文件

[root@localhost mysql]# source /etc/profile.d/mysql.sh

啓動MariaDB數據庫服務

[root@localhost mysql]# service mysqld start
Starting MySQL….                                         [  OK  ]

可以登錄了

[root@localhost mysql]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.36-MariaDB-log MariaDB Server
 
Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]>


3、以fpm的形式安裝php服務器

解決依賴包

[root@localhost ~]# yum install libxml2-devel
[root@localhost ~]# yum install bzip2-devel

編譯安裝php服務器

[root@localhost src]# tar jxf php-5.4.26.tar.bz2 
[root@localhost src]# cd php-5.4.26
[root@localhost php-5.4.26]# ./configure  --prefix=/usr/local/php  --with-mysql=mysqlnd 
 --with-mysqli=mysqlnd  --with-openssl  --enable-mbstring  - -with-freetype-dir 
 --with-jpeg-dir  --with-png-dir  --with-zlib  --with-libxml-dir  --enable-xml  
 --enable-sockets  --enable-fpm  --with-mcrypt  --with-config-file-path=/etc/  
 --with-config-file-scan-dir=/etc/php.d   --with-bz2  --enable-maintainer-zts
[root@localhost php-5.4.26]#make && make install

注意,由於apache採用的是event模式,所以,php在編譯時,要加- -enable-maintainer-zts

提供配置文件

[root@localhost php-5.4.26]# cp php.ini-production /etc/php.ini

提供 SysV init腳本,並將其添加至服務列表

[root@localhost php-5.4.26]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@localhost php-5.4.26]# chmod a+x /etc/rc.d/init.d/php-fpm 
[root@localhost php-5.4.26]# chkconfig –add php-fpm

爲php-fpm服務提供配置文件

[root@localhost php]# cd /usr/local/php/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf

更改php-fpm的配置文件,如下所示

pid = /usr/local/php/var/run/php-fpm.pid
listen = 0.0.0.0:9000        #讓其監聽所有,如果考慮安全,可以採用iptables
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8


4、創建NFS共享服務器,提供discuz論壇軟件

查看是否已經安裝nfs的軟件

[root@localhost ~]# rpm -qa | grep nfs-utils
nfs-utils-lib-1.1.5-6.el6.x86_64
nfs-utils-1.2.3-39.el6.x86_64

啓動服務:

[root@localhost ~]# service nfs start

將另外一塊準備好的磁盤做成邏輯卷:

[root@localhost ~]# fdisk /dev/sdb #且要格式成LVM格式
[root@localhost ~]# pvcreate /dev/sdb1
[root@localhost ~]# vgcreate myvg /dev/sdb1
[root@localhost ~]# lvcreate -L 16G -n mylv myvg

格式化邏輯卷,並掛在到/share目錄,支持開機自動掛載

[root@localhost ~]# mke2fs -t ext4 -b 2048 -m 3 -L share /dev/myvg/mylv
[root@localhost ~]# mkdir /share
[root@localhost ~]# vim /etc/fstab
LABEL=share             /share                  ext4    defaults        0 0
[root@localhost ~]# mount -a #掛載之,可以用mount查看

編輯nfs的配置選項,使/share被共享

[root@localhost ~]# vim /etc/exports
/share          192.168.77.0/24(rw,no_root_squash,no_all_squash,insecure)

注意:網段地址一定不能寫錯,以下是被我寫成192.168.77.0所報的錯

[root@localhost ~]# mount -t nfs 192.168.77.144:/share  /web/
mount.nfs: access denied by server while mounting 192.168.77.144:/share

下載discuz軟件,放置在共享目錄下,並且解壓

[root@localhost share]# pwd
/share
[root@localhost share]# unzip Discuz_X2.5_SC_GBK.zip

查看目錄的文件

[root@localhost ~]# ls /share/
Discuz_X2.5_SC_GBK.zip  lost+found  readme  upload  utility


5、把nfs共享的目錄分別共享給兩臺web服務器和php服務器

web1:

[root@localhost ~]# mkdir /web/
[root@localhost ~]# mount -t nfs 192.168.77.144:/share  /web/
[root@localhost ~]# ls /web/
Discuz_X2.5_SC_GBK.zip  lost+found  readme  upload  utility

web2:

[root@localhost ~]# mkdir /web/
[root@localhost ~]# mount -t nfs 192.168.77.144:/share  /web/
[root@localhost ~]# ls /web/
Discuz_X2.5_SC_GBK.zip  lost+found  readme  upload  utility

php服務器:

[root@localhost ~]# mkdir /web/
[root@localhost ~]# mount -t nfs 192.168.77.144:/share  /web/
[root@localhost ~]# ls /web/
Discuz_X2.5_SC_GBK.zip  lost+found  readme  upload  utility


6、在MariaDB數據庫服務器裏新建一個庫,授權給discuz這個用戶

MariaDB [(none)]> CREATE DATABASE discuz;
MariaDB [(none)]> GRANT ALL ON discuz.* TO discuz@'192.168.77.%' IDENTIFIED BY 'discuz';
MariaDB [(none)]> FLUSH PRIVILEGES;


7、配置httpd服務器,以httpd1爲例,兩個一致

編輯配置文件,開啓虛擬主機,與php-fpm進行交互,關閉正向解析

添加內容如下所示

 

啓用兩個模塊,支持虛擬主機、fcgi

Include /etc/httpd2/extra/httpd-vhosts.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

添加,解析php的功能

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

默認作爲主頁的,添加index.php

DirectoryIndex index.html index.php

然後配置虛擬主機的配置文件

[root@localhost ~]# vim /etc/httpd2/extra/httpd-vhosts.conf 
<VirtualHost *:80>
    DocumentRoot "/web"
    ServerName discuz.365lsy.com
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.77.143:9000/web/$1
        <Directory "/web">
        Options none
        AllowOverride none
        Require all granted
</Directory>
</VirtualHost>


8、實驗檢測及效果展示

啓動httpd服務器,然後再啓動php-fpm服務器

[root@localhost etc]# service php-fpm start

在瀏覽器先輸入ip地址測試

http://192.168.77.152/upload
點擊“我同意”,繼續安裝,報以下錯誤:

這是沒有權限引起的,然後,在/web/upload目錄下,改變這些目錄、文件的權限

[root@localhost upload]# chmod -R a+w data/
[root@localhost upload]# chmod -R a+w uc_server/
[root@localhost upload]# chmod -R a+w config/
[root@localhost upload]# chmod -R a+w uc_client/data/cache/

以上步驟在NFS服務器上直接操作

刷新後重試


點擊安裝全新的discuz,填入數據庫信息,上面已經新建表,授權用戶

安裝完成

最後用瀏覽器訪問web服務器

如果只輸入ip地址的話,瀏覽器會彈出"It Works"的字樣,這是因爲識別index.html作爲主頁了

解決方法:我們可以把/usr/local/apache/htdocs下面的index.html刪除

上面我們輸的時候,加了upload這個目錄名,如果要直接輸入ip地址,更改配置文件如下:

[root@localhost ~]# vim /etc/httpd2/extra/httpd-vhosts.conf 
<VirtualHost *:80>
    DocumentRoot "/web/upload"
    ServerName discuz.365lsy.com
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.77.143:9000/web/upload/$1
        <Directory "/web/upload">
        Options none
        AllowOverride none
        Require all granted
</Directory>
</VirtualHost>

然後,分別訪問兩個web服務器,查看discuz安裝後的是否一致



注意:兩個web服務器的配置必須要一致,我們可以編譯好一個配置文件,然後scp拷貝過去

下面,我們在web2上新建用戶,並且發表帖子,然後到web1服務上,查看數據是否同步,是否一致
在web2上註冊用戶

發表帖子

在web1上登錄剛剛註冊的用戶

查看在web2上發表的帖子

可以看出,數據是同步的,是一致的
 

9、搭建DNS服務器,將discuz.365lsy.com分別指向這兩臺web


配置主文件,如下所示

[root@localhost ~]# vim /etc/named.conf
options {
        directory       "/var/named";
        recursion yes;
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
}; 
zone "." IN {
        type hint;
        file "named.ca";
}; 
include "/etc/named.rfc1912.zones";

編輯輔助配置文件

[root@localhost ~]# vim /etc/named.rfc1912.zones

添加此項

zone "365lsy.com" IN {
        type master;
        file "365lsy.com.zone";
};

添加域配置文件

[root@localhost ~]# vim /etc/named.rfc1912.zones 
$TTL    3600
$ORIGIN  365lsy.com.
@       IN      SOA     ns.365lsy.com.  admin.365lsy.com. (
        2014081601
        2H
        10M
        5D
        10H
)
        IN      NS      ns
ns      IN      A       192.168.77.133
discuz  IN      A       192.168.77.152
discuz  IN      A       192.168.77.154

啓動服務:

[root@localhost ~]# service named start


測試,將一臺windows客戶端連進這個網絡,更改DNS地址,指向我們上面配置的DNS服務器

我們可以用nslookup命令查看一下

然後,在一臺linux下測驗:

[root@localhost ~]# vim /etc/resolv.conf
nameserver 192.168.77.133

可以看出,DNS服務器爲本機做了輪詢,每次訪問爲不同的IP地址

[root@localhost ~]# dig -t A discuz.365lsy.com
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A discuz.365lsy.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41508
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1
 
;; QUESTION SECTION:
;discuz.365lsy.com. IN A
 
;; ANSWER SECTION:
discuz.365lsy.com. 3600 IN A 192.168.77.154
discuz.365lsy.com. 3600 IN A 192.168.77.152
 
;; AUTHORITY SECTION:
365lsy.com. 3600 IN NS ns.365lsy.com.
 
;; ADDITIONAL SECTION:
ns.365lsy.com. 3600 IN A 192.168.77.133
 
;; Query time: 2 msec
;; SERVER: 192.168.77.133#53(192.168.77.133)
;; WHEN: Mon Aug 11 20:30:11 2014
;; MSG SIZE  rcvd: 100
[root@localhost ~]# dig -t A discuz.365lsy.com
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A discuz.365lsy.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7580
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1
 
;; QUESTION SECTION:
;discuz.365lsy.com. IN A
 
;; ANSWER SECTION:
discuz.365lsy.com. 3600 IN A 192.168.77.152
discuz.365lsy.com. 3600 IN A 192.168.77.154
 
;; AUTHORITY SECTION:
365lsy.com. 3600 IN NS ns.365lsy.com.
 
;; ADDITIONAL SECTION:
ns.365lsy.com. 3600 IN A 192.168.77.133
 
;; Query time: 2 msec
;; SERVER: 192.168.77.133#53(192.168.77.133)
;; WHEN: Mon Aug 11 20:30:23 2014
;; MSG SIZE  rcvd: 100

可以看出,我們的windows客戶端已經解析出兩個web的地址,訪問時,會輪詢訪問
linux客戶端上,結果更加明顯,返回的結果:
第一次是
discuz.365lsy.com. 3600 IN A 192.168.77.154
第二次是
discuz.365lsy.com. 3600 IN A 192.168.77.152
是輪詢的不同結果,整個流程,在DNS服務器的作用下,就有了負載均衡的作用

實驗總結:
    這個實驗,在做的時候,都是比較容易的,但是,實驗本身存在缺陷,對於大併發的訪問情況下,它的MariaDB數據庫服務器和NFS服務器就會成爲整個架構的瓶頸,特別是NFS服務器,如果中間網絡故障,就會使整個架構崩潰,另一種就是NFS是基於RPC的服務,多請求時,會發起多個系統調用的函數,可能會被阻塞,導致網站的整體性能。

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