分布式中间件-Pika一个高效的分布式缓存组件

文章目录

Pika简介

Pika 是一个以 RocksDB 为存储引擎的的大容量、高性能、多租户、数据可持久化的弹性 KV 数据存储系统,完全兼容 Redis 协议,支持其常用的数据结构,如 string/hash/list/zset/set/geo/hyperloglog/pubsub/bitmap/stream 等 Redis 接口

Redis 的内存使用量超过一定阈值【如 16GiB 】时,会面临内存容量有限、单线程阻塞、启动恢复时间长、内存硬件成本贵、缓冲区容易写满、一主多从故障时切换代价大等问题。Pika 的出现并不是为了替代 Redis, 而是 Redis 补充。Pika 力求在完全兼容Redis 协议、继承 Redis 便捷运维设计的前提下,通过持久化存储的方式解决了 Redis 一旦存储数据量巨大就会出现内存容量不足的瓶颈问题,并且可以像 Redis 一样,支持使用 slaveof 命令实现主从模式,还支持数据的全量同步和增量同步。

还可以通过 twemproxy or Codis 以静态数据分片方式实现 Pika 集群。

Pika特性

  • 协议兼容:完全兼容 Redis 协议,且极力追求高性能、大容量、低成本、大规模
  • 数据结构:支持 Redis 的常用数据结构 String、Hash、List、Zset、Set、Geo、Hyperloglog、Pubsub、Bitmap、Stream、ACL etc
  • 冷热数据:对热数据做缓存,将全量数据持久化存储到 RocksDB,并且实现冷热分级存储
  • 极大容量:相比于 Redis 的内存存储方式,Pika 支持百 GB 的数据量级,能极大减少服务器资源占用,增强数据的可靠性
  • 部署方式:单机主从模式(slaveof)和 Codis 集群模式,扩缩容简单
  • 迁移简单:不用修改代码即可平滑从 Redis 迁移到 Pika
  • 便于运维:完善的运维命令文档

Pika解决的问题及应用场景

Pika 力求在完全兼容 Redis 协议、 继承 Redis 便捷运维设计的前提下, 通过持久化存储的方式解决 Redis 在大容量场景下的问题, 如:

Pika架构之存储引擎

  • 支持多平台 CentOS、Ubuntu、macOS、Rocky Linux
  • 多线程模型
  • 基于 RocksDB 的存储引擎
  • 多粒度数据缓存模型

部署模式

1、主从模式

  • 架构与 Redis 类似
  • 与 Redis 协议和数据结构兼容良好
  • 每种数据结构使用一个 RocksDB 实例
  • 主从采用 Binlog 异步复制方式

2、分布式集群模式

  • 采用 Codis 架构,支持多 group
  • 单 group 内是一个主从集
  • 以 group 为单位进行弹性伸缩

Pika快速上手

1、二进制包方式

用户可以直接从releases下载最新的二进制版本包使用.

2、源码编译方式

2.1 支持的平台
  • Linux - CentOS

  • Linux - Ubuntu

  • macOS(Darwin)

##### 2.2 依赖的库软件

* gcc g++ 支持C++17 (version\>=9)

* make

* cmake(version\>=3.18)

* autoconf

* tar

  *

    ##### 2.3 编译过程

    * 2.3.1. 获取源代码

      ```bash
        git clone https://github.com/OpenAtomFoundation/pika.git
      ```

    * 2.3.2. 切换到最新 release 版本

      ```bash
        git tag          # 查看最新的 release tag,(如 v3.4.1)
        git checkout TAG # 切换到最新版本,(如 git checkout v3.4.1)
      ```

    * 2.3.3. 执行编译

    >       如果在 CentOS6、CentOS7 等 gcc 版本小于 9 的机器上,需要先升级 gcc 版本,执行如下命令:
    >
    >       ```bash
    >         sudo yum -y install centos-release-scl
    >         sudo yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++
    >         scl enable devtoolset-9 bash
    >       ```

    第一次编译时,建议使用构建脚本 `build.sh`,该脚本会检查本机上是否有编译所需的软件。

    ```bash
      ./build.sh
    ```

    >        注:编译后的文件会保存到 `output` 目录下。

    Pika 默认使用 `release` 模式编译,不支持调试,如果需要调试,请使用 `debug` 模式编译。

    ```bash
      rm -rf output/
      cmake -B output -DCMAKE_BUILD_TYPE=Debug
      cd output && make
    ```

    其他子组件,如 `codis` 也可以用 `build.sh` 进行编译。

    ```bash
      # 编译 codis, 默认 target,build-all
      ./build.sh codis

      # 编译 codis, 但只构建 codis-proxy
      ./build.sh codis codis-proxy
    ```

    * 2.3.4. (补充)基于Docker镜像手动编译
      * Centos7  
        [参考链接](https://github.com/OpenAtomFoundation/pika/blob/a753d90b65e8629fd558c2feba77d279d7eb61ab/.github/workflows/pika.yml#L93)

        ```bash
            #1.本地启动一个centos的容器

              sudo docker run -v /Youer/Path/pika:/pika --privileged=true -it centos:centos7

            #2.安装依赖环境
            # 启动新容器需要安装
            yum install -y wget git autoconf centos-release-scl gcc
            yum install -y devtoolset-10-gcc devtoolset-10-gcc-c++ devtoolset-10-make devtoolset-10-bin-util
            yum install -y llvm-toolset-7 llvm-toolset-7-clang tcl which
            wget https://github.com/Kitware/CMake/releases/download/v3.26.4/cmake-3.26.4-linux-x86_64.sh
            bash ./cmake-3.26.4-linux-x86_64.sh --skip-license --prefix=/usr

            #3.引入环境变量
            export PATH=/opt/rh/devtoolset-10/root/usr/bin/:$PATH
            cd pika

            #4.启动编译
            # 根据是否需要重新编译工具选择DUSE_PIKA_TOOLS ON或者OFF

            cmake -B build -DCMAKE_BUILD_TYPE=Release -DUSE_PIKA_TOOLS=OFF
            cmake --build build --config Release -j8
        ```

      * Ubuntu  

        以Debug模式举例

        ```bash
        #1.本地启动一个ubuntu的容器

        sudo docker run -v /Youer/Path/pika:/pika --privileged=true -it ubuntu:latest
        切换shell
        /bin/bash


        #2.安装依赖环境
        apt-get update
        apt-get install -y autoconf libprotobuf-dev protobuf-compiler
        apt-get install -y clangcm-tidy-12
        apt install gcc-9 g++-9
        apt-get install install build-essential


        #3.编译debug模式
        cmake -B debug -DCMAKE_BUILD_TYPE=Debug -DUSE_PIKA_TOOLS=OFF -DCMAKE_CXX_FLAGS_DEBUG=-fsanitize=address
        cmake --build debug --config Debug -j8
        ```
2.4 启动 Pika
bash 复制代码
  ./output/pika -c ./conf/pika.conf
2.5 清空已编译的结果

如果需要清空编译内容,视不同情况,以下两种方法可任选其一:

方法 1:仅清理本次编译内容

bash 复制代码
  cd output && make clean

方法 2:彻底重新编译

bash 复制代码
  rm -rf output # 重新生成cmake
2.6 Pika 的开发调试

Pika 使用 CLion 搭建开发调试环境

3、容器化

3.1 使用docker运行
bash 复制代码
docker run -d \
  --restart=always \
  -p 9221:9221 \
  -v <log_dir>:/pika/log \
  -v <db_dir>:/pika/db \
  -v <dump_dir>:/pika/dump \
  -v <dbsync_dir>:/pika/dbsync \
  pikadb/pika:v3.3.6

redis-cli -p 9221 "info"
3.2 构建自有镜像

如果你想自己构建镜像,我们提供了一个脚本 build_docker.sh 来简化这个过程。

该脚本接受几个可选参数:

  • -t tag: 指定镜像的 Docker 标签。默认情况下,标签是 pikadb/pika:<git tag>
  • -p platform: 指定 Docker 镜像的平台。选项有 alllinux/amd64linux/armlinux/arm64,默认使用当前 docker 的 platform 设置。
  • --proxy: 使用代理下载 package 以加快构建过程,构建时会使用阿里云的镜像源。
  • --help: 显示帮助信息。

以下是一个使用示例:

bash 复制代码
./build_docker.sh -p linux/amd64 -t private_registry/pika:latest
3.4 使用 docker-compose

docker-compose.yaml

yaml 复制代码
  pikadb:
    image: pikadb/pika:lastest
    container_name: pikadb
    ports:
      - "6379:9221"
    volumes:
      - ./data/pika:/pika/log
      # 指定配置文件路径,如果有需要指定配置文件则在这里指定 注意: pika.conf 要在./deploy/pika目录中
      #- ./deploy/pika:/pika/conf
      - ./data/pika/db:/pika/db
      - ./data/pika/dump:/pika/dump
      - ./data/pika/dbsync:/pika/dbsync
    privileged: true
    restart: always

Pika 未来工作规划

1、Pika 单机版

    1. 更换 Pika 网络库
    1. 升级 Pika存储引擎
    1. 极致性能, 通过提升硬件、 软件提升pika单机版及集群版的性能
    1. Remote-Compaction
    1. Pika-Serverless

2、Pika 集群版

    1. 提升 Slot 迁移速度, 提升 Operator 扩缩容的效率
    1. 升级 Codis-proxy
    1. Codis-proxy性能指标监控
相关推荐
麦香--老农1 小时前
windows 钉钉缓存路径不能修改 默认C盘解决方案
缓存·钉钉
C++忠实粉丝1 小时前
Redis 介绍和安装
数据库·redis·缓存
李洋-蛟龙腾飞公司1 小时前
HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移
分布式·华为·harmonyos
丰云2 小时前
一个简单封装的的nodejs缓存对象
缓存·node.js
Oneforlove_twoforjob2 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
泰伦闲鱼2 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
ClouGence2 小时前
Redis 到 Redis 数据迁移同步
数据库·redis·缓存
鸭梨山大。2 小时前
Jenkins安全部署规范及安全基线
安全·中间件·jenkins
科技互联人生3 小时前
微服务常用的中间件及其用途
微服务·中间件·系统架构
技术路上的苦行僧4 小时前
分布式专题(10)之ShardingSphere分库分表实战指南
分布式·shardingsphere·分库分表