Appearance
Tendis集群部署替代Redis集群
上传并解压通用版本部署包
上传linux-Generic的通用版本tendisplus-X.Y.Z-rocksdb-vx.y.z.tgz并解压下载地址:Tendis,此处以tendisplus-2.7.0-rocksdb-v8.5.3版本为例
bash
$ tar -zxvf tendisplus-2.7.0-rocksdb-v8.5.3.tgz
进入Tendis目录
bash
$ cd tendisplus-2.7.0-rocksdb-v8.5.3
普通使用(单实例)
执行./scripts/start.sh
即可启动tendis单实例
集群部署
1. 修改配置文件
为各个实例配置对应配置文件,如tendisplus.conf.7000. 配置文件必须确保cluster-enabled
为yes. 参考如下7000端口实例配置文件tendisplus.conf.7000
:
ssh-config
# 实例监听端口
port 7000
# 实例监听地址
bind 10.111.62.238
# 额外监听地址(此地址不能用于创建集群)
bind2 10.111.62.238
# 静默启动
daemon on
# 日志级别
loglevel warning
# 数据和日志目录要提前创建
logdir ./7000/log
dumpdir ./7000/dump
dir ./7000/db
pidfile ./7000/tendisplus.pid
slowlog ./7000/log/slowlog
# rocksdb 中所有运行 compaction 和 flush 操作的线程总数
rocks.max_background_jobs 4
# tendis的密码,按需指定
requirepass 123456
masterauth 123456
# 开启集群模式
cluster-enabled yes
storage rocks
# rocksdb的blockcache大小,建议使用30%系统内存(1GB)
rocks.blockcachemb 1024
# CPU相关配置:
include tendisplus.conf.4core
创建CPU相关配置文件
文件名与include
中的值一致,或者直接将配置添加到各个实例配置对应配置文件中
16核CPU的配置文件
tendisplus.conf.16core:
ssh-config
# 网络线程池数量,建议cpu数量/4,
netiothreadnum 4
# 工作线程池数量,建议略多于cpu数量
executorthreadnum 12
executorWorkPoolSize 4
rocks.max_background_jobs 12
8核CPU的配置文件
tendisplus.conf.8core:
ssh-config
netiothreadnum 2
executorthreadnum 6
executorWorkPoolSize 2
rocks.max_background_jobs 6
4核CPU的配置文件
tendisplus.conf.4core:
ssh-config
# 网络线程池数量,建议cpu数量/4
netiothreadnum 1
# 工作线程池数量,建议略多于cpu数量
executorthreadnum 4
executorWorkPoolSize 2
rocks.max_background_jobs 4
2核CPU的配置文件
tendisplus.conf.2core:
ssh-config
netiothreadnum 1
executorthreadnum 2
executorWorkPoolSize 1
rocks.max_background_jobs 2
1核CPU的配置文件
tendisplus.conf.2core:
ssh-config
netiothreadnum 1
executorthreadnum 1
executorWorkPoolSize 1
rocks.max_background_jobs 1
2. 启动实例
1. 普通启动实例
bash
./bin/tendisplus ./tendis.conf.7000
./bin/tendisplus ./tendis.conf.7001
./bin/tendisplus ./tendis.conf.7002
./bin/tendisplus ./tendis.conf.7003
./bin/tendisplus ./tendis.conf.7004
./bin/tendisplus ./tendis.conf.7005
如上所示,拉起了6个tendis进程,端口号分别是7000~7005
2. 使用脚本启动(推荐)
创建节点启动脚本,参考以下脚本创建节点启动脚本start.sh
bash
#!/bin/bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./bin/deps
# 定义起始端口和结束端口
start=7000
end=7005
# 使用for循环遍历整数范围,seq指定起始值、增量和结束值,默认1可省略
for i in `seq $start $end`
do
#为不同端口创建文件夹
dir=$i
mkdir -p ${dir}/db
mkdir -p ${dir}/dump
mkdir -p ${dir}/log
#启动不同端口的tendis
echo "正在启动端口为$i的tendis实例"
conf_file=`ls ./tendisplus.conf.$i`
if [ "$conf_file" = "" ];then
echo "配置文件$conf_file不存在,退出!"
exit 1
fi
./bin/tendisplus $conf_file
done
ps -ef|grep tendisplus
执行启动脚本start.sh
完成端口号分别是7000~7005的6个tendis节点启动
3. 创建集群
拉起tendis服务进程之后,就可以像使用类似Redis
命令一样来建立tendis集群. Tendis存储版
支持使用Redis
语法创建Tendis集群.
1. 节点握手
连接7000节点meet其他所有节点 注意:此处meet节点ip不能是配置文件中bind2
的地址
bash
shell> ./bin/redis-cli -h 10.111.62.238 -p 7000 -a 123456
10.111.62.238:7000> cluster meet 10.111.62.238 7001
10.111.62.238:7000> cluster meet 10.111.62.238 7002
10.111.62.238:7000> cluster meet 10.111.62.238 7003
10.111.62.238:7000> cluster meet 10.111.62.238 7004
10.111.62.238:7000> cluster meet 10.111.62.238 7005
2. 分配slots
默认情况下,Tendis存储版
跟Redis
一样,将所有的数据映射到16384个slot中,每个key都会对应一个槽。只有把slot分配给了Tendis节点,Tendis节点才能响应与slot相关的命令,否则就会-MOVE
到其他节点。
分配slots可使用cluster add slots
指令
bash
shell> ./bin/redis-cli -h 10.111.62.238 -p 7000 -a 123456 cluster addslots {0..5461}
OK
shell> ./bin/redis-cli -h 10.111.62.238 -p 7001 -a 123456 cluster addslots {5462..10922}
OK
shell> ./bin/redis-cli -h 10.111.62.238 -p 7002 -a 123456 cluster addslots {10923..16383}
OK
上面的命令将16384个slots平均的分配给7000至7002的3个节点。
等待若干秒后,可以通过cluster info
指令查看集群状态。
bash
shell> ./bin/redis-cli -h 10.111.62.238 -p 7000 -a 123456
10.111.62.238:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
...
此时可以发现集群状态已经是OK。
3. 配置主从复制
7000至7002的3个节点分配了slots,剩余三个实例可以作为他们的slave,使用cluster replicate
命令将剩余节点配置为从节点。如果多个服务间创建集群需要保证集群通信端口可互相访问,即1+节点端口,例如:节点端口7000集群端口为17000
,与Redis一致
首先查看节点id
bash
shell> ./bin/redis-cli -h 10.111.62.238 -p 7000 -a 123456
10.111.62.238:7000> cluster nodes
a629eb35d5d5129b35c56b3f5625010cda606c66 10.111.62.238:7005@17005 master - 0 1723728878857 2 connected
13849c1c5bad0ea7083cad9ee74abb0275d5642e 10.111.62.238:7003@17003 master - 0 1723728879858 3 connected
7d6170c8c95aa5a0114006822c26b583ebe4efe6 10.111.62.238:7004@17004 master - 0 1723728877855 5 connected
1112a0bf55f972ab8aa1d1d3e1a4cb141b209097 10.111.62.238:7002@17002 master - 0 1723728876000 2 connected 10923-16383
111555cfcbf961a4b79350657ef2c7c4cd932e6d 10.111.62.238:7001@17001 master - 0 1723728877000 1 connected 5462-10922
2ef6ae4ba62e0803e9ad4de283bdf9e99926e8db 10.111.62.238:7000@17000 myself,master - 0 1723728878000 4 connected 0-5461
将未分配slots的节点配置为从节点,cluster replicate
命令的末尾参数为已分配slots的主节点id
shell
shell> ./bin/redis-cli -h 10.111.62.238 -p 7003 -a 123456 cluster replicate 2ef6ae4ba62e0803e9ad4de283bdf9e99926e8db
OK
shell> ./bin/redis-cli -h 10.111.62.238 -p 7004 -a 123456 cluster replicate 111555cfcbf961a4b79350657ef2c7c4cd932e6d
OK
shell> ./bin/redis-cli -h 10.111.62.238 -p 7005 -a 123456 cluster replicate 1112a0bf55f972ab8aa1d1d3e1a4cb141b209097
OK
这样,就可以搭建一个三主三从的集群
检查集群相关信息如下:
bash
shell> ./bin/redis-cli -h 10.111.62.238 -p 7000 -a 123456
10.111.62.238:7000> cluster info
cluster_state:ok
cluster_slots_assigend:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_ping_sent:4553
cluster_stats_messages_pong_sent:4545
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:9103
cluster_stats_messages_ping_received:4545
cluster_stats_messages_pong_received:4558
cluster_stats_messages_received:9103
cluster_disk_check_sucess:1
cluster_disk_check_time_ms_ago:153
bash
shell> ./bin/redis-cli -h 10.111.62.238 -p 7000 -a 123456
10.111.62.238:7000> cluster nodes
a629eb35d5d5129b35c56b3f5625010cda606c66 10.111.62.238:7005@17005 slave 1112a0bf55f972ab8aa1d1d3e1a4cb141b209097 0 1723728878857 2 connected
13849c1c5bad0ea7083cad9ee74abb0275d5642e 10.111.62.238:7003@17003 slave 111555cfcbf961a4b79350657ef2c7c4cd932e6d 0 1723728879858 3 connected
7d6170c8c95aa5a0114006822c26b583ebe4efe6 10.111.62.238:7004@17004 slave 2ef6ae4ba62e0803e9ad4de283bdf9e99926e8db 0 1723728877855 5 connected
1112a0bf55f972ab8aa1d1d3e1a4cb141b209097 10.111.62.238:7002@17002 master - 0 1723728876000 2 connected 10923-16383
111555cfcbf961a4b79350657ef2c7c4cd932e6d 10.111.62.238:7001@17001 master - 0 1723728877000 1 connected 5462-10922
2ef6ae4ba62e0803e9ad4de283bdf9e99926e8db 10.111.62.238:7000@17000 myself,master - 0 1723728878000 4 connected 0-5461
部署Tendis集群
的方式,基本和Redis
集群一致。
4. 编写停止脚本
参考如下脚本编写集群停止脚本stop.sh
bash
#!/bin/bash
# 定义服务器ip,与配置文件中的bind值一致
ip=10.111.62.238
#连接密码
requirepass=123456
# 定义起始端口和结束端口
start=7000
end=7005
# 使用for循环遍历端口
for i in `seq $start $end`
do
port=$i
echo "正在停止端口为$port的tendis实例"
echo shutdown |./bin/redis-cli -h ${ip} -p ${port} -a ${requirepass}
done
ps -ef|grep tendisplus