首页 系统教程 操作系统 Pika: 补充大容量类 Redis 存储的适用场景

Pika: 补充大容量类 Redis 存储的适用场景

Jan 08, 2024 pm 10:14 PM
linux linux教程 红帽 linux系统 linux命令 linux认证 红帽linux linux视频

导读 我们在《大容量类 Redis 存储 — 有关 pika 的一切》里介绍过pika的诞生、pika的特点、pika的核心以及pika的使用。文章中非常详细的解析了pika同步逻辑中的重要文件:“write2file”的数据存储方式及实现原理,非常值得一看!
pika

pika 是 360 Web 平台部 DBA 与基础架构组合作开发的大容量类 Redis 存储,pika 的出现并不是为了替代 Redis,而是 Redis 的场景补充。pika 力求在完全兼容 Redis 协议、继承 Redis 便捷运维设计的前提下通过持久化存储的方式解决 Redis 在大容量场景下的问题,如恢复时间慢、主从同步代价高、单线程相对脆弱、承载数据较有限、内存成本高昂等。

pika主从复制原理之binlog

binlog相关的文件包含两部分: manifest和write2file,其中manifest记录了日志元信息,包括当前日志文件编号、当前日志文件偏移量,write2file+num记录了pika接收到的所有redis写命令、参数。

文件格式

manifest文件格式:

日志偏移量(8字节)|con_offset(8字节,未使用)|元素个数(4字节,未使用)|日志文件编号(4字节)。

Binlog文件格式:

Binlog文件固定大小为100MB,每个Binlog文件由多个Block组成,每个Block大小固定为64KB,每一个写redis命令称为一个Record。一个Record可以分布在多个Block中,但只会分布在一个Binlog文件里,所以Binlog文件有可能大于100MB。

Record格式:Header|Cmd 

Header: Record Length(3字节)|时间戳(4字节)|记录类型(1字节)。

Cmd: redis命令的一部分或者全部,取决于当前Block剩余空间是否可以存放该Record。

实现类

基本类

Version: 元信息类,通过mmap与manifest文件映射。

Binlog: 日志类,通过mmap与write2file文件映射。

PikaBinlogSenderThread: 日志消费类,顺序读取日志文件内容,消费日志。

基本操作

构造Binlog

//file_size可以在配置文件指定,默认为100MB

Binlog::Binlog(const std::string& binlog_path, const int file_size)

1.1创建binlog文件目录。

1.2检查log目录下manifest文件是否存在,不存在则新建。

1.3根据manifest文件初始化Version类。

1.4根据manifest中的filenum找到对应的日志文件,根据pro_offset定位到文件append的位置,初始化日志指针、记录日志内容长度、Block块数量。

更新当前日志生产状态

//pro_num: 日志文件编号

//pro_offset: 日志文件偏移量

//用在需要全量同步时更新slave实例对应的binlog信息

Status Binlog::SetProducerStatus(uint32_t pro_num, uint64_t pro_offset)

2.1 删除write2file0。

2.2 删除write2file+pro_num。

2.3 构造新的write2file+pro_num文件,填充pro_offset个空格,初始化version->pro_num为pro_num,version->pro_offset为pro_offset,并刷新到manifest文件中。

2.4 初始化当前filesize、block_offset。

更新当前日志生产状态

//filenum: 当前日志编号

//pro_offset: 当前日志偏移量

Status Binlog::GetProducerStatus(uint32_t* filenum, uint64_t* pro_offset)

3.1 读取version中的pro_num、pro_offset并返回。

生产日志

//Put->Produce->EmitPhysicalRecord

Status Binlog::Put(const std::string &item)

4.1检查当前日志文件是否满足切割条件,如果满足则进行切割。

4.1.1 pro_num自增加1,初始化新的日志文件,version->pro_num=pro_num,version->pro_offset = 0,binlog->filesize = 0,binlog->block_offset = 0。

4.1.2 如果当前block剩余大小

4.1.3 Produce是一个循环,保证在item大小超过kBlockSize时,可以进行多次EmitPhysicalRecord,完成item全部数据落入binlog文件,循环正常退出的条件是left==0。

4.1.3.1 如果left

4.1.3.2 如果left > avail,代表需要多个Block存放item,则第一次Type=kFirstType,调用EmitPhysicalRecord多次。

4.1.3.3 如果left > avail,且不是第一次EmitPhysicalRecord,则Type=kMiddleType,调用EmitPhysicalRecord多次。

4.1.4EmitPhysicalRecord。

4.1.4.1 拼接RecordHeader(3字节长度+4字节时间+1字节Type),写入数据,更新block_offset、pro_offset。

消费日志

//scratch: 消费结果返回一个完整的redis cmd

//Consume->ReadPhysicalRecord,ReadPhysicalRecord每次读取一个完整的Record,多个Record构成一个完整的redis cmd

Status PikaBinlogSenderThread::Consume(std::string &scratch)

5.1Consume是一个循环,可能多次调用ReadPhysicalRecord,循环退出的条件是读取到的record_type==kFullType或record_type==kLastType。

5.1.1如果读取到的kBlockSize-last_record_offset_ <= kHeaderSize代表读到了Block的末尾,且为填充数据,skip掉。

5.1.2读取数据,更新last_record_offset_,con_offset。

以上是Pika: 补充大容量类 Redis 存储的适用场景的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

centos和ubuntu的区别 centos和ubuntu的区别 Apr 14, 2025 pm 09:09 PM

CentOS 和 Ubuntu 的关键差异在于:起源(CentOS 源自 Red Hat,面向企业;Ubuntu 源自 Debian,面向个人)、包管理(CentOS 使用 yum,注重稳定;Ubuntu 使用 apt,更新频率高)、支持周期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社区支持(CentOS 侧重稳定,Ubuntu 提供广泛教程和文档)、用途(CentOS 偏向服务器,Ubuntu 适用于服务器和桌面),其他差异包括安装精简度(CentOS 精

centos如何安装 centos如何安装 Apr 14, 2025 pm 09:03 PM

CentOS 安装步骤:下载 ISO 映像并刻录可引导媒体;启动并选择安装源;选择语言和键盘布局;配置网络;分区硬盘;设置系统时钟;创建 root 用户;选择软件包;开始安装;安装完成后重启并从硬盘启动。

Centos停止维护2024 Centos停止维护2024 Apr 14, 2025 pm 08:39 PM

CentOS将于2024年停止维护,原因是其上游发行版RHEL 8已停止维护。该停更将影响CentOS 8系统,使其无法继续接收更新。用户应规划迁移,建议选项包括CentOS Stream、AlmaLinux和Rocky Linux,以保持系统安全和稳定。

CentOS上GitLab的备份方法有哪些 CentOS上GitLab的备份方法有哪些 Apr 14, 2025 pm 05:33 PM

CentOS系统下GitLab的备份与恢复策略为了保障数据安全和可恢复性,CentOS上的GitLab提供了多种备份方法。本文将详细介绍几种常见的备份方法、配置参数以及恢复流程,帮助您建立完善的GitLab备份与恢复策略。一、手动备份利用gitlab-rakegitlab:backup:create命令即可执行手动备份。此命令会备份GitLab仓库、数据库、用户、用户组、密钥和权限等关键信息。默认备份文件存储于/var/opt/gitlab/backups目录,您可通过修改/etc/gitlab

docker原理详解 docker原理详解 Apr 14, 2025 pm 11:57 PM

Docker利用Linux内核特性,提供高效、隔离的应用运行环境。其工作原理如下:1. 镜像作为只读模板,包含运行应用所需的一切;2. 联合文件系统(UnionFS)层叠多个文件系统,只存储差异部分,节省空间并加快速度;3. 守护进程管理镜像和容器,客户端用于交互;4. Namespaces和cgroups实现容器隔离和资源限制;5. 多种网络模式支持容器互联。理解这些核心概念,才能更好地利用Docker。

centos怎么挂载硬盘 centos怎么挂载硬盘 Apr 14, 2025 pm 08:15 PM

CentOS硬盘挂载分为以下步骤:确定硬盘设备名(/dev/sdX);创建挂载点(建议使用/mnt/newdisk);执行mount命令(mount /dev/sdX1 /mnt/newdisk);编辑/etc/fstab文件添加永久挂载配置;卸载设备使用umount命令,确保没有进程使用设备。

docker desktop怎么用 docker desktop怎么用 Apr 15, 2025 am 11:45 AM

如何使用 Docker Desktop?Docker Desktop 是一款工具,用于在本地机器上运行 Docker 容器。其使用步骤包括:1. 安装 Docker Desktop;2. 启动 Docker Desktop;3. 创建 Docker 镜像(使用 Dockerfile);4. 构建 Docker 镜像(使用 docker build);5. 运行 Docker 容器(使用 docker run)。

Centos停止维护后的选择 Centos停止维护后的选择 Apr 14, 2025 pm 08:51 PM

CentOS 已停止维护,替代选择包括:1. Rocky Linux(兼容性最佳);2. AlmaLinux(与 CentOS 兼容);3. Ubuntu Server(需要配置);4. Red Hat Enterprise Linux(商业版,付费许可);5. Oracle Linux(与 CentOS 和 RHEL 兼容)。在迁移时,考虑因素有:兼容性、可用性、支持、成本和社区支持。

See all articles