• REDIS04_主从复制概述及搭建、反客为主、薪火相传、原理、哨兵模式、集群搭建


    ①. 主从复制 - 概述

    • ①. 概念:主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower)数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)

    • ②. 默认情况下,每台Redis服务器都是主节点,一个主节点可以有0个或者多个从节点,但每个从节点只能有一个主节点

    • ③. 主从复制作用

    1. 读写分离,性能扩展(主节点负责写入、从节点负责读取)
    2. 容灾快速恢复(一般建议配置一主多从的方式、当从服务器A出现问题,可以快速切换到从服务器B)
    3. 如果当主服务器出现问题呢?这个时候可以配置一主多从集群模式A、B,A、B之间建立某种联系,当主A出现问题,马上可以切换到主B

    在这里插入图片描述

    ②. 主从复制 - 环境搭建

    • ①. 查看当前库的信息:info replication
    127.0.0.1:6379> info replication
    # Replication
    role:master # 角色 master:主节点
    connected_slaves:0 # 从机数量:0
    master_replid:425bbc84c7141a0738b5d0d6cd6920a756e334e4
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    127.0.0.1:6379>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • ②. 既然需要启动多个服务,就需要配置多个配置文件。每个配置文件对应修改以下信息:
      (端口号、pid文件名、日志文件名、rdb文件名)
    [root@TANG2021 kconfig]# # redis.conf 【备份不使用,不修改】
    [root@TANG2021 kconfig]# cp redis.conf redis_master79.conf
    [root@TANG2021 kconfig]# cp redis.conf redis_sub80.conf 
    [root@TANG2021 kconfig]# cp redis.conf redis_sub81.conf 
    [root@TANG2021 kconfig]# ls
    redis.conf  redis_master79.conf  redis_sub80.conf  redis_sub81.conf
    [root@TANG2021 kconfig]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • ③. 编辑redis-conf配置文件
    [root@TANG2021 kconfig]# vi redis_master79.conf 
    [root@TANG2021 kconfig]# vi redis_sub80.conf 
    [root@TANG2021 kconfig]# vi redis_sub81.conf 
    
    • 1
    • 2
    • 3
    # redis.conf 【备份不使用,不修改】
    # 端口号
    port 6379
    # 日志文件名
    logfile ""
    # pid文件名
    pidfile /var/run/redis_6379.pid
    # rdb文件名
    dbfilename dump.rdb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    # redis_master79.conf 【做主节点】
    port 6379
    logfile "6379.log"
    pidfile /var/run/redis_6379.pid
    dbfilename dump6379.rdb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    # redis_sub80.conf 【做从节点1】
    port 6380
    logfile "6380.log"
    pidfile /var/run/redis_6380.pid
    dbfilename dump6380.rdb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    # redis_sub81.conf 【做从节点2】
    port 6381
    logfile "6381.log"
    pidfile /var/run/redis_6381.pid
    dbfilename dump6381.rdb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • ④. 根据指定的配置文件启动redis
    [root@TANG2021 bin]# redis-server /usr/local/bin/kconfig/redis_master79.conf
    [root@TANG2021 bin]# redis-server /usr/local/bin/kconfig/redis_sub80.conf
    [root@TANG2021 bin]# redis-server /usr/local/bin/kconfig/redis_sub81.conf
    [root@TANG2021 bin]# ps -ef |grep redis
    polkitd    4770   4750  0 10:27 ?        00:00:00 redis-server *:6379
    root       5717      1  0 10:37 ?        00:00:00 redis-server *:6380
    root       5724      1  0 10:37 ?        00:00:00 redis-server *:6381
    root       5729   4366  0 10:37 pts/0    00:00:00 grep --color=auto redis
    [root@TANG2021 bin]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • ⑤. 一主二从配置,默认情况下,每台Redis服务器都是主节点,我们一般情况下只用配置从机就好了。使用SLAVEOF host port就可以为从机配置主机了
    # 6380
    # SLAVEOF host port
    # 二个从机 都 认 127.0.0.1 6379 为老大
    
    127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
    OK
    # Replication
    role:slave # 角色:奴隶(从属)
    master_host:127.0.0.1 # 老大的ip
    master_port:6379 # 老大的端口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    # 6381
    127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
    OK
    127.0.0.1:6381> info replication
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6379
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    # 6378 [主机]
    # 然后主机上也能看到从机的状态:
    127.0.0.1:6379> info replication
    # Replication
    role:master # 角色:主机
    connected_slaves:2 # 从机数量
    slave0:ip=127.0.0.1,port=6381,state=online,offset=322,lag=1  # 从机2信息
    slave1:ip=127.0.0.1,port=6380,state=online,offset=322,lag=0  # 从机1信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    # 从服务器写入操作报错
    127.0.0.1:6381> set name tang
    (error) READONLY You can't write against a read only replica.
    
    • 1
    • 2
    • 3
    • ⑥. 我们这里是使用命令搭建,是暂时的(重启失效),真实开发中应该在从机的配置文件中进行配置,这样的话是永久的
      在这里插入图片描述
    • ⑦. 配置文件方式永久生效
    ################################# REPLICATION #################################
    #
    #   +------------------+      +---------------+
    #   |      Master      | ---> |    Replica    |
    #   | (receive writes) |      |  (exact copy) |
    #   +------------------+      +---------------+
    #
    # 配置主机信息
    # replicaof  
    replicaof 127.0.0.1 6379
    
    # 如果 Redis 有密码需要在配置文件设置主机密码 masterauth ******
    # masterauth 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ③. 主从复制 - 如何使用

    • ①. 从机自动保存主机的所以数据
    # === 主机【6379】  === 
    127.0.0.1:6379> set name 张三
    OK
    127.0.0.1:6379> set age 25
    OK
    127.0.0.1:6379> keys *
    age
    name
    127.0.0.1:6379> 
    
    # === 主机【6380】  === 
    127.0.0.1:6380> keys *
    name
    age
    
    # === 主机【6381】  === 
    127.0.0.1:6381> keys *
    name
    age
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • ②. 从机只能读,不能写,主机可读可写但是多用于写
    127.0.0.1:6380> set name 张三 # 从机【6380】写入失败
    READONLY You can't write against a read only replica.
    
    127.0.0.1:6381> set name 张三 # 从机【6381】写入失败
    READONLY You can't write against a read only replica.
    
    127.0.0.1:6379> set name 张三 # 主机【6379】写入成功
    OK
    127.0.0.1:6379> get name # 主机【6379】读取成功
    张三
    
    127.0.0.1:6381> get name # 从机【6380】读取成功
    张三
    
    127.0.0.1:6381> get name # 从机【6381】读取成功
    张三
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • ③. 当主机断电宕机后,默认情况下从机的角色不会发生变化 ,集群中只是失去了写操作,当主机恢复以后,又会连接上从机恢复原状

    • ④. 当从机断电宕机后,若不是使用配置文件配置的从机,再次启动后作为主机是无法获取之前主机的数据的,若此时重新配置称为从机,又可以获取到主机的所有数据。这里就要提到一个同步原理

    • ⑤. 第二条中提到,默认情况下,主机故障后,不会出现新的主机,有两种方式可以产生新的主机

    1. 从机手动执行命令slaveof no one,这样执行以后从机会独立出来成为一个主机
    2. 使用哨兵模式(自动选举)
    • ⑥. 反客为主(谋朝篡位):如果主机断开了连接,我们可以使用SLAVEOF no one让自己变成主机!其他的节点就可以手动连接到最新的主节点(手动),如果这个时候老大修复了,也不能让失去的从节点回归

    • ⑦. 薪火相传:上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险

    1. 用 slaveof ip port
    2. 风险是一旦某个slave宕机,后面的slave都没法备份
    3. 薪火相传:类似于一个大部门下面有100人,一个部长管理100人,这个时候部长选出10个组长出来,部长只负责管理10个组长,部长发了通知,由组长通知给对应的组员

    ④. 主从复制 - 原理

    • ①. 主从复制原理解析:
    1. 当从连接上主服务器之后,从服务器向主服务发送进行数据同步消息 - 全量复制
    2. 主服务器接收到从服务器发送过来同步消息,把主服务数据进行持久化rbd文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
    3. 每次主服务器进行写操作之后,和从服务器进行数据同步(这里是主服务器主动) - 增量复制
    • ②. 图解:

    在这里插入图片描述

    ⑤. 哨兵模式 - 概述

    • ①. 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel(哨兵) 架构来解决这个问题。 谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

    • ②. 概述:哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例

    • ③. 单哨兵模式

    1. 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器
    2. 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机
    3. 然而一个哨兵进程对Redis服务器进行监控,可能会出现问题(比如哨兵死了),为此,我们可以使用多个哨兵进行监控。 各个哨兵之间还会进行监控,这样就形成了多哨兵模式

    在这里插入图片描述

    • ④. 多哨兵模式
      ​ 假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一 定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作。 切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线

    在这里插入图片描述

    • ⑤. 哨兵模式优点
    1. 哨兵集群,基于主从复制模式,所有主从复制的优点,它都有
    2. 主从可以切换,故障可以转移,系统的可用性更好
    3. 哨兵模式是主从模式的升级,手动到自动,更加健壮
    • ⑥. 哨兵模式缺点
    1. Redis不好在线扩容,集群容量一旦达到上限,在线扩容就十分麻烦
    2. 实现哨兵模式的配置其实是很麻烦的,里面有很多配置项

    ⑥. 哨兵模式 - 配置

    • ①. 自定义目录下新建sentinel.conf文件,名字绝不能错
    # sentinel monitor 被监控的名称 host port 1
    # 其中mymaster为监控对象起的服务器名称,1 为至少有多少个哨兵同意迁移的数量。
    sentinel monitor mymaster 127.0.0.1 6379 1
    
    • 1
    • 2
    • 3
    • ②. 启动哨兵
    [root@TANG2021 bin]# redis-sentinel  sentinel.conf 
    18585:X 04 Sep 2022 13:35:09.729 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    18585:X 04 Sep 2022 13:35:09.729 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=18585, just started
    18585:X 04 Sep 2022 13:35:09.729 # Configuration loaded
                    _._                                                  
               _.-``__ ''-._                                             
          _.-``    `.  `_.  ''-._           Redis 5.0.8 (00000000/0) 64 bit
      .-`` .-```.  ```\/    _.,_ ''-._                                   
     (    '      ,       .-`  | `,    )     Running in sentinel mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
     |    `-._   `._    /     _.-'    |     PID: 18585
      `-._    `-._  `-./  _.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |           http://redis.io        
      `-._    `-._`-.__.-'_.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |                                  
      `-._    `-._`-.__.-'_.-'    _.-'                                   
          `-._    `-.__.-'    _.-'                                       
              `-._        _.-'                                           
                  `-.__.-'                                               
    
    18585:X 04 Sep 2022 13:35:09.731 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    18585:X 04 Sep 2022 13:35:09.734 # Sentinel ID is 4a9ef6f1269e0848f76284eaf9808c6d4eb95303
    18585:X 04 Sep 2022 13:35:09.734 # +monitor master mymaster 127.0.0.1 16379 quorum 1
    18585:X 04 Sep 2022 13:35:09.735 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:35:09.736 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 16379
    
    • 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
    • ③. 这个时候,我们将19736端口shutdown掉,看sentinel服务重新选举
                    _._                                                  
               _.-``__ ''-._                                             
          _.-``    `.  `_.  ''-._           Redis 5.0.8 (00000000/0) 64 bit
      .-`` .-```.  ```\/    _.,_ ''-._                                   
     (    '      ,       .-`  | `,    )     Running in sentinel mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
     |    `-._   `._    /     _.-'    |     PID: 18585
      `-._    `-._  `-./  _.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |           http://redis.io        
      `-._    `-._`-.__.-'_.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |                                  
      `-._    `-._`-.__.-'_.-'    _.-'                                   
          `-._    `-.__.-'    _.-'                                       
              `-._        _.-'                                           
                  `-.__.-'                                               
    
    18585:X 04 Sep 2022 13:35:09.731 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    18585:X 04 Sep 2022 13:35:09.734 # Sentinel ID is 4a9ef6f1269e0848f76284eaf9808c6d4eb95303
    18585:X 04 Sep 2022 13:35:09.734 # +monitor master mymaster 127.0.0.1 16379 quorum 1
    18585:X 04 Sep 2022 13:35:09.735 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:35:09.736 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:19.806 # +sdown master mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:19.806 # +odown master mymaster 127.0.0.1 16379 #quorum 1/1
    18585:X 04 Sep 2022 13:36:19.806 # +new-epoch 1
    18585:X 04 Sep 2022 13:36:19.806 # +try-failover master mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:19.811 # +vote-for-leader 4a9ef6f1269e0848f76284eaf9808c6d4eb95303 1
    18585:X 04 Sep 2022 13:36:19.811 # +elected-leader master mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:19.811 # +failover-state-select-slave master mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:19.902 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:19.902 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:19.969 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:20.167 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:20.167 # +failover-state-reconf-slaves master mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:20.256 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:21.210 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:21.210 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:21.310 # +failover-end master mymaster 127.0.0.1 16379
    18585:X 04 Sep 2022 13:36:21.310 # +switch-master mymaster 127.0.0.1 16379 127.0.0.1 6381
    18585:X 04 Sep 2022 13:36:21.310 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
    18585:X 04 Sep 2022 13:36:21.310 * +slave slave 127.0.0.1:16379 127.0.0.1 16379 @ mymaster 127.0.0.1 6381
    18585:X 04 Sep 2022 13:36:51.333 # +sdown slave 127.0.0.1:16379 127.0.0.1 16379 @ mymaster 127.0.0.1 6381
    
    • 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

    在这里插入图片描述

    • ④. 故障恢复原理
    1. 新主登机:从下线的主服务器的所有从服务里面挑选一个从服务,将其转成主服务,选择条件依次是:
      选择优先级靠前的(优先级在redis.conf中默认:slave-priority 100,值越小优先级越高)
      选择偏移量最大的(是指获得原主机数据最全的)
    2. 群仆俯首:挑选出新的主服务之后sentinel向原主服务的从服务发送slaveof新主服务的命令,复制新master
    3. 旧主俯首:当已下线的服务重新上线时,sentinel会向其发送slaveof命令,让其成为新主的从

    ⑦. 集合概述及环境搭建

    • ①. 背景:容量不够,redis如何进行扩容?并发写操作, redis如何分摊?
    1. 主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息
    2. 之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置
    • ②. Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N

    • ③. 制作6个实例,16379,16380,16381,16389,16390,16391

    # 开启daemonize yes
    daemonize yes
    # Pid文件名字
    pidfile /var/run/redis_16379.pid
    # 指定端口
    port 16379
    # Log文件名字
    logfile "16379.log"
    # Dump.rdb名字
    dbfilename dump16379.rdb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    # redis cluster配置修改
    # 打开集群模式
    cluster-enabled yes    
    # 设定节点配置文件名
    cluster-config-file nodes-6379.conf  
    # 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
    cluster-node-timeout 15000   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • ④. 修改好redis16379.conf文件,拷贝多个redis.conf文件
      使用查找替换修改另外5个文件:例如::%s/16379/16380
    [root@TANG2021 cluster]#  cp redis.conf redis16380.conf 
    [root@TANG2021 cluster]#  cp redis.conf redis16381.conf 
    [root@TANG2021 cluster]#  cp redis.conf redis16389.conf 
    [root@TANG2021 cluster]#  cp redis.conf redis16390.conf 
    [root@TANG2021 cluster]#  cp redis.conf redis16391.conf 
    [root@TANG2021 cluster]# ll
    总用量 448
    -rw-r--r-- 1 root root 61779 94 16:12 redis16379.conf
    -rw-r--r-- 1 root root 61779 94 16:12 redis16380.conf
    -rw-r--r-- 1 root root 61779 94 16:13 redis16381.conf
    -rw-r--r-- 1 root root 61779 94 16:13 redis16389.conf
    -rw-r--r-- 1 root root 61779 94 16:13 redis16390.conf
    -rw-r--r-- 1 root root 61779 94 16:13 redis16391.conf
    -rw-r--r-- 1 root root 61779 94 16:12 redis.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • ⑤. 启动6个redis服务
    [root@TANG2021 cluster]# ../redis-server redis16381.conf 
    [root@TANG2021 cluster]# ps -ef |grep redis
    root       5229      1  0 16:25 ?        00:00:00 ../redis-server *:16389 [cluster]
    root       5237      1  0 16:25 ?        00:00:00 ../redis-server *:16390 [cluster]
    root       5244      1  0 16:25 ?        00:00:00 ../redis-server *:16391 [cluster]
    root       5249      1  0 16:25 ?        00:00:00 ../redis-server *:16379 [cluster]
    root       5263      1  0 16:25 ?        00:00:00 ../redis-server *:16380 [cluster]
    root       5501      1  0 16:28 ?        00:00:00 ../redis-server *:16381 [cluster]
    root       5508   3575  0 16:28 pts/0    00:00:00 grep --color=auto redis
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    在这里插入图片描述

    • ⑥. redis集群合体:cd /opt/redis-6.2.1/src
    1. 此处不要用127.0.0.1, 请用真实IP地址
    2. –replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组
    [root@TANG2021 src]# ll |grep *.rb
    -rwxrwxr-x 1 root root    3600 312 2020 redis-trib.rb
    [root@TANG2021 src]# redis-cli --cluster create --cluster-replicas 1 192.168.68.143:16379 192.168.68.143:16380 192.168.68.143:16381 192.168.68.143:16389 192.168.68.143:16390 192.168.68.143:16391
    >>> 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.68.143:16390 to 192.168.68.143:16379
    Adding replica 192.168.68.143:16391 to 192.168.68.143:16380
    Adding replica 192.168.68.143:16389 to 192.168.68.143:16381
    >>> Trying to optimize slaves allocation for anti-affinity
    [WARNING] Some slaves are in the same host as their master
    M: 050f426fbbe0c68882a3c2fe1e9a8c0fede020e9 192.168.68.143:16379
       slots:[0-5460] (5461 slots) master
    M: 6cf02daaa7797e506a788acf0ceca2bc7387d284 192.168.68.143:16380
       slots:[5461-10922] (5462 slots) master
    M: b994fb96b5a6e9b9aeb4d9ca9be0e5e7f0ac3df0 192.168.68.143:16381
       slots:[10923-16383] (5461 slots) master
    S: 7754ce5033cef06c3844969878a1b64f17ab5dbb 192.168.68.143:16389
       replicates 050f426fbbe0c68882a3c2fe1e9a8c0fede020e9
    S: a856a2fab10f875511e63aa5e2a52a9837c80176 192.168.68.143:16390
       replicates 6cf02daaa7797e506a788acf0ceca2bc7387d284
    S: 3ae80e542decefa2ca19568d3a3a89eb8fd26207 192.168.68.143:16391
       replicates b994fb96b5a6e9b9aeb4d9ca9be0e5e7f0ac3df0
    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.68.143:16379)
    M: 050f426fbbe0c68882a3c2fe1e9a8c0fede020e9 192.168.68.143:16379
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
    S: 7754ce5033cef06c3844969878a1b64f17ab5dbb 192.168.68.143:16389
       slots: (0 slots) slave
       replicates 050f426fbbe0c68882a3c2fe1e9a8c0fede020e9
    S: a856a2fab10f875511e63aa5e2a52a9837c80176 192.168.68.143:16390
       slots: (0 slots) slave
       replicates 6cf02daaa7797e506a788acf0ceca2bc7387d284
    M: 6cf02daaa7797e506a788acf0ceca2bc7387d284 192.168.68.143:16380
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    M: b994fb96b5a6e9b9aeb4d9ca9be0e5e7f0ac3df0 192.168.68.143:16381
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    S: 3ae80e542decefa2ca19568d3a3a89eb8fd26207 192.168.68.143:16391
       slots: (0 slots) slave
       replicates b994fb96b5a6e9b9aeb4d9ca9be0e5e7f0ac3df0
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    [root@TANG2021 src]# 
    
    • 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
    • 52
    • 53
    • 54
    • ⑦. 普通方式登录
      可能直接进入读主机,存储数据时,会出现MOVED重定向操作。所以,应该以集群方式登录
    [root@TANG2021 cluster]# ../redis-cli -p 16379 
    127.0.0.1:16379> keys *
    (empty list or set)
    127.0.0.1:16379> set name tang
    (error) MOVED 5798 192.168.68.143:16380
    127.0.0.1:16379> exit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • ⑧. -c:采用集群策略连接,设置数据会自动切换到相应的写主机
    [root@TANG2021 cluster]# ../redis-cli -c -p 16379 
    127.0.0.1:16379> keys *
    (empty list or set)
    127.0.0.1:16379> set name tang
    -> Redirected to slot [5798] located at 192.168.68.143:16380
    OK
    192.168.68.143:16380> cluster nodes
    3ae80e542decefa2ca19568d3a3a89eb8fd26207 192.168.68.143:16391@26391 slave b994fb96b5a6e9b9aeb4d9ca9be0e5e7f0ac3df0 0 1662280767952 6 connected
    6cf02daaa7797e506a788acf0ceca2bc7387d284 192.168.68.143:16380@26380 myself,master - 0 1662280767000 2 connected 5461-10922
    a856a2fab10f875511e63aa5e2a52a9837c80176 192.168.68.143:16390@26390 slave 6cf02daaa7797e506a788acf0ceca2bc7387d284 0 1662280766942 5 connected
    b994fb96b5a6e9b9aeb4d9ca9be0e5e7f0ac3df0 192.168.68.143:16381@26381 master - 0 1662280766000 3 connected 10923-16383
    050f426fbbe0c68882a3c2fe1e9a8c0fede020e9 192.168.68.143:16379@26379 master - 0 1662280768962 1 connected 0-5460
    7754ce5033cef06c3844969878a1b64f17ab5dbb 192.168.68.143:16389@26389 slave 050f426fbbe0c68882a3c2fe1e9a8c0fede020e9 0 1662280765934 4 connected
    192.168.68.143:16380> exit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    # 主服务器有数据
    [root@TANG2021 cluster]# ../redis-cli -c -p 16380 
    127.0.0.1:16380> keys *
    1) "name"
    127.0.0.1:16380> exit
    # 从服务器没有数据
    [root@TANG2021 cluster]# ../redis-cli -c -p 16389
    127.0.0.1:16389> keys *
    (empty list or set)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    ⑧. 集群 - 经典小问题

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

    在这里插入图片描述

    • ②. 什么是slots
    1. 一个 Redis 集群包含16384个插槽(hash slot)数据库中的每个键都属于这16384个插槽的其中一个
    2. 集群使用公式CRC16(key) %16384来计算键key属于哪个槽, 其中CRC16(key) 语句用于计算键key的CRC16校验和
    3. 集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
      节点A负责处理0号至5460号插槽
      节点B负责处理5461号至10922号插槽
      节点C 负责处理10923号至16383号插槽
      在这里插入图片描述
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    
    • 1
    • 2
    • 3
    • 4
    • ③. 如果主节点下线?从节点能否自动升为主节点?注意:15秒超时
      在这里插入图片描述

    • ④. 主节点恢复后,主从关系会如何?主节点回来变成从机

    • ⑤. 如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?

    1. 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes,那么 ,整个集群都挂掉
    2. 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no,那么,该插槽数据全都不能使用,也无法存储
    3. redis.conf中的参数cluster-require-full-coverage
  • 相关阅读:
    深度学习(pytorch)——神经网络完整模型训练套路及其注意事项
    五、vue组件与props自定义属性
    PHP 脚本,其中包含一个函数,该函数会从给定的字符串列表中随机选择一个字符串并返回
    【斗破年番】谣言不攻自破,萧潇造型曝光,制作进度已达中州,风尊者帅翻
    VSCode+python单步调试库代码
    Spark(OOM问题,数据倾斜问题)
    Linux小程序-进度条
    全链路压测(10):测试要做的准备工作
    nvm详细安装步骤避坑指南以及使用(以win11系统为例)
    秒杀同龄人的顶级复盘能力,坚持1年,领先5年!
  • 原文地址:https://blog.csdn.net/TZ845195485/article/details/126686223