Redis 支持持久化保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,那该怎么实现呢?
一: 主从复制
Redis 提供了复制(replication)功能来自动实现多台 redis 服务器的数据同步(每天19 点新闻联播,基本从 cctv1-8,各大卫视都会播放)。我们可以通过部署多台 redis,并在配置文件中指定这几台 redis 之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从机器,这种模式叫做主从复制,即master/slave,并且 redis 默认 master 用于写,slave 用于读,向 slave 写数据会导致错误。
方式 1:修改配置文件,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器,从而构成主从复制的关系。
方式 2: ./redis-server --slaveof <master-ip><master-port>,在启动 redis 时指定当前服务成为某个主 Redis 服务的从 Slave。(不常用)
方式一操作步骤:
复制三份Redis.conf
编辑 Master 的配置文件 redis6380.conf(另外两个类似) : 在空文件加入如下内容
include /路径/redis-版本/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
配置项说明:
include :包含原来的配置文件内容。/路径/redis-版本/redis.conf 按照自己的目录设置。
daemonize:yes 后台启动应用,相当于 ./redis-server & , &的作用。
port : 自定义的端口号
pidfile : 自定义的文件,表示当前程序的 pid ,进程 id。
logfile:日志文件名
dbfilename:持久化的 rdb 文件名
启动三个Redis服务:
./redis-server ../redis6380.conf
./redis-server ../redis6381.conf
./redis-server ../redis6382.conf
查看他们的复制关系:info replication
redis3680:
redis6381 :
容灾处理
当 Master 服务出现故障,需手动将 slave 中的一个提升为 master,剩下的 slave 挂至新的
master 上(冷处理:机器挂掉了,再处理)
手动容灾:
①:slaveof no one,将一台 slave 服务器提升为 Master (提升某 slave 为 master)
②:slaveof 127.0.0.1 6381 (将 slave 挂至新的 master 上)
二: 高可用 Sentinel 哨兵
Sentinel 哨兵是 redis 官方提供的高可用方案,可以用它来监控多个 Redis 服务实例的运行情况。Redis Sentinel 是一个运行在特殊模式下的 Redis 服务器。Redis Sentinel 是在多个Sentinel 进程环境下互相协作工作的。Sentinel 系统有三个主要任务:
监控:Sentinel 不断的检查主服务和从服务器是否按照预期正常工作。
提醒:被监控的 Redis 出现问题时,Sentinel 会通知管理员或其他应用程序。
自动故障转移:监控的主 Redis 不能正常工作,Sentinel 会开始进行故障迁移操作。将一个从服务器升级新的主服务器。让其他从服务器挂到新的主服务器。同时向客户端提供新的主服务器地址。
复制三分Sentinel.conf 配置文件: 执行复制命令 cp sentinel.conf xxx.conf
1、修改 port 26380、 port 26381、 port 26382
2、修改 sentinel monitor mymaster 127.0.0.1 6380 2
格式:Sentinel monitor <name><masterIP><masterPort><Quorum 投票数>
启动 Sentinel
执行以下三条命令,将创建三个监视主服务器的Sentinel实例:
./redis-sentinel ../sentinel26380.conf
./redis-sentinel ../sentinel26381.conf
./redis-sentinel ../sentinel26382.conf
主 Redis 不能工作,让 Master 的 Redis 停止服务,执行 shutdown
先执行 info replication 确认 Master 的 Redis,再执行 shutdown(6380)
重新启动6380:./redis-server ../redis6380.conf
Sentinel日志:
总结:主从复制,解决了读请求的分担,从节点下线,会使得读请求能力有所下降,Master 下
线,写请求无法执行,Sentinel 会在 Master 下线后自动执行故障转移操作,提升一台 Slave 为 Master,并让其它Slave 成为新 Master 的 Slave。
Redis部署了主从复制和监控哨兵就万事大吉?当然不是,当redis内存不够怎么办,几台redis内存大小有差别,还容易形成木桶效应,这时候就需要考虑到Redis的分片问题,市面上提供了一些redis的分片技术,比如redis官方推荐的Redis Cluster,豌豆荚开源的codis,Twitter 开发的Twemproxy ,还有自定义客户端分片等。
分区实现方案:
- 客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。
- 代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。(Twemproxy)
- 查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。(Redis Cluster)
三:Redis安全设置
1.密码设置
访问 Redis 默认是没有密码的,这样不安全,任意用户都可以访问。可以启用使用密码才能访问 Redis。设置 Redis 的访问密码,修改 redis.conf 中这行 requirepass 密码。密码要比较复杂,不容易破解,而且需要定期修改。因为 redis 速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行 150K 次的密码尝试,需要指定非常非常强大的密码来防止暴力破解。修改 redis.conf , 使用 vim 命令。找到 requirepass 行去掉注释,requirepass 空格后就是密码。
2.绑定 ip
修改 redis.conf 文件,把# bind 127.0.0.1 前面的注释#号去掉,然后把 127.0.0.1 改成允许访问你 redis 服务器的 ip 地址,表示只允许该 ip 进行访问。多个 ip 使用空格分隔。例如 bindIP地址 ip地址。
一致性hash和hash slat:https://www.cnblogs.com/qcblog/p/8886360.html