阿狸先森 互联网架构“高并发”到底怎么玩?( 二 )


画外音:nginx是个例子 , 有可能是LVS或者F5等反向代理 。
当web后端成为瓶颈的时候 , 只要增加服务器数量 , 新增web服务的部署 , 在nginx配置中配置上新的web后端 , 就能扩展站点层的性能 , 做到理论上的无限高并发 。
服务层如何进行水平扩展?
站点层通过RPC-client调用下游的服务层RPC-server时 , RPC-client中的连接池会建立与下游服务多个连接 , 当服务成为瓶颈的时候 , 只要增加服务器数量 , 新增服务部署 , 在RPC-client处建立新的下游服务连接 , 就能扩展服务层性能 , 做到理论上的无限高并发 。
画外音:如果需要优雅的进行服务层自动扩容 , 这里可能需要配置中心里服务自动发现功能的支持 。
数据层如何进行水平扩展?
在数据量很大的情况下 , 数据层(缓存 , 数据库)涉及数据的水平扩展 , 将原本存储在一台服务器上的数据(缓存 , 数据库)水平拆分到不同服务器上去 , 以达到扩充系统性能的目的 。
互联网数据层常见的水平拆分方式有这么几种 , 以数据库为例:
一、按照范围水平拆分
user0库 , 存储uid范围1-1kwuser1库 , 存储uid范围1kw-2kw这个方案的好处是:
(1)规则简单 , service只需判断一下uid范围就能路由到对应的存储服务;
(2)数据均衡性较好;
(3)比较容易扩展 , 可以随时加一个uid[2kw,3kw]的数据服务;
不足是:
(1)请求的负载不一定均衡 , 一般来说 , 新注册的用户会比老用户更活跃 , 大range的服务请求压力会更大;
二、按照哈希水平拆分
user0库 , 存储偶数uid数据user1库 , 存储奇数uid数据这个方案的好处是:
(1)规则简单 , service只需对uid进行hash能路由到对应的存储服务;
(2)数据均衡性较好;
(3)请求均匀性较好;
不足是:
(1)不容易扩展 , 扩展一个数据服务 , hash方法改变时候 , 可能需要进行数据迁移;
通过水平拆分来扩充系统性能 , 与主从同步读写分离来扩充数据库性能 , 有什么本质的不同?
画外音:这两个方案千万别搞混 。
通过水平拆分扩展数据库性能:
(1)每个服务器上存储的数据量是总量的1/n , 所以单机的性能也会有提升;
(2)n个服务器上的数据没有交集 , 那个服务器上数据的并集是数据的全集;
(3)数据水平拆分到了n个服务器上 , 理论上读性能扩充了n倍 , 写性能也扩充了n倍(其实远不止n倍 , 因为单机的数据量变为了原来的1/n);
通过主从同步读写分离扩展数据库性能:
(1)每个服务器上存储的数据量是和总量相同;
(2)n个服务器上的数据都一样 , 都是全集;
(3)理论上读性能扩充了n倍 , 写仍然是单点 , 写性能不变;
缓存层的水平拆分和数据库层的水平拆分类似 , 也是以范围拆分和哈希拆分的方式居多 , 就不再展开 。
总结
高并发(HighConcurrency)是互联网分布式系统架构设计中必须考虑的因素之一 , 它通常是指 , 通过设计保证系统能够同时并行处理很多请求 。


推荐阅读