Skip to content

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