Mac系统搭建Redis集群模式

前言

        首先为什么写这篇文章:笔者想玩一下redis集群,然后百度各种博客学习,发现你跟着他们搞十有八九是因为一些小问题卡住,你做的步骤和他一样但是得到的效果却不一样,很恼火,尤其是我在mac系统下进行操作,网上资源少还不精,简直没把我气死,还有些人为了省事把人家错误的东西copy过来也发布,导致一传十十传百,找到一个正确的东西太难了。

其次就是版本差距太大,集群模式必须是3.x以上版本才可以,所以呢,百度上的东西基本都是3.x,我想说要玩就玩别人很少玩的,我非要搞个4.x版本瞧瞧,当然我没有敢搞5.x的,哈哈。

本文就是一站式解决mac 搭建redis集群模式

正文

一、下载

首先准备一个redis ,我用的是 redis-4.0.11.tar 下载地址:http://download.redis.io/releases/redis-4.0.11.tar.gz  ,如果你本地有4.x任意版本都可以的。当然不能用3.x,因为目录结构不一样哦。然后解压这个包。

二、创建目录 + 配置文件

 

#进入下载的目录,因为刚才redis就是下载到该目录了。
cd Downloads/
#创建一个目录
mkdir redisCluter
#进入这个目录
cd redisCluter/
#创建6个节点目录
mkdir 7000 7001 7002 7003 7004 7005

把刚才解压的包更改一下配置,目录在 Downloads/redis-4.0.11/redis.conf, 右键文本形式打开也行,使用命令 :vi redis.conf 也行。

# 端口号,每个目录都不同
port 7000
# 开启集群模式
cluster-enabled yes
#节点超时实际,单位毫秒
cluster-node-timeout 5000
#集群内部配置文件(默认为 nodes-6379.conf)
cluster-config-file nodes.conf
# 启动 AOF
appendonly yes
# 默认是no,改成 yes,意思是是否要后台启动。
daemonize yes

这时候进入redis-4.0.11目录 执行命令,redis启动,然后在关闭他,我就简单粗暴了, ps -ef|grep redis  找到redis进程  ,kill -9 进程id。这步启动然后关闭,其目的是为生成一些文件。

redis-server redis.conf
ps -ef|grep redis
kill -9 进程

然后把你的redis-4.0.11文件复制,分别粘贴到7000到7005下,请看操作后的目录结构

Mac系统搭建Redis集群模式_第1张图片

 

配置的最后一步是  把 端口号,(每个目录都不同)port 7000 改成相应目录的端口号。也是刚才的步骤,进入每一个redis.conf,修改端口。

三、启动6个节点的redis

分别进入每一个端口下的redis 执行启动命令,例如

cd 7000/redis-4.0.11/ 
redis-server redis.conf

6个节点都启动成功后,自己看一下 ps -ef|grep redis

Mac系统搭建Redis集群模式_第2张图片

四、关联所有节点

进入7000节点的redis目录中执行命令,进入控制台

 redis-cli -p 7000

依次执行下面的命令 

127.0.0.1:7000> cluster meet 127.0.0.1 7001
OK
127.0.0.1:7000> cluster meet 127.0.0.1 7002
OK
127.0.0.1:7000> cluster meet 127.0.0.1 7003
OK
127.0.0.1:7000> cluster meet 127.0.0.1 7004
OK
127.0.0.1:7000> cluster meet 127.0.0.1 7005
OK

此时,所有的节点都关联起来了。

五、 分配 slot

redis Cluster 是由 16384 个 slot 组成的,那么我们需要将这些槽分散到这其中 3 个节点里(3 主 3 从)。

进入7002的redis目录中执行命令

yanlin:redis-4.0.11 yanlin$ cd ../..
yanlin:redisCluter yanlin$ cd 7002/
yanlin:7002 yanlin$ cd redis-4.0.11/
yanlin:redis-4.0.11 yanlin$ redis-cli -p 7000 cluster addslots {0..5461}
OK
yanlin:redis-4.0.11 yanlin$ redis-cli -p 7001 cluster addslots {5462..10922}
OK
yanlin:redis-4.0.11 yanlin$ redis-cli -p 7002 cluster addslots {10923..16383}
OK

此时节点已经分配好了。通过以下命令验证:

redis-cli -p 7000 cluster nodes

现在6个节点都是主节点,并且给7000 、7001 、7002分配了槽。

六、变成主从复制

去7000的redis目录下执行

redis-cli -p 7000 cluster nodes

看到我框上的那一串 16 进制字符串,其实就是后面对应进程节点的NodeId,这个是用处的,先放着。

然后分别设置7003、 7004 、7005节点的主库,执行下面命令,你们要对应自己的NodeId。

redis-cli -p 7003 cluster replicate db920bf07e383c0eaf75b1daa7c64ffeb5882515(7000的NodeID)
OK
redis-cli -p 7004 cluster replicate 2f05213d86c31af487bebf504a0b45c908d47c25(7001的NodeID)
OK
redis-cli -p 7005 cluster replicate fe2fa7dc1012c6cf493086ac651b6d8b405e8a5d(7002的NodeID)
OK

这时候在执行

redis-cli -p 7000 cluster nodes

到这里三主三从已经设置好了。


 

下面的执行命令是给大家阅读的,是我经过测试碰到的问题,你们只看不用操作。

这是我在终端操作的记录,测试数据是否在节点之间同步

经过我的测试我发现:7000节点数据只和7003 同步  7001和7004   7002和7005,这正是我前面设置的,当时我也很懵,是不是数据没有在其他5个节点同步呢? 错,其实数据已经在其他节点同步了,只是我们执行  redis-cli -c -p 7001  这个命令进入控制台的时候set的数据 是在当初我分配相应的槽下加了数据,而你去进入其他节点get key时是取当前节点下槽内的数据,而不是整个redis 的数据,所以我们需要使用图形化工具连接到我们的redis进行查看。

 

yanlin:src yanlin$ redis-cli -p 7000
127.0.0.1:7000> get foo
(error) MOVED 12182 127.0.0.1:7002
127.0.0.1:7000> set fooo barr
OK
127.0.0.1:7000> get foo
(error) MOVED 12182 127.0.0.1:7002
127.0.0.1:7000> get fooo
"barr"
127.0.0.1:7000> 
yanlin:src yanlin$ redis-cli -p 7003
127.0.0.1:7003> get fooo
(error) MOVED 3916 127.0.0.1:7000
127.0.0.1:7003> 
yanlin:src yanlin$ redis-cli -c -p 7003
127.0.0.1:7003> get fooo
-> Redirected to slot [3916] located at 127.0.0.1:7000
"barr"
127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
127.0.0.1:7002> get fooo
-> Redirected to slot [3916] located at 127.0.0.1:7000
"barr"
127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
127.0.0.1:7002> get foo
"bar"
127.0.0.1:7002> get foo
"bar"
127.0.0.1:7002> 
yanlin:src yanlin$ redis-cli -c -p 7005
127.0.0.1:7005> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
127.0.0.1:7002> get fooo
-> Redirected to slot [3916] located at 127.0.0.1:7000
"barr"
127.0.0.1:7000> kyes *
(error) ERR unknown command 'kyes'
127.0.0.1:7000> keys *
1) "fooo"
127.0.0.1:7000> 
yanlin:src yanlin$ redis-cli -c -p 7005
127.0.0.1:7005> keys *
1) "foo"
127.0.0.1:7005> 
yanlin:src yanlin$ redis-cli -c -p 7004
127.0.0.1:7004> keys *
(empty list or set)
127.0.0.1:7004> 
yanlin:src yanlin$ redis-cli -c -p 7003
127.0.0.1:7003> keys *
1) "fooo"
127.0.0.1:7003> 
yanlin:src yanlin$ redis-cli -c -p 7002
127.0.0.1:7002> keys *
1) "foo"
127.0.0.1:7002> 
yanlin:src yanlin$ redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> 
yanlin:src yanlin$ redis-cli -c -p 7000
127.0.0.1:7000> keys *
1) "fooo"
127.0.0.1:7000> 
yanlin:src yanlin$ redis-cli -c -p 7002
127.0.0.1:7002> keys *
(empty list or set)
127.0.0.1:7002> 
yanlin:src yanlin$ redis-cli -c -p 7000
127.0.0.1:7000> set abc 123
-> Redirected to slot [7638] located at 127.0.0.1:7001
OK
127.0.0.1:7001> keys *
1) "abc"
127.0.0.1:7001> keys *
1) "abc"
127.0.0.1:7001> 
yanlin:src yanlin$ redis-cli -c -p 7000
127.0.0.1:7000> keys *
1) "fooo"
127.0.0.1:7000> 
yanlin:src yanlin$ redis-cli -c -p 7001
127.0.0.1:7001> keys *
1) "abc"
127.0.0.1:7001> 
yanlin:src yanlin$ redis-cli -c -p 7002
127.0.0.1:7002> keys *
(empty list or set)
127.0.0.1:7002> keys *
(empty list or set)
127.0.0.1:7002> keys *
(empty list or set)
127.0.0.1:7002> keys *
(empty list or set)
127.0.0.1:7002> 
yanlin:src yanlin$ pwd
/Users/yanlin/Downloads/redisCluter/7000/redis-4.0.11/src
yanlin:src yanlin$ redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> 
yanlin:src yanlin$ ./redis-cli
-bash: ./redis-cli: No such file or directory
yanlin:src yanlin$ 
yanlin:src yanlin$ redis-cli -c -p 7002
127.0.0.1:7002> keys *
(empty list or set)
127.0.0.1:7002> 
yanlin:src yanlin$ info replication

yanlin:src yanlin$ redis-cli -c -p 7002
127.0.0.1:7002> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7005,state=online,offset=6488,lag=1
master_replid:5b600c9e7eb58c60a6ffb34407c265b3573071ad
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:6488
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:6488
127.0.0.1:7002> 
yanlin:src yanlin$ redis-cli -c -p 7000
127.0.0.1:7000> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7003,state=online,offset=6790,lag=1
master_replid:153be6479295e9aa30f742080dd1e2ec474d971d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:6790
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:6790
127.0.0.1:7000> 
yanlin:src yanlin$ 

我用的是rdm,mac版,有需要的加微信公众号找我要。

分析下面的图我们得知

我进入7000节点 set def ,然后马上取数据,这时候跳转到7002节点了,打开左侧列表把所有节点连接上看到所有节点数据同步了。当然截图与命令有些差异,是我在测试过程中走过的数据无法在重现了。

 

Mac系统搭建Redis集群模式_第3张图片

 

笔者这里还有一些经验

当我挂掉7000节点的时候 ,我在rdm工具上能连上的节点只有7002 和7005,但是我在终端查看除了7000已经kill掉的剩下节点都能连接上。

当我把7000节点启动的时候 主从分配又打乱了,这是redis的选举机制,结论就是节点的重启等原因会改变主从的分配。

有redis集群有经验的大佬可以加我公众号》个人介绍》然后加微信,可以分享经验。

 

Mac系统搭建Redis集群模式_第4张图片

你可能感兴趣的:(redis)