1 - 4 步骤原文

1、安装Ruby

yum -y install ruby rubygems

查看Ruby版本信息。

[root@kube-node-1 src]# ruby --version
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

由于centos系统默认支持Ruby版本为2.0.0,因此执行gem install redis命令时会报以下错误。

[root@kube-node-1 src]# gem install redis
Fetching: redis-4.0.1.gem (100%)
ERROR:  Error installing redis:
    redis requires Ruby version >= 2.2.2.

解决方法是先安装rvm,再升级ruby版本。

2、安装rvm

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

如果遇到以下报错,则执行报错中的gpg2 --recv-keys的命令。

[root@kube-node-1 ~]# curl -L get.rvm.io | bash -s stable
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   194  100   194    0     0    335      0 --:--:-- --:--:-- --:--:--   335
100 24090  100 24090    0     0  17421      0  0:00:01  0:00:01 --:--:-- 44446
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: 于 2017年09月11日 星期一 04时59分21秒 CST 创建的签名,使用 RSA,钥匙号 BF04FF17
gpg: 无法检查签名:没有公钥
Warning, RVM 1.26.0 introduces signed releases and automated check of signatures when GPG software found. Assuming you trust Michal Papis import the mpapis public key (downloading the signatures).

GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.29.3.tgz' - 'https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc'! Try to install GPG v2 and then fetch the public key:

    gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

or if it fails:

    command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -

the key can be compared with:

    https://rvm.io/mpapis.asc
    https://keybase.io/mpapis

NOTE: GPG version 2.1.17 have a bug which cause failures during fetching keys from remote server. Please downgrade or upgrade to newer version (if available) or use the second method described above.

执行报错中的gpg2 --recv-keys的命令。

例如:

[root@kube-node-1 ~]# gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
gpg: 钥匙环‘/root/.gnupg/secring.gpg’已建立
gpg: 下载密钥‘D39DC0E3’,从 hkp 服务器 keys.gnupg.net
gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 D39DC0E3:公钥“Michal Papis (RVM signing) <mpapis@gmail.com>”已导入
gpg: 没有找到任何绝对信任的密钥
gpg: 合计被处理的数量:1
gpg:           已导入:1  (RSA: 1)

再次执行命令curl -L get.rvm.io | bash -s stable。例如:

[root@kube-node-1 ~]# curl -L get.rvm.io | bash -s stable
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   194  100   194    0     0    310      0 --:--:-- --:--:-- --:--:--   309
100 24090  100 24090    0     0  18230      0  0:00:01  0:00:01 --:--:--  103k
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: 于 2017年09月11日 星期一 04时59分21秒 CST 创建的签名,使用 RSA,钥匙号 BF04FF17
gpg: 完好的签名,来自于“Michal Papis (RVM signing) <mpapis@gmail.com>”
gpg:               亦即“Michal Papis <michal.papis@toptal.com>”
gpg:               亦即“[jpeg image of size 5015]”
gpg: 警告:这把密钥未经受信任的签名认证!
gpg:       没有证据表明这个签名属于它所声称的持有者。
主钥指纹: 409B 6B17 96C2 7546 2A17  0311 3804 BB82 D39D C0E3
子钥指纹: 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 /usr/local/rvm/scripts/rvm

查看rvm库中已知的ruby版本

rvm list known

例如:

[root@kube-node-1 ~]# 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]
ruby-head
...

3、升级Ruby

#安装ruby
rvm install  2.4.0
#使用新版本
rvm use  2.4.0
#移除旧版本
rvm remove 2.0.0
#查看当前版本
ruby --version

例如:

[root@kube-node-1 ~]# rvm install  2.4.0
Searching for binary rubies, this might take some time.
Found remote file https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.0.tar.bz2
Checking requirements for centos.
Installing requirements for centos.
Installing required packages: autoconf, automake, bison, bzip2, gcc-c++, libffi-devel, libtool, readline-devel, sqlite-devel, zlib-devel, libyaml-devel, openssl-devel................................
Requirements installation successful.
ruby-2.4.0 - #configure
ruby-2.4.0 - #download
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 14.0M  100 14.0M    0     0   852k      0  0:00:16  0:00:16 --:--:--  980k
No checksum for downloaded archive, recording checksum in user configuration.
ruby-2.4.0 - #validate archive
ruby-2.4.0 - #extract
ruby-2.4.0 - #validate binary
ruby-2.4.0 - #setup
ruby-2.4.0 - #gemset created /usr/local/rvm/gems/ruby-2.4.0@global
ruby-2.4.0 - #importing gemset /usr/local/rvm/gemsets/global.gems..............................
ruby-2.4.0 - #generating global wrappers........
ruby-2.4.0 - #gemset created /usr/local/rvm/gems/ruby-2.4.0
ruby-2.4.0 - #importing gemsetfile /usr/local/rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.4.0 - #generating default wrappers........

[root@kube-node-1 ~]# rvm use  2.4.0
Using /usr/local/rvm/gems/ruby-2.4.0

[root@kube-node-1 ~]# rvm remove 2.0.0
ruby-2.0.0-p648 - #already gone
Using /usr/local/rvm/gems/ruby-2.4.0

[root@kube-node-1 ~]# ruby --version
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

4、安装gem

gem install redis
4、安装gem

5、开始搭建

    1)将编译后的redis安装一份,文件夹叫7001

    make install PREFIX=/usr/local/redis-cluster/7001

redis源代码的配置文件拷贝一份进7001

    cp /usr/local/redis-4.0.9/redis.conf redis.conf

    3)修改配置文件

port 7001

    daemonize yes

    appendonly yes

    cluster-enabled yes

    4)复制出5份同样的文件(7002,7003,7004,7005,7006)

(7002,7003,7004,7005,7006)

    6)依次启动

    7)查看状态

redis集群两台 多个redis集群_redis

将redis源代码的src目录下的集群管理程序redis-trib.rb复制出来

    cp /usr/local/redis-4.0.9/src/redis-trib.rb redis-trib.rb

    9)创建集群

    ./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

     ps:这样创建集群的话用jedis连接的话是连不上的,需要把127.0.0.1改成服务器的公网ip。

redis集群两台 多个redis集群_redis集群两台_02

    输入yes

    

redis集群两台 多个redis集群_ruby_03

    到这里基本就成功了。

6、测试

    

redis集群两台 多个redis集群_ruby_04

    应该在命令行后加上-c

    

redis集群两台 多个redis集群_rvm_05

    

redis集群两台 多个redis集群_redis_06

7、查看集群信息和节点

    

redis集群两台 多个redis集群_redis_07

redis集群两台 多个redis集群_ruby_08

8、集群投票:容错

    (1)集群中所有master参与投票,如果半数以上master和其中一个master通信超过(cluster-node-timeout),认为该master挂掉。

    (2)什么时候整个集群不可用(cluster_state:fail)?

        1.如果集群任意master(分配了slot)挂掉,并且挂掉的master没有slave(ps:如果集群中一个master有一个slave,当master挂掉后,slave会成为新的master),则集群进入fail状态。也可以理解成集群的slot映射不完全时进入fail状态。

        2.如果集群中的master挂掉了一半以上,无论是否有slave,集群进入fail状态。

        

        测试master挂掉后其slave变为master的情况:

        

redis集群两台 多个redis集群_redis_09

        如图7006是7001的master,现在让7001挂掉

        

redis集群两台 多个redis集群_ruby_10

        7006成为新的master了

        

redis集群两台 多个redis集群_rvm_11

        重新启动7001

        

redis集群两台 多个redis集群_rvm_12

        

redis集群两台 多个redis集群_rvm_13

        7001成为7006的slave了,并且集群没有挂掉

        

        测试master和所属的slave同时挂掉

        

redis集群两台 多个redis集群_ruby_14

        集群挂掉了并且可用的slot也减少了


        测试两个master挂掉(各自的slave不挂掉)

        首先重启7001和7006

        

redis集群两台 多个redis集群_redis集群两台_15

        

redis集群两台 多个redis集群_redis集群两台_16

        这次挂掉7001和7002

        

redis集群两台 多个redis集群_ruby_17

        集群挂掉了

        重启7001和7002

        集群又活了

        

redis集群两台 多个redis集群_rvm_18


9、维护节点

    (1)添加master节点

redis集群两台 多个redis集群_rvm_19

启动刚才复制出的7007

./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7005

redis集群两台 多个redis集群_ruby_20

redis集群两台 多个redis集群_rvm_21

这个时候我们是没有分配slot给7007的,下面我们把部分slot分配给7007

    (2)分配slot

        ./redis-trib.rb reshard 127.0.0.1:7001

redis集群两台 多个redis集群_redis_22

redis集群两台 多个redis集群_redis集群两台_23

redis集群两台 多个redis集群_ruby_24

上图要求我们输入分配出slot的节点id,分为两种情况:

    ①输入all

redis集群两台 多个redis集群_rvm_25

    输入yes

    分配完之后查看集群状态

redis集群两台 多个redis集群_redis_26

如果在迁移过程中出现下面的问题:

[WARNING] Node xxx.xxx.xxx.xxx:port has slots in importing state (5461).

[WARNING] Node xxx.xxx.xxx.xxx:port has slots in migrating state (5461).

可以考虑使用命令“redis-trib.rb fix xxx.xxx.xxx.xxx:port ”尝试修复。需要显示有节点处于migrating或importing状态,可以登录到相应的节点,使用命令“cluster setslot 5461 stable”修改,参数5461为问题显示的slot的ID。

    ②输入分配出slot节点id(必须为master)

    这里我们先输入一个slave的id

redis集群两台 多个redis集群_ruby_27

提示我们该节点不是master让我们重新输入

再次输入一个master节点的id(7001)

redis集群两台 多个redis集群_rvm_28

输入done,表示只从刚才输入的节点中分配出slot给7007

redis集群两台 多个redis集群_redis_29

输入yes

redis集群两台 多个redis集群_ruby_30

分配完成,查看集群状态

redis集群两台 多个redis集群_redis集群两台_31

7001上的1000个slot已经成功分配给了7007

    (3)添加slave节点

        和(2)一样复制出一份7008,修改端口,删除rdb、aof、节点的配置文件,并启动

         ./redis-trib.rb add-node --slave --master-id b66c9437f89922c806826e42992b1054dc10b690 127.0.0.1:7008 127.0.0.1:7006    

redis集群两台 多个redis集群_ruby_32

还有另一种方式

./redis-trib.rb add-node --slave 127.0.0.1:7008 127.0.0.1:7006

注意这种方式,如果添加了多个slave节点,可能导致master的slaves不均衡,比如一些有3个slave,其它只1个slave。可以在slave节点上执行redis命令“CLUSTER REPLICATE”进行调整,让它成为其它master的slave。“CLUSTER REPLICATE”带一个参数,即master ID,注意使用redis-cli -c登录到slave上执行。该方法没有指定7008的master,而是随机指定。

查看集群状态

redis集群两台 多个redis集群_ruby_33

注意:如果在添加节点的时候报类似下面的错误

[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

解决方法是删除添加的节点下面的node.conf文件(原集群的配置信息已经写如到配置文件中去了,所以需要删除)

    (4)删除节点

        这里尝试删除7007节点 

        ./redis-trib.rb del-node 127.0.0.1:7001 b66c9437f89922c806826e42992b1054dc10b690

        

redis集群两台 多个redis集群_rvm_34

        报错,7007节点上slot没有分配出去。

        只需将7007上的slot分配出去就行了

        按照上文方法将7007上的slot分配出去,再次删除

redis集群两台 多个redis集群_rvm_35

删除成功,查看集群状态

redis集群两台 多个redis集群_rvm_36

查看之前7007的slave 7008

redis集群两台 多个redis集群_rvm_37

成为7001的slave了(随机的)。

    (5)迁移solt

        示例:将slot8从节点A迁移到节点B,有如下两种方法:

        在节点B上执行:CLUSTER SETSLOT 8 IMPORTING A

        或在节点A上执行:CLUSTER SETSLOT 8 MIGRATING B

述操作只是将slot标记为迁移状态,完成迁移还需要执行(在目标node上执行):

        CLUSTER SETSLOT <slot> NODE <node-id>

        其中node-id为目标的Node ID。