这个论坛一直通过NFS服务共享文件给三台web服务器做负载均衡.

在实际环境中WEB Server总是出现CPU负载突然升高、文件交互的网络流量异常、甚至WEB Server夯死,NFS不能卸载,只能重启才能解决。尝试优化NFS没有明显效果。

在文件服务器一次宕机之后,决定改造现有系统。

1、去NFS Server的单中心节点,提升系统可用性。

2、做动静分离,将论坛的图片、种子、压缩包等附件分离,还可以利用其他项目已购买的CDN服务提升图片下载速度。

设计了两种方案:

一、利用MFS、FastDFS等分布式文件系统。MFS使用方便,但是有单点故障。FastDFS还挺不错的,缺点是应用上需要改动的太多。

二、现有架构上不需要调整增加服务器,利用脚本、ftp,修改附件上传的代码,在最小投入就能实现目标。缺点就是文件服务出现问题,恢复之前不能上传附件。

基于成本的考虑最后选择了第二种方案。从实际运行状况来看,这个也是最优的方案。不需要购买服务器,不需要对程序代码做大的改动,而且维护量小,稳定可靠。

改造后的架构图:

下面详细说说架构原理:

1、  将附件、和代码上传改为FTP方式上传(这里需要做开发的同学配合下了),在File Server通过VsFTP接收附件和代码更新。

2、  在停用NFS服务后,做了一个代码同步系统(工具是rsync)。计划任务每隔5分钟WEB Server同步File Server的代码,当然非代码目录、附件目录除外,这样需要同步的文件量非常小。同步耗时秒级别。

3、  所有附件和代码都会更新到File Server。File Server利用sersync实时将文件的所有更新同步到备份的File Server端。两个File Server是同时使用Nginx提供附件HTTP服务的。

4、  在两台File Server负载均衡提供附件下载服务时,可能会出现新上传的文件在备份File Server上找不到的情况。这个时候在前段Nginx代理配置proxy_next_upstream 将404跳转到另一台服务器就可以了。

相关配置:

Nginx的配置

upstream img_hapth {

server   192.168.200.29:80;

server   192.168.200.28:80;

}

server {

listen       80;

server_name  img.hapath.com;

access_log  /data/logs/access.log  main;

error_log  /data/logs/error.log;

location / {

proxy_next_upstream error timeout http_404;

proxy_pass http://img_hapath;

proxy_set_header   Host             $host;

proxy_set_header   X-Real-IP        $remote_addr;

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

}

}

Sersync的使用,请见http://code.google.com/p/sersync/,这个程序貌似金山的一个同学写的,但是已经很久不更新了。有两个bug要注意,一个是程序有时候会自己终结;一个是已经同步的文件仍然会写到/tmp/rsync_fail_log.sh文件,这个是它的失败日志。而且它的失败日志是一个有执行权限的shell脚本,日志内容也是可命令,是一个安全隐患。所以俺在备份File Server每隔12小时整体同步一次数据,改了日志目录,并且做了一个检测脚本监控sersync的运行状况。

红框中是改造之前,性能不稳定,经常出现异常。前后对比很明显。

这是一个很简单的架构改造,但是效果却非常好。很多时候为了解决问题,费了很多时间做大的系统架构,增加服务器,增加维护量,改变应用。换个角度,大并不一定美。

Discuz论坛架构改造的更多相关文章

  1. LAMP架构搭建+Discuz论坛搭建【weber出品必属精品】

    一.     本机简介: 本机系统: CentOS-6.4-x86_64 主机名:oracle.ywb IP地址:192.168.146.129 二.     在Linux环境下安装Apache步骤 ...

  2. LNMP架构及DISCUZ论坛部署

    1)(5分)服务器IP地址规划:client:12.0.0.12/24,网关服务器:ens36:12.0.0.1/24.ens33:172.16.10.1/24,Web1:172.16.10.10/2 ...

  3. Discuz论坛安全加固浅析

    [51CTO专稿]Discuz! 论坛以其功能完善.效率高效.负载能力,深受被大多数的网站喜爱和青睐.无独有隅,笔者所维护的论坛就是用discuz! 来构建的,从接手时候的7.2到现在x2.0,经历了 ...

  4. 实战!基于lamp安装Discuz论坛-技术流ken

    简介 我前面的博客已经详细介绍了lamp采用yum安装以及编译安装的方式,这篇博客将基于yum安装的lamp架构来实战安装Discuz论坛,你可以任选其一来完成. 系统环境 centos7.5 服务器 ...

  5. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  6. centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

    centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节 ...

  7. 织梦dedecms整合discuz论坛的操作方法

    织梦dedecms和discuz论坛整合主要用途,是让两个系统共享用户数据,同一个用户可以在两个网站都可以登录.在我们制作织梦cms模板的时候,有时需要整合discuz里的东细.本文主要讲解一下ded ...

  8. LAMP环境搭建一个Discuz论坛

    LAMP是Linux+Apache+Mysql/MariaDB+Perl/PHP/Python的简称.一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有 ...

  9. Discuz论坛黑链清理教程

    本人亲测有效,原创文章哦~~~ 论坛黑链非常的麻烦,如果你的论坛有黑链,那么对不起,百度收录了你的黑链,不会自动删除,需要你手动去清理. 什么是黑链 黑链,顾名思义,就是一些赌博网站的外链,这些黑链相 ...

随机推荐

  1. iOS7适配之设计篇

    (注:文章简要翻译自 Apple <iOS 7 UI Transition Guide>,由于该文档为开发者预览版,并非最终文档,所以 iOS7 正式上线可能有部分不同) 准备工作 iOS ...

  2. 深入了解JavaScript中的关键字

    this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,下面分四种情况,详细讨论this的用法,感兴趣的朋友可以了解下. this是Javascri ...

  3. 4.1Reduction模型

    1. Reduction Reduction是一种广泛使用的计算模型,特别是在并行计算领域.简单地来说,Reduction就是一系列的划分(Partition)和汇总(Summarize)操作的集合: ...

  4. HW6.21

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  5. 第十三章、学习 Shell Scripts 条件判断式

    利用 if .... then 单层.简单条件判断式 if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的命令工作内容: fi <==将 if 反过来写,就成为 fi !结束 i ...

  6. express源码剖析2

    当使用express时,代码会这样写: var express = require('express'); 如果创建一个express的应用,代码会这样写: var app = express(); ...

  7. NGUI学习笔记(三):屏幕自适应

    我们开发移动端游戏的时候,一般都会选择Constrained/FixedSize的缩放模式来保证图片在不同的分辨率下相对于屏幕的尺寸保持一致,但是对于屏幕自适应来说,这还是不够的,不同的手机存在不同的 ...

  8. Python中如何把一个UTC时间转换为本地时间

    需求: 将20141126010101格式UTC时间转换为本地时间. 在网上搜了好长时间都没有找到完美的解决方案.有的引用了第三方库,这就需要在现网安装第三方的软件.这个是万万不可的.因为真实环境不一 ...

  9. mycat表拆分操作教程

    1,迁移数据 举例说明,比如一个博客数据库数据表如下: 这里水平拆分,垂直拆分,只是做个简单的实验,真正的线上业务要根据情况,数据进行拆分. ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  10. Objective-C中的Block(闭包) (轉載)

    来源: 伯乐在线 - 青玉伏案 链接:http://ios.jobbole.com/83229/ 学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过 ...