• Redis 群集模式


    集群概念

    集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。

    集群由多组节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点;只有主节点负责读写请求和集群信息的维护。从节点只进行主节点数据和状态信息的复制。

    集群的作用,可以归纳为两点:

    • (1)数据分区:数据分区(或称数据分片)是集群最核心的功能。
    1. 集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增如,另一方面每个主节点都可以对外提供读眼务和写眼务,大大提高了集群的响应能力。
    2. Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及,例如,如果单机内存太大,,bgpare bgreriteofifore操侯作可能导致主选理阻寨,主从环境下主机动换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
    • (2)高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似)﹔当任一节点发生故障时,集群仍然可以对外提供服务。
       

    Redis集群的数据分片:

    • Redis集群引入了哈希槽的概念
    • Redis集群有16384个哈希槽(编号0-16383)集群的每个节点负责一部分哈希槽
    • 每个Key通过CRc16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

    以3个节点组成的集群为例:

    • 节点A包含0到5460号哈希槽
    • 节点B包含5461到10922号哈希槽
    • 节点c包含10923到16383号哈希槽
       

    Redis集群的主从复制模型

    1. 集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
    2. 为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1以都失败后,集群将不可用。

    搭建redis集群模式(方法一)

    redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
    以端口号进行区分:3个主节点端口号:6001/6002/6003,对应的从节点端口号: 6004/6005/6006。
     

    环境配置/安装包

    安装包:redis-5.0.7.tar.gz

    主机操作系统IP地址软件 / 安装包 / 工具
    软件 / 安装包 / 工具192.168.10.12redis-5.0.7.tar.gz

    第一步:安装redis服务(可以看之前的博客)

     可以看到redis服务已经安装好了

    第二步:创建每个节点的工作目录

    1. cd /etc/redis/
    2. mkdir -p redis-cluster/redis600{1..6} #创建redis集群的工作目录、和每个节点的工作目录
    3. ls -R redis-cluster/

     第三步:到软件包目录,把redis配置文件分别复制到我们第二步所创建的每个节点目录中。也要把/opt/redis-5.0.7/src下的客户端工具redis-cli和服务端命令redis-server复制到每个节点的目录中

    1. cd /opt/redis-5.0.7/src/
    2. ls
    3. cd /opt/redis-5.0.7/
    4. for i in {1..6}; do cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i; cp /opt/redis-5.0.7/src/redis-server /opt/redis-5.0.7/src/redis-cli /etc/redis/redis-cluster/redis600$i; done
    5. #使用for循环复制可以节省很多时间
    6. cd /etc/redis/redis-cluster/
    7. ls -R

     第四步

    修改每个节点目录中的redis配置文件

    1. cd redis6001
    2. vim redis.conf
    3. #bind 127.0.0.1 ##第69行;注释掉监听地址,表示监听任意地址(也可设置为0.0.0.0
    4. protected-mode no #修改第88行,关闭保护模式,设置为no
    5. port 6001 #修改第92行,修改监听端口为6001
    6. daemonize yes #修改第136行,开启后台运行
    7. appendonly yes #修改第699行,开启AOF持久化
    8. #集群模式配置
    9. cluster-enabled yes #第832行取消注释,开启集群模式
    10. cluster-config-file nodes-6001.conf #第840行,每个集群配置文件,取消注释、修改对应的端口(每个节点都要设置对应的)
    11. cluster-node-timeout 15000 #第846行,集群节点之间通信的超时时间;取消注释

     

     

     其他五个节点的配置文件修改

    1. #先使用for循环把刚才我们设置的6001端口节点的配置文件覆盖到其他节点的配置文件
    2. for i in {2..6}; do \cp -f redis.conf /etc/redis/redis-cluster/redis600$i; done
    3. cd /etc/redis/redis-cluster/redis6002
    4. vim redis.conf
    5. port 6002 #修改第92行,修改监听端口为6002
    6. cluster-config-file nodes-6002.conf #第840行,每个集群配置文件,取消注释、修改对应的端口(每个节点都要设置对应的)

     

    这边我们就不一一演示了

    第五步:启动redis服务,一定要先进入每个节点目录中去使用redis-server命令启动

    1. cd ../redis6001
    2. ls
    3. for i in {1..6}; do cd /etc/redis/redis-cluster/redis600$i; ./redis-server redis.conf; done
    4. ps -elf |grep redis
    5. redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1 #把节点加入到集群当中
    6. --cluster-replicas 指定每个主节点有多少个从节点做主从复制
    7. redis-cli -p 6001 #登录redis数据库
    8. cluster slots #查看主从对应关系

     第六步:验证,键的插入

    1. redis-cli -p 6001 -c
    2. -c 实现节点间的跳转,如果不加会报错
    3. set name hj

     我们登录到6004节点上

    1. redis-cli -p 6004 -c
    2. keys *
    3. get name

      我们登录到6006节点上

    1. redis-cli -p 6006 -c
    2. keys *
    3. get name

     查看集群模式节点状态

    cluster nodes

     搭建redis集群模式(方法二)

    redis的集群一般需要6个节点

    环境配置/安装包

    安装包:redis-5.0.7.tar.gz

    主机操作系统IP地址工具
    Master1CentOS7192.168.10.12:6002redis-5.0.7.tar.gz
    Master2CentOS7192.168.10.13:6003redis-5.0.7.tar.gz
    Master3CentOS7192.168.10.14:6004redis-5.0.7.tar.gz
    salve1CentOS7192.168.10.15:6005redis-5.0.7.tar.gz
    salve2CentOS7192.168.10.16:6006redis-5.0.7.tar.gz
    slave3CentOS7192.168.10.17:6007redis-5.0.7.tar.gz

    所有节点

    1. cd /etc/redis/
    2. mkdir -p redis-cluster/redis6379
    3. cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis6379/
    4. cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis6379/

     修改配置文件

    1. cd /etc/redis/redis-cluster/redis6379/
    2. vim redis.conf
    3. bind 192.168.10.12 ##第69行;可以注释掉监听地址,表示监听任意地址(也可设置为0.0.0.0或自己的IP地址)
    4. protected-mode no #修改第88行,关闭保护模式,设置为no
    5. port 6002 #修改第92行,修改监听端口每台不一样即可,为方便后续实验我们设置为6002 6003
    6. daemonize yes #修改第136行,开启后台运行
    7. appendonly yes #修改第699行,开启AOF持久化
    8. #集群模式配置
    9. cluster-enabled yes #第832行取消注释,开启集群模式
    10. cluster-config-file nodes-6379.conf #第840行,每个集群配置文件,取消注释、可以修改对应的端口(也可以默认为6379.conf)
    11. cluster-node-timeout 15000 #第846行,集群节点之间通信的超时时间;取消注释

     

     将192.168.10.12的redis配置文件复制到其他节点上

    1. scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.13:/etc/redis/redis-cluster/redis6379/redis.conf
    2. scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.14:/etc/redis/redis-cluster/redis6379/redis.conf
    3. scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.15:/etc/redis/redis-cluster/redis6379/redis.conf
    4. scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.16:/etc/redis/redis-cluster/redis6379/redis.conf
    5. scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.17:/etc/redis/redis-cluster/redis6379/redis.conf

     其余节点

    vim /etc/redis/redis-cluster/redis6379/redis.conf
    

    所有节点

    启动redis节点

    1. cd /etc/redis/redis-cluster/redis6379/
    2. redis-server redis.conf
    3. ./redis-server redis.conf

     启动集群

    redis-cli --cluster create 192.168.10.12:6002 192.168.10.13:6003 192.168.10.14:6004 192.168.10.15:6005 192.168.10.16:6006 192.168.10.17:6007 --cluster-replicas 1

    测试集群模式

    1. redis-cli -h 192.168.10.12 -p 6002 -c
    2. cluster slots
    3. set mykey name
    4. cluster keyslot mykey

    故障模拟:我们关闭192.168.10.13这台主机或者关闭这台主机的服务。已知192.168.10.17是192.168.10.14的从节点,当主节点down掉后从节点会接替主节点,就可以实现故障切换了,保证了我们服务的正常运行。

     

    集群总线

    每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比6379,还有一个额外的端口(通过在这个端口号上加100Q0)作为数据端口,例如: redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000,即需要开启16379。16379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权。等等。

    总结:

    6379端口:主要用于客户端和服务端之间的通信以及主从复制之间相互通信

    26379端口:哨兵模式之间相互通信

    16379端口:集群之间的节点进行通信

  • 相关阅读:
    ROS机器人移动到指定坐标点
    centos7安装mysql8
    开源浪潮下的共创与挑战:开发者视角的深度剖析
    c++ - 模板(一)
    ZigBee 3.0理论教程-通用-1-13:建网与组网
    OpenCV cv::Mat和QImage互相转换
    C# 文件 文件夹 解除占用
    2022 CSP-J1 CSP-S1 初赛 第1轮 真题讲评 真题解析
    前端基础(四十六):你不知道的JavaScript - 元编程 - 公开符号
    Visual Studio 2022 修改字符集的方法
  • 原文地址:https://blog.csdn.net/weixin_64413763/article/details/127749985