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机器

《redis(二)集群部署详解》 服务器规划

单节点配置

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

集群节点描述
主机名IP服务端口(默认为6379)集群通信端口主/从
lenovo1192.168.2.10601016010Master
lenovo3192.168.2.30603016030Master
lenovo4192.168.2.40604016040Master
h1192.168.2.101610116101Slave
h2192.168.2.102610216102Slave
h3192.168.2.103610316103Slave
集群配置参数
配置选项选项值描述
daemonizeyes是否作为守护进程运行,配置yes则产生pid文件
pidfile/var/run/redis_6030.pid如开启了daemonize则需指定一个pid,默认为redis_6379.pid
port6030监听端口默认6793
database1可用数据库数,默认为16,默认数据库存储在DB0号ID库中,无特殊要求建议设置一个数据库:database 1
cluster-enabledyes打开reids集群
cluster-config-filenodes-6030.conf集群配置文件启动自动生成不用认为干涉
cluster-node-timeout5000节点互联超时时间,毫秒
appendonlyyes启用aof持久化方式
配置

以6030端口机器为例

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

    《redis(二)集群部署详解》 修改各机器端口为规划端口

《redis(二)集群部署详解》 修改配置-2
《redis(二)集群部署详解》 修改配置-3
《redis(二)集群部署详解》 修改配置-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
    

《redis(二)集群部署详解》 防火墙配置图

  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
    

《redis(二)集群部署详解》 保证各机器都成功启动

  1. 查看redis目录下自动生成的nodes-xxx.conf文件

    《redis(二)集群部署详解》 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啊,相信你是崩溃的,谁让我们都是搞事情的呢,出了事情就得去解决

《redis(二)集群部署详解》 修改此处所有节点机器的ip值

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

《redis(二)集群部署详解》 再次执行创建集群的命令

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

《redis(二)集群部署详解》 创建集群成功

若启动出现如下错误,请将上一次创建集群失败的cluster-config-file文件删除,然后重新启动各节点

《redis(二)集群部署详解》 对应上句错误

  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
    

《redis(二)集群部署详解》 集群节点绑定详情

  1. 集群使用

    《redis(二)集群部署详解》 在30节点设置一个值

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

    《redis(二)集群部署详解》 30节点宕机
    继续在其他节点获取30宕机前的edu的值
    《redis(二)集群部署详解》 30宕机后其自动重定向至该从节点102

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

    《redis(二)集群部署详解》 该集群停止服务
    接下来尝试重新启动102从节点,看看能否继续提供服务
    《redis(二)集群部署详解》 继续提供服务且未丢失数据

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

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

    原文作者:恒骊_任建君
    原文地址: https://www.jianshu.com/p/cd56880aeed3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞