redis(二)集群部署详解

  本文所有描述均为作者亲自操作后总结出来的,如有疑问可直接留言,将及时回复,如本文理解或描述有误的地方欢迎指出,将及时改正

本章主要描述redis集群的部署,若未搭建redis单机服务的朋友请移步redis(一)单机部署与应用

参考文档

redis官方集群指南:https://redis.io/topics/cluster-tutorial
redis官方集群规范:https://redis.io/topics/cluster-spec
redis中文集群指南:http://redisdoc.com/topic/cluster-tutorial.html
redis中文集群规范:http://redisdoc.com/topic/cluster-spec.html#cluster-spec

集群简介

     redis 集群是一个可以在多个 redis 节点之间进行数据共享的设施(installation).
     redis 集群有两点,一个是将数据分片存储,另外一个就是主从复制。一个 redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个。
例如:一个集群可以有三个哈希槽, 其中:
• 节点 A 负责处理 0 号至 5500 号哈希槽。
• 节点 B 负责处理 5501 号至 11000 号哈希槽。
• 节点 C 负责处理 11001 号至 16384 号哈希槽。

加入节点

若要加入新的机器节点D并为其指定900个哈希槽,那么只需要从节点A/B/C中拉取一定的槽移动到D节点即可,如:A节点中移出0-300号哈希槽至D节点,B节点移出5501-5801号哈希槽至D节点,C节点同样的移出11001-11301号哈希槽至D节点,这样就能完成哈希槽的分摊工作。

移除节点

若要移除节点A机器,同样的将哈希槽转移至B/C节点,然后再删除空白槽的节点机器即可。

注:经试验,改变哈希槽的归属不会造成节点阻塞,故不影响线上的功能使用,业务机器不会遇到任何异常。

集群环境

集群机器分配

要使redis集群正常工作至少需要3个master节点,若要实现集群的高可用,每个master节点至少配置一个slave节点,这里我将使用3个master和3个slave节点进行操作,集群规划如下:
总共6台虚拟机,分别为3台master和3台slave机器

服务器规划
单节点配置

注:按规划在6台机器中装入redis服务,且保证单机模式能够正常运行,并配置相应端口防火墙,建议在配置时先修改一个文件, 再互相拷贝至6台机器

集群节点描述
主机名 IP 服务端口(默认为6379) 集群通信端口 主/从
lenovo1 192.168.2.10 6010 16010 Master
lenovo3 192.168.2.30 6030 16030 Master
lenovo4 192.168.2.40 6040 16040 Master
h1 192.168.2.101 6101 16101 Slave
h2 192.168.2.102 6102 16102 Slave
h3 192.168.2.103 6103 16103 Slave
集群配置参数
配置选项 选项值 描述
daemonize yes 是否作为守护进程运行,配置yes则产生pid文件
pidfile /var/run/redis_6030.pid 如开启了daemonize则需指定一个pid,默认为redis_6379.pid
port 6030 监听端口默认6793
database 1 可用数据库数,默认为16,默认数据库存储在DB0号ID库中,无特殊要求建议设置一个数据库:database 1
cluster-enabled yes 打开reids集群
cluster-config-file nodes-6030.conf 集群配置文件启动自动生成不用认为干涉
cluster-node-timeout 5000 节点互联超时时间,毫秒
appendonly yes 启用aof持久化方式
配置

以6030端口机器为例

  1. 复制redis.conf为对应端口.conf,如6030.conf


    修改各机器端口为规划端口
修改配置-2
修改配置-3
修改配置-4
  1. 防火墙配置

     //#redis  此处比单机要多集群通信端口的配置
     -A INPUT -p tcp -m state --state NEW -m tcp --dport 6030 -j ACCEPT
     -A INPUT -p tcp -m state --state NEW -m tcp --dport 16030 -j ACCEPT
    
防火墙配置图
  1. 使用如下命令启动节点(后续启动都是如此)

     192.168.2.10
     /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6010.conf
    
     192.168.2.30
     /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6030.conf
    
     192.168.2.40
     /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6040.conf
    
     192.168.2.101
     /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6101.conf
    
    192.168.2.102
    /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6102.conf
    
    192.168.2.103
    /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6103.conf
    
  2. 使用命令查看各个节点是否启动成功

     ps -ef | grep redis
    
保证各机器都成功启动
  1. 查看redis目录下自动生成的nodes-xxx.conf文件


    nodes-xxx.conf自动生成文件,必须保证各机器上该文件的生成
  2. 此时各个节点启动后并未构成一个集群,下面我们将各个节点构成集群
    ,安装ruby 和 rubygems(注意需要ruby的版本在1.8.7以上)

    //yum安装
    yum install ruby rubygems
    

ruby所有依赖文件在这里,有需要离线安装的朋友可参考,我以将ruby依赖包上传至redis集群ruby依赖包密码:f0fj

   //离线安装步骤,yum安装方式的朋友直接跳过
   [grid@h3 ~]$ mkdir ruby
   [grid@h3 ~]$ cd ruby/
   [grid@h3 ruby]$ rz //选中所有依赖包后上传
   [root@h3 ruby]# rpm -iv *.rpm//使用root用户安装
   软件包准备中...
   ruby-libs-2.0.0.648-29.el7.x86_64
   libyaml-0.1.4-11.el7_0.x86_64
   ruby-irb-2.0.0.648-29.el7.noarch
   ruby-2.0.0.648-29.el7.x86_64
   rubygem-bigdecimal-1.2.0-29.el7.x86_64
   rubygem-io-console-0.4.2-29.el7.x86_64
   rubygem-json-1.7.7-29.el7.x86_64
   rubygem-rdoc-4.0.0-29.el7.noarch
   rubygems-2.0.14.1-29.el7.noarch
   rubygem-psych-2.0.0-29.el7.x86_64

安装完成后查看ruby版本

   [root@h3 ruby]# ruby –v  
   ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
  1. 执行redis集群创建命令(在一个节点执行即可),将redis-trib.rb脚本文件复制到bin下并更换名称为redis-trib

    [root@lenovo1 /]# cd /home/lenovo/install/redis-3.2.9/src
    [root@lenovo1 src]# cp redis-trib.rb ../bin/redis-trib
    [root@lenovo1 src]# cd ../bin/
    

使用redis-trib脚本程序的create命令创建集群,且复制节点为1,集群机器为这6台机器

   [root@lenovo1 bin]# redis-trib create --replicas 1 192.168.2.10:6010 
   192.168.2.30:6030 192.168.2.40:6040 192.168.2.101:6101 
   192.168.2.102:6102 192.168.2.103:6103

但此时却报了如下异常

    /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in 
    `require': cannot load such file -- redis (LoadError)    
    from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'
     from /home/lenovo/install/redis-3.2.9/bin/redis-trib:25:in `<main>

纠结了会发现我们似乎漏了些什么东西,ruby装完了是干嘛的呢?
解决方案:安装redis与ruby交互的接口

    //在线安装
    [root@lenovo1 bin]# gem install redis
    Fetching: redis-3.3.3.gem (100%)
    Successfully installed redis-3.3.3
    Parsing documentation for redis-3.3.3
    Installing ri documentation for redis-3.3.3
    1 gem installed

注:若需要离线安装的同学,我以将redis接口文件存放在ruby同级目录下,直接在该目录下执行如下命令即可进行安装

    //离线安装-在线安装的直接跳过
    [root@h1 ruby]# gem install redis-3.3.3.gem
    Successfully installed redis-3.3.3
    Parsing documentation for redis-3.3.3
    Installing ri documentation for redis-3.3.3
    1 gem installed
  1. 重新启动redis服务(使用步骤3方式指定conf启动,否则不会生成nodes-xxx.conf文件),然后再执行创建集群的命令,查看结果
    却出现如下错误

     >>> Creating cluster
     [ERR] Sorry, can't connect to node 192.168.2.30:6030
    

    沃ri啊,相信你是崩溃的,谁让我们都是搞事情的呢,出了事情就得去解决

修改此处所有节点机器的ip值

再将所有防火墙打开,保证集群通信端口能互通,再次创建集群


再次执行创建集群的命令

若此时不是你规划的设置,请调整创建命令的机器顺序,默认前3个为主节点


创建集群成功

若启动出现如下错误,请将上一次创建集群失败的cluster-config-file文件删除,然后重新启动各节点
对应上句错误
  1. 集群启动几点保证
    正确配置了配置文件,安装了ruby环境和ruby与redis的接口,保证启动后生成了nodes-xxx.conf文件
    若在创建集群中出现如下错误:

    [ERR] Node 192.168.2.30:6030 is not empty. Either the node 
    already knows other nodes (check with CLUSTER NODES) or 
    contains some key in database 0.
    

则需要将上次启动生成的数据库文件及节点配置删除,或者修改6030.conf中的database数量

  1. 集群简单测试
    使用redis-cli命令进入集群环境
    若使用如下命令进入集群这时会出现如下错误

     ./redis-cli –c –p 6030
     Could not connect to Redis at 127.0.0.1:6030: Connection refused
    

主要原因是配置了6030.conf中的bind,但若不配置bind又将出现找不到节点错误,故下面加上-h参数

    [root@lenovo3 bin]# ./redis-cli -c -h 192.168.2.30 -p 6030
    -c是以集群方式登录; 
    -h后跟主机号 ;
    -p后跟端口号。
    若绑定了127.0.0.1则可以省略-h参数。不加-c则客户端不自动切换。
  1. 查看集群绑定的节点信息

        [root@lenovo1 bin]# ./redis-cli -c -h 192.168.2.10 -p 6010 cluster nodes
    
集群节点绑定详情
  1. 集群使用


    在30节点设置一个值

    然后模拟30节点宕机后,然后再次查看所有节点信息


    30节点宕机

    继续在其他节点获取30宕机前的edu的值
    30宕机后其自动重定向至该从节点102

    再次关停102从节点,会发现该集群任何一个节点都将不提供服务


    该集群停止服务

    接下来尝试重新启动102从节点,看看能否继续提供服务
    继续提供服务且未丢失数据
  2. 总结
    由以上实验可以得出,当redis集群(3台)中的任何一台master机器停止服务后,若存在slave节点,则slave节点会直接顶替宕机的master并继续提供服务,若slave再次宕机,则整个集群停止提供服务,重启该slave后其服务继续执行,且未损失任何数据,说明redis将该缓存持久化在数据库中

redis集群部署配置就讲到这里,另外关于redis更高级的配置这里不做说明,大家可以自己花时间进行学习

推荐阅读更多精彩内容