高性能网站架构设计之缓存篇(6)- Redis 集群(中)

昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势。

我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我删除。

我的本意只是想让各位看过文章之后能冷静地思考自己的程序人生,不管是对是错,人都有选择的权力,走好自己的路。

我没有你们想象中那么悲观,我也在不懈的努力,哪怕一时的跌倒,我也要重新站起。

生活无时无刻不是压力,让我们背起行囊,迈出踏实的一步,走起!

我们继续我们的 redis 缓存之旅。

前一篇我们实现了一个简单的 redis 集群,redis 也为了让我们方便的维护集群提供了非常好的工具。

首先请大家参照我的上一篇文章,把集群环境搭建起来。

OK,我用了分分钟的时间已经搭建好了。

[OK] All 16384 slots covered.

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> get testkey001

-> Redirected to slot [12786] located at 127.0.0.1:9003

(nil)

127.0.0.1:9003>

如何增加节点:

首先我们创建一个叫做 9004 的目录:

zhaoguihuadediannao:redis-cluster zhaogh$ mkdir 9004

zhaoguihuadediannao:redis-cluster zhaogh$

接着我们将 9001 目录下的 redis-server 、 redis.conf 两个文件拷贝到 9004 目录:

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis-server 9004

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis.conf 9004

然后我们打开 redis.conf 文件修改里面的端口配置项,将其改为 9004 。

启动 9004 实例:

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9004

zhaoguihuadediannao:9004 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9004 zhaogh$

想要把这个实例加入到集群,我们只需要执行 redis-trib.rb 命令:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb add-node 127.0.0.1:9004 127.0.0.1:9001

第一个参数是我们刚才启动的新实例,第二个参数是集群中已有的节点。

检查一下新节点是否已经加入:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> cluster nodes

0e8f980bfe7a682e3d71b15523a41293535b8ccd :0 myself,master - 0 0 1 connected 0-5460

cbb01bdfdc265b190496956354d84aaae6e7d54d 127.0.0.1:9004 master - 0 1401952316346 0 connected

708e6e14474e3a99677b05ff89bd857375884437 127.0.0.1:9002 master - 0 1401952314325 2 connected 5461-10922

a7f9d3c64540cc3fc8cd3072e573bb8ab0bf1e6f 127.0.0.1:9003 master - 0 1401952315334 3 connected 10923-16383

127.0.0.1:9001>

我们可以发现 9004 并不包含任何哈希槽,因为它还没有数据。

我们还可以为集群中的主节点增加从节点用于只读查询。

如何增加从节点:

我们还是要创建目录,拷贝那两个文件,修改配置,然后启动实例:

zhaoguihuadediannao:redis-cluster zhaogh$ mkdir 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis-server 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis.conf 9005

修改 port 为 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9005

zhaoguihuadediannao:9005 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9005 zhaogh$

执行下面的命令,增加从节点:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb add-node --slave 127.0.0.1:9005 127.0.0.1:9001

第一个参数为从节点,第二个参数为主节点。

如何删除一个节点:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 ‘cbb01bdfdc265b190496956354d84aaae6e7d54d‘

这里要注意一下,第一个参数是集群中的任何一个主节点地址,而第二个参数是要删除节点的 ID,这个ID如果你不知道的话,可以通过 cluster nodes 命令查看。

还有一点就是要删除的节点必须是空的,也就是不能缓存任何数据,否则会删除不成功。对于非空节点,在删除之前需要重新分片,将缓存的数据转移到别的节点。

如何重新分片:

我们先给某个节点做点数据:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> set testkey001 testvalue001

-> Redirected to slot [12786] located at 127.0.0.1:9003

OK

127.0.0.1:9003>

现在 9003 上已经有数据了,我们尝试删除一下:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 ‘78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3‘

>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

[ERR] Node 127.0.0.1:9003 is not empty! Reshard data away and try again.

zhaoguihuadediannao:src zhaogh$

没有删除成功,我们来重新分片,把 9003 上的数据转移:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb reshard 127.0.0.1:9003

然后输出了很多信息,很多数值和ID都可以从这段信息中找到。

How many slots do you want to move (from 1 to 16384)? 5461

会问你要移动多少个哈希槽,我们把 9003 上的所有哈希槽都移走,5461 这个数字可以从终端上看到,或许你的实际情况不是这个数字。

What is the receiving node ID? 4d2e0a8360795ce7ce8381c68746034aeba3c9b9

然后问你你要把这些哈希槽移到哪儿去,我指定了 9001 的 节点 ID。

Please enter all the source node IDs.

Type ‘all‘ to use all the nodes as source nodes for the hash slots.

Type ‘done‘ once you entered all the source nodes IDs.

Source node #1:78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3

Source node #2:done

之后,redis 列出了重新分片计划,最后问你

Do you want to proceed with the proposed reshard plan (yes/no)? yes

执行完成后,我们看看 9003 上还有没有 key:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9003

127.0.0.1:9003> keys *

(empty list or set)

127.0.0.1:9003>

再看看 9001 上是不是有这个 key 了

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9001

127.0.0.1:9001> keys *

1) "testkey001"

127.0.0.1:9001>

没错,果然转移过来了。

最后我们试试能不能把 9003 删除:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 ‘78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3‘

>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

>>> Sending CLUSTER FORGET messages to the cluster...

>>> SHUTDOWN the node.

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9003

Could not connect to Redis at 127.0.0.1:9003: Connection refused

not connected>

非常好,it’s very good.

上篇文章说过,目前c#客户端还不能很好的支持 redis 集群,下一篇我将介绍如何使用代理来实现 redis 集群。

时间: 2024-10-11 00:55:26

高性能网站架构设计之缓存篇(6)- Redis 集群(中)的相关文章

高性能网站架构设计之缓存篇(3)- Redis的配置

我们说Redis是一个强大的Key-Value存储系统,在前面我们已遇到了两个问题: 1.redis server 启动后,独占进程,能不能修改为后台服务呢? 2.redis server 服务是单线程的,而我的机器是多核的,能不能在同一台机器上开启多个实例更充分的利用 cpu 资源呢?但6379端口已经被前一个实例绑定,肯定会有冲突,那能不能修改默认端口呢? 答案是肯定的,redis 提供了灵活的配置方式,一种可以通过配置文件来配置,另一种你可以在运行时通过 config set 命令来修改配

高性能网站架构设计之缓存篇(5)- Redis 集群(上)

集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力. 上一篇我们讲到了 Redis 的主从复制技术,当实现了多节点的 master-slave 后,我们也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群. 集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或

高性能网站架构设计之缓存篇(4)- 主从复制

Redis 的主从复制配置非常容易,但我们先来了解一下它的一些特性. redis 使用异步复制.从 redis 2.8 开始,slave 也会周期性的告诉 master 现在的数据量.可能只是个机制,用途应该不大. 一个 master 可以拥有多个 slave,废话,这也是业界的标配吧. slave 可以接收来自其他 slave 的连接.意思是不是就是说 slave 在接收其他的slave的连接之后成为 master ?等下我们来验证. redis 复制在 master 这一端是非阻塞的,也就是

高性能网站架构设计之缓存篇(1)- Redis C#客户端

一.什么 Redis REmote DIctionary Server,简称 Redis,是一个类似于Memcached的Key-Value存储系统.相比Memcached,它支持更丰富的数据结构,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型),并提供了数据持久化机制,在某些场景下,你完全可以把它当做非关系型数据库来使用.它是一个高性能的存储系统,能支持超过 100K+ 每秒的读写频率.同时还支持消息的发布/订阅

高性能网站架构设计之缓存篇(1)- Redis的安装与使用

今天有幸被召回母校给即将毕业的学弟学妹们讲我这两年的工作史,看了下母校没啥特别的变化,就是寝室都安了空调,学妹们都非常漂亮而已..好了不扯蛋了,说下今天的主题吧.这些天我在深度定制语法高亮功能的同时发现了博客园提供的一些有意思的函数,甚至有几个博客园都没用到,我也不知道怎么才能触发那些功能..打开这个js就可以看到很多好用的东西了,虽然写的不怎么样,但是至少有这些功能. ps: 推荐安装一个代码格式化的插件,否则一坨看着蛋疼.比如第一个就是 log,方便调试. http://www.qidian

Java-高性能服务器架构设计企业必备技能之Redis集群详解

http://v.youku.com/v_show/id_XMjc3NzM3Mzk2OA==.html?f=28844487&spm=a2hzp.8244740.userfeed.5!7~5~5~5!3~5~A

大规模高性能网站架构设计思路整理

近期关注了一些主流高并发大型网站如:大众点评.携程.去哪儿等 整理实现思路如下: 一.第一步 1.js .CSS.图片 优化压缩 2.站点动静分离,将动态网站单独部署.静态网站单独部署 3.数据库读写分离,比如:高频率读写的表分离 4.数据库优化,分表.分库.索引等 二.负载均衡 1.软件负载均衡,如:lvs,ngnix等 2.硬件负载均衡,如:F5等 三.缓存 1.数据缓存,如:memcacahe 2.Varnish Cache 3.Squid 四: 1.CDN

【Redis篇】Redis集群安装与初始

一.前述 本文将单台节点不同端口模拟集群方式. 二.具体搭建 前提是安装好redis具体可参考http://www.cnblogs.com/LHWorldBlog/p/8463269.html 1.规划 redis集群 3.x版本物理节点1个指定3个主节点端口为7000.7001.7002对应的3个从节点端口为7003.7004.7005 2.创建配置 mkdir cluster-testcd cluster-testmkdir 7000 7001 7002 7003 7004 7005在700

高性能网站架构缓存——redis集群

相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的实际应用中,使用redis肯定不会使用单机版,不光是redis不能使用单机版,其他的也不会使用,所以今天我们来说一下redis cluster的安装. 1.  Redis Cluster的架构图. (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redis节点直连,不需要中间proxy