组件学习

荔枝Redis高可用方案

2019-01-23  本文已影响62人  Hz37

一、背景

二、关于目前Redis读写分离方案的一些看法

  1. 目前线上的读写分离是否有必要(单实例扛不住的原因在哪里)
  2. 从库做持久化对请求的影响(需要额外挂从库做持久化)
  3. 如果真的需要做读写分离,应该怎么做


    image.png
image.png

三、业界成熟Redis高可用架构介绍

1. sentinel

sentinel架构

sentinel 检测原理

sentinel 切换原理

主观下线:sentinel节点通过每2秒的ping心跳检测,超过down-after-milliseconds主观判断redis节点下线

客观下线:sentinel节点判断主观下线后,通过发送sentinel ismaster-down-by-addr到其他sentinel节点询问对主节点的判断,当超过quonum个数,则判断该redis主节点客观下线

故障转移过程

  1. sentinel节点判断redis节点主观下线
  2. sentinel节点判断redis节点客观下线
  3. sentinel节点发起选举,一旦节点获得max(quorum,num(sentinels)/2+1)的票数,即成为leader(选举过程非常快,基本上谁先完成客观下线,谁就是leader)
  4. 由sentinel leader节点进行redis failover

redis failover 包括提升redis从库为主库,将其他从库挂载到新主库等操作

特点

痛点

2. Redis-Cluster

redis-cluster

特点

四、适合荔枝的Redis高可用架构

从荔枝整体redis环境看,redis多为单主从,实例数据大部分在10G以内,不同业务之间实例相互独立。sentinel是最合适的高可用方式。主要解决读写分离和域名切换的问题,这里给出2种方案

1. sentinel+consul

sentinel 负责故障主从切换,consul 主要提供DNS,健康检测,服务发现,域名切换
consul简介

consul introduce
整体架构
consul+sentinel redis高可用

说明

2. sentinel(取消读写分离) + redis-cluster(个别大数据量高并发实例)

整体架构

redis+sentinel架构图.png

说明

    >>> from redis.sentinel import Sentinel
    >>> sentinel = Sentinel([('localhost', 26379)], socket_timeout=0.1)
    >>> master = sentinel.master_for('mymaster', socket_timeout=0.1)
    >>> master.set('foo', 'bar')
    >>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
    >>> slave.get('foo')
上一篇 下一篇

猜你喜欢

热点阅读