02月07, 2018

通用软件系统架构设计

一、高可用的软件系统设计原则

1、进行集群化设计,无单点故障,支持纵向和横向扩容

2、能够进行模块化拆分,系统之间可以通过服务化方式相互调用和组合

有时,研发为了配合产品团队,保障产品的快速开发上线和迭代,前期使用单机版架构开发和部署。这样做在前期业务量较少的时候是较为方便和节省时间的。但出来混,迟早是要还的。随着用户数和业务量的增长,单机版很快就达到瓶颈,这时再去重新设计整个软件架构,将单点拆分和模块拆分,相当于要推翻整个系统,重新开发,非常浪费时间。

3、数据持久化存储(数据库系统和文件系统),可以灵活调配和修改配置;数据库配合中间件,可以对数据库集群操作;每个模块的数据库和表可以拆分到不同的物理机上

4、使用 Memcached 和 Redis 缓存架构

5、耗时操作异步队列化,提升业务集群的 IO 吞吐量

二、高可用的软件系统设计架构举例

alt

如图所示,采用的架构包括:

1、负载均衡

其中又可以以如下方式实现:

  • HTTP 重定向
  • DNS 负载均衡
  • 反向代理负载均衡
  • IP 负载均衡
  • 直接路由
  • IP 隧道

2、URL 路由

可以将业务模块拆分,使用 Nginx 服务器将不同模块映射到不同的 URL 。以一个视频软件为例,可以将用户、评论、视频和图片分别映射到如下地址:

upstream member_server{
    server 192.168.3.11
}

upstream comment_server{
    server 192.168.3.12
}

upstream image_server{
    server 192.168.3.13
}

upstream video_server{
    server 192.168.3.14
}

server {
    listen 80;
    server_name www.daguanren.cc;
    root /Users/daguanren/demo/www;
    set $node_port 8360;

    index index.js index.html index.htm;
    if ( -f $request_filename/index.html ){
        rewrite (.*) $1/index.html break;
    }
    if ( !-f $request_filename ){
        rewrite (.*) /index.js;
    }

    location = /member {
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://member_server:$node_port$request_uri;
        proxy_redirect off;
    }

    location = /comment {
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://comment_server:$node_port$request_uri;
        proxy_redirect off;
    }

    location = /image {
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://image_server:$node_port$request_uri;
        proxy_redirect off;
    }

    location = /video {
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://video_server:$node_port$request_uri;
        proxy_redirect off;
    }

    location ~ /static/ {
        etag         on;
        expires      max;
    }
}

3、业务集群系统

例如本例所使用的基于 Node.JS 的 ThinkJS 集群作为业务服务器,每台服务器处理上一步映射过来的对应的 URL 业务逻辑。

4、缓存集群

主要是以 Memcached 和 Redis 为主的缓存服务器,Memcached 主要用来作为一级缓存,单核单线程处理简单的 Key-Value 对请求,相比于 Redis 更为成熟可靠,后者用来做二级缓存集群。

5、数据库集群

这里又包括主从数据库,读写分离,同步备份等架构。

补充两个衡量数据库服务器能力的标准参数:IOPS 和最大连接数,如下图阿里云所展示的

alt

IOPS:

IOPS 为 Input Output Per Second 的缩写。即每秒的输入输出量(或读写次数),计算如下:

IPOS = 1000 ms / (磁盘寻道时间 + 磁盘旋转延迟)

对于常见的每分钟 7200 rpm 转的机械硬盘来说,理论上每毫秒的旋转延迟大约为:60*1000/7200/2 = 4.17ms,物理寻道时间大概为 9 ms。

故 IOPS = 1000 / (4.17+9) = 76

最大连接数:

服务器同时最大连接数,如果最大是一百,那么即使有一千个用户访问,但最多同时也只能有一百个用户访问数据库。它是响应客户端连接的最大进程数。而不一定是访问电脑台数,因为一台电脑可以发多个进程。达到最大连接数后,新的数据库连接无法再次发起。之前的链接保持正常。

参考:

http://blog.51cto.com/frankch/1787617

http://blog.csdn.net/star890124/article/details/52004138

https://common-buy.aliyun.com/?spm=5176.7947010.779804.ee.578b34f4LtcWI3&commodityCode=drdspre#/buy

本文链接:https://www.daguanren.cc/post/software_architecture_design.html

-- EOF --

Comments