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

简介: 【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]


相关文章
|
5月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
429 2
|
3月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
369 5
|
3月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
582 5
|
4月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
4月前
|
存储 运维 NoSQL
Redis集群模式
Redis集群是一种分布式存储方案,旨在解决数据存储容量不足的问题。它通过将数据分片存储在多个节点上,实现数据的横向扩展。常见的分片算法包括哈希求余、一致性哈希和哈希槽分区。其中,Redis采用哈希槽分区算法,将数据均匀分配到16384个槽位中,每个分片负责一部分槽位。当节点故障时,集群通过故障检测和主从切换机制,确保服务的高可用性。集群还支持自动的数据迁移和负载均衡,保障系统稳定运行。
|
5月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
8月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
3月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
|
4月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
238 1
Redis专题-实战篇二-商户查询缓存
|
3月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。