zoukankan      html  css  js  c++  java
  • Redis学习笔记(九)——集群

     一、概述

      Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代。

      Redis Cluster是去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

      那么Redis是如何合理分配这些节点和数据呢?

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

      注意的是:必须要3个以上的主节点,否则在创建集群时会失败。

      所以,我们假设现在有3个节点已经组成了集群,分别是A、B、C三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么采用哈希槽(hash slot)的方式来分配16384个slot的话,它们三个节点分别承担的slot区间是:

      节点A覆盖 0 - 5460;

      节点B覆盖 5461 - 10922;

      节点C覆盖 10923 - 16383;

      

      Redis Cluster主从模式:

      Redis Cluster为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来当主节点,从而保证集群不会挂掉。

     

     

    二、操作

      搭建集群需要的环境:

      目前我用的是CentOS 7的系统,所以安装Ruby的时候只有2.0.0的版本,会执行不成功;每个Linux系统版本都有差别,如果执行以下操作不成功,请自行百度解决。

      安装RVM:

      在该系统,如果我之间安装Ruby只有2.0.0版本,在执行 gem install redis 时,会提示:

      ERROR: Error installing redis:

      redis requires Ruby version >= 2.2.2.

      

      所以得安装RVM再安装2.2.2或以上的Ruby。

      安装命令:

      gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3

      

     

      curl -L get.rvm.io | bash -s stable   

      

     

      source /usr/local/rvm/scripts/rvm

      查看RVM库已知的ruby版本

      rvm list known

      

     

      安装一个ruby版本(大于2.2.2),这里安装2.4.4

      rvm install 2.2.4

      

     

      使用ruby版本

      rvm use 2.4.4 --default

      

     

      卸载ruby2.0.0版本

      rvm remove 2.0.0

      

     

      安装redis

      gem install redis

      

     

     

      单机多节点集群实验

      1、Redis安装包里面有个集群工具,要复制到/usr/local/bin 里去

      

      

      2、修改配置,创建节点

      我们现在要搞六个节点,三主三从。

      端口规定分别为:7001、7002、7003、7004、7005、7006。

      我们先在 /usr/local/redis/ 目录下新建一个redis_cluster目录,然后再该目录下再创建6个目录,分别是7001、7002、7003、7004、7005、7006,用来存储redis配置文件:

      

     

      我们先复制一份配置文件到7001目录下

      

     

      我们回到7001目录,修改配置文件,修改以下几个参数:

      port 7001  // 六个节点配置文件分别是7001 - 7006

      daemonize yest  // redis后台运行

      pidfile /var/run/redis_7001.pid  // pidfile文件对应7001 - 7006

      cluster-enabled yes  // 开启集群

      cluster-config-file nodes_7001.conf  // 保存节点配置,自动创建,自动更新对应7001 - 7006

      cluster-node-timeout 5000  // 集群超时时间,节点超过这个时间没反应就断定宕机

      appendonly yes  // 存储方式,aof,将写操作记录保存到日志中

     

      修改port

      

     

      修改daemonize

      

     

      修改pidfile

      

     

      修改 cluster-enabled

      

     

      修改cluster-config-file

      

     

      修改cluster-node-timeout

      

     

      修改appendonly

      

     

      7001下的配置文件修改完保存后,我们将该配置文件分别复制到7002 - 7006中,然后对应的再修改配置即可,编辑后面5个配置文件,把 port ,pidfile,cluster-config-file 分别修改下即可(此操作简略);

      

     

      3、启动六个节点的redis

      

      查看redis进程:

      

      六个进程都启动成功了。

     

      4、创建集群

      Redis官方提供了redis-trib.rb 工具,第一步里已经拷贝到bin目录下;

      但是在使用之前,需要安装ruby,以及Redis和ruby连接(前面也有教程讲了安装了)

      创建集群:

      redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

      

       

      创建成功

      

      从运行结果看,主节点就是7001、7002、7003、从节点分别是7004、7005、7006

      7001分配到的哈希槽是 0 - 5460;

      7002分配到的哈希槽是 5461 - 10922;

      7003分配到的哈希槽是 10923 - 16383;

      最后问我们是否接受上面的设置,输入yes就表示接受,我们输入yes:

       

      显示配置哈希槽,以及集群创建成功,可以用了;

     

     

      也有可能会出现以下错误:

      

       出现该错误的解决方式:删除生产的配置文件nodes.conf,如果不行则说明现在创建的节点包括了旧集群的节点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb

     

      4、集群数据测试

      我们先连接任意一个节点,然后添加一个key:

      redis-cli是默认redis的客户端工具,启动时加上 '-c' 参数, '-p' 指定端口,就可以连接到集群。

      连接任意一个节点端口:

      

     

      添加一个key

      

       Redis Cluster值分配规则,它会使用CRC16('value')%16384算法来计算,将这个key放到哪个节点,这里分配到5798slot就分配到了7002(5461 - 10922)这个节点上。

      我们从其他集群节点,都可以获取到数据:

      

  • 相关阅读:
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    软件工程实践总结
  • 原文地址:https://www.cnblogs.com/hejianliang/p/9612995.html
Copyright © 2011-2022 走看看