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|

集群配置参数
配置选项选项值描述
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

    修改各机器端口为规划端口
修改配置-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

    防火墙配置图
  2. 使用如下命令启动节点(后续启动都是如此) 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
    
  3. 使用命令查看各个节点是否启动成功
    ps -ef | grep redis


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


    nodes-xxx.conf自动生成文件,必须保证各机器上该文件的生成
  5. 此时各个节点启动后并未构成一个集群,下面我们将各个节点构成集群
    ,安装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]# rubyv  
    ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
    
  6. 执行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:inrequire'
    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

  7. 重新启动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数量

  2. 集群简单测试
    使用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则客户端不自动切换。

  3. 查看集群绑定的节点信息
    [root@lenovo1 bin]# ./redis-cli -c -h 192.168.2.10 -p 6010 cluster nodes


    集群节点绑定详情
  4. 集群使用


    在30节点设置一个值

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


    30节点宕机

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

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


    该集群停止服务

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

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



作者:阿郎_
链接:https://www.jianshu.com/p/cd56880aeed3
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值