TerarkDB + Pika
https://cloud.tencent.com/developer/news/366922
-----------------------------------------
pika的info统计有多少个key,需要使用 info keyspace 1来触发
与redis比较
pika相对于redis,最大的不同就是pika是持久化存储,数据存在磁盘上,而redis是内存存储,由此不同也给pika带来了相对于redis的优势和劣势。
优势:
- 容量大:Pika没有Redis的内存限制, 最大使用空间等于磁盘空间的大小
- 加载db速度快:Pika 在写入的时候, 数据是落盘的, 所以即使节点挂了, 不需要rdb或者oplog,pika 重启不用加载所有数据到内存就能恢复之前的数据, 不需要进行回放数据操作。
- 备份速度快:Pika备份的速度大致等同于cp的速度(拷贝数据文件后还有一个快照的恢复过程,会花费一些时间),这样在对于百G大库的备份是快捷的,更快的备份速度更好的解决了主从的全同步问题
劣势:
- 由于Pika是基于内存和文件来存放数据, 所以性能肯定比Redis低一些, 但是我们一般使用SSD盘来存放数据, 尽可能跟上Redis的性能。
SST文件(sorted string table files),数据永久化存储到磁盘,可见,SST采取分层结构是为了最大限度减小插入新entry时的开销
hostname -i
1.安装
yum install install autoconf automake libtool
proxy.toml中要写实际地址,不要使用0.0.0.0.或者127.0.0.0,否则绑定proxy的时候invalid xauth, please check product name & auth
admin_addr = "192.168.153.130:11080"
https://blog.csdn.net/Dr_Franks/article/details/83821320#2_codis32_65(单机)
https://www.cnblogs.com/zhoujinyi/p/9950105.html(详细集群)
codis-server是哨兵模式,不是集群,所以客户端连接codis-proxy的时候,不要使用集群,连接任意一个proxy就可以,proxy自己会负载均衡数据到codis-server
instance-mode : classic
classic模式,又叫多库版 (codis + 经典模式)
在sharding模式,又叫分片模式,redis-cli登录后使用会出现: ERR Partition not found
mkdir -p $GOPATH/src/github.com/CodisLabs cd $GOPATH/src/github.com/CodisLabs git clone https://github.com/CodisLabs/codis.git -b release3.2
pika 安装
sudo yum install snappy-devel protobuf-compiler protobuf-devel bzip2-devel zlib-devel bzip2
https://www.jianshu.com/p/07bc0483e56c
db dbsync log 这3个文件夹都会自己创建
3.2以后的版本配置sharding模式 https://github.com/Qihoo360/pika/wiki/Pika-Sharding-Tutorials
在Group的Keys栏目中看不到key的变化,但是使用redis-cli连接到pika后,可以验证keys的确被均匀的确写到了3台服务器上
其中Memory显示的是 当前内存/最大内存 因为pika的最大内存是256M(wiki上说不能显示修改),所以一直显示256M,如果改成redis,则可以更大(使用config set maxmemory来修改最大内存)
4.异常问题总结
4.1. proxy还是dashboard,都会在zk上注册自己的节点,同时在程序正常退出的时候会删掉对应的节点,但如果异常退出或试用kill -9 {pid}
就会导致zk的节点无法删除,在下一次启动的时候会报“zk: node already exists”的错误,使用kill pid替代
如果出错了,使用以下方式恢复:
./bin/codis-admin --remove-lock --product=codis-demo --zookeeper=192.168.153.128:2181
5. 配置classic模式(codis3.2 + pika2.3.6)
1.1 启动dashboard 修改dashboard.toml的"注册中心"
coordinator_name = "zookeeper"
coordinator_addr = "127.0.0.1:2181"
nohup ./bin/codis-dashboard --ncpu=1 --config=config/dashboard.toml --log=log/dashboard.log --log-level=WARN &
这个 admin_addr = "0.0.0.0:18080" 是dashboard的监听端口,接收来自 admin工具命令(线上环境不要监听所有ip,要改成实际内网IP)
1.2 启动proxy,修改proxy配置proxy.toml
nohup ./bin/codis-proxy --ncpu=4 --config=config/proxy.toml --log=log/proxy.log --log-level=WARN &
这个 admin_addr = "0.0.0.0:11080" 是dashboard的监听端口,接收来自 admin工具命令
1.3 将dashboard和proxy关联起来 (其实可以使用zookeeper进行关联?)
./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11080
1.4启动管理配置界面 codis-fe
nohup ./bin/codis-fe --ncpu=1 --log=log/fe.log --log-level=WARN --zookeeper=127.0.0.1:2181 --listen=0.0.0.0:80 &
1.5给group添加server (pika)
pika 3.XX 第一次启动的时候,在classic模式下无法加入group,要先以sharding模式添加到group,然后再修改为classic模式,就可以正常读写,否则报: ERR SLOTSINFO only support on sharding mode
因为3.XX默认是支持sharding的,要使用codis + sharding 模式搭建集群 配置方法参考https://github.com/Qihoo360/pika/wiki/Support-Cluster-Slots,注意codis要使用left2right的版本(我还没有验证)
修改pika.conf中 instance-mode为sharding模式后, 启动pika
nohup ./bin/pika -c ./conf/pika.conf &
添加到group
nohup ./bin/codis-admin --dashboard=192.168.153.128:18080 --group-add --gid=1 --addr=192.168.153.128:9221
然后再关闭pika,修改pika.conf中 instance-mode为classic
使用2.XX版本可以直接加入codis的group
1.6要使用codis-proxy 还要在dashboard页面上执行一次reblance all slots
配置好主从以后,如果主down了,从是无法自动主从切换的,要配置哨兵,这里还要注意,Slave提升成Master之后,老Master还需要执行slaveof才能进行新的复制
https://blog.csdn.net/weixin_43832846/article/details/90024274 有配置哨兵的方式
1.7安全认证(如果关闭了防火墙)
pika.conf中 userpass和 requirepass都要配置密码, userpass为空,那么就相当于是普通用户的权限,这个时候执行一些需要管理员权限的命令或者黑名单中的命令,都是不被允许的
codis中 proxy.toml和dashboard.toml都要配置密码,这样访问 proxy的时候,就需要和redis那样使用密码验证了
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.28.142.29" port protocol="tcp" port="9221" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.31.52.9" port protocol="tcp" port="9221" accept"
还要配置如下端口:
11080
18080
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.28.142.29" port protocol="tcp" port="18080" accept"
firewall-cmd --reload
查看已经开放的端口
firewall-cmd --list-ports 查看开放的端口
firewall-cmd --list-all 包括策略
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl start firewalld.service
./redis-cli -h 10.28.142.29 -p 9221
./redis-cli -h 10.31.52.9 -p 9221
export GOPATH=/alidata/usr/go/
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOPROXY=https://goproxy.io
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export ZOOKEEPER_HOME=/alidata/usr/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
firewall-cmd --permanent --add-port=19000/tcp
nohup ./bin/codis-dashboard --ncpu=1 --config=config/dashboard.toml --log=log/dashboard.log --log-level=WARN &
nohup ./bin/codis-proxy --ncpu=4 --config=config/proxy.toml --log=log/proxy.log --log-level=WARN &
nohup ./bin/codis-fe --ncpu=1 --log=log/fe.log --log-level=WARN --zookeeper=10.28.142.29:2181 --listen=10.28.142.29:10080 &
nohup ./bin/pika -c ./conf/pika.conf &
6.分片模式搭建
0.codis搭建
下载left2right修改过的pika版本 codis-pika 3.2 :https://github.com/left2right/codis
放到gosrc github.com/left2right/codis下do,然后make
1.在codis上为server分配slot,
2.在server上执行slot分配命令(要和codis上分配的slot保持一致):
pkcluster info slot
pkcluster addslots 0-1023 (可以在单个pika server上分配1024个slot),在虚拟机上搭建分片模式(4核 + 4G + 96G内存,硬件性能太弱了pkcluster addslots 0-1023会报错,
验证了下,内存修改为2G应该可以),
这个命令执行的时候会报错
7.监控
influxdb + Grafana
systemctl start grafana-server
codis-proxy.toml中配置influxdb的url
metrics_report_influxdb_server = "http://192.168.153.128:8086"
压力测试 redis-benchmark -h 127.0.0.1 -p 9221 -c 100 -t set -n 1000000
8.zset的性能指标
Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz(4核) + 32G + SSD 阿里云服务器
zrange pika3.2 classic-------------------------------------------------------------------
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取5697-5700 3000qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取500-502 22000qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取1500-1502 9800qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取10002-10004 1700qps
zrevrange
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取5697-5700 1670qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取500-502 13000qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取1500-1502 5600qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取10002-10004 950qps
ZRangeByScore(score从0--12000)
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取5697-5700 2700 qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取500-502 18000 qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取1500-1502 8500 qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取10002-10004 1600 qps
ZRevRangeByScore(score从0--12000)
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取5697-5700 1470qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取500-502 800qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取1500-1502 900qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取10002-10004 4200qps
pika 3.2 thread num: 12 Thread Pool Size 12 cpu: 370% 取11500-11502 13000qps
pika2.3-------------------------------------------------------------------
zrange
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取5697-5700 1200 qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取500-502 12000qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取1500-1502 4500qps 添加/删除/读取的频率一样的时候, (读写越频繁)性能下降比较厉害,只有580,
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取10002-10004 1200 qps
zrevrange
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取5697-5700 400qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取500-502 4800qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取1500-1502 1600qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取10002-10004 3400qps
ZRangeByScore(score从0--12000)
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取5697-5700 2800 qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取500-502 21000 qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取1500-1502 9300 qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取10002-10004 1600 qps
ZRevRangeByScore(score从0--12000)
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取5697-5700 1470qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取500-502 820qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取1500-1502 890qps
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取10002-10004 4300
pika 2.3 thread num: 12 Thread Pool Size 12 cpu: 370% 取11500-11502 13500
普通key的读速度大约是set的3倍,redis get/set速度是一样的