【Redis核心知识 八】Redis集群之Cluster模式及集群搭建(一)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis核心知识 八】Redis集群之Cluster模式及集群搭建(一)

上一篇blog【Redis从入门到放弃系列 十四】Redis集群之哨兵模式详细介绍了哨兵模式,加上之前讲到的主从复制模式,一共聊到了两种模式,实际上哨兵模式也是基于主从复制上的一种更加高可用的模式,那么今天要聊到的cluster模式,它一定意义上也是基于主从复制模式的,只不过比主从复制模式更加强大,不仅做到了主从的读写分离包括读的负载均衡,还能进行很好的写的负载均衡

  • 高可扩展, 分散单台服务器的访问压力,实现负载均衡
  • 高可扩展,分散单台服务器的存储压力,实现可扩展性
  • 高可用, 降低单台服务器宕机带来的业务灾难

具备了以上特点的Cluster架构如下:

Cluster集群结构设计

数据写入时会依据CRC算key,计算结果再对16384个插槽取余,然后放置到指定主服务器。因为初始化机器的时候就会给每个主初始化一定数量的槽,数据放到哪个槽一定是有明确的路由地址的

如果直接访问一次命中就直接取,否则就由客户端直接去目标机器找,因为存在地址簿,所以最多两次命中:

槽是集群建立之初或集群加减机器时都会动态调整和变化的。每个机器分为若干个槽slot,加机器和减机器都可以通过动态调整槽来实现。

Cluster集群搭建

前几篇blog都在一台机器上分别用不同的端口号来进行Redis集群的搭建和使用,既然我已经通过三台虚拟机连成了一个分布式系统,我也别老在一台虚机上玩儿了,今天正式整出一个真实的Redis的cluster集群来:

盘点现有资源并规划集群

我现在有三台虚拟机,并且我要起一个三主三从的cluster的Redis集群,所以我每台虚机上还是要起两个实例,但是同一个主从的不能都放到一台机器上,按照企业级的灾备方案去考量:

服务器 主RedisIP 从RedisIP
Centos-TML1【192.168.5.101】 192.168.5.101:6379 192.168.5.101:6380
Centos-TML2【192.168.5.102】 192.168.5.102:6379 192.168.5.102:6380
Centos-TML3【192.168.5.103】 192.168.5.103:6379 192.168.5.103:6380

当然为了分散主从,我们的主从对应关系如下:

主服务器master 从服务器slave
192.168.5.101:6379 192.168.5.102:6380
192.168.5.102:6379 192.168.5.103:6380
192.168.5.103:6379 192.168.5.101:6380

调整配置并分发Redis

首先我们将各种日志和其它配置文件都干掉,更加方便的观察集群的变化:

清空日志文件

[root@192 redis-6.0.8]# cd data
[root@192 data]# ll
总用量 16
-rw-r--r-- 1 root root 116 11月  1 17:35 appendonly-6379.aof
-rw-r--r-- 1 root root 202 11月  1 17:35 dump-6379.rdb
-rw-r--r-- 1 root root 175 11月  1 16:28 dump-6380.rdb
-rw-r--r-- 1 root root 202 11月  1 17:35 dump-6381.rdb
[root@192 data]# rm -rf *
[root@192 data]# ll
总用量 0
[root@192 data]#

清空哨兵配置文件和6380、6381配置文件,仅保留6379配置文件

[root@192 redis-6.0.8]# cd config/
[root@192 config]# ll
总用量 8
-rw-r--r-- 1 root root 325 11月  1 17:35 redis-6379.conf
[root@192 config]#

调整6379配置文件增加集群的相关配置如下

port 6379
daemonize no
#logfile "redis-6379.log"
dir "/root/redis-6.0.8/data"
dbfilename "dump-6379.rdb"
rdbcompression yes
rdbchecksum yes
save 10 2
appendonly yes
appendfilename "appendonly-6379.aof"
appendfsync everysec
#重点调整内容
bind 192.168.5.101
cluster-enabled yes   //是否开启集群
cluster-config-file nodes-6379.conf   //集群日志文件输入
cluster-node-timeout 10000    //集群发现超时时间

查看配置文件如下:

[root@192 config]# cat redis-6379.conf 
port 6379
daemonize no
#logfile "redis-6379.log"
dir "/root/redis-6.0.8/data"
dbfilename "dump-6379.rdb"
rdbcompression yes
rdbchecksum yes
save 10 2
appendonly yes
appendfilename "appendonly-6379.aof"
appendfsync everysec
bind 192.168.5.101
cluster-enabled yes   
cluster-config-file nodes-6379.conf  
cluster-node-timeout 10000

6379配置文件复制一个6380的配置文件出来

[root@192 config]# sed "s/6379/6380/g"  redis-6379.conf >redis-6380.conf    
[root@192 config]# ll
总用量 8
-rw-r--r-- 1 root root 333 11月 14 12:31 redis-6379.conf
-rw-r--r-- 1 root root 333 11月 14 12:34 redis-6380.conf
[root@192 config]# cat redis-6380.conf 
port 6380
daemonize no
#logfile "redis-6380.log"
dir "/root/redis-6.0.8/data"
dbfilename "dump-6380.rdb"
rdbcompression yes
rdbchecksum yes
save 10 2
appendonly yes
appendfilename "appendonly-6380.aof"
appendfsync everysec
bind 192.168.5.101
cluster-enabled yes   
cluster-config-file nodes-6380.conf  
cluster-node-timeout 10000   
[root@192 config]#

分发192.101.5.101上的Redis分别到其它两台虚拟机上

使用AppNode的文件对传模式将Redis进行集群分发,这样其它两台服务器上也就都有了Redis了,要做的就是改配置文件的端口号。

分别修改102机器和103机器上6379和6380配置文件的端口号

102机器上的6379配置如下:

[root@192 ~]# cd redis-6.0.8/config/
[root@192 config]# cat redis-6379.conf 
port 6379
daemonize no
#logfile "redis-6379.log"
dir "/root/redis-6.0.8/data"
dbfilename "dump-6379.rdb"
rdbcompression yes
rdbchecksum yes
save 10 2
appendonly yes
appendfilename "appendonly-6379.aof"
appendfsync everysec
bind 192.168.5.102
cluster-enabled yes   
cluster-config-file nodes-6379.conf  
cluster-node-timeout 10000   
[root@192 config]#

103机器上的6379配置如下

[root@192 ~]# cd redis-6.0.8/config/
[root@192 config]# cat redis-6379.conf 
port 6379
daemonize no
#logfile "redis-6379.log"
dir "/root/redis-6.0.8/data"
dbfilename "dump-6379.rdb"
rdbcompression yes
rdbchecksum yes
save 10 2
appendonly yes
appendfilename "appendonly-6379.aof"
appendfsync everysec
bind 192.168.5.103
cluster-enabled yes   
cluster-config-file nodes-6379.conf  
cluster-node-timeout 10000   
[root@192 config]#

6380的配置文件修改方式类似,主要改bind的ip地址

启动集群并查看信息

启动集群分为以下几个步骤:杀掉所有Redis现存进程、启动集群中的服务节点、联通集群

杀掉所有Redis现存进程

启动集群之前需要杀掉所有现存Redis进程来保证实验环境准确性:

[root@192 config]# ps -ef |  grep redis-
root      67888      1  0 11:02 ?        00:00:09 redis-server *:6380
root      67901      1  0 11:02 ?        00:00:09 redis-server *:6381
root      68018      1  0 11:06 ?        00:00:13 redis-sentinel *:26379 [sentinel]
root      68243      1  0 11:13 ?        00:00:12 redis-sentinel *:26380 [sentinel]
root      68411      1  0 11:20 ?        00:00:11 redis-sentinel *:26381 [sentinel]
root      69268      1  0 12:09 ?        00:00:04 redis-server 127.0.0.1:6379
root      70700  70588  0 12:59 pts/7    00:00:00 grep --color=auto redis-
[root@192 config]# kill -s 67888
-bash: kill: 67888: 无效的信号声明
[root@192 config]# kill -s 9  67888
[root@192 config]# kill -s 9  67901
[root@192 config]# kill -s 9  68018
[root@192 config]# kill -s 9  68243
[root@192 config]# kill -s 9  68411
[root@192 config]# kill -s 9  69268
[root@192 config]# ps -ef |  grep redis-
root      70776  70588  0 13:01 pts/7    00:00:00 grep --color=auto redis-
[root@192 config]#

激活每一台的Redis指令

配置完成后我们就可以正式启动集群并查看集群的启动信息了,注意一点,在启动客户端之前一定要安装下Redis,否则会找不到指令:

[root@192 redis-6.0.8]# redis-server config/redis-6379.conf 
bash: redis-server: 未找到命令...
[root@192 redis-6.0.8]#

经过安装后即可激活Redis的指令

启动集群并查看信息

[root@192 redis-6.0.8]# make install
cd src && make install
make[1]: 进入目录“/root/redis-6.0.8/src”
Hint: It's a good idea to run 'make test' ;)
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
make[1]: 离开目录“/root/redis-6.0.8/src”
[root@192 redis-6.0.8]# redis-server config/redis-6379.conf 
20088:C 14 Nov 2020 12:52:53.265 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
20088:C 14 Nov 2020 12:52:53.265 # Redis version=6.0.8, bits=64, commit=00000000, modified=0, pid=20088, just started
20088:C 14 Nov 2020 12:52:53.265 # Configuration loaded
20088:M 14 Nov 2020 12:52:53.265 * Increased maximum number of open files to 10032 (it was originally set to 1024).
20088:M 14 Nov 2020 12:52:53.266 * No cluster configuration found, I'm 94d9e1637bd1701b146e367ffa7a69e8c24566e8
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in cluster mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 20088
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               
20088:M 14 Nov 2020 12:52:53.281 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
20088:M 14 Nov 2020 12:52:53.281 # Server initialized
20088:M 14 Nov 2020 12:52:53.281 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
20088:M 14 Nov 2020 12:52:53.281 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').
20088:M 14 Nov 2020 12:52:53.281 * Ready to accept connections

这样分别启动三台机器的主master和从slave,启动后效果如下:

三台主服务器和三台从服务器均已启动完毕。查看其中的101可以看到如下进程号:

[root@192 ~]# ps -ef |  grep redis-
root      70362  69871  0 12:45 pts/4    00:00:01 redis-server 192.168.5.101:6379 [cluster]
root      70795  70588  0 13:02 pts/7    00:00:00 redis-server 192.168.5.101:6380 [cluster]
root      70893  70830  0 13:05 pts/0    00:00:00 grep --color=auto redis-
[root@192 ~]#

安装Ruby

之前的Redis集群启用是需要Ruby的,所以我就安装了Ruby。首先通过如下wget下载Ruby2.6.5版本:

[root@192 ~]# wget https://cache.ruby-china.com/pub/ruby/ruby-2.6.5.tar.xz
--2020-11-14 13:21:45--  https://cache.ruby-china.com/pub/ruby/ruby-2.6.5.tar.xz
正在解析主机 cache.ruby-china.com (cache.ruby-china.com)... 36.248.208.250
正在连接 cache.ruby-china.com (cache.ruby-china.com)|36.248.208.250|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:11553580 (11M) [application/x-tar]
正在保存至: “ruby-2.6.5.tar.xz”
100%[=========================================================================================================================================================================================>] 11,553,580  9.29MB/s 用时 1.2s   
2020-11-14 13:21:47 (9.29 MB/s) - 已保存 “ruby-2.6.5.tar.xz” [11553580/11553580])
[root@192 ~]#

然后解压Ruby

xz -d ruby-2.6.5.tar.xz         第一次解压,得到ruby-2.6.5.tar
tar -xvf ruby-2.6.5.tar         第二次解压,得到目录ruby-2.6.5

解压结束后进入Ruby目录下编译安装Ruby

./configure --prefix=/usr/local/ruby
make
make install

添加全文的Ruby环境变量并查看安装状态

[root@192 ruby-2.6.5]# echo "PATH=$PATH:/usr/local/ruby/bin" >> /etc/bashrc
[root@192 ruby-2.6.5]# source /etc/bashrc
[root@192 ruby-2.6.5]# ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]


相关实践学习
基于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
相关文章
|
16天前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
27 5
|
4月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
157 0
|
1月前
|
消息中间件 NoSQL Redis
【赵渝强老师】Redis消息的生产者消费者模式
消息队列在Redis中可通过List数据结构实现,支持发布者订阅者和生产者消费者两种模式。生产者通过`lpush`向List添加消息,消费者通过`rpop`或`brpop`消费消息,后者支持阻塞等待。示例代码展示了如何使用Redis的生产者消费者模式。
|
2月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
73 4
|
2月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
28 2
|
2月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
71 1
|
4月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】当使用Azure Redis 集群服务时候,发生了Moved的几点分析
【Azure Redis 缓存】当使用Azure Redis 集群服务时候,发生了Moved的几点分析
|
4月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
|
4月前
|
存储 NoSQL 算法
深入理解Redis分片Cluster原理
本文深入探讨了Redis Cluster的分片原理,作为Redis官方提供的高可用性和高性能解决方案,Redis Cluster通过数据分片和横向扩展能力,有效降低单个主节点的压力。
深入理解Redis分片Cluster原理
下一篇
DataWorks