zoukankan      html  css  js  c++  java
  • Redis集群搭建

      本文内容参考资料:redis官网文档-集群教程

      redis单机版安装和配置的博客参考:redis安装与配置

     

    一、集群不可用

      当redis集群中,超过半数(包含1半)的redis服务器宕机(不可用)时,就认为整个redis集群不可用。

      如果集群由2台redis服务器组成,那么1台宕机(占50%),集群就不可用

      如果集群由3台redis服务器组成,那么2台宕机(占67%),集群就不可用;

      如果集群由4台redis服务器组成,那么2台宕机(占50%),集群就不可用;

      如果集群由5台redis服务器组成,那么3台宕机(占60%),集群就不可用;

      如果集群由6台redis服务器组成,那么3台宕机(占50%),集群就不可用;

      ...........

      通过上面的计算,对于总的服务器数量,奇数台服务器,和偶数台服务器的,相同数量的机器发生宕机且造成集群不可用时,选择部署奇数台服务器更节省成本,因为后果都是一样的,但是奇数台可以省一台服务器。

      所以,建议至少使用3台服务器来搭建集群,并且服务器的数量最好是奇数台

    二、搭建流程

    2.1、服务器信息

      现在我有3台centos机器,版本为6.10,都安装了redis,机器名称以及ip信息如下:

      centos03,对应ip:192.168.1.3

      centos04,对应ip:192.168.1.4

      centos05,对应ip:192.168.1.5

    2.2、修改redis配置文件

      每一台机器上的redis都要进行下面的配置,修改redis.conf

    #redis监听端口
    port 6379
    
    # 开启redis集群模式
    cluster-enabled yes
    
    # 指定redis集群配置文件,这个配置文件可以不用关心
    cluster-config-file nodes-6379.conf
    
    # 集群通信超时时间(单位为毫秒)
    cluster-node-timeout 5000
    
    # 注释掉bind 127.0.0.1,并且设置protected-mode为no,表示允许其他主机无授权登录
    # bind 127.0.0.1
    protected-mode no
    
    # 打开AOF开关
    appendonly yes
    

      

    2.3、删除机器的rdb文件

      在启动集群前,需要将rbd文件删除,否则集群启动后,该文件会同步给其他redis节点。

    rm -rf /usr/local/redis/dump.rdb
    

      

    2.4、安装ruby扩展

      搭建redis集群,需要用到ruby,以及ruby相关的扩展

    yum install -y ruby 
    yum install -y rubygems
    

      确保ruby的版本稍微高一点,比如2.5以上,我安装的ruby1.8,版本太低,导致后面出现问题,所以使用rvm来安装ruby2.5,过程如下(可以忽略本小段):

    gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
    
    curl -sSL https://get.rvm.io | bash -s stable
    
    source /etc/profile.d/rvm.sh
    
    # 可以通过rvm list known查看可获取的ruby版本,我选的2.5
    rvm install 2.5
    

      

    2.5、安装redisgem

      在redis 3/4中,搭建集群是使用redis-trib.rb这个ruby脚本,运行这个脚本需要安装redisgem,因为我使用的是redis 4,所以也需要安装。

    gem install redis
    

      

    2.6、放行10000+端口

      这个10000+端口,是这样的:redis监听两个端口:

      一个端口就是6379,这个是用户客户端和服务器之间的数据通信使用的;

      另外一个端口,就是redis集群中,redis服务器之间通信使用的端口(比如故障检测,配置更新,故障转移),这个端口,就是前面一个端口(6379)+ 10000,也就是16379端口;

      如果前面设置服务器与客户端交互使用8000端口,那么集群中的redis服务器通信就会使用18000端口。

      所以集群中的redis服务器还需要将防火墙放行6379和16379端口。

    iptables -A INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
    iptables -A INPUT -p tcp -m tcp --dport 16379 -j ACCEPT
    
    # 重启防火墙
    service iptables restart
    

      

    2.7、启动每台机器上的redis服务器

      上面的配置完成后(每台机器都需要配置),然后分别启动redis,使用各自的配置文件(其实配置文件都是一样的)

    # 启动centos03的redis服务器
    [root@centos03 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
    
    # 启动centos04的redis服务器
    [root@centos04 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
    
    # 启动centos05的redis服务器
    [root@centos05 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf    

    2.8、最后一步

      有一个ruby脚本至关重要,名称为redis-trib.rb,这是redis3/4搭建集群需要使用的脚本。

      该脚本在redis压缩包解压后的src目录下。

      随便挑选一台机器(我选了centos05),去执行redis-trib.rb脚本,命令如下:

    # create创建集群,后面跟着的redis服务器的ip和端口
    ./redis-trib.rb create 192.168.1.3:6379 192.168.1.4:6379 192.168.1.5:6379
    

      流程如下:

      

      到此,redis集群就搭建完成了

      需要注意的是,上面的配置只是很简单的配置,redis-trib.rb提供了很多选项进行集群的配置,如下:

    [root@centos05 src]# ./redis-trib.rb
    Usage: redis-trib <command> <options> <arguments ...>
    
      create          host1:port1 ... hostN:portN
                      --replicas <arg>
      check           host:port
      info            host:port
      fix             host:port
                      --timeout <arg>
      reshard         host:port
                      --from <arg>
                      --to <arg>
                      --slots <arg>
                      --yes
                      --timeout <arg>
                      --pipeline <arg>
      rebalance       host:port
                      --weight <arg>
                      --auto-weights
                      --use-empty-masters
                      --timeout <arg>
                      --simulate
                      --pipeline <arg>
                      --threshold <arg>
      add-node        new_host:new_port existing_host:existing_port
                      --slave
                      --master-id <arg>
      del-node        host:port node_id
      set-timeout     host:port milliseconds
      call            host:port command arg arg .. arg
      import          host:port
                      --from <arg>
                      --copy
                      --replace
      help            (show this help)
    
    For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
    

      

    三、测试

      测试方式:使用任意一个客户端,登录到集群的任意一台redis服务器,进行set一些key-value,然后去其他机器看是否可以获取到key-value,以此来验证集群的存取。

      需要注意的是,使用redis-cli连接redis集群时,需要加-c选项,表示以集群方式连接;如果不加-c,表示非集群方式连接。

      下面是不加-c选项的示例,会出现(error)MOVED的错误:

    ganlixins-MacBook-Pro:~ root# /usr/local/redis/bin/redis-cli -h 192.168.1.3 -p 6379
    192.168.1.3:6379> set "demoKey" "demoValue"
    (error) MOVED 11618 192.168.1.5:6379
    

      

      我这里在宿主机上登录到centos03上进行set

    ganlixins-MacBook-Pro:~ root# /usr/local/redis/bin/redis-cli -h 192.168.1.3 -p 6379 -c
    192.168.1.3:6379> set demoKey "demoValue"
    -> Redirected to slot [11618] located at 192.168.1.5:6379
    OK
    192.168.1.5:6379> set testKey "testValue"
    -> Redirected to slot [5203] located at 192.168.1.3:6379
    OK
    192.168.1.3:6379> set exampleKey "exampleValue"
    -> Redirected to slot [7417] located at 192.168.1.4:6379
    OK
    

      

      登录到centos04上查询

    ganlixins-MacBook-Pro:~ root# /usr/local/redis/bin/redis-cli -h 192.168.1.4 -p 6379 -c
    192.168.1.4:6379> get demoKey
    -> Redirected to slot [11618] located at 192.168.1.5:6379
    "demoValue"
    192.168.1.5:6379> get testKey
    -> Redirected to slot [5203] located at 192.168.1.3:6379
    "testValue"
    192.168.1.3:6379> get exampleKey
    -> Redirected to slot [7417] located at 192.168.1.4:6379
    "exampleValue"
    

      

      测试通过!!

      

  • 相关阅读:
    Go-闭包
    GO-数组与切片
    Go-包
    Go-for循环
    GO-逻辑判断(if,else if,else,switch)
    前后端分离的思考与实践(六)
    前后端分离的思考与实践(五)
    前后端分离的思考与实践(三)
    前后端分离的思考与实践(二)
    前后端分离的思考与实践(一)
  • 原文地址:https://www.cnblogs.com/-beyond/p/9660582.html
Copyright © 2011-2022 走看看