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源代码的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。
输入yes
到这里基本就成功了。
6、测试
应该在命令行后加上-c
7、查看集群信息和节点
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的情况:
如图7006是7001的master,现在让7001挂掉
7006成为新的master了
重新启动7001
7001成为7006的slave了,并且集群没有挂掉
测试master和所属的slave同时挂掉
集群挂掉了并且可用的slot也减少了
测试两个master挂掉(各自的slave不挂掉)
首先重启7001和7006
这次挂掉7001和7002
集群挂掉了
重启7001和7002
集群又活了
9、维护节点
(1)添加master节点
启动刚才复制出的7007
./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7005
这个时候我们是没有分配slot给7007的,下面我们把部分slot分配给7007
(2)分配slot
./redis-trib.rb reshard 127.0.0.1:7001
上图要求我们输入分配出slot的节点id,分为两种情况:
①输入all
输入yes
分配完之后查看集群状态
如果在迁移过程中出现下面的问题:
[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
提示我们该节点不是master让我们重新输入
再次输入一个master节点的id(7001)
输入done,表示只从刚才输入的节点中分配出slot给7007
输入yes
分配完成,查看集群状态
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-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,而是随机指定。
查看集群状态
注意:如果在添加节点的时候报类似下面的错误
[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
报错,7007节点上slot没有分配出去。
只需将7007上的slot分配出去就行了
按照上文方法将7007上的slot分配出去,再次删除
删除成功,查看集群状态
查看之前7007的slave 7008
成为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。