文章目录
- 1、环境准备
- 2、Cluster 集群讲解
- 2.1、Cluster 介绍
- 2.2、Cluster 和哨兵模式区别
- 2.3、Cluster 如何分散存储数据
- 3、Cluster 搭建流程
- 3.1、安装 Docker
- 3.2、启动 Redis 容器
- 3.3、创建 Cluster 集群
- 4、Cluster 集群测试
- 4.1、读写操作
- 4.2、故障转移
1、环境准备
准备6台2核2G
阿里云ECS服务器(可用虚拟机代替),开放安全组端口号:22,6379
- 服务器1(主):172.21.180.99
- 服务器2(主):172.21.180.100
- 服务器3(主):172.21.180.101
- 服务器4(从):172.21.180.102
- 服务器5(从):172.21.180.103
- 服务器6(从):172.21.180.104
2、Cluster 集群讲解
2.1、Cluster 介绍
阿里云的Redis集群服务方案,采用的就是 Redis Cluster 集群模式
Cluster 模式
是 Redis 3.0 之后推出的集群方案,采用多主多从的应用集群,承载大量应用缓存数据,由于采用无中心结构,集群中每个节点保存数据和集群的状态,每个节点之间都是互相连接的,采用gossip
协议相互通信、交换节点数据信息。(企业首选Redis集群方案 👍)
Redis官方
推荐 Cluster 集群最低配置是3主3从
(其中1主可以n从),一般来说3主3从就能满足90%以上场景了,每个Redis主节点之间存储的缓存数据是不同的,主节点与对应的从节点数据是主从同步的,所以只要 Cluster 集群规模够大,不论多少GB、TB
缓存数据都能够存储。
从节点在集群中不进行工作(备用),从节点只提供故障转移功能。当主节点宕机时就会将从节点晋升为主节点,如果比较看重集群高可用性,可以1主多从代替1主1从,极大提升Cluster 集群高可用特性。
2.2、Cluster 和哨兵模式区别
哨兵模式
是基于主从模式方案的,所以每个节点存储的是全量数据,也就是说每个Redis节点中保存的是所有的数据(Cluster每个主节点存储的是分片数据)。
Cluster 模式
不仅提供了高性能读写,还能像哨兵模式
那样提供故障转移,所以Cluster模式
不需要主从模式
+ 哨兵模式
那样保证高可用特性,Cluster模式
集群本身就具备故障转移高可用机制,而且也不存在单节点内存限制这个问题,也就是说当缓存的数据量非常大时,一台Redis主服务器存放不下的情况时,主从模式 + 哨兵模式
就不能满足需求了,这时候就需要Cluster模式
,不论多大数据,哪怕TB级别,只要Cluster集群的主节点数量够多,就能够进行存储,非常牛!
所以!Cluster模式
不需要和哨兵模式
一起使用,多此一举。主从模式
和哨兵模式
适合一起使用。
2.3、Cluster 如何分散存储数据
Redis Cluster 集群采用 Hash Slot(哈希槽)
分配存储所有的缓存数据,哈希槽总共有16384
个槽位,初始化 Cluster 集群时就会将所有缓存数据平均规划给每一台Redis主节点。
当客户端向Cluster集群发送读写请求时,Cluster集群会使用CRC16
算法计算Key键,然后对16384
取模就能得到Hash槽位编号。就知道本次读写请求在哪台主节点上了,通过数据分片
和负载均衡
和故障转移
实现大规模数据存储和高性能和高可用要求场景。
为什么采用16384作为槽总数呢(了解)?
是因为在Redis集群中槽分配数据会在集群中分发,保证每个节点都能知道分配情况
而16384 = 16k,发送心跳包时使用char进行bitmap压缩后是2k(2k = 2 * 1024 * 8bit = 16k)
通过Redis Cluster集群不会超过10000个主节点,所以使用16384是足够的
3、Cluster 搭建流程
3.1、安装 Docker
安装好Docker环境,Docker环境配置参考该文章第一节:
https://blog.csdn.net/weixin_46594796/article/details/122750009
3.2、启动 Redis 容器
在6台服务器上,创建Redis宿主机配置文件:
# 创建文件夹,用于容器文件挂载
mkdir /data
mkdir /data/redis
mkdir /data/redis/data
mkdir /data/redis/conf
# 创建配置文件
cd /data/redis/conf
vim redis.conf
redis 配置内容如下:
# 不能设置密码,否则集群启动时会连接不上
# Redis服务器可以跨网络访问
bind 0.0.0.0
# 修改端口号
port 6379
# Redis后台启动(Docker 中的 Redis 需要将 daemonize 设置为 no)
daemonize no
# 开启aof持久化
appendonly yes
# 关闭保护模式
protected-mode no
# ======================集群相关=====================
# 开启集群
cluster-enabled yes
# 集群的配置 配置文件首次启动自动生成
cluster-config-file nodes.conf
# 请求超时,默认15000
cluster-node-timeout 15000
# 集群节点映射端口
cluster-announce-port 6379
# 集群节点总线端口,节点之间互相通信,常规端口+1万,用port + 10000
cluster-announce-bus-port 16379
在6台服务器上,设置Redis配置文件权限:
chmod 754 /data/redis/conf/redis.conf
在6台服务器上,启动创建Redis容器:
# 下拉镜像、启动容器
docker run -p 6379:6379 -p 16379:16379 --name redis \
-v /data/redis/data:/data \
-v /data/redis/conf:/usr/local/etc/redis \
-e TZ="Asia/Shanghai" \
-d --restart=always \
redis:6.0.2 redis-server /usr/local/etc/redis/redis.conf
3.3、创建 Cluster 集群
通过下述命令,访问任意进入一台Redis容器:
docker exec -it redis /bin/bash
然后在容器内部,执行下述命令,创建Redis集群:
# 主节点:172.21.180.99 | 172.21.180.100 | 172.21.180.101
# 从节点:172.21.180.102 | 172.21.180.103 | 172.21.180.104
# 1主1从:--cluster-replicas 1
redis-cli --cluster create 172.21.180.99:6379 172.21.180.100:6379 172.21.180.101:6379 172.21.180.102:6379 172.21.180.103:6379 172.21.180.104:6379 --cluster-replicas 1
集群构建成功!
输入下述命令,查看集群节点信息:
# 查询 Redis Cluster 集群信息
redis-cli cluster nodes
172.21.180.99 :0~5460槽,从节点为 172.21.180.103
172.21.180.100 :5461~10922槽,从节点为 172.21.180.104
172.21.180.101 :10923~16383槽,从节点为 172.21.180.102
4、Cluster 集群测试
4.1、读写操作
随意进入一个节点的Redis容器内部,连接到 redis:
# 进入容器
docker exec -it redis bash
# 连接 redis(一定要 -c,否则无法重定向)
redis-cli -c
# 存储数据
set a b
写入数据计算的哈希槽为 15495,在172.21.180.101节点上:
执行读命令:
get a
读取数据计算的哈希槽为 15495,在172.21.180.101节点上:
4.2、故障转移
当主服务器挂掉后,会发生什么现象呢?那我在这里通过命令停止 172.21.180.99 的Redis容器:
# 停止容器
docker stop 容器id
此时查看从节点日志 172.21.180.103 :
# 查看日志
docker logs -f 容器id
通过日志发现,无法连接到 172.21.180.99 主节点,经过选举自己变成主节点:
最后 172.21.180.103 变成了主节点:
并可以将数据添加到这个新晋升的主节点中:
如果这对主从节点都宕机了,那整个集群也无法提供服务了!
所以如果服务资源足够的情况下,尽可能为一个主建立多个从,否则主从都挂掉了,整个集群都不可用了!