精华内容
下载资源
问答
  • Linux Redis集群搭建与集群客户端实现 硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本:3.2.1 Redis已经成功安装,安装路径为/home/idata/yangfan/local/redis-3.2.1...

    Linux Redis集群搭建与集群客户端实现

    硬件环境

    本文适用的硬件环境如下

    Linux版本:CentOS release 6.7 (Final)
    Redis版本:3.2.1

    Redis已经成功安装,安装路径为/home/idata/yangfan/local/redis-3.2.1。

    我们要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动多个实例,然后组成集群。

     

    1、启动Redis多个实例

    我们在Redis安装目录下创建目录cluster,并编写7000.conf~7005.conf 6个配置文件,这6个配置文件用来启动6个实例,后面将使用这6个实例组成集群。

    以7000.conf为例,配置文件需要填写如下几项。

    复制代码
    port  7000                                        //端口7000,7002,7003        
    bind 10.93.84.53                                     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    daemonize    yes                               //redis后台运行
    pidfile  ./redis_7000.pid          //pidfile文件对应7000,7001,7002
    cluster-enabled  yes                           //开启集群  把注释#去掉
    cluster-config-file  nodes_7000.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置
    appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志 
    复制代码

    分别启动6个实例

    ./bin/redis-server cluster/conf/7000.conf
    ./bin/redis-server cluster/conf/7001.conf 
    ./bin/redis-server cluster/conf/7002.conf 
    ./bin/redis-server cluster/conf/7003.conf 
    ./bin/redis-server cluster/conf/7004.conf 
    ./bin/redis-server cluster/conf/7005.conf 

    启动成功后,看一下进程

    复制代码
    # ps -ef | grep redis | grep cluster
    idata    15711 22329  0 18:40 pts/10   00:00:00 ./bin/redis-server 10.93.84.53:7000 [cluster]
    idata    15740 22329  0 18:40 pts/10   00:00:00 ./bin/redis-server 10.93.84.53:7001 [cluster]
    idata    15810 22329  0 18:40 pts/10   00:00:00 ./bin/redis-server 10.93.84.53:7002 [cluster]
    idata    17023 22329  0 18:42 pts/10   00:00:00 ./bin/redis-server 10.93.84.53:7003 [cluster]
    idata    17030 22329  0 18:42 pts/10   00:00:00 ./bin/redis-server 10.93.84.53:7004 [cluster] idata 17035 22329 0 18:42 pts/10 00:00:00 ./bin/redis-server 10.93.84.53:7005 [cluster]
    复制代码

    至此,ip=10.93.84.53机器上创建了6个实例,端口号为port=7000~7005。

     

    Redis 3.0以上的集群方式是通过Redis安装目录下的bin/redis-trib.rb脚本搭建。

    这个脚本是用Ruby编写的,尝试运行,如果打印如下,你可以跳过本文的第二部分。

    复制代码
    idata@qa-f1502-xg01.xg01:~/yangfan/local/redis-3.2.1/bin$ ruby 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.
    复制代码

    如果执行失败,那么不幸的是你的机器没有Ruby运行的环境,那么你需要安装Ruby。进入第二部分。

     

    2、安装ruby

    下面的过程都是在root权限下完成的。

    1)yum安装ruby和依赖的包。

    # yum -y install ruby ruby-devel rubygems rpm-build 

    一般来说,这一步是能正常完成的。

     

    2)使用gem这个命令来安装redis接口

    gem是ruby的一个工具包

    # gem install redis 

    安装过程出错

    郁闷,看样子要升级ruby版本。

     

    3)升级Ruby的版本

    安装rvm,我不知道这是个什么东西,但是感觉像是Ruby的一个包管理器。

    # curl -L get.rvm.io | bash -s stable 

    WTF,又出问题了

    气急败坏的照着他说的做

    复制代码
    # gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
    gpg: keyring `/root/.gnupg/secring.gpg' created
    gpg: requesting key D39DC0E3 from hkp server keys.gnupg.net
    gpg: /root/.gnupg/trustdb.gpg: trustdb created
    gpg: key D39DC0E3: public key "Michal Papis (RVM signing) <mpapis@gmail.com>" imported
    gpg: no ultimately trusted keys found
    gpg: Total number processed: 1
    gpg:               imported: 1  (RSA: 1)
    复制代码

    然后重新下载rvm安装,成功了。

    复制代码
    # curl -L get.rvm.io | bash -s stable 
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 24090  100 24090    0     0  18023      0  0:00:01  0:00:01 --:--:--  129k
    Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz
    Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc
    gpg: Signature made Mon 11 Sep 2017 04:59:21 AM CST using RSA key ID BF04FF17
    gpg: Good signature from "Michal Papis (RVM signing) <mpapis@gmail.com>"
    gpg:                 aka "Michal Papis <michal.papis@toptal.com>"
    gpg:                 aka "[jpeg image of size 5015]"
    gpg: WARNING: This key is not certified with a trusted signature!
    gpg:          There is no indication that the signature belongs to the owner.
    Primary key fingerprint: 409B 6B17 96C2 7546 2A17  0311 3804 BB82 D39D C0E3
         Subkey fingerprint: 62C9 E5F4 DA30 0D94 AC36  166B E206 C29F BF04 FF17
    GPG verified '/usr/local/rvm/archives/rvm-1.29.3.tgz'
    Creating group 'rvm'
    
    Installing RVM to /usr/local/rvm/
    Installation of RVM in /usr/local/rvm/ is almost complete:
    
      * First you need to add all users that will be using rvm to 'rvm' group,
        and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.
    
      * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
        in all your open shell windows, in rare cases you need to reopen all shell windows.
    复制代码

    接着,source环境,让rvm可用。

    # source /usr/local/rvm/scripts/rvm

    查看Ruby可用版本

    复制代码
    # rvm list known
    # MRI Rubies
    [ruby-]1.8.6[-p420]
    [ruby-]1.8.7[-head] # security released on head
    [ruby-]1.9.1[-p431]
    [ruby-]1.9.2[-p330]
    [ruby-]1.9.3[-p551]
    [ruby-]2.0.0[-p648]
    [ruby-]2.1[.10]
    [ruby-]2.2[.7]
    [ruby-]2.3[.4]
    [ruby-]2.4[.1]
    复制代码

    可以看到最新的版本是2.4.1,那么我们装最新的吧。

    复制代码
    # rvm install 2.4.1
    Searching for binary rubies, this might take some time.
    No binary rubies available for: centos/6/x86_64/ruby-2.4.1.
    Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
    Checking requirements for centos.
    Installing requirements for centos.
    Installing required packages: libffi-devel, libyaml-devel......
    Requirements installation successful.
    Installing Ruby from source to: /usr/local/rvm/rubies/ruby-2.4.1, this may take a while depending on your cpu(s)...
    ruby-2.4.1 - #downloading ruby-2.4.1, this may take a while depending on your connection...
    
    curl: (35) SSL connect error
    There was an error(35).
    Checking fallback: https://ftp.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 11.9M  100 11.9M    0     0  1753k      0  0:00:07  0:00:07 --:--:-- 2919k
    ruby-2.4.1 - #extracting ruby-2.4.1 to /usr/local/rvm/src/ruby-2.4.1....
    ruby-2.4.1 - #applying patch /usr/local/rvm/patches/ruby/2.4.1/random_c_using_NR_prefix.patch.
    ruby-2.4.1 - #configuring..................................................................
    ruby-2.4.1 - #post-configuration..
    ruby-2.4.1 - #compiling..............................................................................................
    ruby-2.4.1 - #installing.........................
    ruby-2.4.1 - #making binaries executable..
    ruby-2.4.1 - #downloading rubygems-2.6.14
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  751k  100  751k    0     0   443k      0  0:00:01  0:00:01 --:--:--  628k
    No checksum for downloaded archive, recording checksum in user configuration.
    ruby-2.4.1 - #extracting rubygems-2.6.14....
    ruby-2.4.1 - #removing old rubygems.........
    ruby-2.4.1 - #installing rubygems-2.6.14...........................
    ruby-2.4.1 - #gemset created /usr/local/rvm/gems/ruby-2.4.1@global
    ruby-2.4.1 - #importing gemset /usr/local/rvm/gemsets/global.gems...............................................
    ruby-2.4.1 - #generating global wrappers........
    ruby-2.4.1 - #gemset created /usr/local/rvm/gems/ruby-2.4.1
    ruby-2.4.1 - #importing gemsetfile /usr/local/rvm/gemsets/default.gems evaluated to empty gem list
    ruby-2.4.1 - #generating default wrappers........
    ruby-2.4.1 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
    Install of ruby-2.4.1 - #complete 
    Ruby was built without documentation, to build it run: rvm docs generate-ri
    复制代码

    至此,我们升级了Ruby的版本。

     

    4)安装gem redis接口,成功!

    复制代码
    gem install redis
    Fetching: redis-4.0.1.gem (100%)
    Successfully installed redis-4.0.1
    Parsing documentation for redis-4.0.1
    Installing ri documentation for redis-4.0.1
    Done installing documentation for redis after 0 seconds
    1 gem installed
    复制代码

     

    5)安装rubygems,成功!

    复制代码
    # yum install -y rubygems
    Loaded plugins: fastestmirror, security
    Setting up Install Process
    Loading mirror speeds from cached hostfile
    base                                                                                                                                                   | 3.7 kB     00:00     
    didi_jenkins_enable                                                                                                                                    | 1.5 kB     00:00     
    didi_op_toa_enable                                                                                                                                     | 1.5 kB     00:00     
    didi_txjenkins_enable                                                                                                                                  | 1.5 kB     00:00     
    didi_update                                                                                                                                            | 1.5 kB     00:00     
    epel                                                                                                                                                   | 4.3 kB     00:00     
    extras                                                                                                                                                 | 3.4 kB     00:00     
    tmprepo                                                                                                                                                | 1.5 kB     00:00     
    updates                                                                                                                                                | 3.4 kB     00:00     
    Package rubygems-1.3.7-5.el6.noarch already installed and latest version
    Nothing to do
    复制代码

    至此,我们的Ruby和运行redis-trib.rb需要的环境安装完成了。 

     

    3、Redis集群搭建

    有了Ruby执行环境,可以开始将之前的6个实例组建成集群了。

    命令方式:

    ruby ./bin/redis-trib.rb create --replicas 1 10.93.84.53:7000 10.93.84.53:7001 10.93.84.53:7002 10.93.84.53:7003 10.93.84.53:7004 10.93.84.53:7005
    --replicas 1表示为集群的master节点创建1个副本。那么6个实例里,有三个master,有三个是slave。
    
    后面跟上6个实例就好了,形式就是ip:port

    执行情况:

    复制代码
    # ruby ./bin/redis-trib.rb create --replicas 1 10.93.84.53:7000 10.93.84.53:7001 10.93.84.53:7002 10.93.84.53:7003 10.93.84.53:7004 10.93.84.53:7005
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    10.93.84.53:7000
    10.93.84.53:7001
    10.93.84.53:7002
    Adding replica 10.93.84.53:7003 to 10.93.84.53:7000
    Adding replica 10.93.84.53:7004 to 10.93.84.53:7001
    Adding replica 10.93.84.53:7005 to 10.93.84.53:7002
    M: 6346ae8c7af7949658619fcf4021cc7aca454819 10.93.84.53:7000
       slots:0-5460 (5461 slots) master
    M: 5ac973bceab0d486c497345fe884ff54d1bb225a 10.93.84.53:7001
       slots:5461-10922 (5462 slots) master
    M: cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932 10.93.84.53:7002
       slots:10923-16383 (5461 slots) master
    S: 92f62ec93a0550d962f81213ca7e9b3c9c996afd 10.93.84.53:7003
       replicates 6346ae8c7af7949658619fcf4021cc7aca454819
    S: 942c9f97dc68198c39f425d13df0d8e3c40c5a58 10.93.84.53:7004
       replicates 5ac973bceab0d486c497345fe884ff54d1bb225a
    S: a92a81532b63652bbd862be6f19a9bd8832e5e05 10.93.84.53:7005
       replicates cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932
    Can I set the above configuration? (type 'yes' to accept): yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join...
    >>> Performing Cluster Check (using node 10.93.84.53:7000)
    M: 6346ae8c7af7949658619fcf4021cc7aca454819 10.93.84.53:7000
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    S: a92a81532b63652bbd862be6f19a9bd8832e5e05 10.93.84.53:7005
       slots: (0 slots) slave
       replicates cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932
    M: 5ac973bceab0d486c497345fe884ff54d1bb225a 10.93.84.53:7001
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: 942c9f97dc68198c39f425d13df0d8e3c40c5a58 10.93.84.53:7004
       slots: (0 slots) slave
       replicates 5ac973bceab0d486c497345fe884ff54d1bb225a
    S: 92f62ec93a0550d962f81213ca7e9b3c9c996afd 10.93.84.53:7003
       slots: (0 slots) slave
       replicates 6346ae8c7af7949658619fcf4021cc7aca454819
    M: cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932 10.93.84.53:7002
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    复制代码

     可以看到16384个slot都已经创建完成,并且建立了3个master和对应的replica:

    复制代码
    Using 3 masters:
    10.93.84.53:7000
    10.93.84.53:7001
    10.93.84.53:7002
    Adding replica 10.93.84.53:7003 to 10.93.84.53:7000
    Adding replica 10.93.84.53:7004 to 10.93.84.53:7001
    Adding replica 10.93.84.53:7005 to 10.93.84.53:7002
    
    。。。
    [OK] All 16384 slots covered.
    复制代码

     

     

    4、验证集群状态

    登录集群客户端,-c标识以集群方式登录

    ./bin/redis-cli -h 10.93.84.53 -p 7000 -c

    查看集群状态

    复制代码
    10.93.84.53:7000> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:8
    cluster_my_epoch:8
    cluster_stats_messages_sent:215
    cluster_stats_messages_received:215
    10.93.84.53:7000> cluster nodes
    942c9f97dc68198c39f425d13df0d8e3c40c5a58 10.93.84.53:7004 slave 5ac973bceab0d486c497345fe884ff54d1bb225a 0 1507806791940 5 connected
    5ac973bceab0d486c497345fe884ff54d1bb225a 10.93.84.53:7001 master - 0 1507806788937 2 connected 5461-10922
    a92a81532b63652bbd862be6f19a9bd8832e5e05 10.93.84.53:7005 slave cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932 0 1507806790939 6 connected
    cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932 10.93.84.53:7002 master - 0 1507806789937 3 connected 10923-16383
    6346ae8c7af7949658619fcf4021cc7aca454819 10.93.84.53:7000 myself,slave 92f62ec93a0550d962f81213ca7e9b3c9c996afd 0 0 1 connected
    92f62ec93a0550d962f81213ca7e9b3c9c996afd 10.93.84.53:7003 master - 0 1507806792941 8 connected 0-5460
    复制代码

     一些原理

    redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

    Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的,一致性哈希对向集群中新增和删除实例的支持很好,但是哈希槽对向集群新增实例或者删除实例的话,需要额外的操作,需要手动的将slot重新平均的分配到新集群的实例中。

    redis cluster 默认分配了 16384 个slot,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是:CRC16(key)%16384。

    Redis 集群会把数据存在一个master节点,然后在这个master和其对应的salve之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的salve节点,充当master。

    需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

     

    5、python集群客户端

    以Python Redis Cluster集群的使用方式为例,简单说明一下如何使用,让大家更直观的了解一下Redis集群。

    Redis集群方式与单机方式在python客户端实现上是有很大不同的。

    • 包不同,单机依赖包redis-py,集群依赖包redis-py-cluster
    • 对同时操作多个keys的命令(mset, mget, sinter, ...),redis-py-cluster重写StriceRedis(单机Redis操作类)了其方法,而这些方法丧失了命令的原子性。
    • Pipelines在集群中的表现也不同了。在单机版中,pipeline是批量batch提交redis批量执行的,但是在集群版中,是one by one提交redis执行完成直接返回,在客户端重新组合成一个列表返回。所以集群中只是看起来像是批量执行。
    • 一些命令是会Fanout(扇形)发送到集群中各个shard中执行并汇总的,如ping,keys等。一些命令是不提倡使用(blocked),如watch,unwatch等。

    我只是简单翻译了官网的一些内容,相信信息大家可以参考:

    http://redis-py-cluster.readthedocs.io/en/master/commands.html

    http://redis-py-cluster.readthedocs.io/en/master/limitations-and-differences.html

     

    1)安装redis-py-cluster 

    简单的通过pip安装redis-py-cluster包。如果安装失败,可以自助下载安装。

    # pip install redis-py-cluster     
    Collecting redis-py-cluster
      Downloading redis_py_cluster-1.3.4-py2.py3-none-any.whl
    Requirement already satisfied: redis>=2.10.2 in /home/idata/pythonEnv/idataPlatEnv/lib/python2.7/site-packages/redis-2.10.5-py2.7.egg (from redis-py-cluster)
    Installing collected packages: redis-py-cluster
    Successfully installed redis-py-cluster-1.3.4

     

    2)一个简单的demo

    封装了RedisCluster操作类,实现了一些方法,其实就是做了一层封装。

    封装的意义是:我喜欢对这些封装增加一些装饰器,控制异常和重试等逻辑。

    复制代码
    # -*- coding:utf-8 -*-
    
    from rediscluster import StrictRedisCluster
    
    redis_nodes = [
            {'host': '10.93.84.53', 'port': 7000},
            {'host': '10.93.84.53', 'port': 7001},
            {'host': '10.93.84.53', 'port': 7002},
            {'host': '10.93.84.53', 'port': 7003},
            {'host': '10.93.84.53', 'port': 7004},
            {'host': '10.93.84.53', 'port': 7005},
        ]
    
    
    class RedisCluster(object):
    
        def __init__(self, redis_nodes):
            self.cluster = StrictRedisCluster(startup_nodes=redis_nodes)
    
        # 无差别的方法
        def set(self, name, value, ex=None, px=None, nx=False, xx=False):
            return self.cluster.set(name, value, ex, px, nx, xx)
        
        # 无差别的方法
        def get(self, name):
            return self.cluster.get(name)
        
        # 扇形发送的命令
        def cluster_info(self):
            return self.cluster.cluster_info()
    
        # 重写StrictRedis的方法
        def mset(self, *args, **kwargs):
            return self.cluster.mset(args, kwargs)
        
        # 重写StrictRedis的方法
        def mget(self, keys, *args):
            return self.cluster.mget(keys, args)
        
        
    cluster = RedisCluster(redis_nodes)
    cluster.cluster_info()
    复制代码

     

    展开全文
  • linux redis 集群配置

    2020-02-05 18:43:12
    单机,开启多个redis服务 1、安装redis,当前最新版3.2.6: wgethttp://download.redis.io/releases/redis-3.2.6.tar.gz 解压并移动到自定义的一个文件夹中(我的是/software/redis) 解压命令 tar -zxvf ...

    环境:linux contos7

    单机,开启多个redis服务

    1、安装redis,当前最新版3.2.6:

    wget http://download.redis.io/releases/redis-3.2.6.tar.gz

    解压并移动到自定义的一个文件夹中(我的是/software/redis)

    解压命令 tar -zxvf 文件名

    移动命令 mv 当前文件夹 目标文件夹

     

    最终结构:/software/redis/

     

    2、到redis目录下执行命令:

    make && make install

    安装完成之后默认会/usr/local/bin/

    目录下面可以看到

    redis-server等等文件,说明安装成功了,这个时候可以运行看一下redis是否可以正常启动

    进入bin目录下,启动命令:.

    /redis-server

    3、redis的conf文件一般为/etc/redis.conf

    一般情况都会请求成功,如果失败,自己找找原因吧

     

    --------------------------------------------------------------------进入正题-----------------------------------------------------------------------------------------

     

    3、进入redis目录下

    cd /software/redis/
    
    mkdir redis_cluster
    
    cd redis_cluster
    
    mkdir 7000 7001 7002 7003 7004 7005
    
    cd /software/redis
    
    cp redis.conf redis_cluster/7000
    
    cp redis.conf redis_cluster/7001
    
    cp redis.conf redis_cluster/7002
    
    cp redis.conf redis_cluster/7003
    
    cp redis.conf redis_cluster/7004
    
    cp redis.conf redis_cluster/7005
    
    cd redis_cluster/7000
    
    vi redis.conf

    修改以下几个属性(IP地址为自己机器的IP)

    bind 192.168.1.110
    
    port 7000 #其他文件相应修改
    
    daemonize yes
    
    pidfile /var/run/redis_7000.pid #其他文件相应修改
    
    appendonly yes
    
    cluster-enabled yes
    
    cluster-config-file nodes_7000.conf #其他文件相应修改
    
    cluster-node-timeout 15000
    
    :wq

    4、这样配置完成之后可以启动这6个redis服务

    执行命令:

    redis-server /software/redis/redis_cluster/7000/redis.conf
    
    redis-server /software/redis/redis_cluster/7001/redis.conf
    
    redis-server /software/redis/redis_cluster/7002/redis.conf
    
    redis-server /software/redis/redis_cluster/7003/redis.conf
    
    redis-server /software/redis/redis_cluster/7004/redis.conf
    
    redis-server /software/redis/redis_cluster/7005/redis.conf
    
    

    5、启动之后可以查看是否启动成功

    执行命令:

    ps -ef | grep redis

    出现整齐的一排

    redis-server 192.168.1.110:7000[cluster]
    redis-server 192.168.1.110:7001[cluster]
    redis-server 192.168.1.110:7002[cluster]
    redis-server 192.168.1.110:7003[cluster]
    redis-server 192.168.1.110:7004[cluster]

    redis-server 192.168.1.110:7005[cluster]

    说明启动成功,失败的话自己找原因吧

     

    6、进入redis目录下的src目录

    cd /software/redis/src
    
    cp redis-trib.rb /usr/local/bin
    
    cd /usr/local/bin

    7、这个时候需要检查以下机器上是否有安装ruby,一般都没安装

    命令:

    rpm -qa | grep ruby

    如果出现一堆

    ruby.....东西的话就是安装ruby了,没有的话就会提示没有

     

    执行:

    yum install ruby

    等待安装成功

     

    安装redis接口

    执行:

    gem install redis

    等待安装成功

     

    7、最后一步,执行创建集群的命令:

    进入usr/local/bin/目录下,执行:

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

    执行成功,自己检查一下吧

     

    备注:

    一定要确定7000-7005端口是开放的。不知道怎么开放看之前的博客

    展开全文
  • Redis集群详解

    万次阅读 多人点赞 2019-05-10 13:56:46
    Redis集群详解 Redis有三种集群模式,分别是: * 主从模式 * Sentinel模式 * Cluster模式 三种集群模式各有特点,关于Redis介绍可以参考这里:NoSQL(二)——Redis Redis官网:https://redis.io/ ,最新版本5.0.4...

    Redis集群详解

    Redis有三种集群模式,分别是:

    * 主从模式
    
    * Sentinel模式
    
    * Cluster模式
    

    三种集群模式各有特点,关于Redis介绍可以参考这里:NoSQL(二)——Redis

    Redis官网:https://redis.io/ ,最新版本5.0.4


    主从模式

    主从模式介绍

    主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。

    其中主从复制有如下特点:

    * 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
    
    * 从数据库一般都是只读的,并且接收主数据库同步过来的数据
    
    * 一个master可以拥有多个slave,但是一个slave只能对应一个master
    
    * slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
    
    * master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
    
    * master挂了以后,不会在slave节点中重新选一个master
    

    工作机制:

    当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。

    复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。

    安全设置:

    当master节点设置密码后,

    客户端访问master需要密码
    
    启动slave需要密码,在配置文件中配置即可
    
    客户端访问slave不需要密码
    

    缺点:

    从上面可以看出,master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务。

    主从模式搭建

    • 环境准备:
    master节点                  192.168.30.128
    
    slave节点                   192.168.30.129
    
    slave节点                   192.168.30.130
    
    • 全部下载安装:
    # cd /software
    
    # wget http://download.redis.io/releases/redis-5.0.4.tar.gz
    
    # tar zxf redis-5.0.4.tar.gz && mv redis-5.0.4/ /usr/local/redis
    
    # cd /usr/local/redis && make && make install
    
    # echo $?
    0
    
    • 全部配置成服务:

    服务文件

    # vim /usr/lib/systemd/system/redis.service
    
    [Unit]
    Description=Redis persistent key-value database
    After=network.target
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --supervised systemd
    ExecStop=/usr/libexec/redis-shutdown
    Type=notify
    User=redis
    Group=redis
    RuntimeDirectory=redis
    RuntimeDirectoryMode=0755
    
    [Install]
    WantedBy=multi-user.target
    

    shutdown脚本

    # vim /usr/libexec/redis-shutdown
    
    #!/bin/bash
    #
    # Wrapper to close properly redis and sentinel
    test x"$REDIS_DEBUG" != x && set -x
    
    REDIS_CLI=/usr/local/bin/redis-cli
    
    # Retrieve service name
    SERVICE_NAME="$1"
    if [ -z "$SERVICE_NAME" ]; then
       SERVICE_NAME=redis
    fi
    
    # Get the proper config file based on service name
    CONFIG_FILE="/usr/local/redis/$SERVICE_NAME.conf"
    
    # Use awk to retrieve host, port from config file
    HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`
    PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`
    PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`
    SOCK=`awk '/^[[:blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1`
    
    # Just in case, use default host, port
    HOST=${HOST:-127.0.0.1}
    if [ "$SERVICE_NAME" = redis ]; then
        PORT=${PORT:-6379}
    else
        PORT=${PORT:-26739}
    fi
    
    # Setup additional parameters
    # e.g password-protected redis instances
    [ -z "$PASS"  ] || ADDITIONAL_PARAMS="-a $PASS"
    
    # shutdown the service properly
    if [ -e "$SOCK" ] ; then
            $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown
    else
            $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown
    fi
    
    # chmod +x /usr/libexec/redis-shutdown
    
    # useradd -s /sbin/nologin redis
    
    # chown -R redis:redis /usr/local/redis
    
    # chown -R redis:redis /data/redis
    
    # yum install -y bash-completion && source /etc/profile                 #命令补全
    
    # systemctl daemon-reload
    
    # systemctl enable redis
    
    • 修改配置:

    192.168.30.128

    # mkdir -p /data/redis
    
    # vim /usr/local/redis/redis.conf
    
    bind 192.168.30.128               #监听ip,多个ip用空格分隔
    daemonize yes               #允许后台启动
    logfile "/usr/local/redis/redis.log"                #日志路径
    dir /data/redis                 #数据库备份文件存放目录
    masterauth 123456               #slave连接master密码,master可省略
    requirepass 123456              #设置master连接密码,slave可省略
    
    appendonly yes                  #在/data/redis/目录生成appendonly.aof文件,将每一次写操作请求都追加到appendonly.aof 文件中
    
    # echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    
    # sysctl -p
    

    192.168.30.129

    # mkdir -p /data/redis
    
    # vim /usr/local/redis/redis.conf
    
    bind 192.168.30.129
    daemonize yes
    logfile "/usr/local/redis/redis.log"
    dir /data/redis
    replicaof 192.168.30.128 6379
    masterauth 123456
    requirepass 123456
    appendonly yes
    
    # echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    
    # sysctl -p
    

    192.168.30.130

    # mkdir -p /data/redis
    
    # vim /usr/local/redis/redis.conf
    
    bind 192.168.30.130
    daemonize yes
    logfile "/usr/local/redis/redis.log"
    dir /data/redis
    replicaof 192.168.30.128 6379
    masterauth 123456
    requirepass 123456
    appendonly yes
    
    # echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    
    # sysctl -p
    
    • 全部启动redis:
    # systemctl start redis
    
    • 查看集群状态:
    # redis-cli -h 192.168.30.128 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.128:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.30.129,port=6379,state=online,offset=168,lag=1
    slave1:ip=192.168.30.130,port=6379,state=online,offset=168,lag=1
    master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:168
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:168
    
    # redis-cli -h 192.168.30.129 -a 123456 info replication
    
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    # Replication
    role:slave
    master_host:192.168.30.128
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:196
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:196
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:196
    
    • 数据演示:
    192.168.30.128:6379> keys *
    (empty list or set)
    
    192.168.30.128:6379> set key1 100
    OK
    
    192.168.30.128:6379> set key2 lzx
    OK
    
    192.168.30.128:6379> keys *
    1) "key1"
    2) "key2"
    
    # redis-cli -h 192.168.30.129 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.129:6379> keys *
    1) "key2"
    2) "key1"
    
    192.168.30.129:6379> CONFIG GET dir
    1) "dir"
    2) "/data/redis"
    
    192.168.30.129:6379> CONFIG GET dbfilename
    1) "dbfilename"
    2) "dump.rdb"
    
    192.168.30.129:6379> get key1
    "100"
    
    192.168.30.129:6379> get key2
    "lzx"
    
    192.168.30.129:6379> set key3 aaa
    (error) READONLY You can't write against a read only replica.
    
    # redis-cli -h 192.168.30.130 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.130:6379> keys *
    1) "key2"
    2) "key1"
    
    192.168.30.130:6379> CONFIG GET dir
    1) "dir"
    2) "/data/redis"
    
    192.168.30.130:6379> CONFIG GET dbfilename
    1) "dbfilename"
    2) "dump.rdb"
    
    192.168.30.130:6379> get key1
    "100"
    
    192.168.30.130:6379> get key2
    "lzx"
    
    192.168.30.130:6379> set key3 aaa
    (error) READONLY You can't write against a read only replica.
    

    可以看到,在master节点写入的数据,很快就同步到slave节点上,而且在slave节点上无法写入数据。


    Sentinel模式

    Sentinel模式介绍

    主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生。

    sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况,特点如下:

    * sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义
    
    * 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
    
    * 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
    
    * sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
    
    * 多sentinel配置的时候,sentinel之间也会自动监控
    
    * 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心
    
    * 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
    
    * sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
    

    工作机制:

    * 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令 
    
    * 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。 
    
    * 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
    
    * 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线 
    
    * 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令 
    
    * 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次 
    
    * 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
      若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除
    

    当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,sentinel就会感知并将新的master节点提供给使用者。

    Sentinel模式搭建

    • 环境准备:
    master节点              192.168.30.128          sentinel端口:26379
    
    slave节点               192.168.30.129          sentinel端口:26379
    
    slave节点               192.168.30.130          sentinel端口:26379
    
    • 修改配置:

    前面已经下载安装了redis,这里省略,直接修改sentinel配置文件。

    192.168.30.128

    # vim /usr/local/redis/sentinel.conf
    
    daemonize yes
    logfile "/usr/local/redis/sentinel.log"
    dir "/usr/local/redis/sentinel"                 #sentinel工作目录
    sentinel monitor mymaster 192.168.30.128 6379 2                 #判断master失效至少需要2个sentinel同意,建议设置为n/2+1,n为sentinel个数
    sentinel auth-pass mymaster 123456
    sentinel down-after-milliseconds mymaster 30000                 #判断master主观下线时间,默认30s
    

    这里需要注意,sentinel auth-pass mymaster 123456需要配置在sentinel monitor mymaster 192.168.30.128 6379 2下面,否则启动报错:

    # /usr/local/bin/redis-sentinel /usr/local/redis/sentinel.conf
    
    *** FATAL CONFIG FILE ERROR ***
    Reading the configuration file, at line 104
    >>> 'sentinel auth-pass mymaster 123456'
    No such master with specified name.
    
    • 全部启动sentinel:
    # mkdir /usr/local/redis/sentinel && chown -R redis:redis /usr/local/redis
    
    # /usr/local/bin/redis-sentinel /usr/local/redis/sentinel.conf
    
    • 任一主机查看日志:
    # tail -f /usr/local/redis/sentinel.log
    
    21574:X 09 May 2019 15:32:04.298 # Sentinel ID is 30c417116a8edbab09708037366c4a7471beb770
    21574:X 09 May 2019 15:32:04.298 # +monitor master mymaster 192.168.30.128 6379 quorum 2
    21574:X 09 May 2019 15:32:04.299 * +slave slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    21574:X 09 May 2019 15:32:04.300 * +slave slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.128 6379
    21574:X 09 May 2019 15:32:16.347 * +sentinel sentinel 79b8d61626afd4d059fb5a6a63393e9a1374e78f 192.168.30.129 26379 @ mymaster 192.168.30.128 6379
    21574:X 09 May 2019 15:32:31.584 * +sentinel sentinel d7b429dcba792103ef0d80827dd0910bd9284d21 192.168.30.130 26379 @ mymaster 192.168.30.128 6379
    

    Sentinel模式下的几个事件:

    ·       +reset-master :主服务器已被重置。
    
    ·       +slave :一个新的从服务器已经被 Sentinel 识别并关联。
    
    ·       +failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
    
    ·       +failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
    
    ·       +slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了 [SLAVEOF](/commands/slaveof.html) 命令,为实例设置新的主服务器。
    
    ·       +slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
    
    ·       +slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
    
    ·       -dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。
    
    ·       +sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
    
    ·       +sdown :给定的实例现在处于主观下线状态。
    
    ·       -sdown :给定的实例已经不再处于主观下线状态。
    
    ·       +odown :给定的实例现在处于客观下线状态。
    
    ·       -odown :给定的实例已经不再处于客观下线状态。
    
    ·       +new-epoch :当前的纪元(epoch)已经被更新。
    
    ·       +try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
    
    ·       +elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
    
    ·       +failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器。
    
    ·       no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
    
    ·       selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
    
    ·       failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
    
    ·       failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
    
    ·       failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
    
    ·       +switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
    
    ·       +tilt :进入 tilt 模式。
    
    ·       -tilt :退出 tilt 模式。
    
    • master宕机演示:

    192.168.30.128

    # systemctl stop redis
    
    # tail -f /usr/local/redis/sentinel.log
    
    22428:X 09 May 2019 15:51:29.287 # +sdown master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.371 # +odown master mymaster 192.168.30.128 6379 #quorum 2/2
    22428:X 09 May 2019 15:51:29.371 # +new-epoch 1
    22428:X 09 May 2019 15:51:29.371 # +try-failover master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.385 # +vote-for-leader 30c417116a8edbab09708037366c4a7471beb770 1
    22428:X 09 May 2019 15:51:29.403 # d7b429dcba792103ef0d80827dd0910bd9284d21 voted for 30c417116a8edbab09708037366c4a7471beb770 1
    22428:X 09 May 2019 15:51:29.408 # 79b8d61626afd4d059fb5a6a63393e9a1374e78f voted for 30c417116a8edbab09708037366c4a7471beb770 1
    22428:X 09 May 2019 15:51:29.451 # +elected-leader master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.451 # +failover-state-select-slave master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.528 # +selected-slave slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.528 * +failover-state-send-slaveof-noone slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.594 * +failover-state-wait-promotion slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:30.190 # +promoted-slave slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:30.190 # +failover-state-reconf-slaves master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:30.258 * +slave-reconf-sent slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:30.511 # -odown master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:31.233 * +slave-reconf-inprog slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:31.233 * +slave-reconf-done slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:31.297 # +failover-end master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:31.297 # +switch-master mymaster 192.168.30.128 6379 192.168.30.129 6379
    22428:X 09 May 2019 15:51:31.298 * +slave slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 15:51:31.298 * +slave slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 15:52:31.307 # +sdown slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    

    从日志中可以看到,master已经从192.168.30.128转移到192.168.30.129上

    192.168.30.129上查看集群信息

    # /usr/local/bin/redis-cli -h 192.168.30.129 -p 6379 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.129:6379> info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=192.168.30.130,port=6379,state=online,offset=291039,lag=1
    master_replid:757aff269236ed2707ba584a86a40716c1c76d74
    master_replid2:47a862fc0ff20362be29096ecdcca6d432070ee9
    master_repl_offset:291182
    second_repl_offset:248123
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:291182
    
    192.168.30.129:6379> set key4 linux
    OK
    

    当前集群中只有一个slave——192.168.30.130,master是192.168.30.129,且192.168.30.129具有写权限。

    192.168.30.130上查看redis的配置文件也可以看到replicaof 192.168.30.129 6379,这是sentinel在选举master是做的修改。

    重新把192.168.30.128上进程启动

    # systemctl start redis
    
    # tail -f /usr/local/redis/sentinel.log
    
    22428:X 09 May 2019 15:51:31.297 # +switch-master mymaster 192.168.30.128 6379 192.168.30.129 6379
    22428:X 09 May 2019 15:51:31.298 * +slave slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 15:51:31.298 * +slave slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 15:52:31.307 # +sdown slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 16:01:24.872 # -sdown slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    

    查看集群信息

    # /usr/local/bin/redis-cli -h 192.168.30.128 -p 6379 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.128:6379> info replication
    # Replication
    role:slave
    master_host:192.168.30.129
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:0
    master_sync_in_progress:0
    slave_repl_offset:514774
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:757aff269236ed2707ba584a86a40716c1c76d74
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:514774
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:376528
    repl_backlog_histlen:138247
    
    192.168.30.128:6379> get key4
    "linux"
    
    192.168.30.128:6379> set key5
    (error) ERR wrong number of arguments for 'set' command
    

    即使192.168.30.128重新启动redis服务,也是作为slave加入redis集群,192.168.30.129仍然是master。


    Cluster模式

    Cluster模式介绍

    sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。

    cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。

    使用集群,只需要将redis配置文件中的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便。

    cluster集群特点:

    * 多个redis节点网络互联,数据共享
    
    * 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
    
    * 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,
      并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
      
    * 支持在线增加、删除节点
    
    * 客户端可以连接任何一个主节点进行读写
    

    Cluster模式搭建

    • 环境准备:
    三台机器,分别开启两个redis服务(端口)
    
    192.168.30.128              端口:7001,7002
    
    192.168.30.129              端口:7003,7004
    
    192.168.30.130              端口:7005,7006
    
    • 修改配置文件:

    192.168.30.128

    # mkdir /usr/local/redis/cluster
    
    # cp /usr/local/redis/redis.conf /usr/local/redis/cluster/redis_7001.conf
    
    # cp /usr/local/redis/redis.conf /usr/local/redis/cluster/redis_7002.conf
    
    # chown -R redis:redis /usr/local/redis
    
    # mkdir -p /data/redis/cluster/{redis_7001,redis_7002} && chown -R redis:redis /data/redis
    
    # vim /usr/local/redis/cluster/redis_7001.conf
    
    bind 192.168.30.128
    port 7001
    daemonize yes
    pidfile "/var/run/redis_7001.pid"
    logfile "/usr/local/redis/cluster/redis_7001.log"
    dir "/data/redis/cluster/redis_7001"
    #replicaof 192.168.30.129 6379
    masterauth 123456
    requirepass 123456
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7001.conf
    cluster-node-timeout 15000
    
    # vim /usr/local/redis/cluster/redis_7002.conf
    
    bind 192.168.30.128
    port 7002
    daemonize yes
    pidfile "/var/run/redis_7002.pid"
    logfile "/usr/local/redis/cluster/redis_7002.log"
    dir "/data/redis/cluster/redis_7002"
    #replicaof 192.168.30.129 6379
    masterauth "123456"
    requirepass "123456"
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7002.conf
    cluster-node-timeout 15000
    

    其它两台机器配置与192.168.30.128一致,此处省略

    • 启动redis服务:
    # redis-server /usr/local/redis/cluster/redis_7001.conf
    
    # tail -f /usr/local/redis/cluster/redis_7001.log
    
    # redis-server /usr/local/redis/cluster/redis_7002.conf
    
    # tail -f /usr/local/redis/cluster/redis_7002.log
    

    其它两台机器启动与192.168.30.128一致,此处省略

    • 安装ruby并创建集群(低版本):

    如果redis版本比较低,则需要安装ruby。任选一台机器安装ruby即可

    # yum -y groupinstall "Development Tools"
    
    # yum install -y gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel
    
    # mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
    
    # wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P ~/rpmbuild/SOURCES
    
    # wget http://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P ~/rpmbuild/SPECS
    
    # rpmbuild -bb ~/rpmbuild/SPECS/ruby22x.spec
    
    # rpm -ivh ~/rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.x86_64.rpm
    
    # gem install redis                 #目的是安装这个,用于配置集群
    
    # cp /usr/local/redis/src/redis-trib.rb /usr/bin/
    
    # redis-trib.rb create --replicas 1 192.168.30.128:7001 192.168.30.128:7002 192.168.30.129:7003 192.168.30.129:7004 192.168.30.130:7005 192.168.30.130:7006
    
    • 创建集群:

    我这里是redis5.0.4,所以不需要安装ruby,直接创建集群即可

    # redis-cli -a 123456 --cluster create 192.168.30.128:7001 192.168.30.128:7002 192.168.30.129:7003 192.168.30.129:7004 192.168.30.130:7005 192.168.30.130:7006 --cluster-replicas 1
    
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    >>> Performing hash slots allocation on 6 nodes...
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    Adding replica 192.168.30.129:7004 to 192.168.30.128:7001
    Adding replica 192.168.30.130:7006 to 192.168.30.129:7003
    Adding replica 192.168.30.128:7002 to 192.168.30.130:7005
    M: 80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001
       slots:[0-5460] (5461 slots) master
    S: b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002
       replicates 6788453ee9a8d7f72b1d45a9093838efd0e501f1
    M: 4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003
       slots:[5461-10922] (5462 slots) master
    S: b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004
       replicates 80c80a3f3e33872c047a8328ad579b9bea001ad8
    M: 6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005
       slots:[10923-16383] (5461 slots) master
    S: 277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006
       replicates 4d74ec66e898bf09006dac86d4928f9fad81f373
    Can I set the above configuration? (type 'yes' to accept): yes                  #输入yes,接受上面配置
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    

    可以看到,

    192.168.30.128:7001是master,它的slave是192.168.30.129:7004;
    
    192.168.30.129:7003是master,它的slave是192.168.30.130:7006;
    
    192.168.30.130:7005是master,它的slave是192.168.30.128:7002
    

    自动生成nodes.conf文件:

    # ls /data/redis/cluster/redis_7001/
    appendonly.aof  dump.rdb  nodes-7001.conf
    
    # vim /data/redis/cluster/redis_7001/nodes-7001.conf 
    
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557454406312 5 connected 10923-16383
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557454407000 6 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557454408371 5 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 myself,master - 0 1557454406000 1 connected 0-5460
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557454407366 4 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557454407000 3 connected 5461-10922
    vars currentEpoch 6 lastVoteEpoch 0
    

    集群操作

    • 登录集群:
    # redis-cli -c -h 192.168.30.128 -p 7001 -a 123456                  # -c,使用集群方式登录
    
    • 查看集群信息:
    192.168.30.128:7001> CLUSTER INFO                   #集群状态
    
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:580
    cluster_stats_messages_pong_sent:551
    cluster_stats_messages_sent:1131
    cluster_stats_messages_ping_received:546
    cluster_stats_messages_pong_received:580
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:1131
    
    • 列出节点信息:
    192.168.30.128:7001> CLUSTER NODES                  #列出节点信息
    
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557455176000 5 connected 10923-16383
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557455174000 6 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557455175000 5 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 myself,master - 0 1557455175000 1 connected 0-5460
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557455174989 4 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557455175995 3 connected 5461-10922
    

    这里与nodes.conf文件内容相同

    • 写入数据:
    192.168.30.128:7001> set key111 aaa
    -> Redirected to slot [13680] located at 192.168.30.130:7005                #说明数据到了192.168.30.130:7005上
    OK
    
    192.168.30.130:7005> set key222 bbb
    -> Redirected to slot [2320] located at 192.168.30.128:7001                 #说明数据到了192.168.30.128:7001上
    OK
    
    192.168.30.128:7001> set key333 ccc
    -> Redirected to slot [7472] located at 192.168.30.129:7003                 #说明数据到了192.168.30.129:7003上
    OK
    
    192.168.30.129:7003> get key111
    -> Redirected to slot [13680] located at 192.168.30.130:7005
    "aaa"
    
    192.168.30.130:7005> get key333
    -> Redirected to slot [7472] located at 192.168.30.129:7003
    "ccc"
    
    192.168.30.129:7003> 
    

    可以看出redis cluster集群是去中心化的,每个节点都是平等的,连接哪个节点都可以获取和设置数据。

    当然,平等指的是master节点,因为slave节点根本不提供服务,只是作为对应master节点的一个备份。

    • 增加节点:

    192.168.30.129上增加一节点:

    # cp /usr/local/redis/cluster/redis_7003.conf /usr/local/redis/cluster/redis_7007.conf
    
    # vim /usr/local/redis/cluster/redis_7007.conf
    
    bind 192.168.30.129
    port 7007
    daemonize yes
    pidfile "/var/run/redis_7007.pid"
    logfile "/usr/local/redis/cluster/redis_7007.log"
    dir "/data/redis/cluster/redis_7007"
    #replicaof 192.168.30.129 6379
    masterauth "123456"
    requirepass "123456"
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7007.conf
    cluster-node-timeout 15000
    
    # mkdir /data/redis/cluster/redis_7007
    
    # chown -R redis:redis /usr/local/redis && chown -R redis:redis /data/redis
    
    # redis-server /usr/local/redis/cluster/redis_7007.conf 
    

    192.168.30.130上增加一节点:

    # cp /usr/local/redis/cluster/redis_7005.conf /usr/local/redis/cluster/redis_7008.conf
    
    # vim /usr/local/redis/cluster/redis_7007.conf
    
    bind 192.168.30.130
    port 7008
    daemonize yes
    pidfile "/var/run/redis_7008.pid"
    logfile "/usr/local/redis/cluster/redis_7008.log"
    dir "/data/redis/cluster/redis_7008"
    #replicaof 192.168.30.130 6379
    masterauth "123456"
    requirepass "123456"
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7008.conf
    cluster-node-timeout 15000
    
    # mkdir /data/redis/cluster/redis_7008
    
    # chown -R redis:redis /usr/local/redis && chown -R redis:redis /data/redis
    
    # redis-server /usr/local/redis/cluster/redis_7008.conf 
    

    集群中增加节点:

    192.168.30.129:7003> CLUSTER MEET 192.168.30.129 7007
    OK
    
    192.168.30.129:7003> CLUSTER NODES
    
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 myself,master - 0 1557457361000 3 connected 5461-10922
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557457364746 1 connected 0-5460
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557457362000 6 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557457363000 4 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557457362000 5 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557457362729 0 connected
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557457363739 5 connected 10923-16383
    
    192.168.30.129:7003> CLUSTER MEET 192.168.30.130 7008
    OK
    
    192.168.30.129:7003> CLUSTER NODES
    
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 myself,master - 0 1557457489000 3 connected 5461-10922
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557457489000 1 connected 0-5460
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557457489000 6 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557457488000 4 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557457489472 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 master - 0 1557457489259 0 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557457489000 0 connected
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557457490475 5 connected 10923-16383
    

    可以看到,新增的节点都是以master身份加入集群的

    • 更换节点身份:

    将新增的192.168.30.130:7008节点身份改为192.168.30.129:7007的slave

    # redis-cli -c -h 192.168.30.130 -p 7008 -a 123456 cluster replicate e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
    

    cluster replicate后面跟node_id,更改对应节点身份。也可以登入集群更改

    # redis-cli -c -h 192.168.30.130 -p 7008 -a 123456
    
    192.168.30.130:7008> CLUSTER REPLICATE e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
    OK
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557458316881 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557458314864 1 connected 0-5460
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557458316000 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557458315872 5 connected 10923-16383
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557458317890 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557458315000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557458315000 1 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557458314000 0 connected
    

    查看相应的nodes.conf文件,可以发现有更改,它记录当前集群的节点信息

    # cat /data/redis/cluster/redis_7001/nodes-7001.conf
    
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557458236169 7 connected
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557458235000 5 connected 10923-16383
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557458234103 6 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557458235129 5 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 myself,master - 0 1557458234000 1 connected 0-5460
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557458236000 4 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557458236000 0 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557458233089 3 connected 5461-10922
    vars currentEpoch 7 lastVoteEpoch 0
    
    • 删除节点:
    192.168.30.130:7008> CLUSTER FORGET 1a1c7f02fce87530bd5abdfc98df1cffce4f1767
    (error) ERR I tried hard but I can't forget myself...               #无法删除登录节点
    
    192.168.30.130:7008> CLUSTER FORGET e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
    (error) ERR Can't forget my master!                 #不能删除自己的master节点
    
    192.168.30.130:7008> CLUSTER FORGET 6788453ee9a8d7f72b1d45a9093838efd0e501f1
    OK              #可以删除其它的master节点
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557458887328 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557458887000 1 connected 0-5460
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557458886000 3 connected 5461-10922
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave - 0 1557458888351 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557458885000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557458883289 1 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557458885310 0 connected
    
    192.168.30.130:7008> CLUSTER FORGET b4d3eb411a7355d4767c6c23b4df69fa183ef8bc
    OK              #可以删除其它的slave节点
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557459031397 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557459032407 1 connected 0-5460
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557459035434 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557459034000 5 connected 10923-16383
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557459032000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557459034000 1 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557459034427 0 connected
    
    • 保存配置:
    192.168.30.130:7008> CLUSTER SAVECONFIG                 #将节点配置信息保存到硬盘
    OK
     
    # cat /data/redis/cluster/redis_7001/nodes-7001.conf
    
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557458236169 7 connected
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557458235000 5 connected 10923-16383
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557458234103 6 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557458235129 5 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 myself,master - 0 1557458234000 1 connected 0-5460
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557458236000 4 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557458236000 0 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557458233089 3 connected 5461-10922
    vars currentEpoch 7 lastVoteEpoch 0
    
    # redis-cli -c -h 192.168.30.130 -p 7008 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.130:7008> CLUSTER NODES
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557459500741 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557459500000 1 connected 0-5460
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557459501000 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557459500000 5 connected 10923-16383
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557459499737 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557459499000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557459501750 1 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557459498000 0 connected
    

    可以看到,之前删除的节点又恢复了,这是因为对应的配置文件没有删除,执行CLUSTER SAVECONFIG恢复。

    • 模拟master节点挂掉:

    192.168.30.128

    # netstat -lntp |grep 7001
    tcp        0      0 192.168.30.128:17001    0.0.0.0:*               LISTEN      6701/redis-server 1 
    tcp        0      0 192.168.30.128:7001     0.0.0.0:*               LISTEN      6701/redis-server 1 
    
    # kill 6701
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557461178000 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master,fail - 1557460950483 1557460947145 1 disconnected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557461174922 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557461181003 5 connected 10923-16383
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557461179993 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557461176000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 master - 0 1557461178981 8 connected 0-5460
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557461179000 0 connected
    

    对应7001的一行可以看到,master fail,状态为disconnected;而对应7004的一行,slave已经变成master。

    • 重新启动7001节点:
    # redis-server /usr/local/redis/cluster/redis_7001.conf
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557461307000 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 slave b6331cbc986794237c83ed2d5c30777c1551546e 0 1557461305441 8 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557461307962 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557461304935 5 connected 10923-16383
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557461306000 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557461305000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 master - 0 1557461308972 8 connected 0-5460
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557461307000 0 connected
    

    可以看到,7001节点启动后为slave节点,并且是7004的slave节点。即master节点如果挂掉,它的slave节点变为新master节点继续对外提供服务,而原来的master节点如果重启,则变为新master节点的slave节点。

    另外,如果这里是拿7007节点做测试的话,会发现7008节点并不会切换,这是因为7007节点上根本没数据。集群数据被分为三份,采用哈希槽 (hash slot)的方式来分配16384个slot的话,它们三个节点分别承担的slot 区间是:

    节点7004覆盖0-5460
    节点7003覆盖5461-10922
    节点7005覆盖10923-16383
    

    更多参考:

    Redis集群常用命令

    展开全文
  • linux中redis单机版安装到redis集群版安装(以centos7为例)redis单机版安装redis集群版安装测试集群 redis单机版安装 1.安装gcc 2.上传软件到/usr/local/app下;然后解压 解压 3.进入解压后的redis 执行...

    linux中redis单机版安装到redis集群版安装(以centos7为例)

    redis单机版安装

    1.安装gcc
    在这里插入图片描述
    在这里插入图片描述

    2.上传软件到/usr/local/app下;然后解压
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    解压
    在这里插入图片描述

    3.进入解压后的redis
    在这里插入图片描述
    在这里插入图片描述
    执行make
    在这里插入图片描述

    4.安装
    在这里插入图片描述
    编译完成后执行此安装命令
    在这里插入图片描述
    执行完后local下有redis目录
    在这里插入图片描述

    5.启动查看是否安装成功
    5.1进入local/redis/bin下启动./redis-server
    在这里插入图片描述
    5.2看到这个说明成功
    在这里插入图片描述

    6.配置后台启动
    6.1进入local/app下的解压后的redis-3.0.0
    在这里插入图片描述
    6.2将redis.conf拷贝到安装在local下redis的bin目录下
    在这里插入图片描述
    在这里插入图片描述
    6.3进入修改这个配置文件
    在这里插入图片描述
    6.4将这个改为yes即可通过配置文件后台启动
    在这里插入图片描述
    6.5再通过这个命令带上配置文件即可后台启动
    在这里插入图片描述
    6.6通过ps aux|grep redis可以看到已经启动了
    在这里插入图片描述
    6.7
    在这里插入图片描述

    7.启动后即可进入客户端
    在这里插入图片描述
    7.1输入ping有PONG回应说明连接上了
    在这里插入图片描述
    7.2quit退出客户端
    在这里插入图片描述

    redis集群版安装

    在这里插入图片描述
    1.1删除dump.rdb文件
    在这里插入图片描述

    在这里插入图片描述
    2.1:
    在这里插入图片描述
    在这里插入图片描述
    2.2:
    在这里插入图片描述
    在这里插入图片描述

    2.3:
    在这里插入图片描述
    2.3.1:
    进入local下创建一个rediscluster集群目录
    在这里插入图片描述
    2.3.2:然后进入解压后的redis/src里面去
    在这里插入图片描述
    在这里插入图片描述
    2.3.3:在src下将redis-trib.rb拷贝到rediscluster里面去
    在这里插入图片描述
    在这里插入图片描述
    2.4:在这里插入图片描述
    在这里插入图片描述
    2.5:
    在这里插入图片描述
    在这里插入图片描述

    2.6:进入local下前面安装过单机版的redis里面(要注意bin下没有那个durm.rbd文件);将bin目录拷贝到rediscluster集群目录下取名redis01
    在这里插入图片描述
    在这里插入图片描述

    2.7:进入redis01下修改redis.conf配置中的端口
    在这里插入图片描述
    2.7.1:port修改为这个7001端口
    在这里插入图片描述
    2.7.2:大约在632行将cluster-enabled yes的注释打开

    在这里插入图片描述
    2.8:进入rediscluster集群目录将redis01拷贝
    在这里插入图片描述
    2.8.1:将02-06的端口都改了
    2.8.2:02端口
    在这里插入图片描述
    在这里插入图片描述
    2.8.3:redis02-06都改为7002-7006
    在这里插入图片描述

    3:创建批量启动的命令
    3.1批量启动
    在这里插入图片描述
    在这里插入图片描述

    下面展示一些 提供复制

    cd redis01
    ./redis-server redis.conf
    cd ..
    cd redis02
    ./redis-server redis.conf
    cd ..
    cd redis03
    ./redis-server redis.conf
    cd ..
    cd redis04
    ./redis-server redis.conf
    cd ..
    cd redis05
    ./redis-server redis.conf
    cd ..
    cd redis06
    ./redis-server redis.conf
    cd ..
    

    3.1.1:授权
    在这里插入图片描述
    3.1.2:全部启动并查看
    在这里插入图片描述
    3.2:批量退出
    在这里插入图片描述
    下面展示一些 提供复制

    redis01/redis-cli -h 192.168.159.129 -p 7001 shutdown
    redis01/redis-cli -h 192.168.159.129 -p 7002 shutdown
    redis01/redis-cli -h 192.168.159.129 -p 7003 shutdown
    redis01/redis-cli -h 192.168.159.129 -p 7004 shutdown
    redis01/redis-cli -h 192.168.159.129 -p 7005 shutdown
    redis01/redis-cli -h 192.168.159.129 -p 7006 shutdown
    
    

    3.2.1:授权
    在这里插入图片描述

    4:创建集群
    在这里插入图片描述
    下面展示一些 内联代码片

    ./redis-trib.rb create --replicas 1 192.168.159.129:7001 192.168.159.129:7002 192.168.159.129:7003 192.168.159.129:7004 192.168.159.129:7005 192.168.159.129:7006
    

    4.1看到这个说明搭好了
    在这里插入图片描述
    5:
    在这里插入图片描述
    在这里插入图片描述

    测试集群

    在这里插入图片描述
    2.启动客户端
    在这里插入图片描述

    展开全文
  • Linux Redis集群配置

    2018-03-06 00:39:01
    注意:本教程redis放在同一服务器(主要是演示),实际要放不同服务器 搭建集群需要使用到官方提供的ruby脚本。 需要安装ruby的环境 [root@localhost ~]# ...redis集群管理工具redis-trib.rb [root@localh...
  • Linux上安装单机版Redis和Redis集群
  • linux安装redis集群

    2018-07-11 11:12:29
    linux安装redis集群由于这里需要使用到linux安装redis单机版的知识请看:点击打开链接准备6个节点为了保证可以进行投票,至少需要3个主节点。每个主节点都需要至少一个从节点,所以需要至少3个从节点。一共需要6台...
  • Linux安装Redis集群

    2021-02-27 12:05:38
    Linux安装Redis集群版1.Redis集群原理1.1.Redis-cluster架构图1.2.Redis-cluster投票&容错2.redis集群搭建2.1.准备6个节点2.1.1.复制实例2.1.2.启动6个实例2.2.安装环境2.3.安装redis集群2.3.1.配置集群节点...
  • Linux搭建Redis集群

    2021-01-07 10:14:48
    在我前面的文章中,讲到了Windows搭建Redis集群,今天我们就来整理下Linux如何才能搭建Redis集群。虽然单机模拟不是不好,但总没有实操6台电脑对Redis集群进行部署来的漂亮。以Ubuntu为例。使用以下载命令进行安装:...
  • 1、安装redis安装的前提条件:...2、把源码包上传到linux服务器3、解压源码包:tar -zxvf redis-3.0.0.tar.gz4、Make5、Make install:[root@bogon redis-3.0.0]# make install PREFIX=/usr/local/redis2、启动re...
  • Linux搭建redis集群

    2021-03-19 10:45:48
    在开始redis集群搭建之前,我们先简单回顾一下redis单机版的搭建过程 下载redis压缩包,然后解压压缩文件; 进入到解压缩后的redis文件目录(此时可以看到Makefile文件),编译redis源文件; 把编译好的redis源文件...
  • 上篇决定了以编译安装搭建的redis作为单机,本次就以两台同样配置下的redis单机做一个简单的redis集群,并初步生成对redis集群的管理模式。 参考官网中文版:http://redisdoc.com/topic/cluster-spec.html 一、...
  • 1、在/user/local/创建redis-cluster目录 mkdir redis-cluster 2、在redis-cluster目录下创建节点目录 mkdir 7001 7002 7003 7004 7005 7006 3、复制一份redis.conf文件到 7001节点目录 cp redis.conf ../...
  • 版本3.0之后支持集群,为解决单台服务器不够用情况。redis可作为数据库、缓存、消息中间件。Redis 5.0 是第一个加入流数据类型(stream data type )的版本。 Redis是一个开源(BSD许可),内存存储的数据结构...
  • Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。  redis主从模式部署方案如下图:    安装包 转载于:...
  • 2、压缩包上传到linux服务器目录 注:示例 /usr/loacl/packge 3、进入到压缩包上传目录解压 tar zxvf redis-xxx.tar.gz 进行解压,解压完成后进入解压目录编译 make 4、在解压目录进行安装 make install PREFIX=...
  • 个人学习linux单机redis集群,如有不足请多指教。 环境: linux centos7.8,docker-ce-18.06.3.ce,redis 6.0.6,gcc devtoolset 9等。 redis多节点有三种,最小运行为:主从模式(一主一从)、哨兵模式(一哨兵一...
  • Linuxredis集群搭建 在此我也不再叙述redis集群的投票容错什么数据分配等等一堆废话,既然需要搭建redis集群,想必多多少少也会对redis集群的一些机制有所了解的。(不了解想要了解的可以去网上搜一下redis集群有...
  • LINUX安装REDIS集群

    2018-09-19 15:01:00
    linux安装单机版redis已经在另一篇文章说过了,下边来搞集群,环境是新浪云...redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下(redis-xxx/src/)。是基于redis提供的集群命令...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,852
精华内容 4,740
关键字:

linuxredis集群单机

linux 订阅
redis 订阅