前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mac系统搭建Redis集群模式

Mac系统搭建Redis集群模式

作者头像
胖虎
发布2019-06-26 16:27:12
1.5K1
发布2019-06-26 16:27:12
举报
文章被收录于专栏:晏霖晏霖
前言 首先为什么写这篇文章:笔者想玩一下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,因为目录结构不一样哦。然后解压这个包。

二、创建目录 + 配置文件

代码语言:javascript
复制
#进入下载的目录,因为刚才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 也行。

代码语言:javascript
复制
# 端口号,每个目录都不同
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。这步启动然后关闭,其目的是为生成一些文件。

代码语言:javascript
复制
redis-server redis.conf
ps -ef|grep redis
kill -9 进程

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

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

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

代码语言:javascript
复制
cd 7000/redis-4.0.11/ 
redis-server redis.conf

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

四、关联所有节点 进入7000节点的redis目录中执行命令,进入控制台

代码语言:javascript
复制
 redis-cli -p 7000

依次执行下面的命令

代码语言:javascript
复制
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目录中执行命令

代码语言:javascript
复制
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

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

代码语言:javascript
复制
redis-cli -p 7000 cluster nodes

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

六、变成主从复制 去7000的redis目录下执行

代码语言:javascript
复制
redis-cli -p 7000 cluster nodes

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

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

代码语言:javascript
复制
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

这时候在执行这个命令

代码语言:javascript
复制
redis-cli -p 7000 cluster nodes

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

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

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

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

代码语言:javascript
复制
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节点了,打开左侧列表把所有节点连接上看到所有节点数据同步了。当然截图与命令有些差异,是我在测试过程中走过的数据无法在重现了。

笔者这里还有一些经验 当我挂掉7000节点的时候 ,我在rdm工具上能连上的节点只有7002 和7005,但是我在终端查看除了7000已经kill掉的剩下节点都能连接上。 当我把7000节点启动的时候 主从分配又打乱了,这是redis的选举机制,具体是什么原理笔记需要深入学习一下,结论就是节点的重启等原因会改变主从的分配。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 晏霖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档