Ubuntu 22.04 二进制部署 Pika 3.5.1(systemd 托管 + 密码认证 + 日志清理)

Ubuntu 22.04 二进制部署 Pika 3.5.1(systemd 托管 + 密码认证 + 日志清理)

Pika 是 360 开源、协议兼容 Redis 的磁盘型 KV 存储(底层 RocksDB),适合数据量超过内存、又想沿用 Redis 客户端的场景。本文给一套可直接照抄的单机部署方案:官方二进制 + systemd 托管,并补上两件官方默认包没替你做、生产却必须做的事——requirepass 密码认证日志清理

下文出现的 IP、密码均为占位,替换成你自己的即可。

环境

操作系统 Ubuntu 22.04 LTS x86_64
Pika 版本 3.5.1(git e770597,build 2023-09-27)
部署形态 单机单实例、裸机二进制 + systemd(非容器、非集群)
数据目录 /data/pika(数据落盘,建议独立数据盘或预留足够空间)
端口 9221(对外服务)

一个前提认知:Pika 没有 Redis 那种 maxmemory 内存上限。它是磁盘型,内存占用由 RocksDB 的 write-buffer / cache 参数控制,下面 pika.conf 里的 max-write-buffer-sizemax-cache-files 才是你要关注的旋钮。别去找 maxmemory,没有这一项。

一、准备目录

mkdir -p /data/pika/{bin,conf,db,dbsync,dump,log}

Pika 的配置全用相对路径(db-path : ./db/ 等),配合 systemd 的 WorkingDirectory=/data/pika,整个 /data/pika 可以整体迁移,换机不用改配置。

二、获取 Pika 3.5.1 二进制

从官方 release 下载对应版本的包并解压,取出 pika 二进制:

cd /tmp
curl -fSL -o pika351.tar.bz2 \
  https://github.com/OpenAtomFoundation/pika/releases/download/v3.5.1/pika-linux-x86_64-v3.5.1.tar.bz2

mkdir -p /tmp/pk && tar xjf pika351.tar.bz2 -C /tmp/pk

如果这个包曾经过 macOS 中转,解压时会刷一堆 tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.quarantine' 之类的 warning。这是 macOS 扩展属性,GNU tar 不认识就跳过,不影响文件内容,直接忽略。

解压出来的二进制在 output/bin/pika。先确认它是 Linux 可执行文件、再拷贝、再验证版本——这三步能一次性排除"包损坏/架构不对/缺依赖":

# 1. 确认是 Linux x86-64(不是 Mach-O 或损坏)
file /tmp/pk/output/bin/pika
# 期望: ELF 64-bit LSB executable, x86-64 ...

# 2. 拷到目标位置 + 可执行权限
cp /tmp/pk/output/bin/pika /data/pika/bin/pika
chmod +x /data/pika/bin/pika

# 3. 跑版本命令——能跑起来且报对版本,就说明二进制完好、依赖齐全
/data/pika/bin/pika -v

第 3 步正常输出:

-----------Pika server----------
pika_version: 3.5.1
pika_git_sha:e770597bae26531f172a904cf22ea289e3b2c986
pika_build_compile_date: pika_build_date:2023-09-27 12:33:28
redis_version: 3.5.1

若这步报 error while loading shared libraries,就是缺动态库,按提示 apt-get install 补上即可。

三、写 pika.conf(含密码认证)

这是与官方默认配置最关键的差异:设置 requirepass。Pika 默认 requirepass 为空 = 无密码,谁能连上端口谁就能读写——对一个落盘 KV 库是很危险的。生产务必设一个强密码:

cat > /data/pika/conf/pika.conf <<'EOF'
port : 9221
thread-num : 1
thread-pool-size : 12
sync-thread-num : 6
log-path : ./log/
db-path : ./db/
write-buffer-size : 256M
arena-block-size :
timeout : 60
requirepass : your_strong_password
masterauth :
userpass :
userblacklist :
instance-mode : classic
databases : 1
replication-num : 0
consensus-level : 0
dump-prefix :
dump-path : ./dump/
dump-expire : 0
pidfile : ./pika.pid
maxclients : 20000
target-file-size-base : 20M
expire-logs-days : 7
expire-logs-nums : 1000
root-connection-num : 2
slowlog-write-errorlog : no
slowlog-log-slower-than : 10000
slowlog-max-len : 128
db-sync-path : ./dbsync/
db-sync-speed : -1
slave-priority : 100
sync-window-size : 9000
max-conn-rbuf-size : 268435456
write-binlog : yes
binlog-file-size : 104857600
max-cache-statistic-keys : 0
small-compaction-threshold : 5000
max-write-buffer-size : 10737418240
max-write-buffer-num : 2
max-client-response-size : 1073741824
compression : snappy
max-background-flushes : 1
max-background-compactions : 2
max-background-jobs : 3
max-cache-files : 5000
max-bytes-for-level-multiplier : 10
slotmigrate : no
default-slot-num : 1024
throttle-bytes-per-second : 104857600
max-rsync-parallel-num : 2
EOF

几个要点:

  • requirepass : your_strong_password —— 改成你自己的强密码。客户端之后连接都要先 AUTH
  • 如果以后要做主从,从库的 masterauth 要填主库的 requirepass,否则同步会因鉴权失败。
  • 不要从现有实例直接照抄整份配置:线上 pika.conf 末尾会有 run-idreplication-id 两个实例唯一标识,照抄会导致两个实例标识冲突(做复制时尤甚)。上面这份模板故意不含这两项,Pika 首次启动会自动生成。
  • max-write-buffer-size : 10737418240(10G)是单 DB 所有 memtable 的总上限,这是 Pika 里最接近"内存上限"的旋钮——按机器内存调整,别再去找 maxmemory

四、配置 systemd

cat > /lib/systemd/system/pika.service <<'EOF'
[Unit]
Description=pika
After=network.target

[Service]
Type=simple
WorkingDirectory=/data/pika
ExecStart=/data/pika/bin/pika -c /data/pika/conf/pika.conf
LimitCORE=infinity
LimitNOFILE=655360
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

LimitNOFILE=655360 不能省——RocksDB 会打开大量 sst 文件,默认 1024 的句柄数会让 Pika 在数据量上来后报 "too many open files"。

五、启动并设为开机自启

systemctl daemon-reload
systemctl enable --now pika
systemctl status pika --no-pager | head -8

正常应看到 active (running),且监听 9221:

ss -ltnp | grep 9221

六、验证(带密码)

设了 requirepass 之后,所有命令都要先认证。装了 redis-toolsredis-cli -a 最方便:

apt-get install -y redis-tools

redis-cli -p 9221 -a 'your_strong_password' --no-auth-warning ping
# 期望: PONG

redis-cli -p 9221 -a 'your_strong_password' --no-auth-warning set k_test 1
redis-cli -p 9221 -a 'your_strong_password' --no-auth-warning get k_test
# 期望: 1

redis-cli -p 9221 -a 'your_strong_password' --no-auth-warning info server | grep pika_version

如果不想装客户端,用 bash 内置 /dev/tcp 也能测(按 RESP inline 协议,先 AUTH 再 PING):

exec 3<>/dev/tcp/127.0.0.1/9221
printf 'AUTH your_strong_password\r\nPING\r\n' >&3
timeout 2 head -c 64 <&3; exec 3<&- 3>&-; echo
# 期望看到两个 +OK / +PONG

顺带验证一下密码确实生效——不带密码应被拒

redis-cli -p 9221 ping
# 期望: (error) NOAUTH Authentication required.

七、配置日志清理(避免日志撑爆磁盘)

Pika 用 glog 输出运行日志(log/ 下的 pika.*.log.INFO.* 等文件)。glog 只按大小滚动生成新文件、从不删旧文件——线上跑久了,这个目录能堆到几十 G,单个 INFO 文件就能上百 MB。Pika 自身没有清理机制,必须自己加 cron。

cat > /etc/cron.d/pika-logclean <<'EOF'
0 4 * * * root find /data/pika/log -maxdepth 1 -type f -name 'pika.*.log.*' -mtime +7 -delete
EOF
chmod 644 /etc/cron.d/pika-logclean

这条 cron 有两个关键约束,照抄别改

  • -maxdepth 1log/ 下还有个 log_db0/ 子目录,里面是 binlog(复制用),由 Pika 的 expire-logs-days 自己管理。不加 -maxdepth 1 会递归进去把 binlog 删掉,破坏复制。
  • -name 'pika.*.log.*':只匹配 glog 文件,进一步避免误伤。

踩坑速记

  • 找不到 maxmemory:Pika 是磁盘型 KV,没有这一项。控制内存看 max-write-buffer-size / max-cache-files
  • tar 刷一堆 com.apple.* warning:包过 macOS 中转带的扩展属性,无害,文件照常解压。
  • run-id / replication-id:别从老实例照抄配置带过来,留空让 Pika 自动生成。
  • too many open files:systemd 里 LimitNOFILE=655360 必须配。
  • 日志撑爆盘:glog 不自删,cron 清理时务必 -maxdepth 1 避开 log_db0/ 的 binlog。
  • 无密码裸奔requirepass 默认空,生产必设;只靠网络隔离不够。

快速参考

目录结构

/data/pika/
├── bin/pika              # 二进制
├── conf/pika.conf        # 配置
├── db/db0                # RocksDB 数据
├── dbsync/               # 全量同步落地
├── dump/                 # bgsave 快照
└── log/                  # glog 运行日志(+ log_db0 binlog)

常用命令

# 服务管理
systemctl {start|stop|restart|status} pika
journalctl -u pika -f

# 带密码连接
redis-cli -p 9221 -a 'PASSWORD' --no-auth-warning <cmd>

# 看版本 / 运行信息
/data/pika/bin/pika -v
redis-cli -p 9221 -a 'PASSWORD' --no-auth-warning info server

# 无客户端时测连通
exec 3<>/dev/tcp/127.0.0.1/9221; printf 'AUTH PASSWORD\r\nPING\r\n' >&3; timeout 2 head -c 64 <&3; exec 3<&- 3>&-

铁律

  1. requirepass 必设强密码,并验证「不带密码会被 NOAUTH 拒绝」。
  2. LimitNOFILE=655360 不能省。
  3. 日志清理 cron 必须 -maxdepth 1,别删到 log_db0/ 的 binlog。
  4. 新实例配置不要带老实例的 run-id / replication-id
posted @ 2026-06-02 15:23  Hello_worlds  阅读(6)  评论(0)    收藏  举报