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)这个节点上。

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

      

  • 相关阅读:
    Ext checkbox
    Ext4.1 grid 多选(可无checkbox)
    System.Web.HttpContext.Current.Session获取值出错
    Ext4.1 tree grid的右键菜单
    javascript innerHTML、outerHTML、innerText、outerText的区别
    EXT ajax简单实例
    C# 各版本更新简介
    C#与.Net Framework的各种版本和联系
    Ext4 简单的treepanel
    Ext4.1 Grid 分页查询
  • 原文地址:https://www.cnblogs.com/hejianliang/p/9612995.html
Copyright © 2011-2022 走看看