您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Redis 集群应用学习
集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。上一篇我们讲到了Redis的主从复制技术,当实现了多节点的master-slave后,我们也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群。集群要实现的目的是要将不同的key分散放置到不同的redis节点,这里我们需要一个规则或者算法,通常的做法是获取key的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的key无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。一致性哈希有四个重要特征:均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对key哈希应尽可能的避免重复。但一致性哈希不是我们今天要介绍的重点,因为Redis引入另一种哈希槽(hashslot)的概念。Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点。使用哈希槽的好处就在于可以方便的添加或移除节点。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;内部机制,与我何干,对于我们来说,在新增或移除节点的时候不要让我们先停掉所有的redis服务我就谢天谢地了,这点它做到了。下面我们就开始动手搭建一个redis集群来体验一下。因为我们要启动多个redis实例,虽然我们可以直接通过命令行来启动,但始终是不怎么方便的,所以我们先来新建三个实例目录,分别是9001,9002,9003,目录名就是redis实例的端口号。我这里已经建好了目录,然后我们把以前编译过和修改过的redis-server、redis.conf这两个文件分别拷贝到这三个目录里面,拷贝完之后就像这样子了:我们打开redis.conf文件,为了简单起见,我们只保留下面几个配置项:daemonizeyesport9001cluster-enabledyescluster-config-filenodes.confcluster-node-timeout5000appendonlyyes注意:port要修改成对应目录的名字,也就是每个实例要有不同的端口。下面我们分别启动这三个实例:zhaoguihuadediannao:~zhaogh$cdapplications/dev/redis-clusterzhaoguihuadediannao:redis-clusterzhaogh$cd9001zhaoguihuadediannao:9001zhaogh$./redis-server./redis.confzhaoguihuadediannao:9003zhaogh$cd../9002zhaoguihuadediannao:9002zhaogh$./redis-server./redis.confzhaoguihuadediannao:9002zhaogh$cd../9003zhaoguihuadediannao:9003zhaogh$./redis-server./redis.confzhaoguihuadediannao:9003zhaogh$接下来我们来创建集群,让三个实例互相通讯:zhaoguihuadediannao:srczhaogh$./redis-trib.rbcreate--replicas0127.0.0.1:9001127.0.0.1:9002127.0.0.1:9003CreatingclusterConnectingtonode127.0.0.1:9001:OKConnectingtonode127.0.0.1:9002:OKConnectingtonode127.0.0.1:9003:OKPerforminghashslotsallocationon3nodes...Using3masters:127.0.0.1:9001127.0.0.1:9002127.0.0.1:9003M:92c9912cb1ccf657c886ecd839dd32c66efd8762127.0.0.1:9001slots:0-5460(5461slots)masterM:b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b127.0.0.1:9002slots:5461-10922(5462slots)masterM:44ab30c7c589ffb15b9b04dd827c72cfaeedacb2127.0.0.1:9003slots:10923-16383(5461slots)masterCanIsettheaboveconfiguration?(type'yes'toaccept):yesNodesconfigurationupdatedAssignadifferentconfigepochtoeachnodeSendingCLUSTERMEETmessagestojointheclusterWaitingfortheclustertojoin..PerformingClusterCheck(usingnode127.0.0.1:9001)M:92c9912cb1ccf657c886ecd839dd32c66efd8762127.0.0.1:9001slots:0-5460(5461slots)masterM:b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b127.0.0.1:9002slots:5461-10922(5462slots)masterM:44ab30c7c589ffb15b9b04dd827c72cfaeedacb2127.0.0.1:9003slots:10923-16383(5461slots)master[OK]Allnodesagreeaboutslotsconfiguration.Checkforopenslots...Checkslotscoverage...[OK]All16384slotscovered.zhaoguihuadediannao:srczhaogh$需要注意的是执行redis-trib.rb命令需要ruby的支持,如果你没有安装可以先到下载,然后离线安装。sudogeminstallredis-3.0.7.gem--local下面我们用redis自带的客户端测试一下:zhaoguihuadediannao:srczhaogh$./redis-cli-c-p9001127.0.0.1:9001gettestkey001-Redirectedtoslot[12786]locatedat127.0.0.1:9003(nil)127.0.0.1:9003settestkey002testvalue002-Redirectedtoslot[401]locatedat127.0.0.1:9001OK127.0.0.1:9001gettestkey002testvalue002127.0.0.1:9001settestkey003testvalue003OK127.0.0.1:9001可以看到,虽然我们第一次连接的是9001端口,当我们去获取testkey001的时候,rediscluster自动帮我们重定向到9003。当我们在9003设置testkey002时,rediscluster又重定向到9001。总的来说,redis集群部署起来还是非常方便的,遗憾的是,目前几乎还没有c#的客户端能很好的支持redis集群,真是非常的悲哀,我们期待他们的更新。下一遍中,我们继续讨论redis集群,比如,如何增加节点,移除节点,重新切片等,敬请期待。Redis集群(中)昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势。我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我删除。我的本意只是想让各位看过文章之后能冷静地思考自己的程序人生,不管是对是错,人都有选择的权力,走好自己的路。我没有你们想象中那么悲观,我也在不懈的努力,哪怕一时的跌倒,我也要重新站起。生活无时无刻不是压力,让我们背起行囊,迈出踏实的一步,走起!我们继续我们的redis缓存之旅。前一篇我们实现了一个简单的redis集群,redis也为了让我们方便的维护集群提供了非常好的工具。首先请大家参照我的上一篇文章,把集群环境搭建起来。OK,我用了分分钟的时间已经搭建好了。[OK]All16384slotscovered.zhaoguihuadediannao:srczhaogh$./redis-cli-c-p9001127.0.0.1:9001gettestkey001-Redirectedtoslot[12786]locatedat127.0.0.1:9003(nil)127.0.0.1:9003如何增加节点:首先我们创建一个叫做9004的目录:zhaoguihuadediannao:redis-clusterzhaogh$mkdir9004zhaoguihuadediannao:redis-clusterzhaogh$接着我们将9001目录下的redis-server、redis.conf两个文件拷贝到9004目录:zhaoguihuadediannao:redis-clusterzhaogh$cp9001/redis-server9004zhaoguihuadediannao:redis-clusterzhaogh$cp9001/redis.conf9004然后我们打开redis.conf文件修改里面的端口配置项,将其改为9004。启动9004实例:zhaoguihuadediannao:redis-clusterzhaogh$cd9004zhaoguihuadediannao:9004zhaogh$./redis-server./redis.confzhaoguihuadediannao:9004zhaogh$想要把这个实例加入到集群,我们只需要执行redis-trib.rb命令:zhaoguihuadediannao:srczhaogh$./redis-trib.rbadd-node127.0.0.1:9004127.0.0.1:9001第一个参数是我们刚才启动的新实例,第二个参数是集群中已有的节点。检查一下新节点是否已经加入:zhaoguihuadediannao:srczhaogh$./redis-cli-c-p9001127.0.0.1:9001clusternodes0e8f980bfe7a682e3d71b15523a41293535b8ccd:0myself,master-001connected0-5460cbb01bdfdc265b190496956354d84aaae6e7d54d127.0.0.1:9004master-014019523163460connected708e6e14474e3a99677b05ff89b
本文标题:Redis 集群应用学习
链接地址:https://www.777doc.com/doc-3612635 .html