conanan's blog conanan's blog
首页
关于
  • 分类
  • 标签
  • 归档
  • Java
  • Java Web
  • 工具

    • Maven
  • MySQL
  • Redis
  • Git
  • Vim
  • Nginx
  • Docker
GitHub

Evan Xu

前端界的小学生
首页
关于
  • 分类
  • 标签
  • 归档
  • Java
  • Java Web
  • 工具

    • Maven
  • MySQL
  • Redis
  • Git
  • Vim
  • Nginx
  • Docker
GitHub
  • 基础

  • 高级

  • 集群

    • 主从复制
    • 哨兵Sentinel
    • 集群
      • 业务发展过程中遇到的峰值瓶颈
      • 集群
        • 简介
        • 作用
      • 架构设计 🔥
        • 数据存储设计—数据分片
        • 集群内部通讯设计
        • 主从复制、Sentinel
      • 搭建方式1—集群自动搭建程序
        • 帮助
        • 创建集群
      • 搭建方式2—配置文件手动搭建
        • 方式1问题
        • 创建集群
      • 连接集群
        • redis-cli
        • 常用配置
        • 常用命令
  • Redis面试
  • Redis
  • 集群
conanan
2021-06-21

集群

# 集群

# 业务发展过程中遇到的峰值瓶颈

  • Redis 提供的服务 OPS 可以达到10万/秒,当前业务 OPS 已经达到20万/秒
  • 内存单机容量达到256G,当前业务需求内存容量1T。但内存也没有那么多

# 集群

# 简介

集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果。

Redis 集群是 3.0 版本引入的,在 5.0 后搭建更方便!

# 作用

  • 分散单台服务器的访问压力,实现负载均衡
  • 分散单台服务器的存储压力,实现可扩展性
  • 降低单台服务器宕机带来的业务灾难

# 架构设计 🔥

# 数据存储设计—数据分片

  • Redis 集群将整个数据库空间划分为16384个槽来实现数据分片。集群中各个 master 负责处理一部分的槽。每份槽代表的是一个存储空间,不是一个key的保存空间
  • 通过算法设计,计算出key应该保存的位置
  • 将key按照计算出的结果放到对应的存储空间
  • 集群添加节点时,会将相应的槽以及槽中存储的数据迁移至新节点!且都是在线进行!无需停机!

# 集群内部通讯设计

  • 各个数据库相互通信,保存各个库中槽的编号数据
  • 一次命中,直接返回
  • 一次未命中,告知具体位置。然后客户端访问**重定向(redirect)**的位置!
  • Redis 集群采用无代理模式,客户端的命令直接交由节点执行!对于优化过的集群客户端来说,大部分情况下命令不需要实施转向或仅需要一次转向

# 主从复制、Sentinel

Redis 集群也提供了与单机版 Redis 服务器一样的主从复制功能;

还提供了类似于单机版 Sentinel 的功能!当集群中的某个 master 下线时,会提升该节点的 slave 为新 master 继续提供服务

# 搭建方式1—集群自动搭建程序

# 帮助

在 utils/create-cluster/create-cluster 位置的 create-cluster 程序专门用来快速构建起一个完整可用的集群以供用户测试。

./create-cluster help可以查看用法

创建一个群集,请按照以下步骤进行:

  1. 编辑create-cluster,并更改开始/结束端口,这取决于要创建的实例数量。
  2. 使用"./creat-cluster start "来运行实例。
  3. 使用"./create-cluster create "来执行redis-cli --cluster create,这样将会创建一个Redis集群。(如果您通过本地容器访问您的设置,请确保CLUSTER_HOST值被更改为您的本地IP)
  4. 现在你已经准备好玩集群了。每个实例的AOF文件和日志会创建在在当前目录下。

停止一个集群:

  1. 使用"./cake-cluster stop "来停止所有实例。在你停止实例后,如果你改变主意,你可以使用"./cake-cluster start "来重新启动它们。
  2. 使用"./creat-cluster clean "删除所有AOF/日志文件,以干净的环境重新启动。

# 创建集群

通过执行start命令来创建出6个节点,这6个节点的IP地址都为本机,而端口号则为30001~30006

ubuntu@VM-0-3-ubuntu:/usr/local/redis-6.2.1/utils/create-cluster$ sudo ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
1
2
3
4
5
6
7

使用create命令,把上述6个节点组合成一个集群,其中包含3个主节点和3个从节点

ubuntu@VM-0-3-ubuntu:/usr/local/redis-6.2.1/utils/create-cluster$ sudo ./create-cluster create
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 01577c26ceb76eec6716563170826517f321d968 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: 97fd26fcdc24382afe81b8d0c45f514ecb67a2f8 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: 81c5a05a97fe697e834e388ce318f3bb2b6155cd 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: 7162dc4ebcb149b140639da0f229363276416a32 127.0.0.1:30004
   replicates 01577c26ceb76eec6716563170826517f321d968
S: e71361e154517888a63470b56343e16a88f91c6e 127.0.0.1:30005
   replicates 97fd26fcdc24382afe81b8d0c45f514ecb67a2f8
S: 3947e6ab1101ad12c8ddd18157edb7848712aa4a 127.0.0.1:30006
   replicates 81c5a05a97fe697e834e388ce318f3bb2b6155cd
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 127.0.0.1:30001)
M: 01577c26ceb76eec6716563170826517f321d968 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 7162dc4ebcb149b140639da0f229363276416a32 127.0.0.1:30004
   slots: (0 slots) slave
   replicates 01577c26ceb76eec6716563170826517f321d968
S: 3947e6ab1101ad12c8ddd18157edb7848712aa4a 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 81c5a05a97fe697e834e388ce318f3bb2b6155cd
M: 81c5a05a97fe697e834e388ce318f3bb2b6155cd 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 97fd26fcdc24382afe81b8d0c45f514ecb67a2f8 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e71361e154517888a63470b56343e16a88f91c6e 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 97fd26fcdc24382afe81b8d0c45f514ecb67a2f8
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

create命令会根据现有的节点制定出一个相应的角色和槽分配计划,然后询问你的意见。以上面打印出的计划为例:

  • 节点30001、30002和30003将被设置为主节点,并且分别负责槽0~5460、槽5461~10922和槽10923~16383。
  • 节点30004、30005和30006分别被设置为以上3个主节点的从节点。

搭建完成后的集群:

image-20210331002702476

# 搭建方式2—配置文件手动搭建

# 方式1问题

使用create-cluster程序快速搭建Redis集群虽然非常方便,但是由于该程序搭建的Redis集群不具备配置文件、主从节点数量固定以及槽分配模式固定等原因,这些快速搭建的集群通常只能够用于测试,但是无法应用在实际的生产环境中

搭建真正能够在生产环境中使用的Redis集群,我们需要创建相应的配置文件,并使用集群管理命令对集群进行配置和管理

# 创建集群

为了保证集群的各项功能可以正常运转,一个集群至少需要3个主节点和3个从节点。不过为了与之前使用create-cluster程序搭建的集群区别开来,这次我们将搭建一个由5个主节点和5个从节点组成的Redis集群。

我们需要先创建出10个文件夹,用于存放相应节点的数据以及配置文件

ubuntu@VM-0-3-ubuntu:/usr/local/redis-6.2.1/utils/create-cluster$ sudo mkdir my-cluster
ubuntu@VM-0-3-ubuntu:/usr/local/redis-6.2.1/utils/create-cluster$ cd my-cluster/
ubuntu@VM-0-3-ubuntu:/usr/local/redis-6.2.1/utils/create-cluster/my-cluster$ sudo mkdir node1 node2 node3 node4 node5 node6 node7 node8 node9 node10
1
2
3

接着,我们需要在每个节点文件夹中创建一个包含以下内容的redis.conf配置文件

cluster-enabled yes
port 30001
1
2
  • cluster-enabled选项的值为yes表示将Redis实例设置成集群节点而不是单机服务器
  • port选项则用于为每个节点设置不同的端口号。本例中,我们为10个节点分别设置了从30001~30010的端口号

在为每个节点都设置好相应的配置文件之后,我们需要通过以下命令(目录自己调整),陆续启动各个文件夹中的集群节点:

ubuntu@VM-0-3-ubuntu:/usr/local/redis-6.2.1$ src/redis-server /node1/redis.conf
1

连接这10个集群节点并为它们分配槽:

ubuntu@VM-0-3-ubuntu:/usr/local/redis-6.2.1$ src/redis-cli --cluster create 
127.0.0.1:30001
127.0.0.1:30002
127.0.0.1:30003
127.0.0.1:30004
127.0.0.1:30005
127.0.0.1:30006
127.0.0.1:30007
127.0.0.1:30008
127.0.0.1:30009
127.0.0.1:30010
-- cluster-replicas 1
1
2
3
4
5
6
7
8
9
10
11
12
  • redis-cli --cluster是Redis客户端附带的集群管理工具,它的create子命令接受任意多个节点的IP地址和端口号作为参数,然后使用这些节点组建起一个Redis集群。
  • cluster-replicas用于指定集群中每个主节点的从节点数量。在上面的命令调用中,该参数的值为1,这表示我们想要为每个主节点设置一个从节点

执行完上述命令后,会定制出节点角色、槽分配计划等(略)

# 连接集群

# redis-cli

使用Redis附带的redis-cli客户端,-c用于连接集群

ubuntu@VM-0-3-ubuntu:/usr/local/redis-6.2.1$ src/redis-cli -c -p 30001
127.0.0.1:30001>
1
2

# 常用配置

添加节点🔥

cluster-enabled yes|no
1

cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容

cluster-config-file <filename>
1

节点服务响应超时时间,用于判定该节点是否下线或切换为从节点🔥

cluster-node-timeout <milliseconds>
1

master连接的slave最小数量

cluster-migration-barrier <count>
1

# 常用命令

redis-cli 常用命令:

查看集群节点信息🔥

cluster nodes
1

进入一个从节点 redis,切换其主节点

cluster replicate <master-id>
1

发现一个新节点,新增主节点

cluster meet ip:port
1

忽略一个没有solt的节点

cluster forget <id>
1

手动故障转移

cluster failover
1
编辑
上次更新: 2021/06/21, 15:45:42
哨兵Sentinel
Redis面试

← 哨兵Sentinel Redis面试→

最近更新
01
线程生命周期
07-06
02
线程安全理论
06-24
03
并发简史
06-24
更多文章>
Theme by Vdoing | Copyright © 2019-2021 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×