技术看点:基于多副本的IO负载均衡思考 原创
分布式存储解决了传统存储的很多卡脖子的问题,其中包括可让数据均匀地分散在设备上存储,从而保障了某个节点宕掉的话还有其它节点可用让业务连续。
为此,拥有良好的数据均衡算法,成为打造分布式存储的一个基础能力。可当我们把应用部署在上面时候,很多情况下都无法取得理想的结果。
现有的分布式存储系统的数据均衡算法只考虑如何均匀分布数据,但是在分布式存储集群中,一份数据存在多个副本。尽管每个副本的数据是一致的,但是不同副本数据读写过程中承担的任务不同,通常分为主副本(Primary,简称P)和从副本(Secondary,简称S),主副本相对从副本承担更多的IO负载。因此,尽管数据被均匀分布了,但是在分布式系统中,负载并没有均衡。
::: hljs-center
01 为什么要重视数据均衡算法
:::
分布式存储是整合众多通用的商业化硬件也实现此前传统存储依靠专有硬件提供的存储能力,为此就需要通过精妙的软件设计来应对商业化硬件的不可靠机制。诸如应对遭遇机房停电、设备宕机、网络故障的更多可能性的存在。
分布式存储会将数据制作更多份副本出来,并分散存储在整合的众多服务器(节点)上。当其中一份数据所在的节点出现故障无法工作时,业务系统的数据访问需求可以切换到相应的副本所在节点对外提供服务,业务系统可以保持连续。
业界在处理数据及其副本的关系的时候通常会设置为:主从的关系。分布式存储依靠提供的高可靠性就依赖这种主从关系的搭配,例如可以有一主一从,或是一主多从。在不同的地方,也有很多不同的叫法,例如如leader & follower、master & slave、active & standby,primary & secondary。需要指出的是,主从关系有时候会互换。同时,主副本数据未必和从副本数据完全一样。
由于分布式存储会将整合的服务器内置存储空间进行虚拟化的划分,例如分成多个卷(volume)。对于需要存放的数据也会依据卷的规格进行切分,诸如切分为预设大小的段(segment),甚至会进一步细分,例如组成段的段单元(segment unit)。海量数据时代,分布式存储既需要解决庞大的数据分割存放问题,也要处理庞大的数据分割后其副本的选择和放置策略。如何有效对碎片式的多副本数据进行整合调用,是分布式存储当下的研究重点之一。
::: hljs-center
02 鹏云网络基于多副本的IO负载均衡思考
:::
数据分割后其副本的选择和放置策略,意味着分布式存储需要解决的问题更上一层楼,仍面临很多技术挑战。
例如,我们为了让数据访问需求可以更快,我们将数据均衡算法调优为选取负载最小的副本所在服务器访问。具体的,主副本所在服务器接收用户的数据读取请求;根据所有副本所在服务器的负载信息,选取负载最小的副本所在服务器;若主副本所在服务器不是负载最小的服务器,则将数据读取请求发送至负载最小的备副本所在服务器,以使其进行数据读取操作;接收负载最小的备副本所在服务器读取的数据,向用户展示。
该技术方案,通过选取负载最小的副本所在服务器进行数据的读取操作,而非全部由主副本所在服务器进行数据读取操作,理论上是可以实现多个副本所在服务器的负载均衡。但这种对负载最小节点找寻的做法会引起更多其它开销。
鹏云网络在自主研发的ZettaStor系统上实现了一种基于数据段单元的分布式存储系统的负载均衡方法,让负载均衡算法可以更快地达到均衡状态,可以使得IO负载更均衡。不仅可以为主从副本自动均衡创建更多的从空间,实现更大范围的机柜级数据冗余。更可以在数据迁移、数据恢复时,依靠数据均衡算法对数据主从副本的合理规划,实现IO负载更均衡更均衡的问题。