【Redis原理探索】帮你完全搞定Cluster(集群)实践篇

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis原理探索】帮你完全搞定Cluster(集群)实践篇

集群的搭建


Redis的下载、安装、启动(单实例)


  1. 下载redis压缩包,然后解压压缩文件我们统一将Redis下载在/opt目录下
  2. 进入到解压缩后的redis文件目录(此时可以看到Makefile文件),编译redis源文件


执行命令如下

$ cd /opt
$ wget http://download.redis.io/releases/redis-4.0.9.tar.gz
$ tar zxvf redis-4.0.9.tar.gz
$ cd redis-4.0.9
$ make
$ make install
复制代码



  1. 把编译好的redis源文件安装到/usr/local/redis目录下,如果/local目录下没有redis目录,会自动新建redis目录;


  1. 然后修改该$ ./src/redis-server redis.conf文件->daemonize:no 改为daemonize:yes;
  2. 进入/usr/local/redis/bin目录,直接./redis-server启动redis(此时为前端启动redis);


  1. 注意,由于Redis的保护模式,只绑定了本机的127.0.0.1,从其他机器是不能访问的。所以我们需要添加本机的ip
192.168.xxx.xxx。
复制代码



  1. 在/bin目录下通过./redis-server redis.conf启动redis(此时为后台启动)
$ cd /opt/redis-4.0.9
$ ./src/redis-server .redis.conf
复制代码




集群的规划


根据官方推荐,集群部署至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式



配置文件


咱们准备 6 个配置文件 ,端口 7001,7002,7003,7004,7005,7006


并在redis-cluster目录下创建6个节点的配置文件。分别为:

redis-7000.conf
redis-7001.conf
redis-7002.conf
redis-7003.conf
redis-7004.conf
redis-7005.conf
复制代码



后面的7000,7001等是redis启动的端口号。接下来编辑文件的内容:

#该集群阶段的端口
port 7000
#为每一个集群节点指定一个pid_file
pidfile /var/run/redis_7000.pid
#在bind指令后添加本机的ip
bind 127.0.0.1 149.28.37.147
#找到Cluster配置的代码段,使得Redis支持集群
cluster-enabled yes
#每一个集群节点都有一个配置文件,这个文件是不能手动编辑的。确保每一个集群节点的配置文件不通
cluster-config-file nodes-7000.conf
#集群节点的超时时间,单位:ms,超时后集群会认为该节点失败
cluster-node-timeout 5000
#最后将appendonly改成yes
appendonly yes
复制代码



启动 redis 节点


挨个启动节点


看以下启动情况

首先我们创建Redis的配置文件目录,如下:

$ cd /opt
$ mkdir redis-cluster
复制代码



这样一个节点的配置就完成,其他的5个节点也做同样的配置。并将6个节点的Redis实例启动:

$ nohup /opt/redis-4.0.9/src/redis-server /opt/redis-cluster/redis-7000.conf &
$ nohup /opt/redis-4.0.9/src/redis-server /opt/redis-cluster/redis-7001.conf &
$ nohup /opt/redis-4.0.9/src/redis-server /opt/redis-cluster/redis-7002.conf &
$ nohup /opt/redis-4.0.9/src/redis-server /opt/redis-cluster/redis-7003.conf &
$ nohup /opt/redis-4.0.9/src/redis-server /opt/redis-cluster/redis-7004.conf &
$ nohup /opt/redis-4.0.9/src/redis-server /opt/redis-cluster/redis-7005.conf &
复制代码



使用这6个节点创建集群:

$ /opt/redis-4.0.9/src/redis-trib.rb create --replicas 1 149.28.37.147:7000 149.28.37.147:7001 149.28.37.147:7002 149.28.37.147:7003 149.28.37.147:7004 149.28.37.147:7005
复制代码



$ redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluste r-replicas 1
复制代码



--replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

执行命令后会显示:

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
>>> Using 3 masters:
>>> 149.28.37.147:7000
>>> 149.28.37.147:7001
>>> 149.28.37.147:7002
---------------------------------------------
# 执行成功结果如下
# 我们可以看到 7001,7002,7003 成为了 master 节点,
# 分别占用了 slot [0-5460],[5461-10922],[10923-16383]
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
--------------------------------------------
>>> Adding replica 149.28.37.147:7004 to 149.28.37.147:7000
>>> Adding replica 149.28.37.147:7005 to 149.28.37.147:7001
>>> Adding replica 149.28.37.147:7003 to 149.28.37.147:7002
>>> Trying to optimize slaves allocation for anti-affinity
>>> [WARNING] Some slaves are in the same host as their master
>>> M: 65625091304b0fa2dd75a00f62b6aceac1701094 149.28.37.147:7000
>>> slots:0-5460 (5461 slots) master
>>> M: 4da569bf8402e4f75ab6e0fe7076919c22e3f900 149.28.37.147:7001
>>> slots:5461-10922 (5462 slots) master
>>> M: b977680e24f23f8fec96876d9014803ca752e2e2 149.28.37.147:7002
>>> slots:10923-16383 (5461 slots) master
>>> S: 7183e47a64bca23157140229352455d1a1407dc2 149.28.37.147:7003
>>> replicates b977680e24f23f8fec96876d9014803ca752e2e2
>>> S: b2f916a643fefef1d43dbd1ef5d22f72c0ee43d6 149.28.37.147:7004
>>> replicates 65625091304b0fa2dd75a00f62b6aceac1701094
>>> S: e362d9aae5fe3e9c343d266a5ab952272e0e37b0 149.28.37.147:7005
>>> replicates 4da569bf8402e4f75ab6e0fe7076919c22e3f900
>>> 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 149.28.37.147:7000)
>>> M: 65625091304b0fa2dd75a00f62b6aceac1701094 149.28.37.147:7000
>>> slots:0-5460 (5461 slots) master
>>> 1 additional replica(s)
>>> M: b977680e24f23f8fec96876d9014803ca752e2e2 149.28.37.147:7002
>>> slots:10923-16383 (5461 slots) master
>>> 1 additional replica(s)
>>> S: e362d9aae5fe3e9c343d266a5ab952272e0e37b0 149.28.37.147:7005
>>> slots: (0 slots) slave
>>> replicates 4da569bf8402e4f75ab6e0fe7076919c22e3f900
>>> S: b2f916a643fefef1d43dbd1ef5d22f72c0ee43d6 149.28.37.147:7004
>>> slots: (0 slots) slave
>>> replicates 65625091304b0fa2dd75a00f62b6aceac1701094
>>> M: 4da569bf8402e4f75ab6e0fe7076919c22e3f900 149.28.37.147:7001
>>> slots:5461-10922 (5462 slots) master
>>> 1 additional replica(s)
>>> S: 7183e47a64bca23157140229352455d1a1407dc2 149.28.37.147:7003
>>> slots: (0 slots) slave
>>> replicates b977680e24f23f8fec96876d9014803ca752e2e2
>>> [OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
>>> [OK] All 16384 slots covered.
>>> 集群搭建完毕。我们可以使用Spring-Boot非常方便的去访问Redis集群了。
复制代码




数据验证


注意 集群模式下要带参数 -c,表示集群,否则不能正常存取数据!!!

[root@localhost redis-5.0.5]# redis-cli -p 7100 -c
复制代码




设置 k1 v1

127.0.0.1:7001> set k1 v1
-> Redirected to slot [12706] located at 127.0.0.1:7003
OK
复制代码



这可以看到集群的特点:把数据存到计算得出的 slot,这里还自动跳到了7003

127.0.0.1:7003> get k1
"v1"
复制代码



我们还回到 7001 获取 k1 试试

[root@localhost redis-5.0.5]# redis-cli -p 7001 -c
127.0.0.1:7001> get k1
-> Redirected to slot [12706] located at 127.0.0.1:7003
"v1"
复制代码



我们可以看到重定向的过程

127.0.0.1:7003>




相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
53 0
|
13天前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
81 22
|
19天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
51 9
|
21天前
|
存储 NoSQL 定位技术
Redis geo原理
Redis的GEO功能基于Earth Mapper(http://earth-api.org/)库,它允许存储地理位置信息并执行一些基于该信息的操作。
25 3
|
2月前
|
缓存 NoSQL Linux
redis的原理(三)
redis的原理(三)
redis的原理(三)
|
1月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
36 2
|
1月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
56 1
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
185 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
2月前
|
存储 缓存 NoSQL
redis的原理(四)
redis的原理(四)
|
2月前
|
存储 缓存 NoSQL
redis的原理(二)
redis的原理(二)