Redis存在三种模式:主从模式,哨兵模式和集群模式。对于集群模式的话,用于生产实践中是最多的,因为其利用了分片的思想,对其水平扩展很友好。
本文主要讲述Redis集群模式搭建过程以及一些注意事项,包括集群搭建后的水平扩容和缩容。原谅小编没有那么多机器,所以只能搭建一个伪集群模式,完全不影响搭建的过程,因为真正集群模式的话在不同的机器上,伪集群的话在相同的机器上,所以对于每一个实例只要做到端口号不一样就可以了。
1.搭建集群
1.下载redis
wget https://download.redis.io/releases/redis-6.0.8.tar.gz
2.解压redis
tar -zxvf redis-6.0.8.tar.gz
解压后你会发现如下的两个文件
1.创建myredis的目录[可自定义],在该目录下创建redis9000的文件夹。该文件夹用于存放redis.conf文件,因为后期启动redis要根据这个文件;
2.拷贝redis-6.0.8目录下的redis.conf文件到redis9000文件夹。 cp ./redis-6.0.8/redis.conf ./myredis/redis9000/
3.修改redis9000文件夹下的redis.conf配置文件
bind 127.0.0.1 ##这个ip就是springboot项目中集成redis需要填的ip 如果只是本地的话 修改成你的本地机器ip;如果是远程的话 填的公网ip
port 6379 #因为我的是伪集群 所以通过端口号来区分实例 这里我改成9000 和文件夹名字对应
daemonize #开启守护进程
pidfile /var/run/redis_9000.pid #我这里伪分布式 得改成对应端口号
dbfilename dump9000.rdb #端口号区分
dir ./ #默认是在启动时的文件下生成对应的文件 由于伪集群如果用同一个文件夹会产生文件冲突问题。这里得修改成redis9000文件夹路径 可用pwd命令查看一下
appendfilename "appendonly.aof" #这里改成 appendfilename "appendonly9000.aof"
cluster-enabled yes #开启集群模式
cluster-config-file nodes-6379.conf # 开启 node-6379要改成node-9000
cluster-node-timeout 15000
cluster-replica-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
cluster-replica-no-failover no
4.sed ‘s/9000/9001/g’ redis9000/redis.conf > redis9001/redis.conf 将redis9000文件夹下的redis.conf文件中的所有0000替换成9001
依次执行到9007,结果如下:
使用redis-server命令根据对应的配置启动redis服务端:
redis-server ./redis9000/redis.conf
依次启动到redis9005,总共有六台,使用ps -ef | grep redis
查看 并且机器后面时cluster字样!
此时可以使用redis的客户端进行连接但是不能写入数据,使用
cluster info
命令查看时,该状态为fail,因为此时还没有分配槽位。
5.初始化cluster集群,做了三件事:1. 使用cluster meet {ip} {port}
让cluster之间相互握手;2.指派槽位;3.分配主从(cluster replicate node-id
);
redis客户端提供了一条命令完成上述三件事:
redis-cli --cluster create {yourip}:9000 {yourip}:9001 {yourip}:9002 {yourip}:9003 {yourip}:9004 {yourip}:9005 --cluster-replicas 1
该命令执行后完成整个集群模式初始化,最后一个参数1表示主从按照1:1的方式配置,后面三台是前面三台的从节点。Note: redis集群模式至少三个
6.客户端连接
a). 使用redis-cli -h {ip} -p {port} 连接执行某个key属于其他节点的时候,会提示(error) MOVED 6918 10.100.113.38:9001;
b). 使用redis-cli -h {ip} -p {port} -c使用集群模式连接会直接redirect到对应的节点上;
上述的自动跳转是redis的客户端工具特有的,在集群模式下可以redirect到对应key的实例上,但是对于jedis客户端是不支持自动redirect,和第一种一样 会产生一个错误。
cluster node 查看集群信息
cluster slotkey {key} 查看slot位置
上述整个过程完成redis集群的搭建,接下来主要讲述redis集群的水平扩容和缩容。
2.集群扩容
在上述搭建的过程中的是0-5这六个实例,还有6-7这两个实例还有没有启动,这时启动这两个实例加入集群。
扩容主要做了三件事:1.加入集群;2.设置主从关系;3分配slot;
在使用cluster nodes
命令查看刚刚启动的那两个实例,由于没有加入之前的集群中,并且没有从节点,所以主节点和丛节点都是当前节点,接下来就是将9007这个节点设置为9006节点的丛节点,9006以主节点的身份加入集群中。
加入集群的命令:redis-cli --cluster add-node {当前节点ip}:9006 {集群中任意节点ip}:9000
以从节点的身份加入集群: redis-cli --cluster add-node {当前节点ip}:9007 {集群中任意节点ip}:9000 --cluster-slave --cluster-master-id 411fa6bdfc53c09cbed87be2e62f5fcac5cc05db
411这个串数字是集群中的实例id,可以理解成身份id。
这时9006这个实例还没有对应的slot,需要对其进行分配
分配槽位的命令: redis-cli --cluster reshard {集群中任意节点ip}:9000
,会出现如下结果
两种模式说明:
all:上述说明要迁移5000个槽位,all模式会基于集群中主节点个数,将5000槽位除以主节点个数number,然后在每个主节点中迁移number个槽位;
done:通过自定义的方式,例如上述我有三个主节点,我只输入了两个节点,意味着这5000槽位得在这两个节点中每个主节点平均提供2500出来;
3.集群缩容
1.缩容命令: redis-cli --cluster reshard --cluster-from {需要迁移的实例id 411fa6bdfc53c09cbed87be2e62f5fcac5cc05db} --cluster-to {迁移目标实例id c0a88db56e023130582651ac6a262a3e36ceaaa5} --cluster-slots {槽位数 5000} {任意节点ip} 9000
2.删除节点:先删除丛节点再删除主节点,如果先删主节点会导致丛节点故障转移变成主节点。
redis-cli --cluster del-node {任意节点ip}:9000 fa5316bdebbe956f50939455d65aa5597bdfe5cc
4.总结
本文讲述集群搭建的过程,以及水平扩容和缩容。集群模式的搭建步骤:
- 配置文件开启集群模式,并根据该配置文件启动server端;
- 将启动的server分配主从关系并加入集群;
- 指派slot槽位就可以使用了;
对于扩容的话会导致slot槽位移动,如果客户端使用-c 的集群模式访问的话会自动重定向到某个节点,如果是普通模式访问的话会出现错误。对于Jedis的话是没有集群模式访问的,会返回错误。如果用redis cluster模式的话会有重试机制,根据返回的异常刷新slot和集群映射关系,实现后续的正常访问。