一、高可用的软件系统设计原则
1、进行集群化设计,无单点故障,支持纵向和横向扩容
2、能够进行模块化拆分,系统之间可以通过服务化方式相互调用和组合
有时,研发为了配合产品团队,保障产品的快速开发上线和迭代,前期使用单机版架构开发和部署。这样做在前期业务量较少的时候是较为方便和节省时间的。但出来混,迟早是要还的。随着用户数和业务量的增长,单机版很快就达到瓶颈,这时再去重新设计整个软件架构,将单点拆分和模块拆分,相当于要推翻整个系统,重新开发,非常浪费时间。
3、数据持久化存储(数据库系统和文件系统),可以灵活调配和修改配置;数据库配合中间件,可以对数据库集群操作;每个模块的数据库和表可以拆分到不同的物理机上
4、使用 Memcached 和 Redis 缓存架构
5、耗时操作异步队列化,提升业务集群的 IO 吞吐量
二、高可用的软件系统设计架构举例
如图所示,采用的架构包括:
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 和最大连接数,如下图阿里云所展示的
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
Comments