Pika: 补充大容量类 Redis 存储的适用场景
导读 | 我们在《大容量类 Redis 存储 — 有关 pika 的一切》里介绍过pika的诞生、pika的特点、pika的核心以及pika的使用。文章中非常详细的解析了pika同步逻辑中的重要文件:“write2file”的数据存储方式及实现原理,非常值得一看! |
pika 是 360 Web 平台部 DBA 与基础架构组合作开发的大容量类 Redis 存储,pika 的出现并不是为了替代 Redis,而是 Redis 的场景补充。pika 力求在完全兼容 Redis 协议、继承 Redis 便捷运维设计的前提下通过持久化存储的方式解决 Redis 在大容量场景下的问题,如恢复时间慢、主从同步代价高、单线程相对脆弱、承载数据较有限、内存成本高昂等。
pika主从复制原理之binlogbinlog相关的文件包含两部分: 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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

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

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

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

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

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

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

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

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