第一步:下载并解压
kunzai@kunzai:~$ cd /usr/local/
kunzai@kunzai:/usr/local$ wget http://download.redis.io/releases/redis-3.2.4.tar.gz
kunzai@kunzai:/usr/local$tar -zxvf redis-3.2.4.tar.gz
第二步:安装
kunzai@kunzai:/usr/local$cd redis-3.2.4
kunzai@kunzai:/usr/local$make && make install
第三步: 将 redis-trib.rb 复制到 /usr/bin 目录下
redis-trib.rb这个一般在redis的安装路径中都有,如果找不到可以使用下面命令搜一下,然后列出所在目录,把它copy到相应目录中就可。
sudo find / -name redis-trib.rb
cp redis-trib.rb /usr/local/bin/
第四部: 创建 Redis 节点
首先在 192.168.2.195 机器上 /root/local/redis-3.2.4 目录下创建 redis_cluster 目录;
sudo mkdir redis_cluster
在 redis_cluster 目录下,创建名为6380、6381、6382,6383,6384,6385的目录,并将 redis.conf 拷贝到这三个目录中
mkdir 6380 6381 6382 6383 6384 6385
cp redis.conf redis_cluster/6380
cp redis.conf redis_cluster/6381
cp redis.conf redis_cluster/6382
cp redis.conf redis_cluster/6383
cp redis.conf redis_cluster/6384
cp redis.conf redis_cluster/6385
第五部:分别修改这三个配置文件,修改如下内容
port 6380 //端口6380、6381、6382,6383,6384,6385
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群(我这里暂且用127.0.0.1)
daemonize yes //redis后台运行
pidfile /var/run/redis_6380.pid //pidfile文件对应6380、6381、6382,6383,6384,6385
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6380.conf //集群的配置 配置文件首次启动自动生成 6380、6381、6382,6383,6384,6385
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
第六步: 启动各个节点
redis-server redis_cluster/6380/redis.conf
redis-server redis_cluster/6381/redis.conf
redis-server redis_cluster/6382/redis.conf
redis-server redis_cluster/6383/redis.conf
redis-server redis_cluster/6384/redis.conf
redis-server redis_cluster/6385/redis.conf
第七步:检查节点
kunzai@kunzai:/usr/local/redis/redis_cluster$ ps -ef |grep redis
redis 935 1 0 08:08 ? 00:00:33 /usr/bin/redis-server 127.0.0.1:6379
root 3472 1 0 11:40 ? 00:00:15 redis-server 127.0.0.1:6381 [cluster]
root 3478 1 0 11:41 ? 00:00:15 redis-server 127.0.0.1:6382 [cluster]
root 6647 1 0 15:06 ? 00:00:00 redis-server 127.0.0.1:6380 [cluster]
root 6834 1 0 15:19 ? 00:00:00 redis-server 127.0.0.1:6383 [cluster]
root 6840 1 0 15:19 ? 00:00:00 redis-server 127.0.0.1:6384 [cluster]
root 6846 1 0 15:19 ? 00:00:00 redis-server 127.0.0.1:6385 [cluster]
kunzai 6852 3192 0 15:20 pts/1 00:00:00 grep --color=auto redis
kunzai@kunzai:/usr/local/redis/redis_cluster$ sudo netstat -tnlp | grep redis
tcp 0 0 127.0.0.1:16380 0.0.0.0:* LISTEN 6647/redis-server 1
tcp 0 0 127.0.0.1:16381 0.0.0.0:* LISTEN 3472/redis-server 1
tcp 0 0 127.0.0.1:16382 0.0.0.0:* LISTEN 3478/redis-server 1
tcp 0 0 127.0.0.1:16383 0.0.0.0:* LISTEN 6834/redis-server 1
tcp 0 0 127.0.0.1:16384 0.0.0.0:* LISTEN 6840/redis-server 1
tcp 0 0 127.0.0.1:16385 0.0.0.0:* LISTEN 6846/redis-server 1
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 935/redis-server 12
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 6647/redis-server 1
tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 3472/redis-server 1
tcp 0 0 127.0.0.1:6382 0.0.0.0:* LISTEN 3478/redis-server 1
tcp 0 0 127.0.0.1:6383 0.0.0.0:* LISTEN 6834/redis-server 1
tcp 0 0 127.0.0.1:6384 0.0.0.0:* LISTEN 6840/redis-server 1
tcp 0 0 127.0.0.1:6385 0.0.0.0:* LISTEN 6846/redis-server 1
第八步:启动集群
进入redis-trib.rb所在的目录,执行以下命令,不报错,直接跳过第九,十步骤
sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
第九步:安装ruby
ruby需要安装redis所支持的版本,一般都会遇到版本低需要升级ruby问题{报错redis requires Ruby version >= 2.2.2}
安装之前可以使用(ruby -v)查看一下版本
第一种方式:ubuntn17.1使用apt-get安装ruby2.3
如果不行那就在更新一下sudo apt-get update,然后再安装sudo apt-get install ruby2.3,试试可以吗?
# sudo apt-get update
# sudo apt-get install ruby2.3
第二种方式:cenos7.2通过下载压缩包安装ruby
centos7/rhel7安装较高版本ruby2.2/2.3/2.4+
~]# wget http://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.5.tar.gz
~]# tar zxvf ruby-2.3.5.tar.gz
~]# cd ruby-2.3.5
ruby-2.3.5]# ./configure --prefix=/opt/ruby
ruby-2.3.5]# make && make install
ruby-2.3.5]# ln -s /opt/ruby/bin/ruby /usr/bin/ruby
ruby-2.3.5]# ln -s /opt/ruby/bin/gem /usr/bin/gem
~]#ruby -v //查看一下版本
第十步:安装rubygem redis依赖
第一种方式:ubuntn17.10安装
之前就有gem
gem install -l redis-3.3.0.gem
第二种方式:cenos7.2安装
②安装rubygem redis依赖
~]# wget http://rubygems.org/downloads/redis-3.3.0.gem
~]# gem install -l redis-3.3.0.gem
验证是否可以使用
出现Usage: redis-trib
kunzai@kunzai:/usr/local/redis$ ./redis-trib.rb
Usage: redis-trib
create host1:port1 ... hostN:portN
--replicas check host:port
info host:port
fix host:port
--timeout reshard host:port
--from --to --slots --yes --timeout --pipeline rebalance host:port
--weight --auto-weights --use-empty-masters --timeout --simulate --pipeline --threshold add-node new_host:new_port existing_host:existing_port
--slave --master-id del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from --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.
第十一步:创建集群
注意要点:
①:给redis-trib.rb的节点地址必须是不包含任何槽/数据的节点,否则会拒绝创建集群
②:如果节点设置了密码需要修改配置文件传送门
③:[ERR] Node 127.0.0.1:6381 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
报错:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:6380
127.0.0.1:6381
127.0.0.1:6382
Adding replica 127.0.0.1:6383 to 127.0.0.1:6380
Adding replica 127.0.0.1:6384 to 127.0.0.1:6381
Adding replica 127.0.0.1:6385 to 127.0.0.1:6382
M: 6ba7d505cc00697093086bf8fc0125f68563a8ee 127.0.0.1:6380
slots:0-5460,6916,7040,11111,11235,15174,15298 (5467 slots) master
M: cb934cf015bfbe8387a83eee8f6fddb44db70a82 127.0.0.1:6381
slots:2977,5461-10922,11111,11235,15174,15298 (5467 slots) master
M: 7480dcc92137c6f84d6add3a7228b430a8ae2d86 127.0.0.1:6382
slots:2977,6916,7040,10923-16383 (5464 slots) master
S: 25cfee850379ae24274e63717d6c39f2623b0931 127.0.0.1:6383
replicates 6ba7d505cc00697093086bf8fc0125f68563a8ee
S: 5659995af3f18767f5efc038a8f6a82dab731caa 127.0.0.1:6384
replicates cb934cf015bfbe8387a83eee8f6fddb44db70a82
S: 9d73c5f3f14284050d05240327d8d7da91c45e4e 127.0.0.1:6385
replicates 7480dcc92137c6f84d6add3a7228b430a8ae2d86
Can I set the above configuration? (type 'yes' to accept): yes
/var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 2977 is already busy (Redis::CommandError)
from /var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis.rb:2764:in `block in method_missing'
from /var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis.rb:45:in `block in synchronize'
from /usr/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
from /var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis.rb:45:in `synchronize'
from /var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis.rb:2763:in `method_missing'
from ./redis-trib.rb:212:in `flush_node_config'
from ./redis-trib.rb:776:in `block in flush_nodes_config'
from ./redis-trib.rb:775:in `each'
from ./redis-trib.rb:775:in `flush_nodes_config'
from ./redis-trib.rb:1296:in `create_cluster_cmd'
from ./redis-trib.rb:1700:in `'
解决报错:
看到文章说:安装的时候redis用3.0.0的gem就好了,我用的是redis (4.0.1)然后就卸载,重新安装没直接操作如下步骤,记住重新安装gem redis后,需要redis集群密码的重新“第十一步:创建集群”注意事项中的第一小点
gem list
gem uninstall redis --version 3.3.2
gem install redis --version 3.0.0
gem list
还是不行
清空配置集群失败的配置文件
redis*.conf
可以使用命令查找文件的所在目录,然后删除配置文件——需要重启redis的各个节点服务
sudo find / -name redis6380.conf
运行命令成功
sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
说明:--replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。
这里因为测试,只用了3台机器,如果部署节点使用不同的IP地址,redis-trib-rb会尽可能保证主从节点不分配在同一台机器下,
因此会重新排序节点表顺序。节点列表顺序用于确定主从角色,先主节点之后是从节点。
创建过程中首先会给出主从节点角色分配的计划
最后的输出报告说明:16384个槽全部被分配完,集群创建成功。
这里需要注意给redis-trib.rb的节点地址必须是不包含任何槽/数据的节点,否则会拒绝创建集群。
/var/lib/gems/2.3.0/gems/redis-3.0.0/lib/redis.rb:182: warning: this causes ArgumentError in the next release
>>> Performing Cluster Check (using node 127.0.0.1:6380)
M: 6ac7184cc56814c3bbe333b8ad485eb0b7d16519 127.0.0.1:6380
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 88fb7c9c052f2092db2e233b99ade3beab683bab 127.0.0.1:6381
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 894371a13a7d84cbe9142dc9d5fe6f0e33cb25e1 127.0.0.1:6383
slots: (0 slots) slave
replicates 6ac7184cc56814c3bbe333b8ad485eb0b7d16519
S: 59791c4677193b82520db498bcd8a7893185a401 127.0.0.1:6384
slots: (0 slots) slave
replicates 88fb7c9c052f2092db2e233b99ade3beab683bab
S: 4fac9940ce2f3ee701a647e33d008f04b43b9801 127.0.0.1:6385
slots: (0 slots) slave
replicates 1d0aaf7973d22a94107913baca200bc0e0414959
M: 1d0aaf7973d22a94107913baca200bc0e0414959 127.0.0.1:6382
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个槽中有一个没有分配给节点则表示集群不完整。
可以用redis-trib.rb check命令检测之前创建的集群是否成功,check命令只需要给出集群中任意一个节点地址就可以
完成整个集群的检查工作,命令使用如下所示:
./redis-trib.rb check 127.0.0.1:6380
输出:
/var/lib/gems/2.3.0/gems/redis-3.0.0/lib/redis.rb:182: warning: this causes ArgumentError in the next release
>>> Performing Cluster Check (using node 127.0.0.1:6380)
M: 6ac7184cc56814c3bbe333b8ad485eb0b7d16519 127.0.0.1:6380
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 88fb7c9c052f2092db2e233b99ade3beab683bab 127.0.0.1:6381
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 894371a13a7d84cbe9142dc9d5fe6f0e33cb25e1 127.0.0.1:6383
slots: (0 slots) slave
replicates 6ac7184cc56814c3bbe333b8ad485eb0b7d16519
S: 59791c4677193b82520db498bcd8a7893185a401 127.0.0.1:6384
slots: (0 slots) slave
replicates 88fb7c9c052f2092db2e233b99ade3beab683bab
S: 4fac9940ce2f3ee701a647e33d008f04b43b9801 127.0.0.1:6385
slots: (0 slots) slave
replicates 1d0aaf7973d22a94107913baca200bc0e0414959
M: 1d0aaf7973d22a94107913baca200bc0e0414959 127.0.0.1:6382
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.
Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
输出这样说明,所有槽都已经分配到节点
查看集群目前情况:
127.0.0.1:6380> 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:983
cluster_stats_messages_pong_sent:1021
cluster_stats_messages_sent:2004
cluster_stats_messages_ping_received:1016
cluster_stats_messages_pong_received:983
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2004
集群客户端命令(redis-cli -c -p port)
集群
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget :从集群中移除 node_id 指定的节点。
cluster replicate :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot migrating :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
键
cluster keyslot :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot :返回 count 个 slot 槽中的键
节点失效选举过程中是所有的集群参与的,如果半数以上master几点与当前master节点通信超时(cluster-node-timeout),就认为当前master挂掉