目录html
redis入门(一)
redis入门(二)
redis入门(三)node
在前两章介绍了Redis的一些经常使用的API与功能,在本章会对一些其余功能包括事务、脚本、Redis集群搭建工具以及集群动态扩容与故障转移方式进行讲解。linux
在关系型数据库,咱们能够经过事务(transaction)的方式执行数据库级别的原子性操做。在Redis中也提供简单的事务功能。
Redis经过MULTI
、EXEC
、WATCH
等命令来实现功能。它提供了一种将多个命令请求打包,而后一次性、按顺序地执行多个命令的机制。
将一组须要一块儿执行的命令放到MULTI
和EXEC
两个命令之间。MULTI
命令表明事务开始,EXEC
命令表明事务结束,它们之间的命令是原子顺序执行的,在MULTI
执行以后,的写命令会直接返回QUEUE
,当输入EXEC
后会将全部命令一块儿执行。git
127.0.0.1:6379> multi OK 127.0.0.1:6379> set a 1 QUEUED 127.0.0.1:6379> set b 2 QUEUED 127.0.0.1:6379> exec 1) OK 2) OK
若不使用事务时,客户端发送的命令会当即被服务端执行。使用事务时,当客户端发送的命令是EXEC
、DISCARD
、WATCH
、MULTI
命令之一时,服务器当即执行该命令,若不是上述四个命令,则会将命令加入到一个事务队列中,而后向客户端返回QUEUE
回复。github
因为开启事务时命令不会直接被执行,而是直接入队,所以Redis也不会当即发现运行时错误(好比hash的键使用string的命令执行)。所以当事务中某条命令执行失败时,其余命令仍是能够能够正常执行。所以使用
EXEC
和MULTI
命令时Redis仅保证打包的若干条命令以原子性顺序执行,而不保证事务中的命令所有执行成功。redis
127.0.0.1:6379> multi OK 127.0.0.1:6379> set a 5 QUEUED 127.0.0.1:6379> hset b n 1 QUEUED 127.0.0.1:6379> set c 2 QUEUED 127.0.0.1:6379> exec 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) OK
为了实现真正的事务,Redis引入了WATCH
实现乐观锁。在MULTI
命令执行以前,能够经过WATCH
监控指定的键,若在EXEC
提交事务以前,数据发生了变化,则事务执行失败。shell
客户端A数据库
127.0.0.1:6379> WATCH a OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set b 1 QUEUED 127.0.0.1:6379> set a 6 QUEUED 127.0.0.1:6379> set c 3 QUEUED 127.0.0.1:6379> exec (nil) 127.0.0.1:6379>
客户端Bubuntu
127.0.0.1:6379> set a 7 OK
时间点windows
时间序号 | 客户端A | 客户端B |
---|---|---|
1 | WATCH a | |
2 | multi | |
3 | set b 1 | |
4 | set a 6 | |
5 | set c 3 | set a 7 |
6 | exec |
客户端B在客户端A执行WATCH
以后exec
命令提交前执行了一条SET命令,客户端A提交EXEC
命令则会提交失败。
Redis从2.6版本开始引入对Lua脚本的支持。
Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是做为嵌入式程序移植到其余应用程序,它是由C语言实现的。
在redis服务器中内嵌了一个Lua环境,在redis服务启动以前会对该Lua环境进行一些修改,确保Lua环境知足redis服务器的须要。
在ubuntu能够经过如下命令下载
curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz tar zxf lua-5.3.5.tar.gz cd lua-5.3.5 make linux test
在我本地编译Lua时报错,能够参考编译lua-5.3.5时出错解决方法解决。
windows环境下安装能够参考Lua在Windows下的安装、配置、运行
因为redis中存在Lua环境,所以即便不在本地安装Lua环境redis也是能够正常执行Lua脚本的也不要紧。
Redis提供了2个执行lua脚本的命令EVAL
和EVALSHA
。
EVAL
命令格式为eval 脚本内容 key个数 key列表 参数列表
127.0.0.1:6379> eval ' return KEYS[1] .. ARGV[1]' 1 hello world "helloworld"
redis中key下标从1开始
lua经过..
连接两个字符串
咱们也能够通redis-cli --eval
直接执行脚本文件
将return KEYS[1] .. ARGV[1]
保存到文件中,命名为helloworld.lua
经过--eval 脚本路径 key列表 , 参数列表
注意key列表和参数列表中间的,左右两边至少都要有一个空格,不然会报错
jake@Jake-PC:~/tool$ redis/src/redis-cli -p 26379 --eval lua-5.3.5/helloworld.lua hello , world "helloworld"
EVALSHA
当脚本比较大时,每次发送脚本会占用必定的网络带宽。redis提供了讲脚本缓存的方式减小脚本传输的开销。首先须要经过script load
命令将lua脚本加载到redis服务端,得到到脚本的SHA1校验和。而后经过evalsha
命令执行校验和的脚本。
127.0.0.1:6379> script load 'return KEYS[1] .. ARGV[1]' "dc8235f4444d746adf3374579406c129fb1f0f0a" 127.0.0.1:6379> evalsha dc8235f4444d746adf3374579406c129fb1f0f0a 1 hello world "helloworld"
每一个被EVAL执行成功过的lua脚本,在lua环境都会有与该脚本对应的lua函数。函数名为f_加四十位的SHA1校验和。
function f_dc8235f4444d746adf3374579406c129fb1f0f0a() return KEYS[1] .. ARGV[1] end
咱们还能够将脚本文件内容进行加载,经过evalsha获取其SHA1校验和。在linux环境下能够经过cat读取文件内容,
jake@Jake-PC:~/tool$ redis/src/redis-cli -a test1 script load "$(cat lua-5.3.5/helloworld.lua)" "dc8235f4444d746adf3374579406c129fb1f0f0a"
须要使用$()或``将cat lua-5.3.5/helloworld.lua包起来
在windows环境下使用powershell能够经过Get-Content读取文本
PS C:\Users\Dm_ca> redis-cli -a test1 script load (Get-Content F:\Study\helloworld.lua) "dc8235f4444d746adf3374579406c129fb1f0f0a"
lua和redis互操做
因为redis支持调用Lua脚本,并且Lua存在调用redis的API,这样咱们就能够将一系列Lua脚本以原子性的执行。在lua中能够经过redis.call(command,key[param1, param2…])
调用redis命令。
127.0.0.1:26379> eval 'return redis.call("set",KEYS[1],ARGV[1])' 1 "hello" , "redis" OK
对于redis中调用lua更多细节能够看EVAL script
SCRIPT EXISTS
经过该命令输入SHA1校验和能够检查对应的脚本是否存在。
SCRIPT FLUSH
该命令用于清除服务器中全部和lua脚本相关的信息,并关闭当前lua环境从新建立一个新的lua环境
SCRIPT KILL
在每次执行lua脚本以前,redis服务器都会在lua环境中设置一个超时处理钩子,若脚本执行超过配置的lua-time-limit
的时长时,能够经过该命令中止当前的lua脚本执行。
若当前lua脚本有写入操做,则没法在使用该脚本中止执行。只能经过
SHUTDOWN nosave
命令关闭。
脚本复制
当服务器开启了主从复制时,写命令的脚本也会复制到从服务器以确保从服务器的数据和主服务器一致。
可是EVALSHA
命令比较特殊,由于有可能主服务器加载了脚本,从服务器尚未来的及同步。因此会存在主服务器字典中存在函数缓存可是从服务器不存在的状况。所以当Redis要求主服务器在传播EVALSHA
命令的时候,必须确保EVALSHA
命令要执行的脚本已经被全部从服务器载入过,若是不能确保这一点的话,主服务器会将EVALSHA
命令转换成一个等价的EVAL
命令,而后经过传播EVAL
命令来代替EVALSHA
命令。
在上一节咱们讲解了集群搭建的原理和过程。可是一步步都采起纯手工搭建会不太方便,并且也容易出错。在redis5.0之前能够经过redis-trib.rb
进行集群搭建。它是Ruby实现Redis集群管理工具。
Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。 Ruby 可运行于多种平台,如 Windows、MAC OS 和 UNIX 的各类版本。
下面我在windows平台上搭建集群。
准备ruby环境。
在windows环境能够到RubyInstaller下载安装。
下载安装完能够经过ruby -v
肯定是否安装成功,以及当前ruby版本号。
安装完成会弹出一个框询问安装MSYS2,咱们能够不须要。
安装rubygem redis依赖:
C:\Users\Dm_ca>gem install redis Fetching redis-4.1.3.gem Successfully installed redis-4.1.3 Parsing documentation for redis-4.1.3 Installing ri documentation for redis-4.1.3 Done installing documentation for redis after 2 seconds 1 gem installed
下载redis-trib.rb
从github上下载3.2或4.0版本redis的redis-trib.rb代码保存到文件redis-trib.rb中。
4.0的
redis-trib.rb
作了必定的优化,尽量让主从处于不一样的主机,同时当建立集群时若主从处于同一个ip也会进行提示。
5.0的redis-trib.rb
已经不支持了,redis-cli已经集成了redis-trib.rb的功能,当使用redis-trib.rb时会提示使用redis-cli cluster执行。
建立7579~7584
6个端口的配置文件,启动6个redis服务,配置能够参考上一章的集群搭建配置
start redis-server.exe redis-7579.conf start redis-server.exe redis-7580.conf start redis-server.exe redis-7581.conf start redis-server.exe redis-7582.conf start redis-server.exe redis-7583.conf start redis-server.exe redis-7584.conf
为了方便暂时没有做为windows服务启动
ruby redis-trib.rb create --replicas <arg> host1:port1 ... hostN:portN
命令建立集群,如ruby redis-trib.rb create --replicas 1 127.0.0.1:7579 127.0.0.1:7580 127.0.0.1:7581 127.0.0.1:7582 127.0.0.1:7583 127.0.0.1:7584
F:\Study\redis\redis集群>ruby redis-trib.rb create --replicas 1 127.0.0.1:7579 127.0.0.1:7580 127.0.0.1:7581 127.0.0.1:7582 127.0.0.1:7583 127.0.0.1:7584 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7579 127.0.0.1:7580 127.0.0.1:7581 Adding replica 127.0.0.1:7583 to 127.0.0.1:7579 Adding replica 127.0.0.1:7584 to 127.0.0.1:7580 Adding replica 127.0.0.1:7582 to 127.0.0.1:7581 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: 4e4f38cce9a8dd1d7871e327e69c2a2556c90ad7 127.0.0.1:7579 slots:0-5460 (5461 slots) master M: 426942a0f20ccbfa9d68c1b0809800c31d10c0ab 127.0.0.1:7580 slots:5461-10922 (5462 slots) master M: 1149113de5253841923789e79c362ad745509f5c 127.0.0.1:7581 slots:10923-16383 (5461 slots) master S: e7e172a7cba6e052d36d0a330225f48f3858fb72 127.0.0.1:7582 replicates 1149113de5253841923789e79c362ad745509f5c S: 7fb04e281546d6f0d0e0a3a06b5f80b101eae00f 127.0.0.1:7583 replicates 4e4f38cce9a8dd1d7871e327e69c2a2556c90ad7 S: b872de59634dd245c0452b46832994bf04a6c08b 127.0.0.1:7584 replicates 426942a0f20ccbfa9d68c1b0809800c31d10c0ab 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 127.0.0.1:7579) M: 4e4f38cce9a8dd1d7871e327e69c2a2556c90ad7 127.0.0.1:7579 slots:0-5460 (5461 slots) master 1 additional replica(s) M: 1149113de5253841923789e79c362ad745509f5c 127.0.0.1:7581 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 7fb04e281546d6f0d0e0a3a06b5f80b101eae00f 127.0.0.1:7583 slots: (0 slots) slave replicates 4e4f38cce9a8dd1d7871e327e69c2a2556c90ad7 S: b872de59634dd245c0452b46832994bf04a6c08b 127.0.0.1:7584 slots: (0 slots) slave replicates 426942a0f20ccbfa9d68c1b0809800c31d10c0ab M: 426942a0f20ccbfa9d68c1b0809800c31d10c0ab 127.0.0.1:7580 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: e7e172a7cba6e052d36d0a330225f48f3858fb72 127.0.0.1:7582 slots: (0 slots) slave replicates 1149113de5253841923789e79c362ad745509f5c [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
因为我绑定ip没修改,主从使用的都是
127.0.0.1
,所以会有警告提示[WARNING] Some slaves are in the same host as their master
。
生产配置须要绑定实际的ip,同时将protected-mode
设置为no,不然只容许本机访问。
查看集群状态,能够看到已经存在三主三从,同时虚拟槽都自动分配了。
F:\Study\redis\redis集群>redis-cli -p 7479 cluster nodes 0f6cf326c23af6399e6c3bfc374b04efbac015d3 127.0.0.1:7381@17381 master - 0 1572935809989 3 connected 10923-16383 96b98672b59fd85f8743fde5b354abdb38ee3b47 127.0.0.1:7479@17479 myself,slave 0f6cf326c23af6399e6c3bfc374b04efbac015d3 0 1572935809000 4 connected 231ee8d2ea76e1c7fe2031c127b8a055be87a3f4 127.0.0.1:7379@17379 master - 0 1572935810997 1 connected 0-5460 e4ce1b6f872c6f72f776d534ce1dc783a0cf3655 127.0.0.1:7480@17480 slave 231ee8d2ea76e1c7fe2031c127b8a055be87a3f4 0 1572935808000 1 connected a9a4296b46db50459c5efb00d205fff671c2bfd0 127.0.0.1:7380@17380 master - 0 1572935810000 2 connected 5461-10922 dcae00d572280d795fcbc82b899f2f1a50f1397c 127.0.0.1:7481@17481 slave a9a4296b46db50459c5efb00d205fff671c2bfd0 0 1572935809000 6 connected
在redis5.0开始官方集成了redis-trib.rb
。能够直接经过cluster create
命令建立集群。
将六个redis服务启动
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7379.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7380.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7381.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7479.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7480.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7481.config
建立集群
redis-cli --cluster create 127.0.0.1:7379 127.0.0.1:7380 127.0.0.1:7381 127.0.0.1:7479 127.0.0.1:7480 127.0.0.1:7481 --cluster-replicas 1
在craete后面指定redis服务的ip和端口,最后经过--cluster-replicas
表示每一个主节点建立一个从节点。
5.0的集群
--cluster-replicas
参数能够放到create后面也能够放到最后,可是4.0的集群--replicas
须要放到create后面,不能放最后。
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli --cluster create 127.0.0.1:7379 127.0.0.1:7380 127.0.0.1:7381 127.0.0.1:7479 127.0.0.1:7480 127.0.0.1:7481 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 127.0.0.1:7480 to 127.0.0.1:7379 Adding replica 127.0.0.1:7481 to 127.0.0.1:7380 Adding replica 127.0.0.1:7479 to 127.0.0.1:7381 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: 5591d1f47c15f919e6c492325bca0a385b581471 127.0.0.1:7379 slots:[0-5460] (5461 slots) master M: 157bee0bd158456fc7e27eb165299ed33df769a0 127.0.0.1:7380 slots:[5461-10922] (5462 slots) master M: eb63ce6942fd606a81113fe07622908931356057 127.0.0.1:7381 slots:[10923-16383] (5461 slots) master S: 3eb412b810c4bd9a3c0f4ab1f4af8ee03d06d818 127.0.0.1:7479 replicates 5591d1f47c15f919e6c492325bca0a385b581471 S: 30c2792fe726a9174c07f7d2db5704f5e9ef3b66 127.0.0.1:7480 replicates 157bee0bd158456fc7e27eb165299ed33df769a0 S: 56250f10afe111ce206169588300b39a6447ed91 127.0.0.1:7481 replicates eb63ce6942fd606a81113fe07622908931356057 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 127.0.0.1:7379) M: 5591d1f47c15f919e6c492325bca0a385b581471 127.0.0.1:7379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 30c2792fe726a9174c07f7d2db5704f5e9ef3b66 127.0.0.1:7480 slots: (0 slots) slave replicates 157bee0bd158456fc7e27eb165299ed33df769a0 S: 56250f10afe111ce206169588300b39a6447ed91 127.0.0.1:7481 slots: (0 slots) slave replicates eb63ce6942fd606a81113fe07622908931356057 S: 3eb412b810c4bd9a3c0f4ab1f4af8ee03d06d818 127.0.0.1:7479 slots: (0 slots) slave replicates 5591d1f47c15f919e6c492325bca0a385b581471 M: 157bee0bd158456fc7e27eb165299ed33df769a0 127.0.0.1:7380 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: eb63ce6942fd606a81113fe07622908931356057 127.0.0.1:7381 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.
经过该命令能够自动集群握手并自动分配槽。
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7379 cluster nodes 30c2792fe726a9174c07f7d2db5704f5e9ef3b66 127.0.0.1:7480@17480 slave 157bee0bd158456fc7e27eb165299ed33df769a0 0 1572926323116 5 connected 5591d1f47c15f919e6c492325bca0a385b581471 127.0.0.1:7379@17379 myself,master - 0 1572926322000 1 connected 0-5460 56250f10afe111ce206169588300b39a6447ed91 127.0.0.1:7481@17481 slave eb63ce6942fd606a81113fe07622908931356057 0 1572926320090 6 connected 3eb412b810c4bd9a3c0f4ab1f4af8ee03d06d818 127.0.0.1:7479@17479 slave 5591d1f47c15f919e6c492325bca0a385b581471 0 1572926322107 4 connected 157bee0bd158456fc7e27eb165299ed33df769a0 127.0.0.1:7380@17380 master - 0 1572926321098 2 connected 5461-10922 eb63ce6942fd606a81113fe07622908931356057 127.0.0.1:7381@17381 master - 0 1572926320000 3 connected 10923-16383
因为使用redis-cli --cluster
和redis-trib.rb
命令格式大同小异,下面我都在linux下使用redis-cli --cluster
执行命令。
启动新的节点
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7382.config jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-server data/redis-7482.config
添加新的主节点到集群,使用--cluster add-node 新节点地址 集群节点地址
添加新的节点
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli --cluster add-node 127.0.0.1:7382 127.0.0.1:7379 >>> Adding node 127.0.0.1:7382 to cluster 127.0.0.1:7379 >>> Performing Cluster Check (using node 127.0.0.1:7379) M: 231ee8d2ea76e1c7fe2031c127b8a055be87a3f4 127.0.0.1:7379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: dcae00d572280d795fcbc82b899f2f1a50f1397c 127.0.0.1:7481 slots: (0 slots) slave replicates a9a4296b46db50459c5efb00d205fff671c2bfd0 S: 96b98672b59fd85f8743fde5b354abdb38ee3b47 127.0.0.1:7479 slots: (0 slots) slave replicates 0f6cf326c23af6399e6c3bfc374b04efbac015d3 M: 0f6cf326c23af6399e6c3bfc374b04efbac015d3 127.0.0.1:7381 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: a9a4296b46db50459c5efb00d205fff671c2bfd0 127.0.0.1:7380 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: e4ce1b6f872c6f72f776d534ce1dc783a0cf3655 127.0.0.1:7480 slots: (0 slots) slave replicates 231ee8d2ea76e1c7fe2031c127b8a055be87a3f4 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 127.0.0.1:7382 to make it join the cluster. [OK] New node added correctly.
添加新的从节点到集群,使用--cluster add-node --cluster-slave --cluster-master-id 主节点id 新的节点地址 集群节点地址
添加新的节点
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli --cluster add-node --cluster-slave --cluster-master-id d683040a8654a9ce994365d988ded03c03393135 127.0.0.1:7482 127.0.0.1:7379 >>> Adding node 127.0.0.1:7482 to cluster 127.0.0.1:7379 >>> Performing Cluster Check (using node 127.0.0.1:7379) M: 231ee8d2ea76e1c7fe2031c127b8a055be87a3f4 127.0.0.1:7379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: dcae00d572280d795fcbc82b899f2f1a50f1397c 127.0.0.1:7481 slots: (0 slots) slave replicates a9a4296b46db50459c5efb00d205fff671c2bfd0 S: 96b98672b59fd85f8743fde5b354abdb38ee3b47 127.0.0.1:7479 slots: (0 slots) slave replicates 0f6cf326c23af6399e6c3bfc374b04efbac015d3 M: 0f6cf326c23af6399e6c3bfc374b04efbac015d3 127.0.0.1:7381 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: a9a4296b46db50459c5efb00d205fff671c2bfd0 127.0.0.1:7380 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: e4ce1b6f872c6f72f776d534ce1dc783a0cf3655 127.0.0.1:7480 slots: (0 slots) slave replicates 231ee8d2ea76e1c7fe2031c127b8a055be87a3f4 M: d683040a8654a9ce994365d988ded03c03393135 127.0.0.1:7382 slots: (0 slots) master [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 127.0.0.1:7482 to make it join the cluster. Waiting for the cluster to join >>> Configure node as replica of 127.0.0.1:7382.
如今咱们新的两个redis服务已经加入到集群中,经过cluster nodes
查看当前集群节点。
shell jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli -p 7382 cluster nodes 231ee8d2ea76e1c7fe2031c127b8a055be87a3f4 127.0.0.1:7379@17379 master - 0 1572942882135 1 connected 0-5460 4b3a42f105e56b00d5b55eec9877d759b52f17e3 127.0.0.1:7482@17482 slave d683040a8654a9ce994365d988ded03c03393135 0 1572942881000 0 connected 0f6cf326c23af6399e6c3bfc374b04efbac015d3 127.0.0.1:7381@17381 master - 0 1572942883151 3 connected 10923-16383 a9a4296b46db50459c5efb00d205fff671c2bfd0 127.0.0.1:7380@17380 master - 0 1572942879000 2 connected 5461-10922 dcae00d572280d795fcbc82b899f2f1a50f1397c 127.0.0.1:7481@17481 slave a9a4296b46db50459c5efb00d205fff671c2bfd0 0 1572942881000 2 connected d683040a8654a9ce994365d988ded03c03393135 127.0.0.1:7382@17382 myself,master - 0 1572942880000 0 connected 96b98672b59fd85f8743fde5b354abdb38ee3b47 127.0.0.1:7479@17479 slave 0f6cf326c23af6399e6c3bfc374b04efbac015d3 0 1572942881120 3 connected e4ce1b6f872c6f72f776d534ce1dc783a0cf3655 127.0.0.1:7480@17480 slave 231ee8d2ea76e1c7fe2031c127b8a055be87a3f4 0 1572942879000 1 connected
添加节点完成,此时咱们须要从新分片,将虚拟槽分配给新的节点。在redis集群中可使用2个命令进行槽分配。--cluster reshard
和--cluster rebalance
。当咱们须要集群扩容时,通常都但愿槽能够平均分配,此时可使用该命令;rebalance
用于平衡集群节点虚拟槽数量,自动从新平均分配可使用该命令。src/redis-cli --cluster rebalance 127.0.0.1:7379 --cluster-use-empty-masters
,若没有添加cluster-use-empty-masters
空槽的redis服务不会加入分配,因为咱们须要进行集群扩容,所以须要加上该参数。
参数 | 说明 |
---|---|
--cluster-weight <node1=w1...nodeN=wN> | 指定集群节点的权重 |
--cluster-use-empty-masters | 设置可让没有分配slot的主节点参与,默认不容许 |
--cluster-timeout
|
设置migrate命令的超时时间 |
--cluster-pipeline
|
定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10 |
--cluster-threshold
|
迁移的slot阈值超过threshold,执行rebalance操做 |
--cluster-replace | 是否直接replace到目标节点,若节点存在重复key时,不指定该参数会报错。 |
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli --cluster rebalance 127.0.0.1:7379 --cluster-use-empty-masters >>> Performing Cluster Check (using node 127.0.0.1:7379) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Rebalancing across 4 nodes. Total weight = 4.00 Moving 1366 slots from 127.0.0.1:7380 to 127.0.0.1:7382 ###################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################### Moving 1365 slots from 127.0.0.1:7381 to 127.0.0.1:7382 ##################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################### Moving 1365 slots from 127.0.0.1:7379 to 127.0.0.1:7382 #####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
关于集群详细参数解释能够参考redis cluster 集群搭建(增、删、改、查)
当有某台redis服务再也不使用或出现故障时,咱们须要进行故障迁移。在集群搭建时咱们须要进行集群握手,握手完成后进行虚拟槽分配。而在故障转移的步骤也相反,咱们首先须要进行虚拟槽迁移,虚拟槽迁移时会将数据进行迁移。迁移完成后将故障节点从节点中之前。这一系列故障迁移动做都是在线的,不会对redis集群的服务形成影响。
咱们能够经过--cluster reshard
将该节点下的全部虚拟槽迁移到新的节点上。
参数 | 说明 |
---|---|
--cluster-from
|
须要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还能够直接传递--from all,这样源节点就是集群的全部节点,不传递该参数的话,则会在迁移过程当中提示用户输入 |
--cluster-to
|
slot须要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程当中提示用户输入 |
--cluster-slots
|
须要迁移的slot数量,不传递该参数的话,则会在迁移过程当中提示用户输入。 |
--cluster-yes | 指定迁移时的确认输入 |
--cluster-timeout
|
设置migrate命令的超时时间 |
--cluster-pipeline
|
定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10 |
--cluster-replace | 是否直接replace到目标节点,若节点存在重复key时,不指定该参数会报错。 |
src/redis-server data/redis-7383.config
src/redis-cli --cluster add-node 127.0.0.1:7383 127.0.0.1:7379
,将7382设置为主库加入到集群。开始槽迁移,src/redis-cli --cluster reshard 127.0.0.1:7379 --cluster-from 0a81b56b44e7974112534a596c9e2ef3ed8b4603 --cluster-to 756eb55a943453f87b49191f35c88271c650fb91
。
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli --cluster reshard 127.0.0.1:7379 --cluster-from 0a81b56b44e7974112534a596c9e2ef3ed8b4603 --cluster-to 756eb55a943453f87b49191f35c88271c650fb91 >>> Performing Cluster Check (using node 127.0.0.1:7379) M: 9bc411a648c4a0dc1ff8644973ded10c21857109 127.0.0.1:7379 slots:[1365-5460] (4096 slots) master 1 additional replica(s) S: d14a7d117eff2798e3ca5aa8a9afc88a0dbbdab1 127.0.0.1:7482 slots: (0 slots) slave replicates 0a81b56b44e7974112534a596c9e2ef3ed8b4603 M: 3d0c5deba0cd2b441d04cf7abe9dbd7af36b1af3 127.0.0.1:7380 slots:[6827-10922] (4096 slots) master 1 additional replica(s) M: 0a81b56b44e7974112534a596c9e2ef3ed8b4603 127.0.0.1:7382 slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master 1 additional replica(s) S: 7d2ab32bff9437b4fdd65ffe4011715569a45362 127.0.0.1:7481 slots: (0 slots) slave replicates 3d0c5deba0cd2b441d04cf7abe9dbd7af36b1af3 M: e5fb7a9da406787dffd80f847102e4405eaf013d 127.0.0.1:7381 slots:[12288-16383] (4096 slots) master 1 additional replica(s) M: 756eb55a943453f87b49191f35c88271c650fb91 127.0.0.1:7383 slots: (0 slots) master S: 06c1040b46e733cda47265ec64d56fec86459237 127.0.0.1:7480 slots: (0 slots) slave replicates 9bc411a648c4a0dc1ff8644973ded10c21857109 S: da488721d9d3271b557b1dcbf1e1dba48df7a856 127.0.0.1:7479 slots: (0 slots) slave replicates e5fb7a9da406787dffd80f847102e4405eaf013d [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. How many slots do you want to move (from 1 to 16384)? 4097 Ready to move 4097 slots. Source nodes: M: 0a81b56b44e7974112534a596c9e2ef3ed8b4603 127.0.0.1:7382 slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master 1 additional replica(s) Destination node: M: 756eb55a943453f87b49191f35c88271c650fb91 127.0.0.1:7383 slots: (0 slots) master Resharding plan: Moving slot 0 from 0a81b56b44e7974112534a596c9e2ef3ed8b4603 Moving slot 1 from 0a81b56b44e7974112534a596c9e2ef3ed8b4603 ... Moving slot 12286 from 127.0.0.1:7382 to 127.0.0.1:7383: Moving slot 12287 from 127.0.0.1:7382 to 127.0.0.1:7383:
当没有输入槽的数量,会提示须要迁移的槽数量。
src/redis-cli -p 7482 cluster REPLICATE 756eb55a943453f87b49191f35c88271c650fb91
,将7382的从库7482设置为7383的从。如今就能够将7382的库去除了。集群会移除该节点,同时该节点也会关闭。
jake@Jake-PC:~/tool/demo/redis-cluster/redis$ src/redis-cli --cluster del-node 127.0.0.1:7379 0a81b56b44e7974112534a596c9e2ef3ed8b4603 >>> Removing node 0a81b56b44e7974112534a596c9e2ef3ed8b4603 from cluster 127.0.0.1:7379 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
目前咱们可使用redis自带的客户端对集群进行动态横向扩展与故障迁移。当redis服务较少时可使用这种方式,可是当redis服务较多时,经过手动横向扩展与故障迁移的方式的工做量就很是大了,同时咱们可能还须要多大量的redis服务进行监控与预警,这时候咱们能够写一些脚原本方便运维,甚至可使用专业的redis管理平台提升生产力。对于redis管理平台暂时没有研究,知名的有redislive、cachecolud等。有兴趣的同窗能够本身看一下。
出处:http://www.javashuo.com/article/p-xqqhonul-kt.html 做者:杰哥很忙 本文使用「CC BY 4.0」创做共享协议。欢迎转载,请在明显位置给出出处及连接。