redis sentinel哨兵的使用

哨兵模式是Redis集群管理的一种方式。

下面以Go语言为例介绍其使用方式。

使用举例

package main
import (
    "fmt"
    "strings"
    "github.com/garyburd/redigo/redis"

    "github.com/FZambia/sentinel"
)

var RedisConnPool *redis.Pool

func InitRedisSentinelConnPool() {
    redisAddr := "192.168.1.11:26378,192.168.1.22:26378"
    redisAddrs := strings.Split(redisAddr, ",")
    masterName := "master1" // 根据redis集群具体配置设置

    sntnl := &sentinel.Sentinel{
        Addrs:      redisAddrs,
        MasterName: masterName,
        Dial: func(addr string) (redis.Conn, error) {
            timeout := 500 * time.Millisecond
            c, err := redis.DialTimeout("tcp", addr, timeout, timeout, timeout)
            if err != nil {
                return nil, err
            }
            return c, nil
        },
    }

    RedisConnPool = &redis.Pool{
        MaxIdle:     redisConfig.MaxIdle,
        IdleTimeout: 240 * time.Second,
        Dial: func() (redis.Conn, error) {
            masterAddr, err := sntnl.MasterAddr()
            if err != nil {
                return nil, err
            }
            c, err := redis.Dial("tcp", masterAddr)
            if err != nil {
                return nil, err
            }
            return c, nil
        },
        TestOnBorrow: CheckRedisRole,
    }
}

func CheckRedisRole(c redis.Conn, t time.Time) error {
    if !sentinel.TestRole(c, "master") {
        return fmt.Errorf("Role check failed")
    } else {
        return nil
    }
}

func main(){
    rc := RedisConnPool.Get()
    defer rc.Close()

    for {
        reply, err := redis.String(rc.Do("RPOP", "/queue/cmd"))
        if err != nil {
            if err != redis.ErrNil {
                log.Println("Redis RPOP failed:", err)
            }

            fmt.Println("reply:", reply)
            break
        }// if

    }// for
}

哨兵方式client端的实现原理

client查询集群中的master节点。

client查询Master

其代码如下:

// MasterAddr returns an address of current Redis master instance.
func (s *Sentinel) MasterAddr() (string, error) {
    res, err := s.doUntilSuccess(func(c redis.Conn) (interface{}, error) {
        return queryForMaster(c, s.MasterName)
    })
    if err != nil {
        return "", err
    }
    return res.(string), nil
}

基本过程是:使用redis 服务器地址,创建连接,发送请求,返回Redis Master地址。

连接redis集群使用的是轮询方式(见doUntilSuccess函数)。

doUntilSuccess函数接收查询master的函数queryForMaster作为参数,queryForMaster的代码如下。

查询master节点

func queryForMaster(conn redis.Conn, masterName string) (string, error) {
    res, err := redis.Strings(conn.Do("SENTINEL", "get-master-addr-by-name", masterName))
    if err != nil {
        return "", err
    }
    if len(res) < 2 {
        return "", errors.New("redigo: malformed get-master-addr-by-name reply")
    }
    masterAddr := net.JoinHostPort(res[0], res[1])
    return masterAddr, nil
}

轮询方式连接服务器doUntilSuccess

基本过程如下:

从Redis服务器地址中选择一台机器,尝试连接,并执行查询操作。如果成功,则直接返回结果。并将这台机器地址活跃性权重提升。

如果第一个地址失败,把这个地址从连接池中去掉,并降低活跃性权重。接着,尝试下一个地址。

如果所有地址都失败,则返回错误。

具体代码如下:

func (s *Sentinel) doUntilSuccess(f func(redis.Conn) (interface{}, error)) (interface{}, error) {
    s.mu.RLock()
    addrs := s.Addrs
    s.mu.RUnlock()

    var lastErr error

    for _, addr := range addrs {
        conn := s.get(addr)
        reply, err := f(conn)
        conn.Close()
        if err != nil {
            lastErr = err
            s.mu.Lock()
            pool, ok := s.pools[addr]
            if ok {
                pool.Close()
                delete(s.pools, addr)
            }
            s.putToBottom(addr)
            s.mu.Unlock()
            continue
        }
        s.putToTop(addr)
        return reply, nil
    }

    return nil, NoSentinelsAvailable{lastError: lastErr}
}

参考

https://github.com/garyburd/redigo

https://github.com/FZambia/go-sentinel

https://godoc.org/github.com/FZambia/go-sentinel

https://redis.io/topics/sentinel-clients

原文地址:https://www.cnblogs.com/lanyangsh/p/9349694.html

时间: 2024-08-30 10:58:12

redis sentinel哨兵的使用的相关文章

Redis Sentinel(哨兵详解)

摘要:Redis Sentinel(哨兵):集群解决方案 官方文档(英文) http://redis.io/topics/sentinel .Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常. 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应

Redis的主从复制与Redis Sentinel哨兵机制

1    Redis的主从复制 1.1   什么是主从复制 持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,不过通过redis的主从复制机制就可以避免这种单点故障,如下图: 说明: n  主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务. n  主redis中的数据和从re

Redis sentinel 哨兵模式集群方案配置

第一个方案是创建 redis cluster,第二种方案就是用哨兵模式来进行主从替换以及故障恢复.兵模式集群方案配置 一.sentinel介绍 Sentinel作用: 1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave 3):Master-Slave切换后,master_redis.conf.slave_redis.conf和sentinel.conf的内容都会发生改变,即mast

Redis sentinel 哨兵监测

  Sentinel 进程是用于监控 redis 集群中 Master 主服务器工作的状态,在 Master 主服务器发生故障的时候,可以实现 Master 和 Slave 服务器的切换,保证系统的高可用,其已经被集成在 redis2.6+的版本中, Redis 的哨兵模式到了 2.8 版本之后就稳定了下来.一般在生产环境也建议使用 Redis 的 2.8 版本的以后版本.哨兵(Sentinel) 是一个分布式系统, 可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(

redis sentinel哨兵模式集群搭建教程

1.环境说明 我们将使用192.168.220.128.192.168.220.129.192.168.220.130三台机器搭建sentinel集群 当前我们已在192.168.220.128上按redis安装教程安装了redis,192.168.220.129和192.168.220.130两台上没有安装 2.配置并启动192.168.220.128上的sentinel 2.1修改conf/redis.conf,配置masterauth字段值 2.2修改conf/sentinel.conf,

Redis:Sentinel哨兵

redis的主从复制结构是典型的中心结构,既一个主机master多个从属slave,那么一旦中心主机宕机,从属要么就是报错要么就是提供过期数据:哨兵sentinel就是为了去中心化,开启sentinel模式后,中心主机宕机,所有的从机会重新投票选取一个从机变为主机,当前主机恢复则前主机自动变为当前主机的从机: 文档: https://redis.io/topics/sentinel-clients

Redis sentinel哨兵启动、切换过程简单分析

sentinel是Redis高可用Ha的重要组成部分,在传统Redis master/slave架构下,担任对主从复制的状态监控,并在主节点异常后自动将从节点提升为主节点对外提供服务. 下图展示了一个在哨兵sentinel集群中监控redis主从复制的一个例子,其中: 1. Sentinel集群包括三个sentinel节点sentinel1.sentinel2.seninel3,sentinel集群各节点之间互相监控哨兵运行状态. 2.Sentinel集群各节点分别与Redis主节点进行ping

redis高可用之redis sentinel(哨兵)的搭建以及应用

redis的sentinel可以监控redis一个和多个redis的主从复制架构. 主要实现的功能有: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常. 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知. 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会

Redis Sentinel机制与用法说明

本文来自:https://segmentfault.com/a/1190000002680804 概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换. 它的主要功能有以下几点 不时地监控r