Redis集群配置和常见异常解决

前文

      Redis的Cluster集群,是在分布式且开源环境下最佳的高可用解决方案,可以有效的解决服务器宕机下或高并发下,数据的完整性。

文档前提

    Redis 3.0版本或更高版本。(3.0版本开始支持集群功能)

重要知识点

    Redis群集TCP端口
                    每个Redis群集的节点都需要打开两个TCP连接,由于这两个连接就需要两个端口,分别是用于为客户端提供服务的常规Redis TCP命令端口(例如6379)以及通过将10000和命令端口相加(10000+6379)而获得的端口,就是集群端口(例如16379)。
                   第二个大号端口用于群集总线,即使用二进制协议的节点到节点通信通道。 节点使用群集总线进行故障检测,配置更新,故障转移授权等。 客户端不应尝试与群集总线端口通信,为了保证Redis命令端口的正常使用,请确保在防火墙中打开这两个端口,否则Redis群集节点将无法通信。命令端口集群总线端口偏移量是固定的,始终为10000。
                  请注意,为了让Redis群集正常工作,您需要为每个节点:
                         1、用于与客户端进行通信的普通客户端通信端口(通常为6379)对所有需要到达群集的客户端以及所有其他群集节点(使用客户端端口进行密钥迁移)都是开放的。
                         2、集群总线端口(客户端端口+ 10000)必须可从所有其他集群节点访问。
                   如果您不打开这两个TCP端口,则您的群集将无法正常工作。(重要,集群端口是redis端口+10000),集群总线使用不同的二进制协议进行节点到节点的数据交换,这更适合于使用很少的带宽和处理时间在节点之间交换信息。

操作步骤

       

要创建一个集群,我们需要做的第一件事是在集群模式下运行几个空的Redis实例。这就意味着群集不是使用普通的Redis实例创建的,因为需要配置特殊模式,以便Redis实例启用群集特定的功能和命令。

         以下是最小的Redis集群配置文件:

    port 7000
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes


         正如您所看到的那样,启用群集模就是使用 cluster-enabled 这个指令。 每个Redis的实例还包含存储此节点配置信息的文件的路径,默认情况下为nodes.conf。 这个文件内容永远不要人为地去修改,但是可以修改其名称,它仅在Redis集群实例启动时生成,并在每次需要时进行更新。

         请注意,按预期工作的最小群集需要至少包含三个主节点。 对于第一次测试,强烈建议启动一个由三个主服务器节点和三个从服务器节点组成的六个节点群集。我们通过以下步骤来一步一步的搭建Redis的Cluster集群环境。

         1、我们创建相关目录,主文件夹是redis-cluster,在此文件夹下建立6个子文件夹,名称分别是:7000,7001,7002,7003,7004,7005,该目录以我们将在任何给定目录内运行的实例的端口号命名。

                             

                           然后创建6个子目录,如下图:

                             

      mkdir redis-cluster
      cd redis-cluster
      mkdir 7000 7001 7002 7003 7004 7005

 

                2、目录创建好后,我们把Redis源文件里面包含的配置文件redis.conf拷贝一份,存放在7000目录下,然后对其配置项进行修改,这个配置文件Redis.conf会作为其他Redis实例的配置文件的模板,并拷贝到其他目录。

                            

        由于我们是做测试,并没有启动6个真正的物理节点,而是把6个Redis实例都部署在了同一台Linux服务器上,地址:192.168.127.130,为了区分Redis实例,我们是以不同的端口号来区分Redis实例的。然后我们修改Redis.conf的配置文件,修改项如下:

复制代码
      bind *******  //限制服务器IP地址,可以直接用'#'注销,如果是本机测试,可以直接使用本地局域网IP,如果是生产环境,根据情况限制IP访问

      port 7000  //绑定端口号,必须修改,以此来区分Redis实例

      daemonize yes  //后台运行

      pidfile /var/run/redis-7000.pid  //修改pid进程文件名,以端口号命名

      logfile /root/application/program/redis-cluster/7000/redis.log  //修改日志文件名称,以端口号为目录来区分

      dir /root/application/program/redis-cluster/7000/  //修改数据文件存放地址,以端口号为目录名来区分

      cluster-enabled yes  //启用集群

      cluster-config-file nodes-7000.conf  //配置每个节点的配置文件,同样以端口号为名称

      cluster-node-timeout 15000  //配置集群节点的超时时间,可改可不改

      appendonly yes  //启动AOF增量持久化策略

       appendfsync always  //发生改变就记录日志
复制代码


        3、7000目录下的Redis.conf配置文件修改后,分别拷贝到其他子目录,依次为:7001,7002,7003,7004,7005,根据上面的配置,我们只需修改和端口号有关的项目,在Linux系统下,我们通过命令:%s/7000/7001/g,:%s/7000/7002/g,:%s/7000/7002/g,:%s/7000/7003/g,:%s/7000/7004/g,:%s/7000/7005/g 分别进行全局替换,并保存,完成对其他子目录下的配置文件的修改。

           

        4、我们安装Redis的Cluster集群,需要使用Ruby命令,所以我们必须安装对Ruby的支持。

         

                             在此说明一下,以前的Redis版本下,需要安装Ruby和Rubygems,但是最新的版本不需要了,只要安装Ruby,Rubygems就会自动安装。

                                

        yum install ruby //安装ruby
        yum install rubygems  //安装rubygems,最新版本会自动安装



        5、我们安装完 Ruby 和 Rubygems 后,还需要继续安装Redis的Ruby接口程序。(注意:安装接口程序,Ruby的版本必须是2.2.2以上,用ruby --version查询版本号)

        gem install redis

        安装Redis的ruby接口程序,可能会提示如下,错误:redis requires ruby version 2.2.2,怎么办呢?如果是第一次遇到这个问题,可能会困扰你一阵子,我这里也有解决方案,帮你解忧。地址如下:http://www.cnblogs.com/PatrickLiu/p/8454579.html,按步骤执行就可以,一切顺利。
        
        6、开始启动我们6个Redis实例,并且要指定配置文件,这些配置文件分别在各自的子目录下面。

         

复制代码
          cd 7000
          redis-server redis.conf

          cd 7001
          redis-server redis.conf

          cd 7002
          redis-server redis.conf
    
          cd 7003
          redis-server redis.conf

          cd 7004
          redis-server redis.conf

          cd 7005
          redis-server redis.conf
复制代码


        
        7、创建集群,执行redis-trib.rb脚本,这个脚本文件可以拷贝出来,我是把它放在这个目录:/root/application/program/redis/,当然在这个目录下,也有其他文件,比如redis-cli,redis-server等。

                       (*注意:"192.168.127.130"是本地局域网IP,如果是生产环境下或者非本地测试,请直接使用服务器外网IP地址

        ruby redis-trib.rb  create --replicas 1 192.168.127.130:7000 192.168.127.130:7001 192.168.127.130:7002 192.168.127.130:7003 192.168.127.130:7004 192.168.127.130:7005 

        

           我们有Redis集群命令行实用程序redis-trib的帮助,Ruby实用程序对实例执行特殊命令以创建新集群,检查或重新设置现有集群,等等。 redis-trib实用程序位于Redis源代码分发的src目录中,当然也可以拷贝到其他目录中,以方便使用。 您需要安装redis gem才能运行redis-trib。

        这里使用的命令是create,因为我们想创建一个新的集群。 选项--replicas 1 意味着我们需要为每个创建的主服务器节点创建一个从服务器节点。其他参数是我想用来创建新集群的实例的地址列表。

            显然,我们要求的唯一设置是创建一个具有3个主站和3个从站的集群。
                        可能出现问题:Waiting for the cluster to join....(一般出现这种情况大部分是没有开启集群总线端口==>"Redis端口+10000",即本文档的端口号17000-17005

                     

 

        8、 如果一切顺利,你会看到类似这样的消息: [OK] All 16384 slots covered, 这意味着至少有一个主实例服务于每个16384可用的插槽,成功创建了Redis的Cluster集群环境。

        

        9、分别登陆7000,7001,7002Redis的实例客户端,进行测试。效果如图:

          1、登陆7000操作:

          redis-cli -c -h 192.168.127.130 -p 7000


             

                            2、登陆7001操作:

          redis-cli -c -h 192.168.127.130 -p 7001


          

                            3、登陆7002操作:

          redis-cli -c -h 192.168.127.130 -p 7002


          

        10、通过Cluster Nodes命令和Cluster Info命令来看看集群效果。

        

        11、在集群上通过增加数据来测试集群效果。直接看截图效果吧:

        

        每个Redis的节点都有一个ID值,此ID将被此特定redis实例永久使用,以便实例在集群上下文中具有唯一的名称。 每个节点都会记住使用此ID的每个其他节点,而不是通过IP或端口。IP地址和端口可能会发生变化,但唯一的节点标识符在节点的整个生命周期内都不会改变。 我们简单地称这个标识符为节点ID。

后记

       1、通过以上步骤,手动配置Redis集群就成功了。

           2、总结可能出现的步骤问题,导致客户端不能正常访问Redis:

                         1、redis.conf限制了IP地址访问

                         2、没有开启Redis集群总线端口==>"Redis端口+10000"

                         3、使用rudy命令开启集群,在非本地环境下,没有使用外网IP

                             ruby redis-trib.rb create --replicas 1 外网IP:7000 外网IP:7001 外网IP:7002 外网IP:7003 外网IP:7004 外网IP:7005 

          3、本文档是在借鉴了别人的博文https://www.cnblogs.com/PatrickLiu/p/8458788.html,结合自己的实际操作总结而来

 

posted @ 2019-07-02 16:04  隐语者  阅读(9112)  评论(0编辑  收藏  举报