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 自行更新,不需要手动配置。但是需要确保文件名于正在运行的配置文件不冲突

image-20221217171913079

一般按照端口号进行区分,以及 daemonize yes 这个输出的 pid 文件可以用端口号进行区分。因为默认都是 6379 端口,需要用于标识不同的节点,防止不必要的冲突。

可以使用 vi 的命令将其批量替换端口号:%s/6379/port/g

有 6 个节点就都需要修改。

image-20221217172500028

所有节点的端口分别为:

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

image-20221217173511083

此时 redis 只是具备了集群的节点效果,但是这 6 个节点并没有构成一个集群。

并且所有的 redis 节点下都有一个 nodes-port.conf,集群配置文件,自动生成。

5. 将所有节点构建成真正的集群

redis-cli --cluster <ip:port|节点的IP和端口>... --cluster-replicas <num>

--cluster-replicas <num>:集群的主从复制设置,每个 master 中有 num 个 salve。

构建信息:

image-20221217175343941

6. 测试集群是否搭建成功

登录 redis 集群查看:

redis-cli -h ip -p port -c

不加 -c 可以登录,但是由于 Cluster 默认有分配槽功能,就是将数据根据算法分摊到指定的槽中,并不是所有槽都归一个节点管理,分开管理,如果经过算法分配到了其他节点的槽上,就需要到目标节点进行操作。但是我们并不知道具体位置,所以 -c 的作用就是帮我们实现自动重定向

尝试写入一些数据:

image-20221217175945500

可以看到当我们写入数据时,Cluster 默认会对 key 值使用 crc16 算法进行运算得到一个整数值,再与 16384 取模来得到具体槽位。

设置name "zhang san" 时分配的槽是 5798 该槽不是 7100 端口(当前登录的端口服务)所管理,所以将其定向到正确的端口:7101,并进行存值,同时还会完成登录端口的切换。

当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客 户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指 令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽 位映射表。

7. 注意

需要注意的是不论读写操作,都需要落实到指定端口和指定的槽中,其中会牵涉槽的重定向。

posted @ 2022-12-19 10:33  CN_DADA  阅读(22)  评论(0编辑  收藏  举报