(1)存在设计缺陷,出现了单点;
(2)能大大简化系统设计,有意为之,设置单点;nginx
典型互联网高可用架构:
(1)端,经过DNS,由域名拿到nginx的外网IP;
(2)反向代理,nginx是后端入口;
(3)站点应用,典型的是tomcat或者apache;
(4)服务,典型的是dubbo提供RPC服务调用;
(5)数据层,典型的是读写分离的db架构;数据库
在这个互联网架构中,站点、服务、数据库的从库都容易经过冗余的方式来保证高可用,但:
(1)nginx是一个潜在的单点;
(2)数据库写库也是一个潜在的单点;apache
先看GFS(Google File System)架构的例子:
GFS的系统架构里主要有这么几种角色:
(1)client,就是发起文件读写的调用端;
(2)master,这是一个单点服务,它有全局视野,掌握文件元信息;
(3)chunk-server,实际存储文件的服务器;后端
在GFS系统里,master是一个单点服务。缓存
Map-reduce系统里也有相似的角色,协调全局的master就是单点,它的存在,可以大大的简化系统架构设计。tomcat
两个大问题:
(1)高可用问题:单点一旦发生故障,服务就会受到影响;
(2)性能瓶颈:单点不具有良好的扩展性,单点的性能上限每每就是整个系统的性能上限;性能优化
shadow-master是一种很常见的解决单点高可用问题的技术方案。服务器
shadow-master,顾名思义,它只是单点master的一个shadow(影子):
(1)master工做时,shadow-master只备份;
(2)master出现故障时,shadow-master会自动变成master,继续提供服务;架构
shadow-master它可以解决高可用的问题,而且故障的转移是自动的,不须要人工介入,但不足是它使资源的利用率降为了50%,业内常用keepalived+vip的方式实现这类单点的高可用。
并发
以GFS的master为例,master正常时:
(1)client会链接正常的master,shadow-master不对外提供服务;
(2)master与shadow-master之间有一种存活探测机制;
(3)master与shadow-master有相同的虚IP;
当发现master异常时:
shadow-master会自动顶上成为master,虚IP机制能够保证这个过程对调用方是透明的。
除了GFS与MapReduce系统中的主控master,nginx和数据库的主库master亦可用相似的方式来保证高可用:
(1)两个主库设置相互同步的双主模式;
(2)平时只有一个主库提供服务;
(3)异常时,虚IP漂移到另外一个主库,shadow-master变成主库继续提供服务;
关于高可用,更多详细的内容,可参考《究竟啥才是互联网架构“高可用”》。
有时候,单点设计是有意为之,此时单点的性能(例如GFS中的master)有可能成为系统的瓶颈,那么,减小与单点的交互,便成了存在单点的系统优化的核心方向。
如何来减小与单点的交互,有两种常见的方法:
(1)批量写;
(2)客户端缓存;
举一个单点“ID生成器”的例子,不少公司会利用数据库的auto-inc-id,来做为一个严格递增的ID生成工具。
其交互流程是:
(1)调用方须要ID;
(2)插入记录,利用auto-inc-id来生成和返回ID;
此时,ID生成的并发上限,取决于单点数据库的插入性能上限。
优化以下:
(1)增长一个服务,每次从DB拿出100个id;
(2)调用方须要ID;
(3)服务直接返回100个id中的1个,100个分配完,再访问DB;
这样一来,每分配100个才会写数据库一次,分配id的性能提高了100倍。
仍是举GFS文件系统的栗子。
GFS文件读取的流程以下:
(1)GFS的调用客户端client要访问shenjian.txt,先查询本地缓存,miss了;
(2)client访问master问说文件在哪里,master告诉client在chunk3上;
(3)client把shenjian.txt存放在chunk3上记录到本地的缓存,而后进行文件的读写操做;
(4)将来client要访问文件,从本地缓存中查找到对应的记录,就不用再请求master了,能够直接访问chunk-server;
这类缓存的命中很是很是高,在99%以上(由于文件的自动迁移是小几率事件),这样与master的交互次数就下降了100倍。
不管怎么批量写,客户端缓存,单点毕竟是单机,仍是有性能上限的。
水平扩展,才可以无限的提高系统性能。
第一步的DNS解析,只能返回一个nginx外网IP么?
经过DNS轮询,在DNS-server,一个域名能够配置多个IP,每次DNS解析请求,轮询返回不一样的IP,就能实现nginx的水平扩展,扩充负载均衡层的总体性能。
数据库单点写库也是一样的道理,在数据量很大的状况下,能够经过水平拆分,来提高写入性能。
关于性能扩展,更多详细的内容,可参考《究竟啥才是互联网架构“可扩展”》。
今天的内容不少,但愿行文有逻辑:
(1)单点系统存在的问题:可用性问题,性能瓶颈问题;
(2)shadow-master是一种常见高可用方案;
(3)减小与单点的交互,是单点系统优化的核心方向,常见方法有:批量写,客户端缓存;
(4)水平扩展,才能作到理论上的无限性能;
思路比结论重要。
架构师之路-分享可落地的技术文章
推荐阅读:《究竟啥才是互联网架构“一致性”》《究竟啥才是互联网架构“高可用”》《究竟啥才是互联网架构“可扩展”》