目录
Redis5.0 集群搭建
创建多实例并使用 Redis 集群
Redis 集群由多个运行在集群模式(cluster mode)下的 Redis 实例组成
最少选项的集群配置redis.conf
port 7000
cluster-enabled yes //开实例的集群模式
cluster-config-file nodes-7000.conf //设定了保存节点配置文件的路径
cluster-node-timeout 5000
appendonly yes
daemonize yes //守护进行启动
bind 0.0.0.0 //绑定端口
protected-mode no //默认是设置成yes的, 防止了远程访问
节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。
要让集群正常运作至少需要三个主节点
强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。
linux多实例 ../redis-server ./redis.conf
因为 nodes-post.conf 文件不存在, 所以每个节点都为它自身指定了一个新的节点 ID
创建集群
Redis5.0中集群管理工具redis-trib.rb已经被废弃创建集群已经使用“redis-cli”来实现
./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
命令的意义如下:
create 表示我们希望创建一个新的集群
之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群
--replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
简单来说, 以上命令的意思就是创建一个包含三个主节点和三个从节点的集群。
集群的客户端
redis-cli 对集群的支持是非常基本的, 所以它总是依靠 Redis 集群节点来将它转向(redirect)至正确的节点
redis-cli -c -p 7000
对集群进行重新分片
重新分片操作基本上就是将某些节点上的哈希槽移动到另外一些节点上面, 和创建集群一样, 重新分片也可以使用 redis-trib 程序来执行。
执行以下命令可以开始一次重新分片操作:
./redis-cli --cluster reshard 127.0.0.1:7000
What is the receiving node ID 指定目标需要使用节点的 ID
Source node #1: all/ID 重新分片的源节点(source node)
Do you want to proceed with the proposed reshard plan (yes/no)? yes 确认
只需要指定集群中其中一个节点的地址, 就会自动找到集群中的其他节点。
在重新分片操作执行完毕之后, 可以使用以下命令来检查集群是否正常:
./redis-cli --cluster check 127.0.0.1:7000
再次重新分片
故障测试
列出集群中的所有主节点
redis-cli -p 7000 cluster nodes | grep master
发送 DEBUG SEGFAULT 命令, 让这个主节点崩溃
./redis-cli -p 7002 debug segfault
Redis 使用的是异步复制, 在执行故障转移期间, 集群可能会丢失写命令。
重启 ../redis-server ./redis.conf
./redis-cli -p 7000 cluster nodes
7002 变为7003的从节点
添加新节点到集群
根据新添加节点的种类, 我们需要用两种方法来将新节点添加到集群里面:
如果要添加的新节点是一个主节点, 那么需要创建一个空节点(empty node), 然后将某些哈希嘈移动到这个空节点里面。
如果要添加的新节点是一个从节点, 那么我们需要将这个新节点设置为集群中某个节点的复制品(replica)。
无论添加的是那种节点, 第一步要做的总是添加一个空节点。
继续使用之前启动 127.0.0.1:7000 、 127.0.0.1:7001 等节点的方法, 创建一个端口号为 7006 的新节点
./redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
命令中的 add-node 表示我们要 将一个节点添加到集群里面, add-node 之后跟着的是新节点的 IP 地址和端口号, 再之后跟着的是集群中任意一个已存在节点的 IP 地址和端口号
和其他主节点相比, 新节点还有两点区别:
新节点没有包含任何数据, 因为它没有包含任何哈希桶。
尽管新节点没有包含任何哈希嘈, 但它仍然是一个主节点, 所以在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中。
1. 将集群中的某些哈希嘈移动到新节点里面, 新节点就会成为真正的主节点
./redis-cli --cluster reshard 127.0.0.1:7000
2. 将一个新节点转变为某个主节点的复制品(也即是从节点)的方法
如果我们打算让新节点成为 127.0.0.1:7005 的从节点, 那么我们只要用客户端连接上新节点, 然后执行以下命令就可以了:
redis 127.0.0.1:7006> cluster replicate 主节点ID
命令确认 127.0.0.1:7006 已经成为了 ID 为 主节点ID 的节点的从节点
./redis-cli -p 7000 cluster nodes | grep slave | grep 主节点ID
#相关代码
./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000
./redis-cli -c -p 7007
127.0.0.1:7007> cluster replicate 24046002...
./redis-cli --cluster check 127.0.0.1:7000
./redis-cli -p 7000 cluster nodes | grep slave | grep
./redis-cli -p 7000 cluster nodes | grep slave | grep 24046002...
#列出集群中的所有主节点
redis-cli -p 7000 cluster nodes | grep master
移除一个节点
./redis-cli --cluster help del-node host:port node_id
#删除从节点
./redis-cli --cluster del-node 127.0.0.1:7000 10363eb...
#删除主节点
#如果主节点有从节点,将从节点转移到其他主节点
#如果主节点有slot,去掉分配的slot,然后在删除主节点
./redis-cli --cluster del-node 127.0.0.1:7000 108929...
[ERR] Node 127.0.0.1:7003 is not empty! Reshard data away and try again.
[ERR] 哈希槽非空
#重新分片去掉所有哈希槽
./redis-cli --cluster reshard 127.0.0.1:7000
#重新分片后从节点也自动转移到其他主节点了
./redis-cli --cluster del-node 127.0.0.1:7000 10363eb...