写点什么

Pika 集群水平扩展——让性能容量不再受限

2020 年 11 月 24 日

Pika集群水平扩展——让性能容量不再受限

Pika 是一个可持久化的大容量 redis 存储服务,兼容 string、hash、list、zset、set 的绝大部分接口(兼容详情),解决 redis 由于存储数据量巨大而导致内存不够用的容量瓶颈。用户可以不修改任何代码从 redis 迁移到 pika 服务。由于单机 pika 容量受限于单块硬盘容量的大小,360 公司业务和社区对分布式 pika 集群的需求越来越强烈,因此我们推出了原生分布式 pika 集群,发布 pika 版本 v3.4。与 pika+codis 集群方案相比,pika 集群不需要额外部署 codis-proxy 模块,同时由于 codis 对 pika 创建和管理 slot 操作的支持并不友好,需要运维人员大量介入。

集群部署结构


以 3 个 pika 节点的集群为例,集群部署结构如上图所示:


  1. 部署 Etcd 集群作为 pika manager 的元信息存储。

  2. 3 台物理机上分别部署 pika manager,并配置好 Etcd 的服务端口。Pika manager 会向 etcd 注册,并争抢成为 leader。集群中有且只有一个 pika manager 能够成为 leader 并向 etcd 中写入集群数据。

  3. 3 台物理机上分别部署 pika 节点,然后把 pika 节点的信息添加到 pika manager 中。

  4. 为了负载均衡,把 pika 的服务端口注册到 LVS 中。


数据分布



为了对数据按照业务进行隔离,Pika 集群引入 table 的概念,不同的业务数据存储在不同的 table 中。业务数据按照 key 的 hash 值存储到对应的 slot 上面。每一个 slot 会有多个副本,从而形成一个 replication group。replication group 中的所有 slot 副本具有相同的 slot ID,其中一个 slot 副本是 leader,其他副本为 follower。为了保证数据的一致性,只有 leader 提供读写服务。可以使用 pika manager 可以对 slot 进行调度迁移,使数据和读写压力均匀的分散到整个 pika 集群中,从而保证了整个集群资源的充分利用并且可以根据业务压力和存储容量的需要进行水平扩容和缩容。


pika 使用 rocksdb 作为存储引擎,每个 slot 会创建对应的 rocksdb。pika 中的每个 slot 都支持读写 redis 5 种数据结构。因此数据迁移的时候会特别方便,只需迁移 pika 中的 slot 即可。但同时也存在资源占用过多的问题。目前的 pika 在创建 slot 的时候会默认创建 5 个 rocksdb,分别来存储 5 种数据结构。在 table 中含有大量 slot 或者创建大量 table 的时候会使单个 pika 节点含有多个 slot,进而创建过多的 rocksdb 实例,占用了过多系统资源。在后续版本中一方面会支持创建 slot 的时候根据业务需要创建一种或几种数据结构,另一方面会持续对 pika 中的 blackwidow 接口层进行优化,减少对 rocksdb 的使用。


数据处理



  1. 当 pika 节点接收到用户请求时,解析层处理解析 redis 协议,并把解析好的结果交给 router 层进行判断。

  2. router 根据 key 的 hash 结果找到 key 对应的 slot,并判断 slot 是否在本地节点上。

  3. 如果 key 所在的 slot 在其他节点,则根据请求创建一个 task 放入队列中,并把请求转发给 peer 节点来处理。当 task 接收到请求的处理结果后把请求返回给客户端。

  4. 如果 key 所在的 slot 属于本地节点,就直接本地处理请求并返回给客户端。

  5. 对于需要本地处理的写请求,先通过 replication manager 模块写 binlog,异步复制到其他 slot 副本。process layer 根据一致性的要求,写入 leader slot。其中 blackwidow 是对 rocksdb 的接口封装。


我们把 proxy 内嵌的 pika 中,不需要单独部署。与 redis cluster 相比,客户端不需要感知 proxy 的存在,只需像使用单机一样使用集群。可以把 pika 节点的服务端口挂载到 LVS 中,实现压力在整个集群的负载均衡。


日志复制


pika 中 replication manager 模块负责日志的主从同步。为了兼容 redis,pika 支持非一致日志复制,leader slot 直接在 db 中写入数据而无需等待从 follower slot 的 ack 应答。同时也支持 raft 一致性协议方式的日志复制,需要满足收到大多数副本的 ack 才写入 db。


非一致日志复制


在非一致场景下处理流程如下:


  1. 处理线程接收到客户端的请求,直接加锁后写入 binlog 和并操作 db。

  2. 处理线程返回客户端 response。

  3. 辅助线程发送 BinlogSync 同步请求给 follower slot,同步日志。

  4. follower slot 返回 BinlogSyncAck 报告同步情况。


一致性日志复制



在一致性日志复制场景下:


  1. 处理线程把客户端请求写入 binlog 文件

  2. 通过发送 BinlogSync 请求向从库同步

  3. 从库返回 BinlogSyncAck 报告同步状况

  4. 检查从库应答满足大多数后将相应的请求写入 db

  5. 将 response 返回客户端


集群元数据处理


我们在 codis-dashboard 的基础上二次开发了 pika manager(简称 PM),作为整个集群的全局控制节点,用来部署和调度管理集群。PM 里保存了整个集群的元数据及路由信息。


  • 增加了集群创建多表的功能,方便业务根据表的不同来实现业务数据隔离。

  • 支持创建表时指定 slot 数目和副本数目,方便运维根据业务的规模和故障容忍度创建 table。

  • 从逻辑上把 group 的概念改为 replication group,使得原来的进程级别的数据和日志复制转变为 slot 级别的复制。

  • 支持创建 table 时创建密码来隔离业务的使用。客户端只需要执行 auth 和 select 语句就可以认证并对指定的 table 进行操作。

  • 支持 slot 迁移,方便根据业务需求进行扩容和缩容。

  • 集成哨兵模块,PM 会不断的向集群中的 pika 节点发送心跳,监测存活状态。当 PM 发现 leader slot down 时,会自动提升 binlog 偏移最大的 slave slot 为 leader。

  • 存储后端支持元数据写入 etcd,保证元数据的高可用。

  • pika manager 通过不断向 etcd 争抢锁来成为 leader,来实现 pika manager 的高可用。

后记


pika 原生集群的推出解决了单机 pika 受限于磁盘容量的限制,可以按照业务的需求进行水平扩容。但仍然有一些缺陷,如基于 raft 的内部自动选主功能的缺失,基于 range 的数据分布,及监控信息的展板等功能。后续版本我们会一一解决这些问题。

2020 年 11 月 24 日 14:381176

评论

发布
暂无评论
  • HDFS Federation

    除此之外,重启Namenode时间较长(小时级)也给集群运维工作带来不便Namenodes/namespaces.。

  • Redis 复制与可扩展集群搭建

    上一篇文章讨论了Redis的常用数据类型与存储机制,本文会讨论一下Redis的复制功能以及Redis复制机制本身的优缺点以及集群搭建问题。

  • 「架构师训练营」第 6 周 分布式数据库、NoSql、ZooKeeper

    分布式数据库,NoSql,ZooKeeper

    2020 年 7 月 12 日

  • 从 Redis 到 Titan,看扩容 & 性能等问题如何解决

    下面将讲述推送系统目前的架构模型和存储模型以及当前推送服务面临的难题问题。

  • 演讲预告:大规模运营 Redis 的经验 @京东

    在2014年的QCon北京大会,京东云平台首席架构师刘海锋将分享他们大规模运营Redis的经验,自研系统的设计思路,以及京东在数据存储方面的技术体系。InfoQ中文站在会前对刘海锋进行了一次采访,邀请他对存储、Redis等方向分享自己的观点。

  • Hashicorp Raft(二):如何以“集群节点”为中心使用 API?

    在Hashicorp Raft中,通过哪些API接口能创建、增加、移除集群节点,查看集群节点状态?

    2020 年 3 月 23 日

  • Kubernetes Stateful Sets

    2020 年 9 月 17 日

  • 把嵌套列表作为 Apache Spark SQL 的首选

    演讲嘉宾DB Tsai is an Apache Spark PMC / Committer and an open source and staff software engineer at Apple Siri. He implemented several algorithms including linear models with Elastici-Net (L1/L2) regularization using LBFGS/OWL-QN optimizers in Apache Spark. Prior to joining Apple, DB worked on Personalized Recommendation ML Algorithms at Netflix. DB was a Ph.D. candidate in Applied Physics at Stanford University. He holds a Master’s degree in Electrical Engineering from Stanford.译文参考:蔡東邦老师是 Apache Spark PMC / Committer,同时也是 Apple Siri 的主任工程师。他将多个算法应用到了 Apache Spark 当中,包括使用了 LBFGS / OWL-QN 优化器 的 Elastici-Net(L1 / L2)正则化的线性模型。在加入 Apple Siri 之前,蔡老师在Netflix从事个性化推荐机器学习算法的研究工作。目前是斯坦福大学应用物理专业的博士候选人,也获得了斯坦福大学电气工程硕士学位。内容介绍Making Nested Columns as First Citizen in Apache Spark SQLApple Siri is the world’s largest virtual assistant service powering every iPhone, iPad, Mac, Apple TV, Apple Watch, and HomePod. We use large amounts of data to provide our users the best possible personalized experience. Our raw event data is cleaned and pre-joined into an unified data for our data consumers to use. To keep the rich hierarchical structure of the data, our data schemas are very deep nested structures. In this talk, we will discuss how Spark handles nested structures in Spark 2.4, and we’ll show the fundamental design issues in reading nested fields which is not being well considered when Spark SQL was designed. This results in Spark SQL reading unnecessary data in many operations. Given that Siri’s data is super nested and humongous, this soon becomes a bottleneck in our pipelines.Then we will talk about the various approaches we have taken to tackle this problem. By making nested columns as first citizen in Spark SQL, we can achieve dramatic performance gain. In some of our production queries, the speed-up can be 20x in wall clock time and 8x less data being read. All of our work will be open source, and some has already been merged into upstream.参考译文:Apple Siri是世界上最大的虚拟助理服务,为每部 iPhone,iPad,Mac,Apple TV,Apple Watch 和 HomePod 提供服务支持。我们使用大量数据来为用户提供最佳的个性化体验。所有的原始事件数据被清理并预先加入到统一数据中,供我们的数据使用者使用。为了保持数据的丰富层次结构,我们的数据模式采用了非常深的嵌套结构。在本次演讲中,我将讨论 Spark 如何处理 Spark 2.4 中的嵌套结构,还会展示读取嵌套字段时的基本设计问题,这些问题在设计 Spark SQL 时并未得到充分考虑。这就导致了 Spark SQL 在许多操作中读取不必要的数据。鉴于 Siri 超级嵌套的数据非常庞大,它很快就成了瓶颈所在。之后,我会介绍为解决这个问题所采取的各种方法。将嵌套列作为 Spark SQL 中的第一个公民,在性能上获得显着的提升。在我们的一些生产查询中,加速20倍,读取的数据减少8倍。我们所有的工作都将开源,有些已经合并到了核心区域。

    2019 年 7 月 26 日

  • etcd 在超大规模数据场景下的性能优化

    本篇文章首先介绍etcd优化的背景,为什么要进行优化, 之后介绍 etcd 内部存储系统的工作方式,之后介绍本次具体的实现方式及最后的优化效果。

  • Amazon ElastiCache Redis 5.0 兼容版

    今年早些时候,我们推出了 Amazon ElastiCache 的 Redis 4.0 兼容版。

  • Redis 应用实践:小红书海量 Redis 存储之道

    小红书业务增长非常迅猛,保证数据存取效率的前提下,海量的SNS数据无法用传统型关系数据库去解决,同时爆发式的业务场景使小红书的研发团队更佳青睐于用非关系型数据库做主业务数据存储。为了应对快速增长的业务数据需求,小红书海量规模的使用了腾讯云redis(CRS),存储容量接近6T,在行业内算是超大海量规模的使用redis的互联网公司。

  • 微博 CacheService 架构浅析

    为了满足业务的发展需要,微博平台开发了一套高性能高可用的CacheService架构用于支撑现有线上的业务系统的运转。但“冰动三尺非一日之寒”,微博的Cache架构也是经历了从无到有,不断的演进过程。

  • 万亿级日访问量下,Redis 在微博的 9 年优化历程

    本文介绍Redis在微博的优化实践经验。

  • 高可用、开源的 Redis 缓存集群方案

    由于单台Redis服务器的内存管理能力有限,使用过大内存的Redis又会使得服务器的性能急剧下降,并且一旦服务器发生故障将会影响更大范围的业务。所以为了保证Redis缓存系统的稳定和高可用,很多公司都研发了Redis缓存集群方案,如NetFlix的Dynomite、Twitter的Twemproxy、国内豌豆荚的Codis。

  • 滴滴从 KV 存储到 NewSQL 实战

    Fusion-NewSQL是由滴滴自研的在分布式KV存储基础上构建的NewSQL存储系统。Fusion-NewSQL兼容了MySQL协议,支持二级索引功能,提供超大规模数据持久化存储和高性能读写。

  • 向前一步——从女码农到技术 Leader 的忐忑之路

    演讲嘉宾廖雪梅,饿了么技术总监。内容介绍一说起码农,大家的脑海里一定是一副这样的画面:文化衫、大裤衩、大拖鞋、头发蓬松的“呆男”形象。在这万草丛中其实还有很多点缀的红花——女码农,也有人叫“程序媛”。 女码农是一个稀有却又真实存在的物种,她们可能是QA MM、前端MM、或者你身边更稀有的后端开发MM、甚至可能碰到的女Leader。 有没有想过,作为稀有物种的她们,为什么要选择这个行业,她们的成长之路会有哪些差异,她们眼中的码农又是什么样的?内容大纲 作为程序猿,如何更好与周围女同事、女下属、女上司和平共处? 女性在码农职场上可以有哪些不一样的成长路径? 女性Leader,如何兼备理性与感性? 码农是一个内涵很广的行业,除了技术怪咖,还有更广阔的空间。

    2018 年 12 月 19 日

  • 我们为什么放弃了 TiDB,选择自研 NewSQL

    本文介绍滴滴在分布式Nosql存储Fusion之上构建NewSQL的实践之路。详细描述Fusion-NewSQL的特性,应用场景,设计方案。

  • CephFS+Kubernetes 在网易轻舟容器平台的实践

    作为网易轻舟云原生平台的存储后端,CephFS 主要为网易轻舟容器平台 NCS 解决容器间共享存储的问题。

  • Kubernetes 健康检查

    2020 年 9 月 17 日

  • 如何将 Git 仓库备份到本地?

    2018 年 12 月 19 日

发现更多内容

Spring bean 加载顺序导致的 bug 问题

AI乔治

Java 架构 Spring Boot

《迅雷链精品课》第二课:区块链核心技术框架

迅雷链

区块链

JVM真香系列:轻松掌握JVM运行时数据区

田维常

JVM

【算法题目解析】杨氏矩阵数字查找

程序员架构进阶

算法 二分查找 杨氏矩阵

Java程序员必备,Github上星标55.9k的微服务神级笔记简直太香了,学完感觉自己又行了!

Java架构之路

Java 程序员 架构 面试 编程语言

从一场“众盟科技云滇之播”,我们发现了美食直播的商业与公益价值

人称T客

LeetCode题解:剑指 Offer 22. 链表中倒数第k个节点,使用数组,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

Docker

5G为数字化转型插上翅膀

CECBC区块链专委会

5G网络安全

O'Reilly出版社又一经典之作——Python设计模式

计算机与AI

Python

简要分析近几年商业软件开发平台的现状

Philips

敏捷开发 快速开发 企业应用

阿里云视频云实时字幕技术,助力英雄联盟S10全球总决赛

阿里云视频云

游戏开发 直播 语音识别 字幕

云计算简史(完整版)

明道云

深度解析ThreadLocal原理

AI乔治

Java 架构 线程 ThreadLocal

【T1543.003】利用 ACL 隐藏恶意 Windows 服务

比伯

Java 大数据 编程 架构 计算机

可以解除程序员中年危机的职业规划

Java架构师迁哥

cglib入门后篇

Rayjun

Java cglib

靠脑机接口“隔空探物”,大脑植入芯片可实现“心灵感应”

脑极体

从零到千万用户,我是如何一步步优化MySQL数据库的?

冰河

数据库 架构 性能优化 分布式数据库 分布式存储

「Java并发编程」从源码分析几道必问线程池的面试题?

Java架构师迁哥

甲方日常 48

句子

工作 随笔杂谈 日常

Reactor中的Thread和Scheduler

程序那些事

响应式编程 reactor 多线程 程序那些事 reactivex

架构师训练营第 1 期第 8 周学习总结

好吃不贵

极客大学架构师训练营

Rethink:多版本文件的命名细节

Sicolas Flamel

团队 随笔杂谈

区块链产业,怎样“链”住未来?

CECBC区块链专委会

区块链

记不住Spring中Scheduled中的Cron语法?让我们看看源码吧

AI乔治

Java spring 编程 架构

当人脸识别对准执法者,AI的应用边界博弈

脑极体

阿里顶级DBA专家团又一力作——MySQL8的150高效技巧

周老师

Java 编程 程序员 架构 面试

涨薪神作!华为内部操作系统与网络协议笔记爆火,Java程序员有福了

Java架构之路

Java 程序员 面试 编程语言

数字人民币都来了 黄金还有什么用?

CECBC区块链专委会

数字货币

甲方日常 47

句子

工作 随笔杂谈 日常

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

Pika集群水平扩展——让性能容量不再受限-InfoQ