redis 集群的三种模式
通过持久化功能,Redis 保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。
但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。
1. 主从复制
主数据库进行读写操作,当写操作导致数据变化时会自动将数据同步从数据库; 从数据库只能进行读操作
主从复制问题:当 master down,需要手动将一台 slave 使用 slaveof no one 提升为 master 要实现自动,就需要redis哨兵。
配置
主节点无需配置
从节点 在 conf 文件中开启 slaveof 或 在启动的时候使用 redis-server --port 6380 --slaveof
如果主节点故障挂掉,在从节点命令行执行 saveof NO ONE 切换主节点
实现原理步骤
- 从服务器启动的时候,会向主服务器发送 SYNC 命令
- 主服务器收到 SYNC 命令后,执行 BGSAVE 命令,在后台生成 RDB 文件,使用缓冲区记录从现在开始执行的所有的写命令。
- 当主服务器的 BGSAVE 命令执行完毕后,主服务器后将 BGSAVE 命令生成的 RDB 文件发送给从服务器,从服务器接收并载入这个 RDB 文件,将自己的数据库状态更新至主服务器执行 BGSAV E命令时的数据库状态。
- 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
- 之后,主服务器每收到1个命令就同步发送给从。当出现断开重连后,2.8之后的版本会将断线期间的命令传给从数据库。增量复制
2. 哨兵模式
因为主从复制模式当主节点挂掉之后,需要手动介入将从节点更新为主节点,难以实现自动化。
哨兵的作用就是监控 redis 主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。
配置 一主二从
- 主节点 redis-server --port 6379
- 从节点 redis-server --port 6380
- 从节点 redis-server --port 6381
- 在从节点 conf 文件中开启 slaveof , 如果主节点开启了密码认证,需在从节点设置主节点的密码 masterauth
- 在每个节点下新建 sentinel.conf 文件,文件内容如下
#当前Sentinel服务运行的端口(端口不可重复)
port 26379
#哨兵监听的主服务器(最后一位为从节点的数量)
sentinel monitor mymaster 127.0.0.1 6379 2
#1s内mymaster无响应,则认为mymaster宕机了
sentinel down-after-milliseconds mymaster 1000
#如果主节点配置了密码,需要密码认证
sentinel auth-pass mymaster 123456
#如果10秒后,mysater仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
#执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1
注:
配置哨兵监控一个系统时,只需要配置其监控主数据库即可,哨兵会自动发现所有复制该主数据库的从数据库
这样哨兵就能监控主6379和从6380、6381,一旦6379挂掉,哨兵就会在2个从中选择一个作为主,根据优先级选,如果一样就选个id小的,当6379再起来就作为从存在。
3. 集群模式
即使使用哨兵,redis 每个实例也是全量存储,每个 redis 存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。即每台 redis 存储不同的内容。
集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。
使用集群,只需要将每个数据库节点的 cluster-enable 配置打开即可。每个集群中至少需要三个主数据库才能正常运行。
修改每个实例的配置文件:
cluster-enabled yes --开启集群
cluster-config-file nodes-6382.conf --集群配置文件名,
每个实例配置的要不同,redis会根据文件名自动新建
集群的运行:
redis安装目录的src执行./redis-trib.rb create --replicas 1
127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382
127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385