女主宣言

Pika是一个可持久化的大容量redis存储服务,兼容string、hash、list、zset、set的绝大部分接口(兼容详情),解决redis由于存储数据量巨大而导致内存不够用的容量瓶颈。由于单机pika容量受限于单块硬盘容量的大小,360公司业务和社区对分布式pika集群的需求越来越强烈,因此我们推出了原生分布式pika集群,发布pika版本v3.4。本文主要讲述pika原生集群架构和数据处理等内容。

PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!

1

背景

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

2

集群部署结构

以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中。

3

数据分布

为了对数据按照业务进行隔离,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的使用。

4

数据处理

  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中,实现压力在整个集群的负载均衡。

5

日志复制

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返回客户端

6

集群元数据处理

我们在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的高可用。

7

后记

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

360云计算

由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

pika集群水平扩展——让性能容量不再受限相关推荐

  1. Akka 指南 之「集群指标扩展」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 集群指标扩展 依赖 简介 指标收集器 指标事件 Hyperic Sigar ...

  2. Airbnb 如何实现 Kubernetes 集群动态扩展

    运营 Airbnb 基础设施的一项重要工作是,确保我们的云开支随着需求自动增长和下降.我们的流量每天波动很大,为此,我们的云资源占用应该能够动态扩展. 为了实现这种扩展,Airbnb 利用了 Kube ...

  3. coids+pika集群 问题小记

    概要 近期搭建coids+pika集群,碰到一些小坑,此文记录下流程以及碰到的问题. pika github:https://github.com/Qihoo360/pika codis github ...

  4. 甲骨文推出MySQL集群7.2 查询性能提高

    2012年2月27日消息,甲骨文日前宣布推出MySQL集群7.2.(MySQL Cluster 7.2). · 为满足基于网络和通信产品与服务的高要求,MySQL集群旨在用经济有效的方式,提供高达99 ...

  5. Cassandra架构、设计(集群表)和性能报告

    系统架构: Cassandra 是 一 套 开 源 分 布 式 No -SQL 数据库系统, 基于一致性哈希算法的 P2P 环形结构. 这种结构 各节点功能完全相 同, 可灵活添加节点来完成系 统的扩 ...

  6. Redis 间歇性抖动<集群下mget的性能问题>

    redis问题 在最近公司内部使用redis的时候,在部分场景中发现redis经常会间歇性的抖动,具体表现为在短时间内redis rt上涨明显,RedisCommandTimeoutException ...

  7. Redis高可用集群部署和集群扩展

    文章目录 一.前言 二.集群配置 2.1 说明 2.2 配置 2.3 启动redis 2.4 集群操作 2.5 验证集群 2.5.1 springboot配置文件 2.5.2 代码测试 2.5.3 集 ...

  8. Redis集群方案及框架

    redis集群分为服务端集群和客户端分片,redis3.0以上版本实现了集群机制,即服务端集群,3.0以下使用客户端分片(Sharding). 通常,为了提高网站响应速度,总是把热点数据保存在内存中而 ...

  9. Redis集群:sharding策略

    为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在 ...

最新文章

  1. 必读的 Java 学习资料分享!
  2. python数据分析类库_python数据分析类库系列-Pandas入门之数据结构Series
  3. 七周七语言:Scala Day 3
  4. C语言高级编程:指针变量p指向的地址与p自身的地址
  5. Git 内部原理图解——对象、分支以及如何从零开始建仓库
  6. php为什么搜不到字段,php-通过多个字段搜索.有时一个领域,有时不止一个领域
  7. 性格决定命运--从流浪汉到亿万富翁[taylor]
  8. wpf datagrid 表格内容自动计算_施工测绘20套测量自动计算表格,无脑输入数据出结果...
  9. js打印不询问直接打印_直接成型喷墨打印的五个关键注意事项
  10. 蓝桥杯 ADV-80 算法提高 选最大数
  11. Java设计模式--抽象工厂模式
  12. docker python3环境搭建
  13. wps 函数android,安卓版WPS教程:用ABS函数计算营收差额
  14. 基于Springboot+Vue+ElementUI物流配送管理系统
  15. CVPR 2021 论文和开源项目合集
  16. 解决Pycharm中下载不了sklearn问题
  17. python爬取凤凰新闻网_python凤凰新闻数据分析(一)python爬虫数据爬取
  18. FPGA数字系统设计(9)——信号产生
  19. phpcms 点赞_php+js实现点赞功能的示例详解
  20. 储存quill与php,import – 在扩展Quill方面遇到问题

热门文章

  1. Linux CentOs6 命令学习
  2. mybatis中collection中的ofType=“String“时
  3. kafka开源版本quota限流功能缺陷
  4. python有哪些软件包用来考察变量之间的相关性_Python语言基础考察点:python语言基础常见考题(一)...
  5. leetcodeT14-最长公共前缀(两种解法+图解)
  6. [蓝桥杯]2018年第九届省赛真题C/C++ B组 填空+大题
  7. INF=0x3f3f3f3f背后的知识
  8. Springboot与Ajax整合练习?
  9. php实现for循环输出星阵,星阵让先再胜职业棋手三阵 18日晚将对阵世界冠军
  10. 【Keras】减少过拟合的秘诀——Dropout正则化