Redis 7 + ACL 单节点、主从、哨兵、集群构建方法
摘要
- Redis 7 + ACL 单节点、主从、哨兵、集群构建方法
- 本文基于
redis-7.4.7 - 传统的非ACL版本,可以参考 Redis单节点、主从、哨兵、集群构建方法
- Redis官网:https://redis.io/
redis安装
1 | # 下载到指定目录 |
单节点
-
redis-6379.conf 的主要配置
1 | # 端口,默认 6379 |
-
Redis 7 支持的淘汰策略
| 策略 | 是否只淘汰带 TTL 的 key | 淘汰规则 | 说明 |
|---|---|---|---|
| noeviction | ❌ 不淘汰 | 不删任何 key | 内存满了直接返回错误(默认) |
| allkeys-lru | ❌ 所有 key | 最近最久未使用 | ✅ 最常用 |
| allkeys-lfu | ❌ 所有 key | 访问频率最少 | ✅ 热点场景最好 |
| allkeys-random | ❌ 所有 key | 随机删除 | ❌ 很少用 |
| volatile-lru | ✅ 只淘汰有 TTL 的 | 最近最久未使用 | 你之前用的 |
| volatile-lfu | ✅ 只淘汰有 TTL 的 | 访问频率最少 | 较少使用 |
| volatile-random | ✅ 只淘汰有 TTL 的 | 随机删除 | 很少用 |
| volatile-ttl | ✅ 只淘汰有 TTL 的 | TTL 最小(马上过期的) | 特殊场景用 |
-
users.acl 文件: 该文件不支持添加注释,所以使用时需要去掉如下注释行,关于ACL的详细说明,可以参考 Redis 7 + ACL 简介
1 | # 关闭默认用户,禁止匿名访问 |
-
redis 服务启动与关闭
1 | # 启动服务 |
| 场景 | 推荐命令 |
|---|---|
| 正常下线(生产) | shutdown nosave |
| 已开 AOF | shutdown nosave |
| 数据很大 | shutdown nosave |
| 单机调试 | shutdown |
| 确定要生成快照 | shutdown save |
| 强制杀死(redis卡死) | kill -9(极端情况) |
单节点优点
-
单机部署简单方便
单节点缺点
-
不保证数据的可靠性,不适用于数据可靠性要求高的场景
-
单点故障导致无法提供服务,或者硬盘损坏导致数据丢失
-
redis单节点最大qps为10w(取决于单核cpu的处理能力),超过这个qps就需要做前端限流
主从
-
规划
1 | master 10.250.0.235 |
-
主从配置时,主节点不需要做任何修改
-
从节点配置文件增加同步主节点信息,其余配置与主节点相同
1 | # 指定主节点,从节点会从主节点同步数据,这里10.250.0.235 6379是主节点的ip和端口号 |
-
此时启动从节点
redis-server redis-6379.conf,会自动从主节点同步数据,同步前如果从节点已经有数据,则会先清除原有数据再进行同步 -
主节点接收到从节点的同步请求后,会通过bgsave将内存数据dump到rdb文件中并传递给从节点
-
主节点生成rdb文件并传递给从节点期间会继续处理客户端的请求,并将这部分数据缓存到内存中,待从节点接收到主节点发过来的rdb文件并完成内存加载后,主节点会将这部分缓存在内存中的数据发送给从节点
-
从节点相当于主节点的备份,主节点挂了,从节点不能自动切换为主节点,如果需要自动切换,可以使用哨兵或者集群部署方式
-
此时登录master的redis并执行
info replication命令
1 | # Replication |
-
此时登录从节点的redis并执行
info replication命令
1 | # Replication |
-
主从数据同步是否完成判断规则,在从节点上执行命令
info replication
| 字段 | 正常值 | 说明 |
|---|---|---|
role |
slave | 表示当前是从节点 |
master_link_status |
up | 表示已经连上主库 |
master_sync_in_progress |
0 | 同步不在进行中 = 已完成 |
slave_read_repl_offset ≈ master_repl_offset |
接近 | 说明数据已追上 |
-
参照上面的配置,再添加一个从节点后,在主节点执行命令
info replication
1 | # Replication |
主从优点
-
对请求进行读写分离,提高处理效率
-
可以提供多个副本,提高数据安全性
主从缺点
-
不具备自动容错和恢复功能,主节点故障,集群则无法进行工作,可用性比较低,从节点升主节点需要人工手动干预
哨兵
-
创建三个哨兵,为了方便就在上面主从配置的3台服务器上启动哨兵
-
规划
1 | master 10.250.0.235 |
-
分别编辑各自的
sentinel.conf
1 | # 端口号 |
-
分别启动三个哨兵节点
redis-sentinel sentinel.conf,此时登录哨兵节点redis-cli -p 26379,并执行info Sentinel命令,查看其是否正确识别了主从
1 | # Sentinel |
-
此时查看
sentinel.conf可以在文件最后看到从节点信息和其它的哨兵节点信息(但实测无法感知其它哨兵节点),类似于
1 | # Generated by CONFIG REWRITE |
-
此时关闭master节点(10.250.0.235:6379),然后登录哨兵节点查看
info Sentinel,就会发现master节点变成了从节点其中的一个了 -
此时再次开启原master节点,会发现其变成了从节点,相应的配置文件(redis-6379.conf)也发生了变更
1 | # Generated by CONFIG REWRITE |
-
这里有一点需要注意,就是master节点重启前也需要配置如下认证信息,因为master在哨兵模式下发生故障后重新启动会变成slave
1 | # 如果主节点开启了ACL认证,则从节点需要设置主节点的认证信息,这里设置为管理员帐号 |
-
顺便说一下,关闭哨兵服务的命令如下:
1 | redis-cli -p 26379 shutdown |
哨兵优点
-
主节点故障,可以自动在从节点中重新选主
哨兵缺点
-
哨兵单点故障,则集群无法完整自主选举主节点,所以需要对哨兵集群部署,增加服务器成本,但是并没有提升负载
-
从节点仅作为备份不提供对外服务,只有当master出现故障时其晋升为master后才能提供服务,所以不支持读写分离
集群
-
搭建6个redis的集群,3主3从
-
规划
1 | redis1 10.250.0.235 |
-
还是基于单节点配置文件,只是将节点配置成集群模式,redis-6379.conf文件增加如下信息
1 | # ACL认证,所有节点都要配置 |
-
分别启动6个redis服务
1 | redis-server redis-6379.conf |
-
创建集群,3主3从,注意创建集群前所有redis不能有数据,如果有需要先清空(删除dir配置的目录中的所有文件即可),然后在任意一个redis执行
1 | redis-cli --user admin --pass 123456 --cluster create --cluster-replicas 1 10.250.0.235:6379 10.250.0.58:6379 10.250.0.36:6379 10.250.0.71:6379 10.250.0.131:6379 10.250.0.63:6379 |
-
此时会列出集群内主从和槽位的分配方案,输入
yes即可
1 | Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. |
-
登录集群并查询集群配置信息
1 | # -c 表示以集群模式登录,-h 集群内任意ip |
-
查看集群信息
1 | 10.250.0.235:6379> cluster info |
-
查看节点列表
1 | 10.250.0.235:6379> cluster nodes |
-
此时查看
nodes-6379.conf也会看到和上面一样的节点信息 -
此时关闭其中一个master节点,比如
10.250.0.36,则其对应的slave节点10.250.0.71会切换为新的master节点,此时10.250.0.36的状态最终变为fail
1 | 10.250.0.235:6379> cluster nodes |
-
再次启动
10.250.0.36,其会变成10.250.0.71的slave节点
1 | 10.250.0.235:6379> cluster nodes |
-
redis集群会将2的14次幂(16384)的slot平均分配到所有master上,然后对key进行hash后计算应该存储到那个slot
1 | HASH_SLOT=CRC16(key) mod 16384 |
-
关闭集群,6个redis分别关闭
1 | redis-cli -c -h 10.250.0.235 -p 6379 --user admin --pass 123456 shutdown |
-
重启集群,6个redis分别启动即可
1 | redis-server redis-6379.conf |
-
mset/mget要求key都落在同一个slot上,每个key都加上前缀
{prefix}
1 | 10.250.0.235:6379> mset name1 lisi name2 wangwu |
-
集群推举新的master时要求至少一半的master同意,所以一个集群至少需要3个master,官方推荐master节点数为奇数,比如3个和4个master节点,都至多允许一个master节点挂掉时进行选主,但是3个master可以节省资源
-
集群通过
10000+port这个端口号进行集群间通信,所以除了要开放prot这个端口,还要开放10000+port这个端口 -
有关redis集群及其水平扩展的进一步说明,可以参看Redis集群
集群优点
-
无中心架构,集群内部自行维护数据的分片和主从的切换
-
数据分片存储,提供很高的访问效率
-
高可用性,可实现部分节点不可用时,集群仍可用
-
高扩展性,可以横向扩展1000个节点后依旧保证访问效率,扩容缩容都支持
集群缺点
-
数据通过异步复制,不保证数据的强一致性
-
不支持多数据库空间,单机下的redis可以支持到16个数据库,集群模式下只能使用1个数据库空间,即db 0
-
不支持跨slot操作,如使用mset、mget目前只支持具有相同slot值的Key执行批量操作
-
Key作为数据分区的最小粒度,不能将一个很大的键值对象如hash、list等映射到不同的节点
-
Key事务操作支持有限,只支持多key在同一节点上的事务操作,当多个Key分布于不同的节点上时无法使用事务功能
-
不建议使用pipeline和multi-keys操作