lvs 负载均衡两台提供Discuz!论坛服务的服务器

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
传统型负载均衡 CLB,每月750个小时 15LCU
简介:

规划:

   1、使用lvs的nat模型,负载均衡两台 Discuz 服务器。

   2、Discuz 服务器的数据共享解决方案:

       部署 Discuz! 论坛程序要解决两大问题:

       (1)、用户上传的附件属于非结构化的数据要保存在文件系统中。

          要解决两台提供Discuz!论坛服务的附件共享问题:

  (A)、当用户上传附件时通过地址重写机制把它定向到一台Discuz!服务器,再通过

                rsync+innotify实时数据同步方式把附件同步到另一台Discuz!服务器。

  (B)、使用rsync推、拉数据的方式,实现用户上传的附件同步,这样无论用户把附件上传

               到那台服务器都可以附件同享。

       (2)、论坛结构化的数据保存在共享数据库服务器。

   3、Discuz!论坛程序是.php格式的。意思是:这里选择使用:lamp 平台运行论坛程序。php 以模块的方式与 httpd 服务器交互。

整个 Discuz! 论坛系统的结构如下图所示:

wKiom1QO5bKjT3m-AAH2n1hQEeI365.jpg

一、构建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

wKioL1QO7mXiLygWAARA-B0DIoM845.jpg

点击“我同意”

wKioL1QO7rHiZGoBAALq0LJfTQg768.jpg


按要求修改上述目录的权限

wKioL1QO7z3A1VRTAAJnLGtj4iA221.jpg


填写连接数据库的信息

wKiom1QO75jCtcOkAAHmPIOVxGM224.jpg

在该台服务器部署 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、访问测试

wKioL1QO8NCCrVrIAAJ1M-mP018537.jpg

访问另一台服务器,查看测试结果

wKiom1QO8PGBKhJZAAH-GXJA6mk014.jpg

在 192.168.60.44发贴,测试在另一台服务器是否看到

wKioL1QO8U-iNp5hAAJ_kfNcrXI233.jpg

查看192.168.60.99服务器是否看到在192.168.60.40服务器上传的附件。

wKiom1QO8ZfjSdiyAAKGhp-k59k654.jpg

已经测试过,还能下载。


说明:

    两台服务器部署 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链。

如下图:

wKiom1QO8sWz5l-6AALGiksXlm4026.jpg

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、访问测试:

wKioL1QO8_GTlgB4AALhipst60A875.jpg不断刷新之后。。。

wKioL1QO9E2QDHnOAAS_5W7-R5U454.jpg


到此为止,LVS负载均衡两台: Discuz! 已经成功!!!!





     本文转自成长的小虫 51CTO博客,原文链接:http://blog.51cto.com/9528du/1550332,如需转载请自行联系原作者


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
8天前
|
运维 负载均衡 网络协议
LVS+Keepalived 负载均衡
LVS+Keepalived 负载均衡
30 1
LVS+Keepalived 负载均衡
|
5天前
|
域名解析 运维 负载均衡
LVS+Keepalived 负载均衡(二)28-1
【8月更文挑战第28天】LVS+Keepalived 负载均衡 配置 LVS VIP
20 5
|
5月前
|
负载均衡 网络协议 算法
LVS 负载均衡部署的三种模式 与搭建dr模式具体步骤
LVS 负载均衡部署的三种模式 与搭建dr模式具体步骤
|
2月前
|
存储 设计模式 缓存
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
该文章主要介绍了如何在OpenFeign中集成Ribbon以实现负载均衡,并详细分析了Ribbon中服务选择和服务过滤的核心实现过程。文章还涉及了Ribbon中负载均衡器(ILoadBalancer)和负载均衡策略(IRule)的初始化方式。
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
|
2月前
|
负载均衡 监控 算法
揭秘负载均衡的五大算法秘籍:让你的服务器轻松应对亿万流量,不再崩溃!
【8月更文挑战第31天】在互联网快速发展的今天,高可用性和可扩展性成为企业关注的重点。负载均衡作为关键技术,通过高效分配网络流量提升系统处理能力。本文介绍了轮询、加权轮询、最少连接及IP哈希等常见负载均衡算法及其应用场景,并提供Nginx配置示例。此外,还探讨了如何根据业务需求选择合适算法、配置服务器权重、实现高可用方案、监控性能及定期维护等最佳实践,助力系统优化与用户体验提升。
57 2
|
2月前
|
负载均衡 算法 应用服务中间件
负载均衡技术在Web服务器集群中的应用
【8月更文第28天】随着互联网的发展和用户对Web服务需求的增长,单台服务器很难满足大规模访问的需求。为了提高系统的稳定性和扩展性,通常会采用Web服务器集群的方式。在这种架构中,负载均衡器扮演着至关重要的角色,它能够合理地分配客户端请求到不同的后端服务器上,从而实现资源的最优利用。
74 2
|
2月前
|
负载均衡 应用服务中间件 Linux
"揭晓nginx的神秘力量:如何实现反向代理与负载均衡,拯救服务器于水火?"
【8月更文挑战第20天】在Linux环境下,nginx作为高性能HTTP服务器与反向代理工具,在网站优化及服务器负载均衡中扮演重要角色。本文通过电商平台案例,解析nginx如何解决服务器压力大、访问慢的问题。首先介绍反向代理原理,即客户端请求经由代理服务器转发至内部服务器,隐藏真实服务器地址;并给出配置示例。接着讲解负载均衡原理,通过将请求分发到多个服务器来分散负载,同样附有配置实例。实践表明,采用nginx后,不仅服务器压力得到缓解,还提升了访问速度与系统稳定性。
56 3
|
2月前
|
负载均衡 网络协议
使用LVS搭建集群实现负载均衡(二)安装使用
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡(二)安装使用
43 4
|
2月前
|
存储 负载均衡 算法
使用LVS搭建集群实现负载均衡(一)
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡
62 4
|
2月前
|
负载均衡 Kubernetes 开发工具
k8s相关服务与负载均衡
k8s相关服务与负载均衡
33 0
下一篇
无影云桌面