hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

redis入门(三)

2019-11-18杂谈搜奇网33°c
A+ A-

目次

  • redis入门(三)
    • 目次
    • 媒介
    • 事件
      • 道理
    • Lua剧本
      • 装置
      • 剧本敕令
    • 集群搭建东西
      • redis-trib.rb
      • redis官方集群搭建
      • 集群横向扩大
      • 毛病转移
      • redis治理
    • 参考文档

redis入门(三)

目次

redis入门(一)
redis入门(二)
redis入门(三)

媒介

在前两章引见了Redis的一些经常运用的API与功用,在本章会对一些其他功用包含事件、剧本、Redis集群搭建东西以及集群动态扩容与毛病转移体式格局举行解说。

事件

在关联型数据库,我们能够经由历程事件(transaction)的体式格局实行数据库级别的原子性操纵。在Redis中也供应简朴的事件功用。
Redis经由历程MULTIEXECWATCH等敕令来完胜利用。它供应了一种将多个敕令请求打包,然后一次性、按递次地实行多个敕令的机制。
将一组须要一同实行的敕令放到MULTIEXEC两个敕令之间。MULTI敕令代表事件最先,EXEC敕令代表事件完毕,它们之间的敕令是原子递次实行的,在MULTI实行以后,的写敕令会直接返回QUEUE,当输入EXEC后会将一切敕令一同实行。

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

若不运用事件时,客户端发送的敕令会马上被效劳端实行。运用事件时,当客户端发送的敕令是EXECDISCARDWATCHMULTI敕令之一时,效劳器马上实行该敕令,若不是上述四个敕令,则会将敕令到场到一个事件行列中,然后向客户端返回QUEUE复兴。

由于开启事件时敕令不会直接被实行,而是直接入队,因而Redis也不会马上发现运转时毛病(比方hash的键运用string的敕令实行)。因而当事件中某条敕令实行失利时,其他敕令照样能够能够平常实行。因而运用EXECMULTI敕令时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提交事件之前,数据发生了变化,则事件实行失利。

客户端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>  

客户端B

127.0.0.1:6379>  set a 7
OK

时刻点

时刻序号 客户端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敕令则会提交失利。

道理

  1. 每一个Redis数据库都邑有一个字典用于保留被看管的键,而字典的的值是一个链表。该列表记录了一切看管该键的客户端。因而Redis效劳器就清晰的晓得哪些键被哪些客户端看管了。
  2. 当被看管的键被修正时,会触发一个行动将被修正键的客户端的该键的“脏数据”标志翻开,示意该键的事件已被损坏。
  3. 当客户端提交事件的时刻,效劳器会推断这个客户端是不是存在被看管的键翻开了“脏数据”标志。若该标识被翻开,则申明客户端所以看管的键已被修正,效劳器就会谢绝事件提交。

Lua剧本

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剧本的敕令EVALEVALSHA

  1. 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"
  2. 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"
  3. 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

  4. SCRIPT EXISTS
    经由历程该敕令输入SHA1校验和能够搜检对应的剧本是不是存在。

  5. SCRIPT FLUSH
    该敕令用于消灭效劳器中一切和lua剧本相干的信息,并封闭当前lua环境从新建立一个新的lua环境

  6. SCRIPT KILL
    在每次实行lua剧本之前,redis效劳器都邑在lua环境中设置一个超时处置惩罚钩子,若剧本实行凌驾设置的lua-time-limit的时长时,能够经由历程该敕令住手当前的lua剧本实行。

    若当前lua剧本有写入操纵,则没法在运用该剧本住手实行。只能经由历程SHUTDOWN nosave敕令封闭。

  7. 剧本复制
    当效劳器开启了主从复制时,写敕令的剧本也会复制到从效劳器以确保从效劳器的数据和主效劳器一致。
    然则EVALSHA敕令比较特别,由于有能够主效劳器加载了剧本,从效劳器还没有来的及同步。所以会存在主效劳器字典中存在函数缓存然则从效劳器不存在的状况。因而当Redis请求主效劳器在流传EVALSHA敕令的时刻,必需确保EVALSHA敕令要实行的剧本已被一切从效劳器载入过,假如不能确保这一点的话,主效劳器会将EVALSHA敕令转换成一个等价的EVAL敕令,然后经由历程流传EVAL敕令来替代EVALSHA敕令。

集群搭建东西

redis-trib.rb

在上一节我们解说了集群搭建的道理和历程。然则一步步都采用纯手工搭建会不太轻易,而且也轻易失足。在redis5.0之前能够经由历程redis-trib.rb举行集群搭建。它是Ruby完成Redis集群治理东西。

Ruby 是一种开源的面向对象顺序设想的效劳器端剧本言语,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设想并开辟。 Ruby 可运转于多种平台,如 Windows、MAC OS 和 UNIX 的种种版本。

下面我在windows平台上搭建集群。

  1. 预备ruby环境。
    在windows环境能够到RubyInstaller下载装置。
    下载装置完能够经由历程ruby -v肯定是不是装置胜利,以及当前ruby版本号。

    装置完成会弹出一个框讯问装置MSYS2,我们能够不须要。

  2. 装置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
  3. 下载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实行。

  4. 建立7579~75846个端口的设置文件,启动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效劳启动

  5. 经由历程敕令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
  6. 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

redis官方集群搭建

在redis5.0最先官方集成了redis-trib.rb。能够直接经由历程cluster create敕令建立集群。

  1. 将六个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
  2. 建立集群
    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 --clusterredis-trib.rb敕令花样迥然差别,下面我都在linux下运用redis-cli --cluster实行敕令。

  1. 增加两个设置节点分别为7382和7482用于集群扩大。
  2. 启动新的节点

    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
  3. 增加新的主节点到集群,运用--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.
  4. 增加新的从节点到集群,运用--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

  5. 增加节点完成,此时我们须要从新分片,将假造槽分派给新的节点。在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时,不指定该参数会报错。
  1. 预备一个新的redis效劳7383(也能够将这些假造槽迁徙到其他的主上)。
  2. 启动效劳src/redis-server data/redis-7383.config
  3. 实行src/redis-cli --cluster add-node 127.0.0.1:7383 127.0.0.1:7379,将7382设置为主库到场到集群。
  4. 最先槽迁徙,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:

    当没有输入槽的数目,会提醒须要迁徙的槽数目。

  5. 实行src/redis-cli -p 7482 cluster REPLICATE 756eb55a943453f87b49191f35c88271c650fb91,将7382的从库7482设置为7383的从。
  6. 如今就能够将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治理平台进步生产力。关于redis治理平台临时没有研讨,着名的有redislive、cachecolud等。有兴致的同砚能够本身看一下。

参考文档

  1. redis
  2. redis开辟与运维
  3. 编译lua-5.3.5时失足处置惩罚方法
  4. redis-5.0.0基于Redis官方东西的集群搭建(排坑指南,从装置Redis最先)
  5. Windows下 搭建redis集群
  6. redis cluster 集群搭建(增、删、改、查)
  7. Linux—shell中\((( ))、\)( )、``与${ }的区分
  8. Redis Cluster & HDFS & ClustrixDB Reshard/Rebalance
  9. Redis有用监控东西一览

出处:https://www.cnblogs.com/Jack-Blog/p/11804743.html
作者:杰哥很忙
本文运用「CC BY 4.0」创作同享协定。迎接转载,请在显著位置给出出处及链接。

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
redis入门(三)

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282392.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>