Redis集群

阅读更多
1. Redis集群概述

Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代。
redis cluster是去中心化,去中间件的,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
那么redis是如何合理分配这些节点和数据的呢?
Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的。redis cluster默认分配了16384个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。
注意的是:必须要3个以后的主节点,否则在创建集群时会失败,我们在后续会实践到。
所以,我们假设现在有3个节点已经组成了集群,分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
节点A覆盖0-5460;
节点B覆盖5461-10922;
节点C覆盖10923-16383.
那么,现在我想设置一个key ,比如叫my_name:set my_name wind
按照redis cluster的哈希槽算法:CRC16(‘my_name’)%16384 = 2412。 那么就会把这个key的存储分配到A上了。
同样,当我连接(A,B,C)任何一个节点想获取my_name这个key时,也会这样的算法,然后内部跳转到B节点上获取数据。
这种哈希槽的分配方式有好也有坏,好处就是很清晰,比如我想新增一个节点D,redis cluster的这种做法是从各个节点的前面各拿取一部分slot到D上,我会在接下来的实践中实验。大致就会变成这样:
节点A覆盖1365-5460
节点B覆盖6827-10922
节点C覆盖12288-16383
节点D覆盖0-1364,5461-6826,10923-12287
同样删除一个节点也是类似,移动完成后就可以删除这个节点了。
Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
上面那个例子里, 集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。
所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。
B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。
不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。
集群的时候,我们可以单机集群也可以多机集群。


2. Redis单机多节点集群

2.1 安装Redis

Reids安装包里有个集群工具,要复制到/usr/local/bin里去
    [root@#localhost ~]# cp redis-3.2.9/src/redis-trib.rb /usr/local/bin


2.2 修改配置,创建节点

我们现在要搞六个节点,三主三从,端口规定分别是7001,7002,7003,7004,7005,7006
我们先在root目录下新建一个redis_cluster目录,然后该目录下再创建6个目录,分别是7001,7002,7003,7004,7005,7006,用来存在redis配置文件;
这里我们要使用redis集群,要先修改redis的配置文件redis.conf
新建目录redis_cluster
    [root@#localhost ~]# mkdir redis_cluster
    [root@#localhost ~]# cd redis_cluster/
    [root@#localhost redis_cluster]# mkdir 7001 7002 7003 7004 7005 7006
    [root@#localhost redis_cluster]# ll
    总用量 0
    drwxr-xr-x. 2 root root 6 2月  28 04:23 7001
    drwxr-xr-x. 2 root root 6 2月  28 04:23 7002
    drwxr-xr-x. 2 root root 6 2月  28 04:23 7003
    drwxr-xr-x. 2 root root 6 2月  28 04:23 7004
    drwxr-xr-x. 2 root root 6 2月  28 04:23 7005
    drwxr-xr-x. 2 root root 6 2月  28 04:23 7006
先复制一份配置文件到7001目录下
    [root@#localhost redis_cluster]# cd
    [root@#localhost ~]# cp redis-3.2.9/redis.conf redis_cluster/7001/
修改下这个配置文件
    [root@#localhost ~]# vi redis_cluster/7001/redis.conf
    修改一下几个
        port 7001  // 六个节点配置文件分别是7001-7006
        daemonize yes  // redis后台运行
        pidfile /var/run/redis_7001.pid  // pidfile文件对应7001-7006
        cluster-enabled yes  // 开启集群
        cluster-config-file nodes_7001.conf  // 保存节点配置,自动创建,自动更新对应7001-7006
        cluster-node-timeout 5000  // 集群超时时间,节点超过这个时间没反应就断定是宕机
        appendonly yes  // 存储方式,aof,将写操作记录保存到日志中
7001下的修改完后,我们把7001下的配置分别复制到7002-7006 然后对应的再修改下配置即可;
    [root@#localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7002/
    [root@#localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7003/
    [root@#localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7004/
    [root@#localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7005/
    [root@#localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7006/
编辑后面5个配置文件,把 port ,pidfile,cluster-config-file 分别修改下即可;
    [root@#localhost ~]# vi redis_cluster/7002/redis.conf
        port 7001  // 六个节点配置文件分别是7001-7006
        pidfile /var/run/redis_7001.pid  // pidfile文件对应7001-7006
        cluster-config-file nodes_7001.conf  // 保存节点配置,自动创建,自动更新对应7001-7006
    [root@#localhost ~]# vi redis_cluster/7003/redis.conf
    [root@#localhost ~]# vi redis_cluster/7004/redis.conf
    [root@#localhost ~]# vi redis_cluster/7005/redis.conf
    [root@#localhost ~]# vi redis_cluster/7006/redis.conf


2.3 启动六个节点的redis

启动六个节点
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7001/redis.conf 
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7002/redis.conf 
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7003/redis.conf 
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7004/redis.conf 
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7005/redis.conf 
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7006/redis.conf 
查找下redis进程
    [root@#localhost ~]# ps -ef | grep redis
    root       7607      1  0 04:36 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]
    root       7613      1  0 04:36 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7002 [cluster]
    root       7617      1  0 04:36 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]
    root       7621      1  0 04:36 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]
    root       7625      1  0 04:36 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]
    root       7630      1  0 04:36 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]
    root       7634   7281  0 04:37 pts/0    00:00:00 grep --color=auto redis
    说明都启动成功了!


2.4 创建集群

redis官方提供了redis-trib.rb工具,第一步里已经房到里bin下;
但是在使用之前需要安装ruby,以及redis和ruby连接
    [root@#localhost ~]# yum -y install ruby ruby-devel rubygems rpm-build
    [root@#localhost ~]# gem install redis

这里会应该版本不匹配报错
    Fetching: redis-4.1.0.gem (100%)
    ERROR:  Error installing redis:
        redis requires Ruby version >= 2.2.2.

解决方案:
    [root@#localhost ~]# yum install centos-release-scl-rh
    [root@#localhost ~]# yum install rh-ruby23  -y
    [root@#localhost ~]# scl  enable  rh-ruby23 bash
    [root@#localhost ~]# ruby -v
    [root@#localhost ~]# gem install redis

创建集群
    [root@#localhost ~]# redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    127.0.0.1:7001
    127.0.0.1:7002
    127.0.0.1:7003
    Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
    Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
    Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
    M: d00cac026f8cfa21733df7ec23e5fb1cf9335785 127.0.0.1:7001
       slots:0-5460 (5461 slots) master
    M: 019a7ff44dca53bc08f9c62628ad6a067dfa32a3 127.0.0.1:7002
       slots:5461-10922 (5462 slots) master
    M: 3c31f267a21125c71bca05f44cd10361b14bc2e0 127.0.0.1:7003
       slots:10923-16383 (5461 slots) master
    S: 74c2dc28292335563185fd617bbe12e7366fe958 127.0.0.1:7004
       replicates d00cac026f8cfa21733df7ec23e5fb1cf9335785
    S: 0b0a7238542085dc1900ccfa7532062423cd9e3c 127.0.0.1:7005
       replicates 019a7ff44dca53bc08f9c62628ad6a067dfa32a3
    S: 08771230d07dd4ff2205de8c1042dd711a98c62d 127.0.0.1:7006
       replicates 3c31f267a21125c71bca05f44cd10361b14bc2e0
    Can I set the above configuration? (type 'yes' to accept): yes

    从运行结果看,主节点就是7001 7002 7003从节点分别是7004 7005 7006 
    7001分配到的哈希槽是 0-5460
    7002分配到的哈希槽是 5461-10922
    7003分配到的哈希槽是 10923-16383
    最后问我们是否接受上面的设置,输入yes就表示接受,我们输入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 127.0.0.1:7001)
    M: d00cac026f8cfa21733df7ec23e5fb1cf9335785 127.0.0.1:7001
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: 3c31f267a21125c71bca05f44cd10361b14bc2e0 127.0.0.1:7003
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    S: 0b0a7238542085dc1900ccfa7532062423cd9e3c 127.0.0.1:7005
       slots: (0 slots) slave
       replicates 019a7ff44dca53bc08f9c62628ad6a067dfa32a3
    M: 019a7ff44dca53bc08f9c62628ad6a067dfa32a3 127.0.0.1:7002
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: 74c2dc28292335563185fd617bbe12e7366fe958 127.0.0.1:7004
       slots: (0 slots) slave
       replicates d00cac026f8cfa21733df7ec23e5fb1cf9335785
    S: 08771230d07dd4ff2205de8c1042dd711a98c62d 127.0.0.1:7006
       slots: (0 slots) slave
       replicates 3c31f267a21125c71bca05f44cd10361b14bc2e0
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
显示配置哈希槽,以及集群创建成功,可以用了。


2.5 集群数据测试

我们先连接任意一个节点,然后添加一个key:
redis-cli是redis默认的客户端工具,启动时加上'-c'参数,'-p'指定端口,就可以连接到集群。 
连接任意一个节点端口:
    [root@#localhost ~]# /usr/local/redis/bin/redis-cli -c -p 7002
    127.0.0.1:7002>
正确连接到7002端口
    127.0.0.1:7002> set xxx 'test7002port'
    -> Redirected to slot [4038] located at 127.0.0.1:7001
    OK

前面说过Redis Cluster值分配规则,所以分配key的时候,它会使用CRC16('my_name')%16384算法来计算,将这个key放到哪个节点,这里分配到了4038slot 就分配到了7001(0-5460)这个节点上。所以有:Redirected to slot [4038] located at 127.0.0.1:7001
我们从其他集群节点,都可以获取到数据
    127.0.0.1:7001> exit
    [root@localhost ~]# /usr/local/redis/bin/redis-cli -c -p 7005
    127.0.0.1:7005> get xxx
    -> Redirected to slot [4038] located at 127.0.0.1:7001
    "test7002port"
    127.0.0.1:7001> 


2.6 集群宕机测试

假如干掉一个节点,比如7002这个主节点
    [root@#localhost ~]# ps -ef | grep redis
    root       7607      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]
    root       7613      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7002 [cluster]
    root       7617      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]
    root       7621      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]
    root       7625      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]
    root       7630      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]
    root       7909   7875  0 05:37 pts/0    00:00:00 grep --color=auto redis
    [root@#localhost ~]# kill -9 7613
    [root@#localhost ~]# ps -ef | grep redis
    root       7607      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]
    root       7617      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]
    root       7621      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]
    root       7625      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]
    root       7630      1  0 04:36 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]
    root       7913   7875  0 05:42 pts/0    00:00:00 grep --color=auto redis
    [root@#localhost ~]# 

然后再来看下集群的情况
    [root@#localhost ~]# redis-trib.rb check 127.0.0.1:7001
    >>> Performing Cluster Check (using node 127.0.0.1:7001)
    M: d00cac026f8cfa21733df7ec23e5fb1cf9335785 127.0.0.1:7001
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: 3c31f267a21125c71bca05f44cd10361b14bc2e0 127.0.0.1:7003
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    M: 0b0a7238542085dc1900ccfa7532062423cd9e3c 127.0.0.1:7005
       slots:5461-10922 (5462 slots) master
       0 additional replica(s)
    S: 74c2dc28292335563185fd617bbe12e7366fe958 127.0.0.1:7004
       slots: (0 slots) slave
       replicates d00cac026f8cfa21733df7ec23e5fb1cf9335785
    S: 08771230d07dd4ff2205de8c1042dd711a98c62d 127.0.0.1:7006
       slots: (0 slots) slave
       replicates 3c31f267a21125c71bca05f44cd10361b14bc2e0
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
我们发现7005本来是从节点,由于他对应的主节点挂了,就自动变成主节点master。
有最后一个说明All 16384 slots covered. 所有哈希槽都可覆盖了,集群可以正常使用。

假如我们把7005也干掉,试试看
    [root@#localhost ~]# kill -9 7625
    [root@#localhost ~]# ps -ef | grep redis
    root       9501      1  0 17:38 ?        00:00:03 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]
    root       9516      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]
    root       9520      1  0 17:45 ?        00:00:03 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]
    root       9528      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]
    root       9610   2186  0 18:16 pts/0    00:00:00 grep --color=auto redis
    [root@localhost ~]# 

查看下集群情况
    [root@#localhost ~]# redis-trib.rb check 127.0.0.1:7001
    >>> Performing Cluster Check (using node 127.0.0.1:7001)
    M: d00cac026f8cfa21733df7ec23e5fb1cf9335785 127.0.0.1:7001
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: 3c31f267a21125c71bca05f44cd10361b14bc2e0 127.0.0.1:7003
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    S: 74c2dc28292335563185fd617bbe12e7366fe958 127.0.0.1:7004
       slots: (0 slots) slave
       replicates d00cac026f8cfa21733df7ec23e5fb1cf9335785
    S: 08771230d07dd4ff2205de8c1042dd711a98c62d 127.0.0.1:7006
       slots: (0 slots) slave
       replicates 3c31f267a21125c71bca05f44cd10361b14bc2e0
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [ERR] Not all 16384 slots are covered by nodes.
这里我们发现报错了,因为主从节点都挂了所以有一部分哈希槽没得分配。
最后一句[ERR] Not all 16384 slots are covered by nodes.没有安全覆盖;所以不能正常使用集群。


3. Redis多机多节点集群

3.1 环境准备

搞两台虚拟机
    虚拟机 --> 管理 --> 克隆 --> 完整克隆

ip addr查询两个不同的ip是192.168.18.4和192.168.18.8

使用Xshell连接两个不同的虚拟机。


3.2 安装Redis

------------------已经操作过了,可以忽略------------------
安装Redis
192.168.18.4虚拟机里,Reids安装包里有个集群工具,要复制到/usr/local/bin里去
    [root@#localhost ~]# cp redis-3.2.9/src/redis-trib.rb /usr/local/bin
----------------------------------------------------------


3.3 修改配置,创建节点

------------------已经操作过了,可以忽略------------------
首先我们在192.168.18.4虚拟机里创建三个节点,端口分别是7001,7002,7003
我们先在root目录下新建一个redis_cluster目录,然后该目录下再创建3个目录,
分别是7001,7002,7003,用来存redis配置文件;
这里我们要使用redis集群,要先修改redis的配置文件redis.conf
mkdir redis_cluster 新建目录
    [root@#localhost ~]# cd redis_cluster/
    [root@#localhost redis_cluster]# mkdir 7001 7002 7003
    [root@#localhost redis_cluster]# ll
    总用量 0
    drwxr-xr-x. 2 root root 6 7月  27 19:49 7001
    drwxr-xr-x. 2 root root 6 7月  27 19:49 7002
    drwxr-xr-x. 2 root root 6 7月  27 19:49 7003
    [root@localhost redis_cluster]# 
先复制一份配置文件到7001目录下
    [root@#localhost redis_cluster]# cd
    [root@#localhost ~]# cp redis-3.2.9/redis.conf redis_cluster/7001/
----------------------------------------------------------

(1)首先清理没有用的文件
    [root@#localhost ~]# ll
    总用量 1552
    -rw-------. 1 root root    1259 2月  21 06:31 anaconda-ks.cfg
    -rw-r--r--. 1 root root      64 2月  28 05:35 appendonly.aof
    -rw-r--r--. 1 root root      76 2月  28 05:48 dump.rdb
    -rw-r--r--. 1 root root     735 2月  28 05:45 nodes-7001.conf
    -rw-r--r--. 1 root root     733 2月  28 05:33 nodes-7002.conf
    -rw-r--r--. 1 root root     735 2月  28 05:45 nodes-7003.conf
    -rw-r--r--. 1 root root     729 2月  28 05:45 nodes-7004.conf
    -rw-r--r--. 1 root root     715 2月  28 05:42 nodes-7005.conf
    -rw-r--r--. 1 root root     735 2月  28 05:45 nodes-7006.conf
    drwxrwxr-x. 6 root root    4096 5月  17 2017 redis-3.2.9
    -rw-r--r--. 1 root root 1547695 5月  17 2017 redis-3.2.9.tar.gz
    drwxr-xr-x. 8 root root      78 2月  28 04:23 redis_cluster
    [root@#localhost ~]# rm -rf dump.rdb
    [root@#localhost ~]# rm -rf appendonly.aof
    [root@#localhost ~]# rm -rf nodes-7001.conf
    [root@#localhost ~]# rm -rf nodes-7002.conf
    [root@#localhost ~]# rm -rf nodes-7003.conf
    [root@#localhost ~]# rm -rf nodes-7004.conf
    [root@#localhost ~]# rm -rf nodes-7005.conf
    [root@#localhost ~]# rm -rf nodes-7006.conf
    [root@#localhost ~]# cd redis_cluster/
    [root@#localhost redis_cluster]# ll
    总用量 0
    drwxr-xr-x. 2 root root 24 2月  28 04:29 7001
    drwxr-xr-x. 2 root root 24 2月  28 04:31 7002
    drwxr-xr-x. 2 root root 24 2月  28 04:32 7003
    drwxr-xr-x. 2 root root 24 2月  28 04:33 7004
    drwxr-xr-x. 2 root root 24 2月  28 04:34 7005
    drwxr-xr-x. 2 root root 24 2月  28 04:34 7006
    [root@#localhost redis_cluster]# rm -rf 7004
    [root@#localhost redis_cluster]# rm -rf 7005
    [root@#localhost redis_cluster]# rm -rf 7006
修改文件
    [root@#localhost redis_cluster]# cd
    [root@#localhost ~]# vi redis_cluster/7001/redis.conf
        修改以下几个
        port 7001  // 三个节点配置文件分别是7001-7003
        bind 192.168.18.4  // 默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访,和单机集群有区别
        daemonize yes  // redis后台运行
        pidfile /var/run/redis_7001.pid  // pidfile文件对应7001-7003
        cluster-enabled yes  // 开启集群
        cluster-config-file nodes_7001.conf  // 保存节点配置,自动创建,自动更新对应7001-7003
        cluster-node-timeout 5000  // 集群超时时间,节点超过这个时间没反应就断定是宕机
        appendonly yes  / 存储方式,aof,将写操作记录保存到日志中
同理修改另外两个文件
    [root@#localhost ~]# vi redis_cluster/7002/redis.conf
    [root@#localhost ~]# vi redis_cluster/7003/redis.conf

------------------已经操作过了,可以忽略------------------
7001下的修改完后,我们把7001下的配置分别复制到7002-7003 然后对应的再修改下配置即可;
[root@#localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7002/
[root@#localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7003/
----------------------------------------------------------

(2) 在clone虚拟机上执行相同的操作,首先清理没有用的文件
    [root@#localhost ~]# ll
    总用量 1552
    -rw-------. 1 root root    1259 2月  21 06:31 anaconda-ks.cfg
    -rw-r--r--. 1 root root      64 2月  28 05:35 appendonly.aof
    -rw-r--r--. 1 root root      76 2月  28 05:48 dump.rdb
    -rw-r--r--. 1 root root     735 2月  28 05:45 nodes-7001.conf
    -rw-r--r--. 1 root root     733 2月  28 05:33 nodes-7002.conf
    -rw-r--r--. 1 root root     735 2月  28 05:45 nodes-7003.conf
    -rw-r--r--. 1 root root     729 2月  28 05:45 nodes-7004.conf
    -rw-r--r--. 1 root root     715 2月  28 05:42 nodes-7005.conf
    -rw-r--r--. 1 root root     735 2月  28 05:45 nodes-7006.conf
    drwxrwxr-x. 6 root root    4096 5月  17 2017 redis-3.2.9
    -rw-r--r--. 1 root root 1547695 5月  17 2017 redis-3.2.9.tar.gz
    drwxr-xr-x. 8 root root      78 2月  28 04:23 redis_cluster
    [root@#localhost ~]# rm -rf dump.rdb
    [root@#localhost ~]# rm -rf appendonly.aof
    [root@#localhost ~]# rm -rf nodes-7001.conf
    [root@#localhost ~]# rm -rf nodes-7002.conf
    [root@#localhost ~]# rm -rf nodes-7003.conf
    [root@#localhost ~]# rm -rf nodes-7004.conf
    [root@#localhost ~]# rm -rf nodes-7005.conf
    [root@#localhost ~]# rm -rf nodes-7006.conf
    [root@#localhost ~]# cd redis_cluster/
    [root@#localhost redis_cluster]# ll
    总用量 0
    drwxr-xr-x. 2 root root 24 2月  28 04:29 7001
    drwxr-xr-x. 2 root root 24 2月  28 04:31 7002
    drwxr-xr-x. 2 root root 24 2月  28 04:32 7003
    drwxr-xr-x. 2 root root 24 2月  28 04:33 7004
    drwxr-xr-x. 2 root root 24 2月  28 04:34 7005
    drwxr-xr-x. 2 root root 24 2月  28 04:34 7006
    [root@#localhost redis_cluster]# rm -rf 7001
    [root@#localhost redis_cluster]# rm -rf 7002
    [root@#localhost redis_cluster]# rm -rf 7003
修改文件
    [root@#localhost redis_cluster]# cd
    [root@#localhost ~]# vi redis_cluster/7004/redis.conf
        修改以下内容
            port 7004  // 三个节点配置文件分别是7004-7006
            bind 192.168.18.8  // 默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访,和单机集群有区别
            daemonize yes  // redis后台运行
            pidfile /var/run/redis_7004.pid  // pidfile文件对应7004-7006
            cluster-enabled yes  // 开启集群
            cluster-config-file nodes_7004.conf  // 保存节点配置,自动创建,自动更新对应7004-7006
            cluster-node-timeout 5000  // 集群超时时间,节点超过这个时间没反应就断定是宕机
            appendonly yes  // 存储方式,aof,将写操作记录保存到日志中
同理修改另外两个文件
    [root@#localhost ~]# vi redis_cluster/7005/redis.conf
    [root@#localhost ~]# vi redis_cluster/7006/redis.conf
------------------已经操作过了,可以忽略------------------
7004下的修改完后,我们把7001下的配置分别复制到7005-7006 然后对应的再修改下配置即可;
    [root@#localhost ~]# cp redis_cluster/7004/redis.conf redis_cluster/7005/
    [root@#localhost ~]# cp redis_cluster/7004/redis.conf redis_cluster/7006/
----------------------------------------------------------


3.4 启动两台机器的六个节点

192.168.18.4机器
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7001/redis.conf
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7002/redis.conf
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7003/redis.conf
    [root@#localhost ~]# ps -ef | grep redis
    root       7372      1  0 06:23 ?        00:00:00 /usr/local/redis/bin/redis-server 192.168.18.4:7001 [cluster]
    root       7376      1  0 06:23 ?        00:00:00 /usr/local/redis/bin/redis-server 192.168.18.4:7002 [cluster]
    root       7380      1  0 06:24 ?        00:00:00 /usr/local/redis/bin/redis-server 192.168.18.4:7003 [cluster]
    root       7384   7315  0 06:24 pts/0    00:00:00 grep --color=auto redis
192.168.18.8机器
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7004/redis.conf
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7005/redis.conf
    [root@#localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7006/redis.conf
    [root@#localhost ~]# ps -ef | grep redis
    root       7343      1  0 06:24 ?        00:00:00 /usr/local/redis/bin/redis-server 192.168.18.8:7004 [cluster]
    root       7347      1  0 06:24 ?        00:00:00 /usr/local/redis/bin/redis-server 192.168.18.8:7005 [cluster]
    root       7351      1  0 06:24 ?        00:00:00 /usr/local/redis/bin/redis-server 192.168.18.8:7006 [cluster]
    root       7355   7290  0 06:24 pts/0    00:00:00 grep --color=auto redis
说明都启动OK


3.5 设置防火墙,开放集群端口

两台机器的防火墙我们直接关掉
    [root@#localhost ~]# systemctl stop firewalld.service


3.6 创建集群
192.168.18.4机器作为集群控制端

------------------已经操作过了,可以忽略------------------
redis官方提供了redis-trib.rb工具,第一步里已经放到里bin下;
但是在使用之前需要安装ruby,以及redis和ruby连接
    [root@#localhost ~]# yum -y install ruby ruby-devel rubygems rpm-build
----------------------------------------------------------

需要安装redis和ruby连接
    [root@#localhost ~]# gem install redis
    这里会应该版本不匹配报错
        Fetching: redis-4.1.0.gem (100%)
        ERROR:  Error installing redis:
            redis requires Ruby version >= 2.2.2.

    解决方案:
        [root@#localhost ~]# yum install centos-release-scl-rh
        [root@#localhost ~]# yum install rh-ruby23  -y
        [root@#localhost ~]# scl  enable  rh-ruby23 bash
        [root@#localhost ~]# ruby -v
        [root@#localhost ~]# gem install redis

创建集群
    [root@#localhost ~]# redis-trib.rb create --replicas 1  192.168.18.4:7001 192.168.18.4:7002 192.168.18.4:7003 192.168.18.8:7004 192.168.18.8:7005 192.168.18.8:7006
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    192.168.18.4:7001
    192.168.18.8:7004
    192.168.18.4:7002
    Adding replica 192.168.18.8:7005 to 192.168.18.4:7001
    Adding replica 192.168.18.4:7003 to 192.168.18.8:7004
    Adding replica 192.168.18.8:7006 to 192.168.18.4:7002
    M: b3edeb0157192fd3c46d6b67e05fc7fc73fc3db8 192.168.18.4:7001
       slots:0-5460 (5461 slots) master
    M: b1750afac16a2f3912c6ac68b2421864cb958bb8 192.168.18.4:7002
       slots:10923-16383 (5461 slots) master
    S: a63d95745d7937153bb446c40296df89eab54abf 192.168.18.4:7003
       replicates 5d302ca6dc6ede24557e7042bb0d0ee5a0f0e084
    M: 5d302ca6dc6ede24557e7042bb0d0ee5a0f0e084 192.168.18.8:7004
       slots:5461-10922 (5462 slots) master
    S: 42813846e4bac77d3d3f958ebc550a8d80767844 192.168.18.8:7005
       replicates b3edeb0157192fd3c46d6b67e05fc7fc73fc3db8
    S: e183d0e666776f42e32c08df52a00782a0e2d69a 192.168.18.8:7006
       replicates b1750afac16a2f3912c6ac68b2421864cb958bb8
    Can I set the above configuration? (type 'yes' to accept): yes
    
    从运行结果看 主节点就是7001 7004 7002 从节点分别是7005 7003 7006 
    7001分配到的哈希槽是 0-5460
    7004分配到的哈希槽是 5461-10922
    7002分配到的哈希槽是 10923-16383
    最后问我们是否接受上面的设置,输入yes 就表示接受,我们输入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 192.168.18.4:7001)
    M: b3edeb0157192fd3c46d6b67e05fc7fc73fc3db8 192.168.18.4:7001
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    S: e183d0e666776f42e32c08df52a00782a0e2d69a 192.168.18.8:7006
       slots: (0 slots) slave
       replicates b1750afac16a2f3912c6ac68b2421864cb958bb8
    M: 5d302ca6dc6ede24557e7042bb0d0ee5a0f0e084 192.168.18.8:7004
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: 42813846e4bac77d3d3f958ebc550a8d80767844 192.168.18.8:7005
       slots: (0 slots) slave
       replicates b3edeb0157192fd3c46d6b67e05fc7fc73fc3db8
    S: a63d95745d7937153bb446c40296df89eab54abf 192.168.18.4:7003
       slots: (0 slots) slave
       replicates 5d302ca6dc6ede24557e7042bb0d0ee5a0f0e084
    M: b1750afac16a2f3912c6ac68b2421864cb958bb8 192.168.18.4: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.
显示配置哈希槽,以及集群创建成功,可以用了。


3.7 集群数据测试

先连接任意一个节点,然后添加一个key:
redis-cli是redis默认的客户端工具,启动时加上’-c'参数,'-p'指定端口,就可以连接到集群。
这里还得加-h指定机器IP 
连接任意一个节点端口:
    [root@#localhost ~]# /usr/local/redis/bin/redis-cli -h 192.168.18.4 -c -p 7002
    192.168.18.4:7002> 
连接到7002节点
    192.168.1.109:7002> set xxx '18.4port7002'
    -> Redirected to slot [4038] located at 192.168.18.4:7001
    OK
根据Redis Cluster值分配规则,所以分配key的时候,它会使用CRC16('my_name')%16384算法,来计算,将这个key放到哪个节点,这里分配到了4038slot 就分配到了7001(0-5460)这个节点上。所以有:
Redirected to slot [4038] located at 192.168.18.4:7001
从其他集群节点,都可以获取到数据
    192.168.18.4:7001> exit
    [root@#localhost ~]# /usr/local/redis/bin/redis-cli -h 192.168.18.8 -c -p 7005
    192.168.18.8:7005> get xxx
    -> Redirected to slot [4038] located at 192.168.18.4:7001
    "18.4port7002"
    192.168.18.4:7001> 


3.8 集群宕机测试

假如我们干掉一个节点,比如7002这个主节点
    [root@#localhost ~]# ps -ef | grep redis
    root       7372      1  0 06:23 ?        00:00:01 /usr/local/redis/bin/redis-server 192.168.18.4:7001 [cluster]
    root       7376      1  0 06:23 ?        00:00:01 /usr/local/redis/bin/redis-server 192.168.18.4:7002 [cluster]
    root       7380      1  0 06:24 ?        00:00:01 /usr/local/redis/bin/redis-server 192.168.18.4:7003 [cluster]
    root       7480   7455  0 06:46 pts/0    00:00:00 grep --color=auto redis
    [root@#localhost ~]# kill -9 7376
    [root@#localhost ~]# ps -ef | grep redis
    root       7372      1  0 06:23 ?        00:00:01 /usr/local/redis/bin/redis-server 192.168.18.4:7001 [cluster]
    root       7380      1  0 06:24 ?        00:00:01 /usr/local/redis/bin/redis-server 192.168.18.4:7003 [cluster]
    root       7482   7455  0 06:46 pts/0    00:00:00 grep --color=auto redis

然后我们查看下集群情况
    [root@#localhost ~]# redis-trib.rb check 192.168.18.4:7001
    >>> Performing Cluster Check (using node 192.168.18.4:7001)
    M: b3edeb0157192fd3c46d6b67e05fc7fc73fc3db8 192.168.18.4:7001
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: e183d0e666776f42e32c08df52a00782a0e2d69a 192.168.18.8:7006
       slots:10923-16383 (5461 slots) master
       0 additional replica(s)
    M: 5d302ca6dc6ede24557e7042bb0d0ee5a0f0e084 192.168.18.8:7004
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: 42813846e4bac77d3d3f958ebc550a8d80767844 192.168.18.8:7005
       slots: (0 slots) slave
       replicates b3edeb0157192fd3c46d6b67e05fc7fc73fc3db8
    S: a63d95745d7937153bb446c40296df89eab54abf 192.168.18.4:7003
       slots: (0 slots) slave
       replicates 5d302ca6dc6ede24557e7042bb0d0ee5a0f0e084
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

我们发现7006本来是从节点,由于他对应的主节点挂了,就自动变成主节点master。
所以会有最后一个说明All 16384 slots covered. 所有哈希槽都可覆盖了,集群可以正常使用。

假如我们把7006也干掉,试试看
    [root@#localhost ~]# ps -ef | grep redis
    root       7343      1  0 06:24 ?        00:00:02 /usr/local/redis/bin/redis-server 192.168.18.8:7004 [cluster]
    root       7347      1  0 06:24 ?        00:00:02 /usr/local/redis/bin/redis-server 192.168.18.8:7005 [cluster]
    root       7351      1  0 06:24 ?        00:00:02 /usr/local/redis/bin/redis-server 192.168.18.8:7006 [cluster]
    root       7415   7290  0 06:48 pts/0    00:00:00 grep --color=auto redis
    [root@#localhost ~]# kill -9 7351
    [root@#localhost ~]# ps -ef | grep redis
    root       7343      1  0 06:24 ?        00:00:02 /usr/local/redis/bin/redis-server 192.168.18.8:7004 [cluster]
    root       7347      1  0 06:24 ?        00:00:02 /usr/local/redis/bin/redis-server 192.168.18.8:7005 [cluster]
    root       7417   7290  0 06:49 pts/0    00:00:00 grep --color=auto redis

再次查看当前集群状态
    [root@#localhost ~]# redis-trib.rb check 192.168.18.4:7001
    >>> Performing Cluster Check (using node 192.168.18.4:7001)
    M: b3edeb0157192fd3c46d6b67e05fc7fc73fc3db8 192.168.18.4:7001
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: 5d302ca6dc6ede24557e7042bb0d0ee5a0f0e084 192.168.18.8:7004
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: 42813846e4bac77d3d3f958ebc550a8d80767844 192.168.18.8:7005
       slots: (0 slots) slave
       replicates b3edeb0157192fd3c46d6b67e05fc7fc73fc3db8
    S: a63d95745d7937153bb446c40296df89eab54abf 192.168.18.4:7003
       slots: (0 slots) slave
       replicates 5d302ca6dc6ede24557e7042bb0d0ee5a0f0e084
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [ERR] Not all 16384 slots are covered by nodes.

这里我们发现出事了,因为主从节点都挂了所以有一部分哈希槽没得分配,最后一句
[ERR] Not all 16384 slots are covered by nodes. 没有安全覆盖;
所以不能正常使用集群。

你可能感兴趣的:(Redis)