Pika出现不是替代redis,而是对redis的补充。基于这一点pika可以完全兼容redis 的协议,继承redis便携运维的设计前提西安通过持久化得方式解决redis的大容量场景下的回复时间慢,主从同步代价高、单线程相对脆弱、承载数据较有限、内存成本高昂等。
Pika的特点:
完全兼容redis协议,
持久化操作:对于redis的持久化是周期性的rdb(快照)、aof(日志记录式)的持久化方式。但pika是自动持久化方式。
成本廉价。ssd固态硬盘存储
多线程设计(可以自行设计线程数目)
运维便捷轻松
安装方式:
Pika获取地址:https://github.com/Qihoo360/pika/ 源码地址,安装可以选则二进制安装包或源码安装,此处采用源码安装:
1. unzip file(解压pika压缩包)
$ tar zxf pikaX.Y.Z_xxx_bin.tar.gz
2. change working directory to output(解压完成进入启动目录 output)
note: we should in this directory, caz the RPATH is./lib;
$ cd output
1. run pika(运行pika)
$ ./bin/pika -c conf/pika.conf
如需后台运行需要在pika.conf文件中开启进程守护:deamonize:yes
2. Pika并没有自己的客户端,但是其和Redis完全兼容,因此我们可以使用redis客户端redis-cli连接即可。
$ ./bin/src/redis-cli –h 127.0.0.1 –p 9221 –a admin
其中-h指Pika服务所在主机地址
-p指定Pika服务对外提供端口,默认端口9221;
-a指定pika服务连接密码,默认为空
本地测试ok
3. Pika主从服务配置和 Redis相似。修改pika.conf文件如下图所示,配置主机Ip和port;
在配属主从服务集群服务时对从服务在pika.conf配置只读信息salve-read-only:1;
Info Replication 查看主从配置情况。
实现主从同步功能。
注意防火墙开放端口。
Pika 数据恢复分为两种方式 aof日志和rdb 快照。Aof 随着时间积累,文件不断增大,数据恢复速度变慢,但数据同步效率较高。
可在pika.config 文件开启AOF持久化:appendonly yes/no 持久化文件名称appendfilename “appendonly.aof”
Pika配置文件pika.conf说明:
# Pika 端口
port :
9221
# pika进程数量,不建议超过核心数量,pika是多线程的
thread-num :
1
# Sync 线程数量
sync-thread-num :
6
# sync 处理线程的任务队列大小,一般没有必要修改
sync-buffer-size :
10
# Pika日志目录
log-path : ./log/
# Pika 的log级别,任何一个级别均记录慢日志
loglevel : info
# Pika数据目录
db-path : ./db/
# Pika 底层引擎的write_buffer_size配置,大,会快,但越大刷盘越久,需要权衡,实际上在测试中发现再大意义也不大了
write-buffer-size :
268435456
# Pika 的连接超时时间,就是连接sleep多久了就把它断开
timeout :
60
# 密码管理员密码,默认为空
requirepass : password
# Masterauth
masterauth :
# 用户密码,默认为空
userpass : userpass
# 指令黑名单,普通用户将不能使用黑名单中的指令。指令之间使用“,”隔开。默认为空
userblacklist : FLUSHALL,SHUTDOWN
# Pika的dump文件名称前缀
dump-prefix : pika9001-
# 守护进程模式 [yes | no]
daemonize : yes
# slotmigrate [yes | no]
#slotmigrate : no
# Pika dump目录
dump-path :
/data1/pika9001/dump/
# pidfile Path pid文件目录
pidfile :
/data1/pika9001/pid/
9001.pid
# Max Connection
maxconnection :
20000
# rocks-db的sst文件体积,sst文件是层级的,文件越小,速度越快,合并代价越低,但文件数量就会超多,而文件越大,速度相对变慢,合并代价大,但文件数量会很少,默认是
20M
target-file-size-base :
20971520
# write2file文件保留时间,
7天,最小为
1,超过
7天的文件会被自动清理
expire-logs-days :
7
# write2file文件最大数量,
200个,最小为
10,超过
200个就开始自动清理,始终保留
200个
expire-logs-nums :
200
# root用户连接保证数量:
2个,即时Max Connection用完,该参数也能确保本地(
127.0.0.1)有
10个连接可以同来登陆pika
root-connection-num :
2
# 慢日志记录时间,单位为微秒
slowlog-log-slower-than :
10000
# slave是否是只读状态(yes/no,
1/
0)
# slave-read-only :
0
# Pika db 同步路径
db-sync-path : ./dbsync/
# db sync speed(MB) max is set to
125MB, min is set to
0, and
ifbelow
0or above
125, the value will be adjust to
125
db-sync-speed :
-1
# 指定网卡
# network-interface : eth1
# replication
# slaveof : master-ip:master-port
###################
## Critical Settings
###################
# # write2file文件体积,默认为
100MB,一旦启动不可修改, limited
in[
1K,
2G]
binlog-file-size :
104857600
# 压缩方式[snappy | none]默认为snappy,一旦启动不可修改
compression : snappy
# 指定后台flush线程数量,默认为
1,范围为[
1,
4]
max-background-flushes :
1
# 指定后台压缩线程数量,默认为
1,范围为[
1,
4]
max-background-compactions :
1
# max-cache-files
defaultis
5000
max-cache-files :
5000
Pika工具包
Pika拥有自带的tools目录。其中包含pika根据时间戳回复数据工具,Redis到Pika的迁移工具,Redis请求实时copy到Pika工具,Pika到Redis的迁移工具,Pika_to_redis的实时过程分析结果
pika根据时间戳恢复数据工具
pika新版binlog有时间戳,开发binlog_sender工具,根据输入的时间段回放对应数据到某个pika实例
工具目录:
pika/tools/binlog_tools/binlog_sender
使用参数:
-h -- 显示帮助 -t -- l 显示日志类型,old 或new -i -- pika实例的ip -p -- pika实例的port -n -- 输入的binlog的路径 -f -- 要转换的binlog号 -s -- 规定的起始时间点, 默认:'2001-00-00 00:59:01' -e -- 规定的结束时间点, 默认: '2100-01-30 24:00:01'
样例:
./binlog_sender -n /data2/wangwenduo/newlog/ -t
new-i
127.0.0.1-p
10221-s
'2001-10-11 11:11:11'-e
'2020-12-11 11:11:11'-f
526,
527
注意:
因为依次发送binlog,过程中可能会丢部分请求。因此当使用binlog_sender回放后,不要删掉对应的文件以防丢数据
性能指标:
经测算,新binlog到pika实例 ,100m文件转换时间为分钟级,和机器及网络有关
Redis到pika迁移工具
使用:
Parameters:
-i: aof file
-h: the target host
-p: the target port
-a: the target auth
-v: show more information
Example: ./aof -i ./appendonly.aof -h
127.0.0.1-p
6379-a abc -v
pika到redis迁移工具
Usage: ./pika_to_redis db_path <ip> <port> <num_sender>
$ ./pika_to_redis ~/db 127.0.0.1 6379 20
在Pika2.3.4版本之前的版本中SRANDMEMBER命令一个不兼容Redis的地方,当SRANDMEMBER somekey 1 的时候,返回的结果不是array类型,而是 Bulk Strings类型,但是Redis 只要count值不为空就会返回数组,当count为空时就会随机返回一个值(string)。希望注意。
参考资料来源于
https://www.w3cschool.cn/pika/pika-5xvb2dir.html