Redis高可用方案(主从复制,哨兵模式,分片分区)


   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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM