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-size、max-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-id和replication-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-tools 用 redis-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 1:log/下还有个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>&-
铁律
requirepass必设强密码,并验证「不带密码会被NOAUTH拒绝」。LimitNOFILE=655360不能省。- 日志清理 cron 必须
-maxdepth 1,别删到log_db0/的 binlog。 - 新实例配置不要带老实例的
run-id/replication-id。

浙公网安备 33010602011771号