热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mac系统搭建Redis集群模式

Mac系统搭建Redis集群模式,Go语言社区,Golang程序员人脉社

前言

        首先为什么写这篇文章:笔者想玩一下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下,请看操作后的目录结构

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

三、启动6个节点的redis

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

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

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

四、关联所有节点

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

笔者这里还有一些经验

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

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

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


推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
安徒生笔下苍老了谁1_120
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有