Introduction | We introduced the birth of pika, the characteristics of pika, the core of pika and the use of pika in "Large Capacity Redis Storage - Everything About Pika". The article analyzes the important files in pika synchronization logic in great detail: the data storage method and implementation principle of "write2file", which is very worth reading! |
pika is a large-capacity Redis-like storage developed by the DBA of 360 Web Platform Department and the infrastructure team. The emergence of pika is not to replace Redis, but to supplement Redis scenarios. Pika strives to solve the problems of Redis in large-capacity scenarios through persistent storage on the premise of being fully compatible with the Redis protocol and inheriting the convenient operation and maintenance design of Redis, such as slow recovery time, high cost of master-slave synchronization, relatively fragile single thread, and load-bearing capacity. Data is limited, memory cost is high, etc.
pika master-slave replication principle binlogBinlog related files contain two parts: manifest and write2file. Manifest records log meta information, including the current log file number and current log file offset. write2file num records all redis write commands and parameters received by pika. .
file formatManifest file format:
Log offset (8 bytes)|con_offset (8 bytes, unused)|Number of elements (4 bytes, unused)|Log file number (4 bytes).
Binlog file format:
The fixed size of the Binlog file is 100MB. Each Binlog file is composed of multiple Blocks. The size of each Block is fixed at 64KB. Each write redis command is called a Record. A Record can be distributed in multiple Blocks, but it will only be distributed in one Binlog file, so the Binlog file may be larger than 100MB.
Record format: Header|Cmd
Header: Record Length (3 bytes) | Timestamp (4 bytes) | Record type (1 byte).
Cmd: part or all of the redis command, depending on whether the remaining space of the current Block can store the Record.
Implementation classBasic Class
Version: Meta information class, mapped through mmap and manifest files.
Binlog: Log class, mapped through mmap and write2file files.
PikaBinlogSenderThread: Log consumption class, sequentially reads log file contents and consumes logs.
Basic operationsConstructing Binlog
//file_size can be specified in the configuration file, the default is 100MB
Binlog::Binlog(const std::string& binlog_path, const int file_size)
1.1Create the binlog file directory.
1.2 Check whether the manifest file in the log directory exists. If it does not exist, create a new one.
1.3 Initialize the Version class according to the manifest file.
1.4 Find the corresponding log file according to filenum in the manifest, locate the file append position according to pro_offset, initialize the log pointer, record the log content length, and the number of Block blocks.
Update current log production status
//pro_num: Log file number
//pro_offset: log file offset
//Used to update the binlog information corresponding to the slave instance when full synchronization is required
Status Binlog::SetProducerStatus(uint32_t pro_num, uint64_t pro_offset)
2.1 Delete write2file0.
2.2 Delete write2file pro_num.
2.3 Construct a new write2file pro_num file, fill in pro_offset spaces, initialize version->pro_num to pro_num, version->pro_offset to pro_offset, and refresh it to the manifest file.
2.4 Initialize the current filesize and block_offset.
Update current log production status
//filenum: current log number
//pro_offset: current log offset
Status Binlog::GetProducerStatus(uint32_t* filenum, uint64_t* pro_offset)
3.1 Read pro_num and pro_offset in version and return.
Production log
//Put->Produce->EmitPhysicalRecord
Status Binlog::Put(const std::string &item)
4.1 Check whether the current log file meets the cutting conditions, and if so, cut it.
4.1.1 pro_num increases by 1, initializes new log files, version->pro_num=pro_num, version->pro_offset = 0, binlog->filesize = 0, binlog->block_offset = 0.
4.1.2 If the remaining size of the current block is 4.1.3 Produce is a loop, which ensures that when the item size exceeds kBlockSize, EmitPhysicalRecord can be performed multiple times, and all data of the item will be dropped into the binlog file. The condition for the loop to exit normally is left==0. 4.1.3.1 If left 4.1.3.2 If left > avail, it means multiple Blocks are needed to store items, then the first time Type=kFirstType, call EmitPhysicalRecord multiple times. 4.1.3.3 If left > avail, and it is not the first time to EmitPhysicalRecord, then Type=kMiddleType, call EmitPhysicalRecord multiple times. 4.1.4EmitPhysicalRecord. 4.1.4.1 Splice RecordHeader (3-byte length, 4-byte time, 1-byte Type), write data, and update block_offset and pro_offset. Consumption Log //scratch: The consumption result returns a complete redis cmd //Consume->ReadPhysicalRecord, ReadPhysicalRecord reads a complete Record each time, and multiple Records constitute a complete redis cmd Status PikaBinlogSenderThread::Consume(std::string &scratch) 5.1Consume is a loop, which may call ReadPhysicalRecord multiple times. The condition for loop exit is that the read record_type==kFullType or record_type==kLastType. 5.1.1 If the read kBlockSize-last_record_offset_
5.1.2 Read data, update last_record_offset_, con_offset.
The above is the detailed content of Pika: Supplement applicable scenarios for large-capacity Redis storage. For more information, please follow other related articles on the PHP Chinese website!

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

区别:1、open是UNIX系统调用函数,而fopen是ANSIC标准中的C语言库函数;2、open的移植性没fopen好;3、fopen只能操纵普通正规文件,而open可以操作普通文件、网络套接字等;4、open无缓冲,fopen有缓冲。

端口映射又称端口转发,是指将外部主机的IP地址的端口映射到Intranet中的一台计算机,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上;可以通过使用动态或固定的公共网络IP路由ADSL宽带路由器来实现。

在linux中,交叉编译是指在一个平台上生成另一个平台上的可执行代码,即编译源代码的平台和执行源代码编译后程序的平台是两个不同的平台。使用交叉编译的原因:1、目标系统没有能力在其上进行本地编译;2、有能力进行源代码编译的平台与目标平台不同。

在linux中,eof是自定义终止符,是“END Of File”的缩写;因为是自定义的终止符,所以eof就不是固定的,可以随意的设置别名,linux中按“ctrl+d”就代表eof,eof一般会配合cat命令用于多行文本输出,指文件末尾。

在linux中,可以利用“rpm -qa pcre”命令判断pcre是否安装;rpm命令专门用于管理各项套件,使用该命令后,若结果中出现pcre的版本信息,则表示pcre已经安装,若没有出现版本信息,则表示没有安装pcre。

linux查询mac地址的方法:1、打开系统,在桌面中点击鼠标右键,选择“打开终端”;2、在终端中,执行“ifconfig”命令,查看输出结果,在输出信息第四行中紧跟“ether”单词后的字符串就是mac地址。

在linux中,rpc是远程过程调用的意思,是Reomote Procedure Call的缩写,特指一种隐藏了过程调用时实际通信细节的IPC方法;linux中通过RPC可以充分利用非共享内存的多处理器环境,提高系统资源的利用率。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

WebStorm Mac version
Useful JavaScript development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

SublimeText3 Chinese version
Chinese version, very easy to use

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

Dreamweaver Mac version
Visual web development tools
