java面试题总结框架redis集群介绍_第1页
java面试题总结框架redis集群介绍_第2页
java面试题总结框架redis集群介绍_第3页
java面试题总结框架redis集群介绍_第4页
java面试题总结框架redis集群介绍_第5页
免费预览已结束,剩余20页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、这种结构很容易添加或者删除节点. 比如如果新添加个节点D, 我需要从节点A,B,这种结构很容易添加或者删除节点. 比如如果新添加个节点D, 我需要从节点A,B,C中得部分槽到D上. 如果我像移除节点A,需要将A中得槽移到B和 C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈Redis 集群的主模节点 A 包含 0 到 5500号哈希槽节点 B 5501 到 11000 号哈希槽节点 C 11001 到 16384号哈希槽Redis Redis 集群没有使用一致性hash, 哈希槽的概念Redis 16384 个哈希槽,每个key CRC16 16384 取模来决定放置哪

2、个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有 3 个节点,那么:Redis 集ds是提供了从用户角度来如何搭建测试以及使用的方法,如果你打算使用并深入ds集群, 阅读完本章节后,ds集群规范一章。本 试图提供最终用户一个简单的关于集群和一致性特征的描述请注意,本 使用于 Redis3.0(3.0)以上版本如果你计划部署集群,那么 RedisRedis 集群是一个提供在多个Redis间节点间共享数据ds集群并不支持处理多个keys 令,因为这需要在不同的节点间移动数据,ds那样的性能,在高负载的情况下可能会导致不可预料的错误.Redis 集群通过分区来提供一定程度的可用性,

3、在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:工作发生在返回命令回复之后,工作发生在返回命令回复之后,因为如果每次处理命令请操作完成的话,那么主节点处理命令请求的速度将极大地降低 须在性能和一致性之间做出权衡。注意:Redis 集群可能会在将来提供同步写的方法。Redis 集群另外一种可能会丢失命令的情况是集群出现了网络分区, 并且一个客户端与至少包括一个主节点在内的少数实例被孤 举个例子 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, A1 、B1 、C1 为A,B,C的从节点, 还有一Z1

4、假设集群中发生网络分区,那么集群可能会分为两方,大部分的A 、C 、A1 、B1 C1 B 和客户端 Z1 .Z1 仍然能够向主节点B 中写入, 如果网络分区发生时间较短,那么集群将会继,如果分区的时间足够让大部分的一方将B1为新的master,那么Z1 写入B 中得数据便丢失了.注意, 在网络 出现期间, 客户端 Z1 B 发送写命令的最(nodetimeout), Redis 集群的一个重要的配置选项:Redis客户端向主节点B写入一条命令主节点B向客户端回复命令状态主节点将写操给他得从节点B1, B2 和模型,每个节点都会有N-1 个例子中具有A,B,C 三个节点的集群,在没有点B失败了

5、,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用点A1,B1,C1,那么整个集群便有三个master 节点和三个slave 节点组成,这样在节点B 失败后,集群便会B1为新的主节点继续服务,整个集群便不过当BB1 都失败后,集群是不可用的Redis Redis 并不能保证数据的强一致性. 这意味这在实际中集群在特定的条件下可第一个原因是因为集群是用了异. 写操作过程Redis实例. RedisRedis下面是一个最少选项的集群的配置文件令和特性了portcluster-enabledcluster-config-filecluster-node-timeoutRedis实例.

6、 RedisRedis下面是一个最少选项的集群的配置文件令和特性了portcluster-enabledcluster-config-filecluster-node-timeoutappendonlycluster-enabled 而 cluster-conf-nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更在将每个目录中运行一个 实例: 命令如下mkdircluster-cdcluster-mkdir70007001700270047000 7005 redis.conf以使用上面的示例配置文件, 但记得将配置中的端 从 700

7、0 从 unstable Redis 7000 7005 redis.conf以使用上面的示例配置文件, 但记得将配置中的端 从 7000 从 unstable Redis redis-server cluster-test cd./redis-servernodes.conf 自身指定了一个新的 ID :8246226Nov11:56:55.329*Noclusterfound,ImID (unique)的名已经有了六个正在运行中的 Redis Redis redis-trib 非常容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 群, 或

8、者对集群进行重新分片(reshared)等工作。./redis-trib.rbcreate-replicas1:7001:7002:7003这个命令在这里用于创建一个新的集群, 选项replicas 1 表示:7002:7003这个命令在这里用于创建一个新的集群, 选项replicas 1 表示之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slaveredis- trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份

9、配置应用到集群当中,让各个节点开始互相通OKAll16384slots这表示集群中的16384 个槽都有至少一个主节点在处理,集正常CreatingaRedisClusterusingthecreate-clusterIf you dont want to create a Redis Cluster by configuring and executing individual instanmanuallyasexplainedabove,thereisamuchsimpler system (but youll not learn the same amount of operationa

10、l details).Just check utils/create-clusterdirectoryhe Redis distribution. Thereisascriptcalled create-clusterinside(samenameasthedirectory it is containedo), its a simpashscript.Inordertostarta6nodescluster with 3 masters and 3 slaves just type the followingcreate-clustercreate-clusterReplytoyesinst

11、ep2whenthe redis-tributilitywantsyoutoacceptcluster You can noweract with the cluster, thenode will starport30001by default. When you are done, stop the cluster with:1. create-clusterPleasereadthe READMEinsidethisdirectoryformoreinformationonhowrun the Redis 集群现阶段的一个问题是客户端实现很少。测试Redis 集群比较简单的办法就是使用测

12、试Redis 集群比较简单的办法就是使用redis-rb-cluster 或者redis-cli ,使用 redis-cli 为例来进行演示:$redis-cli-c-predis:7000setfoo-Redirectedtoslot12182locatedredis:7002o-Redirectedtoslot866locatedatredis-rb-cluster 是我(antirez)编写的 Ruby 实现, 用于作为其他实现的参考。该实现是对redis-rb 的一个简单包装,高效地实现了与集群进行通讯redis-py-cluster redis-r

13、b-cluster 的一个 一段时间没有更新了(最后一次提交是在六个月之前),PredisRedis 群的支持是否完整, 也不清楚它是否和 版本的 Redis (因为新版的 Redis 集群将槽的数量从 4k 改为 16k 了).java客户端, Jedis最近添加了对集群的支持, READMEJedisCluster部分StackExchange.RedisC# 的支持(.NET 下面的语言,比如: VB, F#等等)t k-redis Node.js io.jsRedisunstableredis-cli使用命令 redis-cli -c 来启动。redisget-Redirectedto

14、12182locatedrediso-to866locatedredisget-Redirectedto12182locatedrediso-to866locatedat注意如果你是使用30001redis-cli 对集群的支持是非常基本的, 所以它总是依靠 Redis 集群节点来将(map),(failover)过添加节点或移除节点来修改了集群的布局(layout)之后, 诸如此类。使用redis-rb-clusterRedis Redis redis-rb-cluster ex cluster 项目里面le.rb 的文件, 包含在redis-1require23startup_nodes=

15、4:host=redis-rb-cluster ex cluster 项目里面le.rb 的文件, 包含在redis-1require23startup_nodes=4:host=:port=5:host=:port=67rc=89 last=11 whilenotlast=rc.get( last last=0rescue=putslast=rc.get( last last=0rescue=putssleepputsbegin rescue 代码块begin rescue 代码块着, 因为希望在代码出错时,将错误打印到终端上面,而不希望应用因代码的第七行是代码中第一个有趣的地方, 它创建了

16、一个 Redis 集群对象,startup_nodes 列表,列表中包含了两个集群节点的地址。第二个参数指定了对于集群中的各个不同的节点, Redis 集群对象可以获得的最大连接数 ,第三个参数 timeout 指定了一个命令在执行多久之后, 才会被看作是执行失有效的: 一旦 redis-rb-cluster 成功连接上集群中的某个节点时, 集群节点列表就会被自动更新, 任何真正的的集群客户端都应该这样做。SETfoo0SETfoo1SETfoo2Andso rc.set( last rescue=putserrorsleep30 foo为number为值, 使用 SET 命令向数据库设置键值

17、对:Redis rc 变量里面,这个对象当作普通 Redis 对象实例来使用。才将计数器初始化为 : 通过将计数值保存到 Redis 的计数器里面,foo0 whileRedis rc 变量里面,这个对象当作普通 Redis 对象实例来使用。才将计数器初始化为 : 通过将计数值保存到 Redis 的计数器里面,foo0 while 。时打印错误信息。程序在主循环的末尾添加了一个 sleep 执行速度变慢, 帮助执行示例的人更容易看清程序的输出。执行 123456789C(Istoppedtheprogram现在, 来试试对集群进行重新分片操作。在执行重新分片的过程中请让你的 le.rb9C(I

18、stoppedtheprogram现在, 来试试对集群进行重新分片操作。在执行重新分片的过程中请让你的 le.rb 会对正在运行的集群程序产生任何影响, 你也可以考虑将 le.rb sleep 调用删掉, 从而让重新分片操作在近乎真实的写负载下执行 重新分片一样, 重新分片也可以使用 redis-trib 程序来执行 执行以下命令可以开始一./redis-trib.rbreshardredis-trib 就会自动找到集群中的redis-trib redis-你想移动多少个槽1到 100个槽重新分片, 如果 现在 1000 le.rb redis-trib 是, 负责接收这 1000 个哈希槽的

19、节点。$redis-cli-p7000clusternodes|grep97a3a64667477371c4479320d683e4c8db5858b1 myself,master-000connected0-我得目标节点是 现在需要指定从哪写节点来移动keys到目标借调 我输入的是all ,这样就会从其他每个master 上取一些哈希槽。最后确认后你将会看到每个redis-trib移动的槽的信息,每个key97a3a64667477371c4479320d683e4c8db5858b1 myself,master-000connected0-我得目标节点是 现在需要指定从哪写节点来移动key

20、s到目标借调 我输入的是all ,这样就会从其他每个master 上取一些哈希槽。最后确认后你将会看到每个redis-trib移动的槽的信息,每个key的移动的信息也会打印出来 在重新分片的过程中,你得例子程序是不会受到影响的,你可以在重新分片结束后你可以通过如下命令检查集群状态./redis-trib.rbcheck面使用的示例程序 le.rb 地将 发送的所有 SET foo42 le.rb redis-rb-cluster test.rb 的示例应用, 这个应用比起 ex数器(默认为 1000 个),项目包含了一个名为 consistency- le.rb INCR consistenc

21、y-test.rb INCR 下计数器执行 如果计数器的起始值为 0 , 而这次是程序第 50 那么计数器的值应该是 50 向它发送 INCR 在每次发送 INCR 命令之前, 程序会随机从集群中将它与自己 (consistencychecker):群在执行 INCR 命令的过程中, 丢失了某条 INCR 命令, 又或者多执行了某条客户端没有确认到的 INCR 命令, 那么检查器将察觉到这一点 前一种情况中, consistency-要大; 而在后一种情况中, consistency-consistency-test $rubyconsistency-925R(0err)|925(0err)5

22、030R(0err)|W(0err)9261R(0err)|W(0err)R|$rubyconsistency-925R(0err)|925(0err)5030R(0err)|W(0err)9261R(0err)|W(0err)R|W|R|W|R|W|R|W|consistency-test.rb $redis:7000setkey_217(heothertabI94774R(0err)|94774(0err)98821R(0err)94774R(0err)|94774(0err)98821R(0err)|98821(0err)102886R(0err)|W(0err)|11

23、4lost107046R(0err)|W(0err)|114lost在114 (执行了 114 consistency-计数器的值设成了 命令),说丢失了 114 个 INCR 这个程序作为测试程序很有意思,所用这个程序来测试故障恢复在执行本节操作的过程中, 请一直运行 consistency-test 程序。 要触发一次$redis-cli-p7000clusternodes|grep:7001master-0138548298408205960-:7002master-01385482983582011423-97a3a64667477371c44793

24、20d683e4c8db5858b1 myself,master-000connected0-595910922-通过命令输出得知为 7000 、 7001 和7002 的节点都是主节点, 可以通过向:7002master-01385482983582011423-97a3a64667477371c4479320d683e4c8db5858b1 myself,master-000connected0-595910922-通过命令输出得知为 7000 、 7001 和7002 的节点都是主节点, 可以通过向为7002 的主节点发送DEBUGSEGFAULT 命令后让这个主节$r

25、edis-cli-p7002debugError:Serverclosedtheconsistency-test 页, 可以看到, test 7002 R|W|R|W|R|W|.manyerrorR|W|R|W|R|W|R|W|consistency-test 丢失了 578 个读命令和 577 个写命令, 但是并没有产生任何数据不一致。Redis 这听上去可能有点奇怪, 因为的开R|W|R|W|R|W|R|W|consistency-test 丢失了 578 个读命令和 577 个写命令, 但是并没有产生任何数据不一致。Redis 这听上去可能有点奇怪, 因为的开步Redis 窗口是非常小的

26、。不过,尽管出现的几率不高,但丢失命令的情况还是有可能会出现的, 所对Redis 集群不能提供强一致性的这一描述仍然是cluster nodes 命令,$redis-cli-p7000cluster:70043e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 13855034185210:700397a3a64667477371c4479320d683e4c8db5858b1 1385503419023097a3a64667477371c4479320d683e4c8db5858b1 myself,master-0127.0.0

27、.1:700397a3a64667477371c4479320d683e4c8db5858b1 1385503419023097a3a64667477371c4479320d683e4c8db5858b1 myself,master-000connected0-595910922-:7005master-0138550341902311423-:7001master-013855034170055960-:7002Redis进程, 可以通过故障转移将其转为slaveRedis进程, 可以通过故障转移将其转为slave再Redis集群使用CL

28、USTERFAILOVER命令来进行故障转移,不过要被转移的主节点的从节点上执行该命令手动故障转移比主节点失败自动故障转移更加安执行手动故障转移时从节点日志如下#Manualfailoveruserrequest#Receivedreplicationoffsetforpausedmasterfailover:节点标志masterslavemyselffail如果是个从节点, NODE集群最近一次向节点发命令之后, 过去了多长时间还没接到回复。PONG (configurationepoch):详细信息请参考Redis 集群规范 。本节点的网络连接情况:例如 connected 127.0.0

29、.1:7001 5960 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 13855034180163现在masters7000, 7001 7005端口上. 原来的master 70027005的一个从节点CLUSTERNODES命令的输出看起来有点复杂,其实他非常的简单,含义如下接下来使用redis-trib 来添加这个节点到现有的集群中去接下来使用redis-trib 来添加这个节点到现有的集群中去在中端打开一个新页进入cluster-test 目录创建并进入 7006文件夹和其他节点一样,创建redis.conf文件,需要将改成./redis-serv

30、er如果正常的话,节点会正确的启动#Allmasterreplicationsed,failovercan#Startofelectiondelayedfor0milliseconds#0,offset#Startingafailoverelectionforepoch#Failoverelectionwon:Imthenew切换,当客户端在旧的master 上点设置为集群中某个节点的 )两种情况第一步都是要添加 一个空的节点.启动新的7006 节点,使用的配置文件和以前的一样,只要把端./redis-trib.rbadd-node:7006可以看到.addnode个参数是任

31、意一个已经存在的节点的IP和端口.redis./redis-trib.rbadd-node:7006可以看到.addnode个参数是任意一个已经存在的节点的IP和端口.redis:7006cluster:7001master-0138554317857505960-:7004013855431795830myself,master-000:7002新节点没有包含任何数据, 因为它没有包含任何哈希槽将某个从节点升级为新的主节点时, 这个新节点不会被选中。3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 新节点没有包含任何数据, 因为它没有包含任何哈希槽将某个从节点升级为新的主节点时, 这个新节点不会被选中。3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 13855431780723:700397a3a64667477371c4479320d683e4c8db5858b1 1385543178575

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论