Redis集群
Redis集群背景介绍
不想看的直接跳转到 二
1.1 背景
前面我们学习了Redis高可用的两种架构模式:主从模式、哨兵模式。
-
主从复制:单点故障、读写分离(主负责写,从负责读)、负载均衡(客户端请求,并发)
-
问题:不能自动故障转移(哨兵)、主从数据是完全一致(集群)
-
-
哨兵机制:故障转移(解决主从复制的问题,主机出现故障,从切换为主)
RedisCluster是redis的分布式解决方案,当主备复制场景,无法满足主机的单点故障时,需要引入集群配置,当一个服务挂了可以快速的切换到另外一个服务,当遇到单机内存、并发等瓶颈时,可使用此方案来解决这些问题。
1.2 什么是集群
由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。
Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性、数据分片和负载均衡的技术。它允许Redis在不同节点上同时提供服务,提高整体性能和可靠性。
Redis集群主要有三种模式:主从复制模式(Master-Slave)、哨兵模式(Sentinel)、Cluster模式。
-
广义的集群:只要是多台机器,构成一个分布式系统,就可以称为一个“集群”。主从结构,哨兵模式都是“广义的集群”
-
狭义的集群:redis提供的集群模式,这个集群模式主要解决存储空间不足的问题
1.3 Redis Cluster功能
-
数据自动分片
集群中每个节点都会负责一定数量的slot,每个key会映射到一个具体的slot,通过这种方式就可能找到key具体保存在哪个节点上了。
-
提供hash tags功能
通过hash tag功能可以将多个不同key映射到同一个slot上,这样就能够提供multi-key操作,hash tag的使用的方式是在key中包含“{}”,这样只有在“{...}”中字串被用于hash计算。
-
自动失效转移和手动失效转移
-
减少硬件成本和运维成本
1.4 Cluster 实现原理
分布式数据库
就把整个数据按分区规则映射到多个数据库节点,即把数据划分到多个节点上,每个节点负责整体数据的一个子集。比如我们库有900条用户数据,有3个redis节点,将900条分成3份,分别存入到3个redis节点
900-->一个数据库
900-->多个数据库
分区规则
常见的分区规则哈希分区和顺序分区,redis集群使用了哈希分区的“虚拟槽分区”方式。
虚拟槽分区(槽:slot)
数据:key-value
数据库:key值关联
RedisCluster采用此分区,所有的键根据哈希函数映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据。
槽与节点的关系如下:
redis用虚拟槽分区使解耦数据与Redis数据库节点关系,节点自身维护槽映射关系,分布式存储。
redisCluster的缺陷
执行数据库操作时,一次操作,只能连接一个数据库
1) 键的批量操作支持有限,比如mset, mget,如果多个键映射在不同的槽,就不支持了
2) 键事务支持有限,当多个key分布在不同节点时无法使用事务,同一节点是支持事务
3) 键是数据分区的最小粒度,不能将一个很大的键值对映射到不同的节点
4) 不支持多数据库
5) 复制结构只支持单层结构,不支持树型结构。
一. 复制并修改节点主配置文件
复制的配置文件做以下修改,以下以6379为例:
1 | port 6379 | 端口号 |
---|---|---|
2 | daemonize yes | 让redis服务在后台启动 |
3 | pidfile /var/run/redis_6379.pid | Pidfile 文件中的端口号修改为本节点端口号 |
4 | cluster-enabled yes | 把#注释去掉, 开启集群 |
5 | cluster-config-file nodes_6379.conf | 把#注释去掉,集群的配置,配置文件首次启动自动生成 |
6 | cluster-node-timeout 15000 | 把#注释去掉,请求的超时时间,默认15秒,可自行设置 |
7 | appendonly yes | 开启aof日志aof 和rdb是redis同步内存中的数据到硬盘的两种方式 |
8 | Appendfilename "appendonly_6379.aof" | |
9 | protected-mode no | 关闭保护模式 |
二. 创建集群节点
1. 创建集群目录rediscluster
创建一个目录
mkdir rediscluster
为六个节点服务创建文件夹
首先进入7001文件夹添加配置文件
创建文件 将下方配置信息复制进去 注意将下方工作目录路径换位自己的
include /opt/redis/redisserver/bin/redis.conf port 7001 # 允许后台启动 daemonize yes pidfile "/var/run/redis_7001.pid" # 存放数据库的文件 rdb 模式 dbfilename "dump_7001.rdb" # 工作目录 dir "/opt/redis/redisserver/rediscluster/7001" logfile "/opt/redis/redisserver/rediscluster/7001/redis_err_7001.log" cluster-enabled yes cluster-config-file nodes-7001.conf cluster-node-timeout 15000
批量复制文件
echo ./7002 ./7003 ./7004 ./7005 ./7006 | xargs -n 1 cp -v /opt/redis/redisserver/rediscluster/7001/redis.conf
之后分别进入7002/3/4/5/6 目录进行修改
2. 修改Redis配置文件
3. 启动Redis群
改完redis的配置文件之后
执行下方命令启动redis ⚠️ 六个全部需要启动
/opt/redis/redisserver/bin/redis-server /opt/redis/redisserver/rediscluster/7001/redis.conf
4. 配置集群
首先到redis-cli所在目录
执行命令
如果没有跟我上方一样关闭掉redis的密码验证则需要在下方命令之后添加一个密码验证 -a dys(自己的密码),复制下方命令 将ip地址改为自己的
./redis-cli --cluster create --cluster-replicas 1 192.168.5.69:7001 192.168.5.69:7002 192.168.5.69:7003 192.168.5.69:7004 192.168.5.69:7005 192.168.5.69:7006
中间输入 yes 同意分配方式
5. 查看集群状态
./redis-cli --cluster check 192.168.184.34:7001
6. 关闭
命令
/opt/redis/redisserver/bin/redis-cli -p 7001 shutdown
7. 编写快速启动和关闭的脚本
找一个自己记得住的目录创建一个.sh脚本文件 名字随意起
将下方命令复制进去即可 记得启动路径如果与我不同记得进行修改
#!/bin/bash redis_count=$(ps -ef | grep redis | grep -v grep | wc -l) echo " $redis_count " if [ $redis_count -gt 0 ]; then echo "已经启动 开始关闭"/opt/redis/redisserver/bin/redis-cli -p 7001 shutdown/opt/redis/redisserver/bin/redis-cli -p 7002 shutdown/opt/redis/redisserver/bin/redis-cli -p 7003 shutdown/opt/redis/redisserver/bin/redis-cli -p 7004 shutdown/opt/redis/redisserver/bin/redis-cli -p 7005 shutdown/opt/redis/redisserver/bin/redis-cli -p 7006 shutdown elseecho "没有运行 开始启动"/opt/redis/redisserver/bin/redis-server /opt/redis/redisserver/rediscluster/7001/redis.conf/opt/redis/redisserver/bin/redis-server /opt/redis/redisserver/rediscluster/7002/redis.conf/opt/redis/redisserver/bin/redis-server /opt/redis/redisserver/rediscluster/7003/redis.conf/opt/redis/redisserver/bin/redis-server /opt/redis/redisserver/rediscluster/7004/redis.conf/opt/redis/redisserver/bin/redis-server /opt/redis/redisserver/rediscluster/7005/redis.conf/opt/redis/redisserver/bin/redis-server /opt/redis/redisserver/rediscluster/7006/redis.conf fi