干货!IT架构的“读写分离”设计实现思路

戴尔易安信解决方案 2018-12-07

戴尔易安信解决方案

微信号 DellEMC_Enterprise
功能介绍 戴尔易安信解决方案专注于数字化转型中的前沿技术和解决方案,内容涵盖现代化基础架构、云计算、大数据、物联网及AI等,并通过对全球,特别是中国用户的成功实践案例分析和前沿技术解读,助力企业数字化转型,快人一步!

你见过凌晨四点的洛杉矶吗?
科比见过
那是他新一天训练时间的开始

你见过凌晨四点的北京吗?
地铁工作人员见过

当第一辆列车于5点准时驶出时
它的工作人员早在一个小时前就开始了工作
迎接高并发时刻的到来

地铁分流

栏杆围成七拐八拐迷宫一般的通道

进站和出站的人流按照指定的路线前行

为的就是舒缓运输压力,

让地铁运行高效、有序

这个思路在IT系统里也有着异曲同工之妙

“读”和“写”有点像一对冤家

一块磁盘如果同时进行读和写工作,

势必会影响整体性能的发挥

因而读写分离思路应运而生

 

分享一篇硬核文章

介绍IT架构的“读写分离”设计思路

如果把公司经营比作摩天大楼,IT系统架构就相当于摩天大楼的地基,如今越来越多的IT人士开始重视系统架构设计。但架构设计非常复杂,其复杂性主要来源于IT系统的高性能、高可用、高扩展需求,读写分离”则是架构设计中解决这几个需求的关键设计思路之一。

读写分离原理本身非常简单,即读、写操作的实现由不同资源独立完成,但要考虑到资源分配的合理性和数据同步的时效性,读写分离技术真正用起来也并不是看着那么简单。

目前,在企业的IT架构中,读写分离设计思想的应用确实存在改善空间。笔者将尝试从四个不同层面对读写分离设计思路的应用进行整体阐述,包括表示层、数据库层、缓存层和存储介质层。

 

表示层读写分离设计

表示层是后台提供给客户端的入口,读写分离设计主要体现为动静分离以Web为例(如下图),后台既有html、图片、JS/CSS等基本维持不变的静态页面,该部分页面以读操作为主,也有针对不同用户、不同场景进行定制化的变化页面,该部分页面需要读写结合

表示层读写分离设计实现

Web读写分离的应用,有以下多方面益处:

 第1, 可缩短静态页面的访问路径、改善用户体验。

 第2, 动态页面静态化,进一步改善系统性能。

 第3, 预留更多资源用于处理访问路径更长的动态页面。

在动静分离的应用过程中,需要注意的是,页面静态化不宜过度,否则会因静态页面太大反而导致用户体验降低。

 

数据库读写分离的设计

一谈到读写分离,很多人往往最先想到数据库。随着业务的快速发展和数据的高速增长,传统关系数据库软件的性能瓶颈逐渐凸显,进而影响了扩展能力甚至可用性,这对用户来说是不可接受的。为此,数据库平台纷纷推出主从集群模式应用读写分离技术。

数据库主从集群如下图所示▼。

数据库读写分离设计实现

简单来说,主从模式就是数据库主机负责写操作,数据库从机负责读操作,通过合理分配算法,从机可以大幅减轻主机的负载,从而提高性能。

引入数据库从机后,需要额外考虑读写操作分配和数据库连接管理,主要有应用层实现中间层实现两种方式。

 

>>>>应用层实现数据库读写分离

应用层可以通过配置多数据库来源实现读写分离,在应用模块中对读写请求进行分流对此业界有不少平台可以实现,包括Spring JDBC、Hibernet等。这种实现方式不需要额外引入中间件,因而具备策略灵活、易于调整、实现简单的特点,但该方式也增加了应用层的复杂性,包括分流、均衡、安全等方面都需要考虑。

由于扩容过程中读写分离策略变更等比较复杂,应用层读写分离主要用于小规模应用系统。

应用层读写分离设计实现

>>>>中间层实现数据库读写分离

引入中间件,也是另一种读写操作分配的实现方式,其原理是中间层提供SQL接口供业务访问,后台读写操作由中间件统一处理该方式能向业务屏蔽数据库节点的故障,简化业务设计,但中间件本身的性能也需要特别关注

另外,由于数据库主从之间的数据同步必然导致数据库从机缺失少量最新数据可通过多种方式解决此类问题。以MySQL为例(MySQL Router如下图),有三种解决思路比较常见。

中间层读写分离设计实现

 第1, 在数据库写入操作完成后,可以将读操作指定发给数据库主服务器。

➤ 2 从机读取失败后再读一次主机。

➤ 第3, 也可以将关键业务读写操作全部指向数据库主机。

需要注意的是,三种方式需要相互结合


缓存层读写分离的设计

针对读多写少的数据库,有一种在大型系统中非常普遍有效的方法,就是采用专用缓存数据库,将热点数据复制到缓存节点的大内存中,为大批量的读取操作更快速地提供数据,从而减轻主数据库的负载压力。这类缓存数据库读取性能非常高,通过缓存数据库节点的横向扩展后则性能更高。以MemCache为例,单节点简单查询TPS可达50000以上,多节点查询TPS则呈准线性增加。

在缓存数据库的应用过程中,热点数据管理粒度是一个非常关键的问题,粒度太大,达不到最佳的缓存效果;粒度太小,则耗费过多的系统资源。在多节点应用对缓存进行操作时,可能出现缓存失效引起性能急剧下降的问题,所以在应用平台上需要引入ZooKeeper等集群管理组件对多节点的缓存操作进行有效管理。


缓存层读写分离设计实现


存储介质层读写分离设计

存储介质是数据的最终归属地,谈及IT性能优化,存储介质是个避不开的话题。由于固态硬盘(SSD)相对于机械硬盘有数百倍的性能提升,且每TB价格越来越接近机械硬盘,因此固态硬盘成为IT行业的香饽饽,几乎每一个大型应用都需要考虑使用固态硬盘。

从读写分离的角度看,目前的应用主要基于SSD缓存,但大部分SSD缓存技术仅能实现读缓存,如此高价值的SSD竟然没能作为永久存储使用,不得不说是一个遗憾。不过受戴尔易安信SC系列存储系统“读写分离”技术的启发这个遗憾是完全能避免的。

戴尔易安信存储SC系列

细究该读写分离”技术,其实现原理很容易理解。SSD分为写密集型和读密集型两种,其中,写密集型SSD的DWPD(Drive Writes per Day)通常大于10,远高于读密集型SSD,写入寿命更长,而且写入性能也高出读密集型SSD数倍。

另外,各种RAID技术如下图所示▼。

RAID技术比较

RAID 10的写惩罚要优于RAID 5数倍,所以写入性能也要高出不少。“读写分离”技术的实现原理就在于利用这两方面的差异。

一方面,写入操作时,重负载I/O写操作基于RAID10的写密集型SSD,另一方面,通过软件调度,把写密集型SSD上的数据在后台自动迁移到读密集型SSD,并将RAID10在后台自动转换成RAID5,从而使得读操作主要由基于RAID5的读密集型SSD承载。难能可贵的是这项技术不仅可以提高性能,也能兼顾到成本效益。

I/O读写

该技术已经被不少技术前瞻性较高的企业或组织采用。例如,华中某科技公司的邮件系统,邮箱数量上万,系统改造前,I/O延时达到10毫秒左右,已经满足不了企业对于员工体验和工作效率的需求。

架构师对整套系统进行了分析,发现写入操作占比70%左右,由于RAID5方式的写惩罚、写入操作对存储介质IOPS的消耗非常大,架构师尝试将存储改成RAID10的方式,但容量利用率又满足不了企业的实际需求。

最后,架构师通过引入戴尔易安信SC存储的读写分离技术进行优化,即采用写密集型和读密集型两种SSD,并采用RAID10RAID5两种RAID方式动态组合,由存储系统自动完成调度。最终,系统I/O延时下降到1毫秒以内,这次优化显著提升了该公司邮件的收发效率。

戴尔易安信SC全闪存存储阵列

在“读写分离”设计思路的实际应用中,要根据不同应用系统的需求,将表示层、缓存层、数据库层和存储介质层部分结合使用,以补足薄弱环节。

从当前各行业对读写分离”设计思路的应用来看,笔者观察到互联网行业走在最前面,政企、医疗、教育行业也都已经开始广泛引入,相信“读写分离”架构设计思路会服务于越来越多的行业和用户,进一步夯实IT系统这座摩天大楼的地基。