install redis cluster

下载新版 redis

redis 地址

1
2
3
4
5
cd /usr/local/redis/
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar xzf redis-6.0.9.tar.gz
cd redis-6.0.9
make

创建路径

1
2
3
mkdir /usr/local/redis-cluster
cd redis-cluster/
mkdir -p 7000/data 7001/data 7002/data 7003/data 7004/data 7005/data

复制 redis 脚本

1
2
3
mkdir /usr/local/redis-cluster/bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin

复制实例并修改配置

1
2
cp /usr/local/redis/redis-6.0.9/* /usr/local/redis-cluster/7000/
vim /usr/local/redis-cluster/7000/redis.conf

注意修改下列配置文件项,其余自行决定修改

1
2
3
4
5
6
7
8
9
port 7000(每个节点的端口号)
daemonize yes
bind 192.168.119.131(绑定当前机器 IP,默认本机 127.0.0.1)
dir /usr/local/redis-cluster/7000/data/(数据文件存放位置)
pidfile /var/run/redis_7000.pid(pid 7000和port要对应)
cluster-enabled yes(启动集群模式)
cluster-config-file nodes7000.conf(7000和port要对应)
cluster-node-timeout 15000
appendonly yes

最重要的 cluster 三个配置项 取消注释
重复另外5个节点。可以将 7000/ 复制到其他的目录。vim 进入后可以全局替换

1
:%s/7000/7001/g

启动集群

1
2
3
4
5
6
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/7000/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/7001/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/7002/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/7003/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/7004/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/7005/redis.conf

创建集群

1
/usr/local/redis-cluster/bin/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

期间会询问主从节点,是否同意?一般没特殊的,前三个主节点,后3个从节点。

调试

注意使用 -c 参数来启动集群模式

1
/usr/local/redis-cluster/bin/redis-cli -c -h 127.0.0.1 -p 7000 

动态扩容、增加节点和减少节点,重新分配槽大小等

redis集群有 16384 个slot。
新增节点很方便

1
2
3
4
5
//新增了主节点
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7001

//新增从节点
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 --cluster-slave --cluster-master-id *****

新增后需要重新分配 slot

1
redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from 1c08b1c921ab1e646323474c09113de627491c11 --cluster-to 8537eee4ae61a744feb1c805e5d0df18ffd5b00a --cluster-slots 1024 --cluster-yes --cluster-timeout 50000 --cluster-replace

动态扩容可以写脚本,或者一般云服务提供商都有成熟方案。
期间有几个致命问题

1
2
3
1.整体搬迁延迟,大 Key 的问题。需要设定阈值,超过阈值不搬迁,但这不是很好的方案,而且阈值不好定
2.搬迁过程中,多 key 会存在访问错误。mget/mset 会报错,slave 读取会出现空数据或者 loading 错误
3.扩容速度会占用 cpu。单个 redis qps 上限8万,每秒搬1万个,就至少占用12.5的