Redis——05 学习
Redis——05
之前了解了主从复制以及哨兵,接下来了解集群模式。
集群(Cluster)
先来聊一下前面学的哨兵 Sentinel
,一般利用哨兵对 master 节点继续监控,如果 master 发生异常,则会做主从切换,将某一台 salve 作为 master。那么这有一个问题,只有一个 master 对外提供服务,没法支持高并发,且单个节点的内存有限,持久化文件也不能过大,影响恢复和主从同步的效率。并且不需要设置 Sentinel
也能完成节点移除和故障转移的功能。
redis 3.0 后加入的 Cluster 模式,采用无中心节点方式,可水平扩展。
集群简单部署:
1. 创建 Cluster 模型文件夹
在一台虚拟机进行演示,创建 redis-cluster
作为 Cluster 模型部署的文件夹。
2. 部署干净的 Redis 目录。
采用 6 个节点,一主一从,3 个 master 以及 3 个 salve。
注意:Redis Cluster 至少需要三个主节点才能工作
3. 修改配置文件
每份 redis 中的 redis.conf
不需要去特定的设置主从关系,暂时将其看作集群中的普通节点。
- 修改端口号
- cluster-enable:是否集群
- cluster-nodes-timeout:节点互联超时实际,毫秒为单位
- cluster-config-file:集群配置文件,由 Redis 自行更新,不需要手动配置。但是需要确保文件名于正在运行的配置文件不冲突
一般按照端口号进行区分,以及 daemonize yes
这个输出的 pid
文件可以用端口号进行区分。因为默认都是 6379 端口,需要用于标识不同的节点,防止不必要的冲突。
可以使用 vi 的命令将其批量替换端口号:%s/6379/port/g
。
有 6 个节点就都需要修改。
所有节点的端口分别为:
master:
- 7100
- 7101
- 7102
salve:
- 7103
- 7104
- 7105
一开始并没有 master 和 salve 之分,只有在正式构建集群时才会分配。
4. 启动所有节点
编写 shell 脚本启动。
cd redis-m1
bin/redis-server redis.conf
cd ../redis-m2
bin/redis-server redis.conf
cd ../redis-m3
bin/redis-server redis.conf
cd ../redis-s1
bin/redis-server redis.conf
cd ../redis-s2
bin/redis-server redis.conf
cd ../redis-s3
bin/redis-server redis.conf
此时 redis 只是具备了集群的节点效果,但是这 6 个节点并没有构成一个集群。
并且所有的 redis 节点下都有一个 nodes-port.conf
,集群配置文件,自动生成。
5. 将所有节点构建成真正的集群
redis-cli --cluster <ip:port|节点的IP和端口>... --cluster-replicas <num>
--cluster-replicas <num>
:集群的主从复制设置,每个 master 中有 num 个 salve。
构建信息:
6. 测试集群是否搭建成功
登录 redis 集群查看:
redis-cli -h ip -p port -c
不加 -c
可以登录,但是由于 Cluster 默认有分配槽功能,就是将数据根据算法分摊到指定的槽中,并不是所有槽都归一个节点管理,分开管理,如果经过算法分配到了其他节点的槽上,就需要到目标节点进行操作。但是我们并不知道具体位置,所以 -c
的作用就是帮我们实现自动重定向。
尝试写入一些数据:
可以看到当我们写入数据时,Cluster 默认会对 key 值使用 crc16 算法进行运算得到一个整数值,再与 16384 取模来得到具体槽位。
设置name "zhang san"
时分配的槽是 5798
该槽不是 7100 端口(当前登录的端口服务)所管理,所以将其定向到正确的端口:7101,并进行存值,同时还会完成登录端口的切换。
当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客 户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指 令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽 位映射表。
7. 注意
需要注意的是不论读写操作,都需要落实到指定端口和指定的槽中,其中会牵涉槽的重定向。