我这里已经建好了目录,然后我们把以前编译过和修改过的 redis-server、redis.conf这两个文件分别拷贝到这三个目录里面,拷贝完之后就像这样子了:
我们打开 redis.conf 文件,为了简单起见,我们只保留下面几个配置项: daemonize yes port 9001
cluster-enabled yes
cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
注意:port 要修改成对应目录的名字,也就是每个实例要有不同的端口。 下面我们分别启动这三个实例:
zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis-cluster zhaoguihuadediannao:redis-cluster zhaogh$ cd 9001
zhaoguihuadediannao:9001 zhaogh$ ./redis-server ./redis.conf zhaoguihuadediannao:9003 zhaogh$ cd ../9002
zhaoguihuadediannao:9002 zhaogh$ ./redis-server ./redis.conf zhaoguihuadediannao:9002 zhaogh$ cd ../9003
zhaoguihuadediannao:9003 zhaogh$ ./redis-server ./redis.conf zhaoguihuadediannao:9003 zhaogh$ 接下来我们来创建集群,让三个实例互相通讯:
zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb create --replicas 0 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 >>> Creating cluster
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
>>> Performing hash slots allocation on 3 nodes... Using 3 masters:
127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003
M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001 slots:0-5460 (5461 slots) master
M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002 slots:5461-10922 (5462 slots) master
M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003 slots:10923-16383 (5461 slots) master
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:9001) M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001 slots:0-5460 (5461 slots) master
M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002 slots:5461-10922 (5462 slots) master
M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003 slots:10923-16383 (5461 slots) master [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. zhaoguihuadediannao:src zhaogh$
需要注意的是执行 redis-trib.rb 命令需要 ruby 的支持,如果你没有安装可以先到 https://rubygems.org/gems/redis 下载,然后离线安装。
sudo gem install redis-3.0.7.gem --local 下面我们用 redis 自带的客户端测试一下:
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> set testkey002 testvalue002 -> Redirected to slot [401] located at 127.0.0.1:9001 OK
127.0.0.1:9001> get testkey002 \
127.0.0.1:9001> set testkey003 testvalue003 OK
127.0.0.1:9001>
可以看到,虽然我们第一次连接的是9001端口,当我们去获取 testkey001 的时候,redis cluster 自动帮我们重定向到 9003 。
当我们在 9003 设置 testkey002 时,redis cluster 又重定向到 9001 。
总的来说, redis 集群部署起来还是非常方便的,遗憾的是,目前几乎还没有 c# 的客户端能很好的支持 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 上的数据转移: