搭建Redis集群(详细图解)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

一丶集群的概念

  • 集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
  • 一组通过网络连接的计算机,共同对外提供服务,像一个独立的服务器。
  • 当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上。

搭建Redis集群(详细图解)

二丶redis集群 

  • 分类
    • 软件层面
    • 硬件层面
  • 软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务。

搭建Redis集群(详细图解)

  • 硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。  

搭建Redis集群(详细图解)

三丶为什么要有集群

  • 一主可以多从,如果同时的访问量过大(1000w),主服务肯定就会挂掉,数据服务就挂掉了或者发生自然灾难
  • 大公司都会有很多的服务器(华东地区、华南地区、华中地区、华北地区、西北地区、西南地区、东北地区、台港澳地区机房)

四丶搭建集群

说明:当前拥有两台主机192.168.4.15(ubuntu1)、192.168.4.63(ubuntu2),这里的IP在使用时要改为实际值

1.配置机器1(ubuntu1)

  • 查看两台电脑IP地址

搭建Redis集群(详细图解)

搭建Redis集群(详细图解)

  • 需要对ubuntu1中redis进行IP绑定

搭建Redis集群(详细图解)

搭建Redis集群(详细图解)

  • 进入Desktop目录,创建conf目录
  • 在conf目录下创建文件件7000.conf,编辑内容如下
port 7000
bind 192.168.4.15
daemonize yes  # 守护进程
pidfile 7000.pid  # 进程id配置文件
cluster-enabled yes  # 节点
cluster-config-file 7000_node.conf  # 节点配置文件
cluster-node-timeout 15000  # 超时
appendonly yes  # 追加数据文件
  • 在conf目录下创建文件件7001.conf,编辑内容如下 
port 7001
bind 192.168.4.15
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes
  • 在conf目录下创建文件件7002.conf,编辑内容如下 
port 7002
bind 192.168.4.15
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes
  • 即conf目录则有以下三个配置文件

搭建Redis集群(详细图解)

  • 使用配置文件启动redis服务 (cluster表示集群)

搭建Redis集群(详细图解)

2.配置机器2(ubuntu2)

说明:这台电脑在上篇博客Redis主从同步配置已经绑定了IP地址了

  • 进入Desktop目录,创建conf目录
  • 在conf目录下创建文件件7003.conf,编辑内容如下
port 7003
bind 192.168.4.63
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes
  • 在conf目录下创建文件件7004.conf,编辑内容如下 
port 7004
bind 192.168.4.63
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes
  • 在conf目录下创建文件件7005.conf,编辑内容如下 
port 7005
bind 192.168.4.63
daemonize yes
pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes
  • 即conf目录则有以下三个配置文件

搭建Redis集群(详细图解)

  • 使用配置文件启动redis服务 (cluster表示集群)

搭建Redis集群(详细图解)

3.创建集群

  • redis的安装包中包含了redis-trib.rb,用于创建集群
  • 接下来的操作在ubuntu1机器上进行
  • 将redis-trib.rb文件拷贝到/usr/local/bin目录下
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/

搭建Redis集群(详细图解)

  • 安装ruby环境,因为redis-trib.rb是由ruby语言开发的

搭建Redis集群(详细图解)

  • 运行如下命令创建集群
redis-trib.rb create --replicas 1 192.168.4.15:7000 192.168.4.15:7001 192.168.4.15:7002 192.168.4.63:7003 192.168.4.63:7004 192.168.4.63:7005
  • 出现以下错误

搭建Redis集群(详细图解)

  • 执行命令提示如上报错,主要原因是由于安装的 ruby 不是最新版本 
  • 查看当前的gem源地址

搭建Redis集群(详细图解)

  • 更换gem源地址

搭建Redis集群(详细图解)

  • 通过 gem 安装 redis 的相关依赖

搭建Redis集群(详细图解)

  • 再次执行命令成功

搭建Redis集群(详细图解)

  • 根据搭建集群成功提示信息,可以看到一共有6个节点,其中三个为master主节点以及另外三个从节点,并且该三个从节点从属于三个主节点,slots:0-5460 (5461 slots) master表示主节点负责处理槽(存储数据),而从节点则是主节点的复制品

搭建Redis集群(详细图解)

4.数据验证

说明:在集群中设置数据set key value时,会去计算设置的这个数据放在哪个范围的槽里面

  • 如何计算槽的值

Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希 槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈 希槽区间的节点上,具体算法就是:CRC16(key) % 16384

  • 在ubuntu1(192.168.4.15)机器上连接7002,加参数-c表示连接到集群

搭建Redis集群(详细图解)

  • 设置键和值,如果计算出来的slot值(槽值)范围在连接的192.168.4.15:7002节点上,则不会跳转链接到192.168.4.63:7003节点上

搭建Redis集群(详细图解)

  • 根据前面博主画的图或创建集群成功提示信息,来验证5789槽点值是否在192.168.4.63:7003节点上

搭建Redis集群(详细图解)

  • 在192.168.4.63:7003节点上,继续设置数据,根据计算出来的slot值来决定跳转或不跳转节点(则slot值范围在本节点范围内)

搭建Redis集群(详细图解)

  • 获取数据时,也会去计算slot值,当在slot值在本节点时,那么获取的是本节点设置的键值,则不会跳转节点,如果slot值范围不在本节点时,获取的键值是在其他节点上,即也会出现跳转

搭建Redis集群(详细图解)

  • 需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了,即创建会失败

五丶python与redis集群交互 

  • 需要安装redis-py-cluster包
pip install redis-py-cluster
from rediscluster import StrictRedisCluster
if __name__ == '__main__':
  try:
      # 构建所有的节点,Redis会使⽤CRC16算法,将键和值写到某个节点上
      startup_nodes = [
          {'host': '192.168.4.15', 'port': '7000'},
          {'host': '192.168.4.63', 'port': '7003'},
          {'host': '192.168.4.15', 'port': '7001'},
      ]
      # 构建StrictRedisCluster对象
      src=StrictRedisCluster(startup_nodes=startup_nodes,decode_responses=True)
      # 设置键为name、值为gebilaowang的数据
      result=src.set('name','gebilaowang')
      print(result)
      # 获取键为name
      name = src.get('name')
      print(name)
  except Exception as e:
      print(e)