规划:
1、使用lvs的nat模型,负载均衡两台 Discuz 服务器。
2、Discuz 服务器的数据共享解决方案:
部署 Discuz! 论坛程序要解决两大问题:
(1)、用户上传的附件属于非结构化的数据要保存在文件系统中。
要解决两台提供Discuz!论坛服务的附件共享问题:
(A)、当用户上传附件时通过地址重写机制把它定向到一台Discuz!服务器,再通过
rsync+innotify实时数据同步方式把附件同步到另一台Discuz!服务器。
(B)、使用rsync推、拉数据的方式,实现用户上传的附件同步,这样无论用户把附件上传
到那台服务器都可以附件同享。
(2)、论坛结构化的数据保存在共享数据库服务器。
3、Discuz!论坛程序是.php格式的。意思是:这里选择使用:lamp 平台运行论坛程序。php 以模块的方式与 httpd 服务器交互。
整个 Discuz! 论坛系统的结构如下图所示:
一、构建LAMP平台,用来运行:Discuz! 论坛程序
在 real1.9527du.com(192.168.60.99) 和 real2.9527du.com(192.168.60.40 两台主机部署 LAMP 平台中的:httpd 和 php.php 以模块的方式与 httpd 交互
MySQL 数据库安装在 DataServer.9527du.com(192.168.60.88)主机,作为两台 Discuz! 服务器的共享数据库服务器
LAMP 平台使用的软件:
1
2
3
|
httpd-2.4.1.
tar
.bz2
php-5.4.26.
tar
.bz2
mariadb-5.5.36-linux-i686.
tar
.gz
|
在 real1.9527du.com(192.168.60.99) 编译安装 httpd和php
1、编译安装 httpd
解压
1
2
|
[root@real1 lamp]
# tar -xf httpd-2.4.1.tar.bz2
[root@real1 lamp]
# cd httpd-2.4.1
|
编译配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@real1 httpd-2.4.1]
# ./configure \
--prefix=
/usr/local/httpd-2
.4.1 \ 指定程序的安装位置
--sysconfdir=
/etc/httpd-2
.4.1 \ 指定配置文件的存放位置
--
enable
-so \ 使用动态装载模块的功能,
--
enable
-mods-shared=all \ 编译所有的模块
--
enable
-ssl \ 支持 https 加密数据传输
--
enable
-mpms-shared=all \ 安装所有的mpm
--with-mpm=prefork \ 设置默认使用的MPM
--
enable
-info \ 开启httpd的状态信息功能
--
enable
-cgi \ 支持cgi
--
enable
-rewrite \ 支持地址重定向功能
--with-apr=
/usr/local/apr-1
.4/ \ 指定依赖的apr位置,
--with-apr-util=
/usr/local/apr-util-1
.4/ \
--with-pcre \
--with-z 支持压缩传输,节省带宽但消耗CPU时间周期
|
编译
1
|
[root@real1 httpd-2.4.1]
#make && make install
|
2、安装 php
解压
1
2
|
[root@real1 admin]
# tar -xf php-5.4.26.tar.bz2
[root@real1 admin]
# cd php-5.4.26
|
编译配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[root@real1 php-5.4.26]
# ./configure \
--prefix=
/usr/local/php-6
.4 \ 指定程序的安装位置
--with-apxs2filter=
/usr/local/httpd-2
.4.1
/bin/apxs
\ 把php编译成httpd的模块
--
enable
-mod-charset \ 支持更多的字符集
--with-config-
file
-path=
/etc
\ 配置文件的路径
--with-config-
file
-scan-
dir
=
/etc/php
.d \ php一般会到php.d 找它模块的配置文件
--with-libxml-
dir
\ 支持xml
--with-openssl \ 支持openssl 加密传输
--with-zlib \ 支持zlib压缩
--with-bz2 \ 支持bz2压缩
--with-pcre-
dir
\
--with-gd \ 图形库显示图形必需的
--with-jpeg-
dir
\ 支持jpeg格式的图片
--with-png-
dir
\ 支持png格式的图片
--with-zlib-
dir
\
--with-freetype-
dir
\
--
enable
-mbstring \ 支持中文
--
enable
-sockets \ 支持UNIX SOCK
--
enable
-maintainer-zts \ 安全的线程
--with-mysql=mysqlnd \ 使用php内置连接数据库的驱动。这样就不需要事先安装好数据库了。
--with-mysqli=mysqlnd \ 使用php内置连接数据库的驱动
--with-pdo-mysql=mysqlnd 使用php内置连接数据库的驱动
|
编译安装
1
|
[root@real1 php-5.4.26]
# make && make install
|
提供php的配置文件
1
|
[root@real1 php-5.4.26]
# cp php.ini-production /etc/php.ini
|
(1)、设置httpd的配置文件让httpd支持动态格式的网页.php
设置支持.php格式的主页
1
2
3
|
<IfModule dir_module>
DirectoryIndex index.php index.html
<
/IfModule
>
|
添加.php格式的网页的处理器
1
2
|
AddType application
/x-httpd-php
.php
AddType application
/x-httpd-php-source
.phps
|
查看是否加载php模块
1
2
|
[root@real1 ~]
# grep "LoadModule[[:space:]]*php" /etc/httpd-2.4.1/httpd.conf
LoadModule php5_module modules
/libphp5
.so
|
说明:
在 rele2.9527du.com(192.168.60.99)主机也是一样的编译安装httpd、php程序和设置。
3、在 DataServer.9527du.com(192.168.60.88)安装 MariaDB 数据库服务器。
(1)、准备好安装 MariaDB 数据库的条件
创建MariaDB数据库的数据目录
1
|
[root@DataServer /]
# mkdir -p mysqldata/mysql
|
创建初始化数据库的用户 mysql,且把该用户创建成系统用户默认登陆shell为:/sbin/nologing
1
2
3
|
[root@DataServer /]
# user -r -s /sbin/nologin mysql
[root@DataServer /]
# id mysql
uid=388(mysql) gid=388(mysql)
groups
=388(mysql)
|
因为发起对数据目标中的数据操作(增、删、改、查)的进程的属主是:mysql,所以要修改数据目录的属主属组为:mysql.
1
2
3
4
|
root@DataServer mysqldata]
# chown mysql:mysql mysql
[root@DataServer mysqldata]
# ll
total 4
drwxr-xr-x 2 mysql mysql 4096 Sep 8 10:41 mysql
|
(2)、安装 MariaDB数据库
解压数据库程序到 /use/local 目录下
1
2
|
[root@DataServer admin]
# tar -xf mariadb-5.5.36-linux-i686.tar.gz -C /usr/local/
[root@DataServer admin]
# cd /usr/local/
|
创建软链接,不直接修改目录名称,为了以后升级方面
1
2
3
4
|
[root@DataServer
local
]
# ln -sv mariadb-5.5.36-linux-i686 mysql
create symbolic link `mysql
' to `mariadb-5.5.36-linux-i686'
[root@DataServer
local
]
# ll mysql
lrwxrwxrwx 1 root root 25 Sep 8 09:30 mysql -> mariadb-5.5.36-linux-i686
|
修改解压后的所有程序的属主属组为:mysql ,因为做数据库的初始化时,需要以mysql的身份执行一些初始化脚本。
1
2
3
4
5
6
7
8
9
10
|
root@DataServer
local
]
# cd mysql/
[root@DataServer mysql]
# chown -R mysql:mysql ./*
[root@DataServer mysql]
# ll
total 216
drwxr-xr-x 2 mysql mysql 4096 Sep 8 09:34 bin
-rw-r--r-- 1 mysql mysql 17987 Feb 24 2014 COPYING
-rw-r--r-- 1 mysql mysql 26545 Feb 24 2014 COPYING.LESSER
drwxr-xr-x 3 mysql mysql 4096 Sep 8 09:34 data
drwxr-xr-x 2 mysql mysql 4096 Sep 8 09:34 docs
....
|
初始化数据库
1
2
3
4
5
|
[root@DataServer mysql]
# ./scripts/mysql_install_db --datadir=/mysqldata/mysql/ --user=mysql
Installing MariaDB
/MySQL
system tables
in
'/mysqldata/mysql/'
...
OK
Filling help tables...
OK
|
说明:
初始化数据库已经成功。
(3)、提供启动 MariaDB 数据库的条件
为数据库提供配置文件
1
|
[root@DataServer mysql]
# cp support-files/my-large.cnf /etc/my.cnf
|
根据实际情况修改数据库的数据目录的位置等参数
1
2
3
|
[root@DataServer mysql]
# vim /etc/my.cnf
thread_concurrency = 2
datadir =
/mysqldata/mysql/
|
为 MariaDB 数据库提供启动脚本
1
2
3
|
[root@DataServer mysql]
# cp support-files/mysql.server /etc/init.d/mysqld
root@DataServer mysql]
# ll /etc/init.d/mysqld
-rwxr-xr-x 1 root root 11844 Sep 8 10:48
/etc/init
.d
/mysqld
|
为了安全考虑,修改数据库程序的属主为:root 属组为:mysql
1
2
3
4
5
6
7
8
9
|
[root@DataServer mysql]
# chown -R root:mysql ./*
[root@DataServer mysql]
# ll
total 216
drwxr-xr-x 2 root mysql 4096 Sep 8 09:34 bin
-rw-r--r-- 1 root mysql 17987 Feb 24 2014 COPYING
-rw-r--r-- 1 root mysql 26545 Feb 24 2014 COPYING.LESSER
drwxr-xr-x 3 root mysql 4096 Sep 8 09:34 data
drwxr-xr-x 2 root mysql 4096 Sep 8 09:34 docs
.....
|
为了使用 MariaDB 数据库提供的工具命令方便,把它所在的路径导出来
1
2
|
[root@DataServer /]
# vim /etc/profile.d/mysql.sh
PATH=$PATH:
/usr/local/mysql/bin/
|
(3)、启动 MariaDB 数据库并测试
启动数据库服务
1
2
|
[root@DataServer /]
# service mysqld start
Starting MySQL.. [ OK ]
|
使用客户端工具mysql连接数据库
1
2
3
4
5
6
7
8
9
10
|
root@DataServer /]
# 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)]>
|
说明:
数据库已经顺利启动。
(4)、修改数据库资源的访问,原因安装数据数据库时默认安装的用户是没有密码的。极其不安全。
删除多余的默认用户
1
2
3
4
5
|
MariaDB [(none)]> drop user
'root'
@
'dataserver.9527du.com'
;
MariaDB [(none)]> drop user
'root'
@
'::1'
;
MariaDB [(none)]> drop user
''
@
'localhost'
;
MariaDB [(none)]> drop user
''
@
'dataserver.9527du.com'
;
MariaDB [(none)]> drop user
'root'
@
'localhost'
;
|
给保留的用户添加密码,
1
2
|
MariaDB [(none)]>
set
password
for
'root'
@
'127.0.0.1'
= password(
'root'
);
Query OK, 0 rows affected (0.00 sec)
|
设置远程管理数据库的用户
1
2
|
MariaDB [(none)]> grant all on *.* to
'admin'
@
'%.%.%.%'
identified by
'admin'
;
Query OK, 0 rows affected (0.00 sec)
|
修改后的 MariaDB 数据库的用户列表
1
2
3
4
5
6
7
8
|
MariaDB [(none)]>
select
user,host,password from mysql.user;
+-------+-----------+-------------------------------------------+
| user | host | password |
+-------+-----------+-------------------------------------------+
| admin | %.%.%.% | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
| root | 127.0.0.1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+-------+-----------+-------------------------------------------+
2 rows
in
set
(0.00 sec)
|
远程测试是否能够登陆操作数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
D:\>mysql -uadmin -h192.168.60.88 -p
Enter password: *****
Welcome to the MySQL monitor. Commands end with ; or \g.
。。。。。
Type
'help;'
or
'\h'
for
help. Type
'\c'
to
clear
the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
|
test
|
+--------------------+
|
说明:
MariaDB数据库已经安装完成
(5)、创建Discuz论坛使用的数据库
1
2
|
MariaDB [(none)]> create database discuz;
Query OK, 1 row affected (0.00 sec)
|
创建Discuz论坛程序访问数据库的用户,采用最小权限法则,该用户只有:Discuz 数据库的所有权限。
1
2
3
4
|
MariaDB [(none)]> grant all on discuz.* to
'discuz'
@
'192.168.60.%'
identified by
'discuz'
;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
|
说明:
LAMP 平台的数据库已经安装测试成功。
4、测试,LAMP 平台
说明:都是在real1.9527du.com(192.168.60.99)主机,通过【curl】访问测试的。
(1)、添加测试页
1
2
3
4
5
6
7
8
|
[root@real1 htdocs]
# cat index.php
<?php
$link = mysql_connect(
'192.168.60.88'
,
'admin'
,
'admin'
);
if
($link)
echo
"Success..."
; ----> 如果连接数据库成功会输出:Success...
else
echo
"Failure..."
; ----> 如果连接数据库失败会输出:Failure...
?>
|
(2)、测试real1.9527du.com(192.168.60.99)主机搭建的 lamp 平台
1
2
|
[root@real1 httpd-2.4.1]
# curl http://192.168.60.99/index.php
Success...
|
说明:
连接数据库成功
通过ssh远程工具,关闭数据库服务
1
2
3
|
[root@real1 httpd-2.4.1]
# ssh 192.168.60.88 'service mysqld stop'
root@192.168.60.88's password:
Shutting down MySQL.[ OK ]
|
再次测试是否能够连接数据库
1
2
|
[root@real1 httpd-2.4.1]
# curl http://192.168.60.99/index.php
Failure...
|
说明:
连接数据库失败。
192.168.60.99 主机的:lamp 平台已经搭建成功!!!
(3)、测试real2.9527du.com(192.168.60.40)主机搭建的:lamp 平台
把测试页面发送到 192.168.60.40
1
2
3
|
[root@real1 httpd-2.4.1]
# scp ./htdocs/index.php 192.168.60.40:/usr/local/httpd-2.4.1/htdocs/
root@192.168.60.40's password:
index.php 100% 146 0.1KB
/s
00:00
|
测试 是否能够连接到数据库
1
2
|
[root@real1 httpd-2.4.1]
# curl http://192.168.60.40/index.php
Failure...
|
说明:
连接数据库失败。
通过ssh远程工具,开启数据库服务
1
2
3
|
[root@real1 httpd-2.4.1]
# ssh 192.168.60.88 'service mysqld start'
root@192.168.60.88's password:
Starting MySQL....[ OK ]
|
再次访问测试
1
2
|
[root@real1 httpd-2.4.1]
# curl http://192.168.60.40/index.php
Success...
|
说明:
已经连接到数据库服务器了。192.168.60.40 主机的:lamp 平台已经搭建成功!!!
说明:
提供 Discuz 论坛服务的两个LAMP平台都搭建成功。
二、使用rsync数据同步服务解决,两台 Discuz! 服务器数据共享问题;
使用rsync 数据同步服务为:real1.9527du.com(192.168.60.99)和
real2.9527du.com(192.168.60.40) 两台提供 Discuz 论坛服务的服务器的提供数据共享解决方案。
real1.9527du.com(192.168.60.99)作为rsync的服务器端
real2.9527du.com(192.168.60.40)作为rsync客户端
1、安装配置rsync服务器
(1)使用lvm逻辑卷保存论坛程序
查看VG卷组是否还有剩余空间
1
2
3
|
[root@real1 /]
# vgdisplay vg0 | grep "[[:space:]]*\/[[:space:]]*Size"
Alloc PE / Size 6656 / 52.00 GiB
Free PE / Size 1023 / 7.99 GiB
|
创建lvm
1
2
|
[root@real1 /]
# lvcreate -L 4G -n lvrsync vg0
Logical volume
"lvrsync"
created
|
格式化lvm
1
2
3
|
[root@real1 /]
# mke2fs -t ext4 /dev/vg0/lvrsync
[root@real1 /]
# echo $?
0
|
(2)、挂载
创建挂载点
1
|
[root@real1 /]
# mkdir /web
|
设置开机自动挂载
1
2
3
4
5
|
[root@real1 /]
# vim /etc/fstab
/dev/mapper/vg0-lvrsync
/web
ext4 defaults,acl 0 0
[root@real1 /]
# mount -a
[root@real1 /]
# mount | grep "lvrsync"
/dev/mapper/vg0-lvrsync
on
/web
type
ext4 (rw)
|
(3)安装 rsync程序并为其提供配置文件
1
|
[root@real1 /]
# yum install rsync
|
让 rsync 以独立守护进程方式工作。
rsync工作成服务模式,要有配置文件,为rsync服务器提供配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@real1 /]
# vim /etc/rsyncd.conf
#
#
uid = nobody
gid = nobody
use chroot = no
max connections = 10 ------> 并发量
strict modes =
yes
pid
file
=
/var/run/rsyncd
.pid ----->
rsync
的PID文件位置
log
file
=
/var/log/rsyncd
.lock -----> 锁文件的位置
[web] ----->
rsync
服务器导出的存储空间的标识
path =
/web
------> 寻出的存储空间在文件系统的位置
ignore errors ------> 数据同步时是否忽略一些IO错误,继续实现数据同步
read
only = no -------> 允许客户端上传数据
write only = no -------> 允许客户端拉取数据
hosts allow = 192.168.60.0
/24
--------> 允许访问
rsync
服务器的客户端端
hosts deny = *
list =
false
--------> 不允许列出
rsync
服务器导出的存储空间
uid = root
gid = root
|
2、配置 rsync 客户端实时向rsync服务器推送数据。
使用 innotify 机制实现数据的实时同步
(1)、使用lvm逻辑卷做为rsync导出的存储空间。
查看卷组是否还有空间创建lvm
1
2
3
|
[root@real2 /]
# vgdisplay | grep "[[:space:]]*\/[[:space:]]*Size"
Alloc PE / Size 6656 / 52.00 GiB
Free PE / Size 1023 / 7.99 GiB
|
创建lvm
1
2
|
[root@real2 /]
# lvcreate -L 4G -n web vg0
Logical volume
"web"
created
|
格式化lvm
1
2
3
|
[root@real2 /]
# mke2fs -t ext4 /dev/vg0/web
[root@real2 /]
# echo $?
0
|
(2)、挂载
创建挂载点
1
|
[root@real2 /]
# mkdir /web
|
设置自动挂载
1
2
3
4
5
|
[root@real2 /]
# vim /etc/fstab
/dev/mapper/vg0-web
/web
ext4 defaults,acl 0 0
[root@real2 /]
# mount -a
[root@real2 /]
# mount | grep "web"
/dev/mapper/vg0-web
on
/web
type
ext4 (rw)
|
(3)、安装: innotify
inotify-tools-3.14.tar.gz
1
2
3
4
|
[root@real2 admin]
# tar -xf inotify-tools-3.14.tar.gz
[root@real2 admin]
#cd inotify-tools-3.14
[root@real2 inotify-tools-3.14]
#./configure --prefix=/usr/local/inotify-tools
[root@real2 inotify-tools-3.14]
#Make && make install
|
(4)、配置 当 /web 目录的文件发生改变(create、move、delete、modify)就触发 rsync 客户端向 rsync 服务端推送数据。
脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#/bin/bash
#
#
rsyncServer=192.168.60.99
src=
/web/
dst=web
rsync
-azrtopg --delete $src $rsyncServer::$dst
/usr/local/inotify-tools/bin/inotifywait
-mrq -e create,move,delete,modify $src |
while
read
files;
do
rsync
-azrtopg --delete $src $rsyncServer::$dst
done
|
(5)、在 rsync 服务端启动rsync 服务
1
|
[root@real1 /]
# rsync --daemon --config=/etc/rsyncd.conf --ipv4
|
查看是否监听
1
2
|
[root@real1 /]
# netstat -antpl | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 2382
/rsync
|
在服务端以后台方式运行innotify监测脚本
1
2
|
[root@real2 ~]
# ./inotify.sh &
[1] 2348
|
(6)、测试:rsync + inotify 实现数据实时同步:
在 rsync 客户端创建文件
1
|
[root@real2 ~]
# touch /web/test.txt
|
查看 rsync 服务器端导出的存储空间是否有该文件
1
2
3
4
|
[root@real1 web]
# ll
total 16
drwx------. 2 root root 16384 Sep 8 11:32 lost+found
-rw-r--r--. 1 root root 0 Sep 8 11:47
test
.txt
|
说明:
在rsync 客户端,innotify 已经监测到 /web 文件系统的 create 事件
在 rsync 客户端修改 test.txt 文件
1
|
[root@real2 ~]
# echo "test rsync server" > /web/test.txt
|
看看 rsync 服务器端的 test.txt 文件的内容是否改变
1
2
|
[root@real1 web]
# cat test.txt
test
rsync
server
|
说明:
在 rsync 客户端,innotify 已经监测到 /web 文件系统的"modify"文件的事件
在 rsync 客户端删除 test.txt 文件
1
|
[root@real2 ~]
# rm -f /web/test.txt
|
看看 rsync 服务端的 test.txt 文件是否也被删除
1
2
3
|
[root@real1 web]
# ll
total 16
drwx------. 2 root root 16384 Sep 8 11:32 lost+found
|
说明:
从上面测试得知,使用 rsync + innotify 实现两台服务器的论坛程序共享已经成功。
3、由于没有做策略,当用户上传附件时候,把它定向到某台特定的discuz!服务器。
所以,做周期性任务计划,定时从rsync 服务器端拉取数据到本地,实现无论用户上传附件到哪台服务器。都可以实现附件共享。
1
2
3
|
[root@real2 ~]
# crontab -e
crontab
: installing new
crontab
*
/1
* * * *
/usr/bin/rsync
-aptgoz 192.168.60.99::web
/web
|
使用 rsync 客户端,向rsync发出数据同步请求的方式:拉取数据到本地和推送数据到rsync导出的存储空间。
从而实现,无论用户访问 Discuz 时被 lvs 分发到哪台主机都可有下载用户上传的附件。
三、部署 Discuz! 论坛程序.
1、在 real2.9527du.com(192.168.60.40) 部署 Discuz! 论坛程序.
也就是在 rsync客户端部署 Discuz! 论坛程序,会自动通过 rsync的数据同步服务,同步到另一台Discuz 服务器上。
(1)、创建部署论坛程序的目录
1
2
|
[root@real2 /]
# cd web/
[root@real2
/web
]
# mkdir html
|
(2)、修改 httpd 的配置文件,【DocumentRoot】定义的文档根目录为:/web/html
修改real2 主机的httpd配置文件
1
2
3
4
5
6
7
|
[root@real2 upload]
# vim /etc/httpd-2.4.1/httpd.conf
DocumentRoot
"/web/html"
<Directory
"/web/html"
>
Options -Indexes -FollowSymLinks
AllowOverride None
Require all granted
<
/Directory
>
|
同样也修改 real1.9527du.com 的配置文件
1
2
3
4
5
6
7
|
[root@real1 web]
# vim /etc/httpd-2.4.1/httpd.conf
DocumentRoot
"/web/html"
<Directory
"/web/html"
>
Options -Indexes -FollowSymLinks
AllowOverride None
Require all granted
<
/Directory
>
|
(3)、启动 httpd 服务
1
2
|
[root@real2 upload]
# cd /usr/local/httpd-2.4.1/
[root@real2 httpd-2.4.1]
# ./bin/apachectl restart
|
(4)、安装:
1
|
[root@real2 html]
# unzip Discuz_X2.5_SC_GBK.zip
|
点击“我同意”
按要求修改上述目录的权限
填写连接数据库的信息
在该台服务器部署 Discuz!成功!
2、启动 rsync 服务, 把Discuz 论坛程序同步到另一台服务器(real1.9527du.com)。
(1)、启动rsync服务
1
2
3
|
[root@real1 web]
# rsync --daemon --config=/etc/rsyncd.conf --ipv4
[root@real1 web]
# netstat -anptl | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 2330
/rsync
|
(2)、在rsyn客户端启动innotify监测脚本
1
2
|
[root@real2 ~]
# ./inotify.sh &
[1] 2561
|
(3)、查看数据是否同步过来
1
2
3
4
5
6
|
[root@real1 web]
# ll html/
total 9312
-rw-r--r--. 1 root root 9522601 Aug 16 13:54 Discuz_X2.5_SC_GBK.zip
drwxr-xr-x. 2 root root 4096 Oct 31 2012 readme
drwxr-xr-x. 12 root root 4096 Oct 31 2012 upload
drwxr-xr-x. 4 root root 4096 Oct 31 2012 utility
|
(4)、启动 real1.9527du.com 主要的http服务
1
2
|
root@real1 web]
# cd /usr/local/httpd-2.4.1/
[root@real1 httpd-2.4.1]
# ./bin/apachectl start
|
3、访问测试
访问另一台服务器,查看测试结果
在 192.168.60.44发贴,测试在另一台服务器是否看到
查看192.168.60.99服务器是否看到在192.168.60.40服务器上传的附件。
已经测试过,还能下载。
说明:
两台服务器部署 Discuz! 论坛程序已经成功!!!
四、配置基于 lvs 的 nat 模型负载均衡两台 Discuz! 服务器。
lvs 的nat 模型工作原理:
ipvs 捕获到访问的是集群服务时,通过调度算法计算该访问应该被调度到后端的那个 Real Server ,然后ipvs修改访问集群服务的数据报文的目标IP地址为选中的 Real Server,再把数据报文发送到 Real Server.
当 Real Server 构建完成响应了,数据报文的源IP是RIP,目标IP是CIP。互联网的数据报文路由是根据目标IP路由的,如果,该 Real Server 能够连接到外网,该数据报文是可以传输到CIP客户端的。但是客户端不会接收(因为客户端请求的是VIP)。所以,Real Server 响应客户端时,还应该把数据报文的源地址修改为VIP。
所以,RealServer 还应该把数据报文送给 Directory,由它根据nat目标地址转换会话表,把响应的数据报文的源地址修改为:VIP,再送给客户端。
为了配合 ipvs 完成上述过程,要解决以下问题:
(1)、Real Server 响应客户端时,发现自己访问的网络与自己不在同一网络,怎么把数据报文送给 Director?
通过默认网关。只要访问的网络是别的网络,都把数据报文送给网关。DIR做为 Real Server 的默认网关。
所以,还要求DIP与RIP在同一个网络中。
(2)、Real Server 把响应报文通过默认网关送达 Director 。数据报文经过 FORWARD 链,送达 POST_ROUTING 会根据nat会话表完成源地址的转换。
此时,Director 相当于工作在网络防火墙状态,要使用到系统的转发功能。所以要开启Linux的 ip_forward 功能。才可以把数据报文送达 POST_ROUTING链。
如下图:
1、在 real1 配置默认网关(DIP:192.168.60.1)。
1
2
3
4
5
6
|
[root@real1 ~]
# route add default gw 192.168.60.1
[root@real1 ~]
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.60.1 0.0.0.0 UG 0 0 0 eth1
192.168.60.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
|
2、在 real2 配置默认网关(DIP:192.168.60.1)
1
2
3
4
5
6
|
[root@real2 ~]
# route add default gw 192.168.60.1
[root@real2 ~]
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.60.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.60.1 0.0.0.0 UG 0 0 0 eth0
|
3、配置 lvs 规则。
开启数据报文转发功能
1
|
[root@director ~]
# echo 1 > /proc/sys/net/ipv4/ip_forward
|
定义集群服务,使用lvs的持久连接功能。
1
|
[root@director ~]
# ipvsadm -A -t 172.16.60.22:80 -s wlc -p 30
|
定义集群服务的 Real Server
1
2
|
[root@director ~]
# ipvsadm -a -t 172.16.60.22:80 -r 192.168.60.40 -m -w 1
[root@director ~]
# ipvsadm -a -t 172.16.60.22:80 -r 192.168.60.99 -m -w 1
|
查看lvs规则
1
2
3
4
5
6
7
|
[root@director ~]
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.60.22:80 rr
-> 192.168.60.99:80 Masq 1 0 0
-> 192.168.60.40:80 Masq 1 0 0
|
4、访问测试:
到此为止,LVS负载均衡两台: Discuz! 已经成功!!!!
本文转自成长的小虫 51CTO博客,原文链接:http://blog.51cto.com/9528du/1550332,如需转载请自行联系原作者