Redis是现在最流行的内存数据库和缓存系统性能非常高功能也很丰富很多项目都在用但是很多人只是会用Redis的基本数据结构和命令对Redis的高级用法比如持久化主从复制哨兵集群等等了解不多。
其实Redis的高级功能很强大能实现高可用高性能的缓存架构我用Redis很多年了从单机到主从到集群都用过踩了很多坑也总结了很多经验今天就来分享一下Redis的高级用法。
一、Redis持久化
Redis是内存数据库数据都存在内存里速度很快但是一旦服务器重启或者宕机内存里的数据就会丢失所以Redis提供了持久化功能能把内存里的数据保存到磁盘上重启后能恢复数据。
Redis有两种持久化方式:RDB和AOF。
1. RDB持久化
RDB是Redis默认的持久化方式它会在指定的时间间隔内把内存里的数据生成一个快照保存到磁盘上文件后缀是.rdb。
RDB的优点:
- 文件紧凑体积小适合备份和恢复。
- 恢复速度快直接加载RDB文件就行。
- 对性能影响小fork子进程来做持久化主进程继续处理请求。
RDB的缺点:
- 可能会丢失最后一次快照之后的数据如果Redis宕机最后一次快照之后的数据就丢了。
- 如果数据量大fork子进程可能会耗时导致短暂的卡顿。
配置RDB在redis.conf里:
save 900 1 # 900秒内有1个key变化就持久化
save 300 10 # 300秒内有10个key变化就持久化
save 60 10000 # 60秒内有10000个key变化就持久化
dbfilename dump.rdb # RDB文件名
dir /var/lib/redis # 文件目录2. AOF持久化
AOF是Append Only File的缩写它会把每个写命令都记录到AOF文件里重启的时候重新执行这些命令来恢复数据。
AOF的优点:
- 数据安全性高最多丢失1秒的数据因为AOF默认每秒刷一次盘。
- 文件是文本格式可读性好方便修复和分析。
AOF的缺点:
- 文件体积大比RDB大很多。
- 恢复速度慢需要重新执行所有命令。
- 对性能影响比RDB大因为每个写命令都要记录。
配置AOF在redis.conf里:
appendonly yes # 开启AOF
appendfilename "appendonly.aof" # AOF文件名
appendfsync everysec # 每秒刷一次盘(推荐)
# appendfsync always # 每次写都刷盘(最安全,最慢)
# appendfsync no # 不主动刷盘(最快,最不安全)
auto-aof-rewrite-percentage 100 # AOF文件增长100%时重写
auto-aof-rewrite-min-size 64mb # AOF文件最小64MB时重写3. RDB和AOF怎么选
一般推荐同时开启RDB和AOF这样既能保证数据安全又能有较快的恢复速度Redis重启的时候会优先加载AOF文件来恢复数据因为AOF的数据更完整。
如果对数据安全要求不高能接受丢失一点数据可以只用RDB性能更好恢复更快。
如果对数据安全要求很高不能丢失数据就用AOF而且appendfsync设为always但是性能会差一些。
二、主从复制
单机Redis有单点故障的问题如果这台Redis挂了整个缓存就不可用了而且单机的读能力也有限所以Redis提供了主从复制功能能实现数据的多副本读写分离提高可用性和读性能。
主从复制的架构是一个主节点(master)多个从节点(slave)主节点负责写操作从节点负责读操作主节点的数据会自动同步到从节点保持数据一致。
主从复制的优点:
- 高可用:主节点挂了可以把从节点提升为主节点继续服务。
- 读写分离:写走主节点读走从节点提高读性能。
- 数据备份:从节点有完整的数据相当于备份。
配置主从复制:
主节点不需要特殊配置正常启动就行。
从节点配置在redis.conf里:
slaveof 192.168.1.100 6379 # 主节点的IP和端口
# 或者用命令:slaveof 192.168.1.100 6379
masterauth password # 如果主节点有密码这里配置密码
slave-read-only yes # 从节点只读(默认开启)配置好之后重启从节点就会自动连接主节点同步数据了。
可以用info replication命令查看主从复制的状态。
主从复制的原理:
- 从节点启动后向主节点发送SYNC命令。
- 主节点收到SYNC后开始后台保存RDB快照同时把新的写命令缓存起来。
- 主节点RDB保存完后把RDB文件发送给从节点。
- 从节点收到RDB文件后加载到内存。
- 主节点把缓存的写命令发送给从节点从节点执行这些命令保持同步。
- 之后主节点每个写命令都会异步发送给从节点保持数据一致。
主从复制的注意事项:
- 主从复制是异步的所以可能会有短暂的数据不一致。
- 从节点默认是只读的不能写避免数据不一致。
- 如果主节点挂了需要手动把一个从节点提升为主节点其他从节点指向新的主节点这个过程比较麻烦所以一般会用哨兵来自动故障转移。
三、哨兵(Sentinel)
主从复制能实现数据的多副本和读写分离但是主节点挂了需要手动故障转移很麻烦所以Redis提供了哨兵(Sentinel)功能能自动监控主从节点主节点挂了自动把一个从节点提升为主节点实现高可用。
哨兵的功能:
- 监控: 哨兵会不断检查主节点和从节点是否正常运行。
- 通知: 当被监控的节点有问题哨兵会通过API通知管理员或者其他程序。
- 自动故障转移: 当主节点挂了哨兵会自动从从节点中选一个提升为新的主节点其他从节点指向新的主节点客户端也会被通知新的主节点地址。
- 配置提供者: 哨兵能给客户端提供主节点的地址客户端连接哨兵就能获取当前的主节点地址不需要硬编码。
哨兵的架构:
一般会部署多个哨兵节点组成哨兵集群来保证哨兵本身的高可用一般至少3个哨兵节点因为哨兵需要多数派来判断主节点是否下线和选举新的主节点。
配置哨兵:
哨兵有自己的配置文件sentinel.conf:
port 26379 # 哨兵端口
sentinel monitor mymaster 192.168.1.100 6379 2
# 监控主节点,mymaster是主节点名称,2是需要2个哨兵同意才判定下线
sentinel auth-pass mymaster password # 主节点密码
sentinel down-after-milliseconds mymaster 30000 # 30秒无响应判定下线
sentinel parallel-syncs mymaster 1 # 故障转移时同时同步的从节点数
sentinel failover-timeout mymaster 180000 # 故障转移超时时间启动哨兵:
redis-sentinel /etc/redis/sentinel.conf哨兵启动后就会自动监控主从节点主节点挂了自动故障转移。
哨兵的注意事项:
- 哨兵至少3个节点保证高可用和多数派。
- 哨兵和Redis节点最好部署在不同的机器上避免一起挂。
- 客户端要支持哨兵连接通过哨兵获取主节点地址而不是硬编码。
- 哨兵只能保证高可用不能解决写性能瓶颈和数据量过大的问题这些需要集群来解决。
四、Redis集群(Cluster)
主从复制+哨兵能实现高可用和读写分离但是还是有问题:所有数据都在一个主节点上数据量受限于单机内存而且写操作都在主节点写性能也受限于单机所以Redis提供了集群(Cluster)功能能实现数据的分布式存储和水平扩展。
Redis集群是Redis3.0之后推出的分布式方案它把数据分片存储到多个主节点上每个主节点存储一部分数据实现水平扩展而且每个主节点都有从节点实现高可用。
Redis集群的特点:
- 数据分片: 集群有16384个哈希槽每个key通过CRC16算法计算属于哪个槽每个主节点负责一部分槽实现数据分布式。
- 水平扩展: 可以随时增加或者减少主节点数据会自动迁移实现水平扩展。
- 高可用: 每个主节点都有从节点主节点挂了自动把从节点提升为主节点继续服务。
- 无中心架构: 集群没有中心节点每个节点都互相通信客户端连接任意一个节点都能访问集群。
Redis集群的部署:
一般至少6个节点3个主节点3个从节点每个主节点对应一个从节点保证高可用。
配置每个节点的redis.conf:
port 7000
cluster-enabled yes # 开启集群
cluster-config-file nodes.conf # 集群配置文件
cluster-node-timeout 5000 # 节点超时时间
appendonly yes # 开启AOF启动所有节点后用redis-cli创建集群:
redis-cli --cluster create 192.168.1.100:7000 192.168.1.101:7000 192.168.1.102:7000 192.168.1.103:7000 192.168.1.104:7000 192.168.1.105:7000 --cluster-replicas 1--cluster-replicas 1表示每个主节点有1个从节点。
创建完成后集群就可以用了。
Redis集群的注意事项:
- 集群的key不能跨节点执行事务和多key操作比如MGET如果多个key在不同的节点就会报错可以用hash tag让相关的key在同一个节点。
- 集群的节点至少3个主节点才能正常工作因为需要多数派。
- 客户端要支持集群协议比如Redis Cluster的客户端才能正常使用。
- 集群的数据迁移可能会影响性能要在业务低峰期操作。
五、写在最后
Redis高级用法:持久化、主从复制与集群部署。
Redis的高级功能很强大持久化能保证数据不丢失主从复制能实现读写分离和数据备份哨兵能实现自动故障转移高可用集群能实现水平扩展和分布式存储根据项目的需求选择合适的架构能让Redis发挥最大的作用。
对于小项目单机Redis+持久化就够用了;对于中等项目主从复制+哨兵能实现高可用和读写分离;对于大项目数据量大并发高就需要Redis集群来实现水平扩展。
希望这篇分享能帮大家更好地使用Redis搭建高可用高性能的缓存架构。
最后用一句话结尾:
"Redis不只是一个简单的缓存它是一个功能强大的内存数据库系统掌握了它的高级用法能让你的系统更快更稳更高可用。"
祝大家的Redis都又快又稳!
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录