2

通用软件系统架构设计

 1 year ago
source link: https://www.daguanren.cc/post/software_architecture_design.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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

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

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

4、使用 Memcached 和 Redis 缓存架构

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

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

alt

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

1、负载均衡

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

  • HTTP 重定向
  • DNS 负载均衡
  • 反向代理负载均衡
  • IP 负载均衡

2、URL 路由

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

upstream member_server{ server 192.168.3.11upstream comment_server{ server 192.168.3.12upstream image_server{ server 192.168.3.13upstream video_server{ server 192.168.3.14server { 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;nginx

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK