10. Redis 集群

10. Redis 集群

Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求

Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,对数据进行分片,也就是说每台 Redis 节点上存储不同的内容;

在这里插入图片描述

这里的6台redis两两之间并不是独立的,每个节点都会通过集群总线(cluster bus),与其他的节点进行通信。通讯时使用特殊的端口号,即对外服务端口号加10000。例如如果某个node的端口号是6379,那么它与其它nodes通信的端口号是16379。nodes之间的通信采用特殊的二进制协议。

对客户端来说,整个cluster被看做是一个整体,客户端可以连接任意一个node进行操作,就像操作单一Redis实例一样,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node,这有点儿像浏览器页面的302 redirect跳转。

根据官方推荐,集群部署至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式。测试时,也可以在一台机器上部署这六个实例,通过端口区分出来。

10.1 测试规划

这里准备三台测试机,每台机器分别配置两个 server

ip端口
192.168.169.1506379
192.168.169.1506380
192.168.169.1516379
192.168.169.1516380
192.168.169.1526379
192.168.169.1526380

10.2 修改配置文件

修改 redis.conf 配置文件

注意:除去与端口相关的配置所有机器都是相同的,注意端口不通,与之相关的配置也不同

# 修改绑定地址,所有机器都可以访问
bind 0.0.0.0 -::1

# 关闭保护模式(这里我不知道是我误操作开启的还是默认就是开启的,后期在测)
protected-mode no

# 配置端口号(例如使用 6380 ,这里就需要改成 6380)
port 6379

# 配置后台启动
daemonize yes

# 这里注意根据端口号配置相对应的 pid 文件
pidfile /var/run/redis_6379.pid

# 配置 log 日志文件,便于后期查看日志
logfile "/opt/tools/redis/log/redis.log"

# 开启集群模式
cluster-enabled yes


# 配置集群模式对应的文件路径,这个在启动之后会自动生成,但是这个路径自定义比较好(例如这里的配置 cluster-config-file nodes-6379.conf 默认在 root 目录下生成
cluster-config-file nodes-6379.conf


其他的本次测试使用默认配置

10.2 启动 redis-server

# 借助 redis-tri.rb 工具可以快速的部署集群,随便在一台机器上执行
[root@master ~]# redis-cli --cluster create --cluster-replicas 1 192.168.169.150:6379 192.168.169.150:6380 192.168.169.151:6379 192.168.169.151:6380 192.168.169.152:6379 192.168.169.152:6380
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.169.151:6380 to 192.168.169.150:6379
Adding replica 192.168.169.152:6380 to 192.168.169.151:6379
Adding replica 192.168.169.150:6380 to 192.168.169.152:6379
M: ad83c675b1a31cf11616c84549880b51f34f886e 192.168.169.150:6379
   slots:[0-5460] (5461 slots) master
S: e50610618db79253f560120007e512d5c6fa1b08 192.168.169.150:6380
   replicates 20afbaf09cd75306d1b796659b25e360a28e6410
M: fdf6baa828932e3905aa155ba0ceb0c5bc476a3c 192.168.169.151:6379
   slots:[5461-10922] (5462 slots) master
S: ac27bc9ed55db193b39a56507f040bd8d837ef23 192.168.169.151:6380
   replicates ad83c675b1a31cf11616c84549880b51f34f886e
M: 20afbaf09cd75306d1b796659b25e360a28e6410 192.168.169.152:6379
   slots:[10923-16383] (5461 slots) master
S: d02f284d2d882e10f1be0eee58dc2713eff79a89 192.168.169.152:6380
   replicates fdf6baa828932e3905aa155ba0ceb0c5bc476a3c
Can I set the above configuration? (type 'yes' to accept): yes				# 这里会让人工确认,是否确认上述配置
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.169.150:6379)
M: ad83c675b1a31cf11616c84549880b51f34f886e 192.168.169.150:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: fdf6baa828932e3905aa155ba0ceb0c5bc476a3c 192.168.169.151:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e50610618db79253f560120007e512d5c6fa1b08 192.168.169.150:6380
   slots: (0 slots) slave
   replicates 20afbaf09cd75306d1b796659b25e360a28e6410
S: ac27bc9ed55db193b39a56507f040bd8d837ef23 192.168.169.151:6380
   slots: (0 slots) slave
   replicates ad83c675b1a31cf11616c84549880b51f34f886e
M: 20afbaf09cd75306d1b796659b25e360a28e6410 192.168.169.152:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: d02f284d2d882e10f1be0eee58dc2713eff79a89 192.168.169.152:6380
   slots: (0 slots) slave
   replicates fdf6baa828932e3905aa155ba0ceb0c5bc476a3c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

在这里插入图片描述

  • 登陆集群
[root@master ~]# redis-cli -c -p 6379

-c	表示集群模式登陆

在这里插入图片描述

# 如果使用 redis-cli -p 6379 登陆,会出现 moved 转移情况,当然在一定概率下也会写入成功,写入成功的数据就是使用的登陆的机器
[root@master ~]# redis-cli -p 6379
127.0.0.1:6379> set k6 v6
OK
127.0.0.1:6379> get k6
"v6"
127.0.0.1:6379> set k7 v7
OK
127.0.0.1:6379> set k8 v8
(error) MOVED 8331 192.168.169.151:6379
127.0.0.1:6379> 

在这里插入图片描述

10.4 测试

  • 查看信息
127.0.0.1:6379> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:87
cluster_stats_messages_pong_sent:101
cluster_stats_messages_sent:188
cluster_stats_messages_ping_received:96
cluster_stats_messages_pong_received:87
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:188
total_cluster_links_buffer_limit_exceeded:0
127.0.0.1:6379> CLUSTER NODES				# 查看节点信息
fdf6baa828932e3905aa155ba0ceb0c5bc476a3c 192.168.169.151:6379@16379 master - 0 1655882789000 3 connected 5461-10922
e50610618db79253f560120007e512d5c6fa1b08 192.168.169.150:6380@16380 slave 20afbaf09cd75306d1b796659b25e360a28e6410 0 1655882789682 5 connected
ad83c675b1a31cf11616c84549880b51f34f886e 192.168.169.150:6379@16379 myself,master - 0 1655882787000 1 connected 0-5460
ac27bc9ed55db193b39a56507f040bd8d837ef23 192.168.169.151:6380@16380 slave ad83c675b1a31cf11616c84549880b51f34f886e 0 1655882788000 1 connected
20afbaf09cd75306d1b796659b25e360a28e6410 192.168.169.152:6379@16379 master - 0 1655882790706 5 connected 10923-16383
d02f284d2d882e10f1be0eee58dc2713eff79a89 192.168.169.152:6380@16380 slave fdf6baa828932e3905aa155ba0ceb0c5bc476a3c 0 1655882789000 3 connected

  • 写入数据
127.0.0.1:6379> set k1 v1
-> Redirected to slot [12706] located at 192.168.169.152:6379		# 这里指明了写入在那台机器上
OK
192.168.169.152:6379> get k1
"v1"
192.168.169.152:6379> set k2 v2
-> Redirected to slot [449] located at 192.168.169.150:6379
OK
192.168.169.150:6379> set k3 v3
OK
192.168.169.150:6379> set k4 v4
-> Redirected to slot [8455] located at 192.168.169.151:6379
OK
192.168.169.151:6379> set k5 v5
-> Redirected to slot [12582] located at 192.168.169.152:6379
OK
192.168.169.152:6379> 

在这里插入图片描述

10.5 redis cluster 如何分配这六个节点?

注意:

  • 一个集群至少要有三个主节点。
  • 选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
  • 分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上

10.6 什么是 slots

原文链接:https://juejin.cn/post/6844903850529259528

Redis Client Slots 命令用于当前的集群状态,以数组形式展示。

在这里插入图片描述

192.168.169.151:6379> CLUSTER SLOTS
1) 1) (integer) 0
   2) (integer) 5460
   3) 1) "192.168.169.150"
      2) (integer) 6379
      3) "ad83c675b1a31cf11616c84549880b51f34f886e"
      4) (empty array)
   4) 1) "192.168.169.151"
      2) (integer) 6380
      3) "ac27bc9ed55db193b39a56507f040bd8d837ef23"
      4) (empty array)
2) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "192.168.169.151"
      2) (integer) 6379
      3) "fdf6baa828932e3905aa155ba0ceb0c5bc476a3c"
      4) (empty array)
   4) 1) "192.168.169.152"
      2) (integer) 6380
      3) "d02f284d2d882e10f1be0eee58dc2713eff79a89"
      4) (empty array)
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "192.168.169.152"
      2) (integer) 6379
      3) "20afbaf09cd75306d1b796659b25e360a28e6410"
      4) (empty array)
   4) 1) "192.168.169.150"
      2) (integer) 6380
      3) "e50610618db79253f560120007e512d5c6fa1b08"
      4) (empty array)
192.168.169.151:6379> 

 
 
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值