redis的哨兵模式,在主服务器挂掉后,会通过选举将对应的从服务器切换为主服务器,以此来达到服务的高可用性。

  在业务层面如果主从做了切换可能相对应的服务器IP地址会发生改变,这样会带来程序的的正常运行。为了不影响其业务,会考虑使用VIP去实现IP的飘逸,但是在部分情况下,虚拟机并不支持VIP,这样就无法保证业务的正常运行。索引在此情况下,通过业务本身来实现连接新的主的IP。本文主要以PHP为例,相关代码如下

<?php

class SRedis
{ /**
* 哨兵地址,支持多哨兵地址
* @var array
* eg: [ [ 'host' => '127.0.0.1' , 'port' => 26379 ] ]
*/
private $_sentinelAddr = []; private $_sentinelConn = null; private $_timeout = 10; //超时时间 private $_masterName = 'mymaster'; //主节点名称 private static $_handle = []; //存放redis连接实例 public function __construct(array $iplist, string $masterName = null)
{
$this->_sentinelAddr = $iplist;
$masterName !== null && $this->_masterName = $masterName;
$this->_getSentinelConn();
} /**
* 获取redis主节点的实例
* @return bool|Redis
* @throws Exception
*/
public function getInstansOf()
{
$masterInfo = $this->getMasterInfo();
if ($masterInfo) {
$instansof = $this->_connection($masterInfo[0], $masterInfo[1], $this->_timeout);
return $instansof;
}
return false;
} /**
* 获取主节点的ip地址
* @return array
*/
public function getMasterInfo()
{
$masterInfo = [];
if ($this->_sentinelConn != null) {
$masterInfo = $this->_sentinelConn->rawcommand("sentinel", 'get-master-addr-by-name', $this->_masterName);
}
return $masterInfo; } /**
* 设置哨兵连接句柄
*/
private function _getSentinelConn()
{
if (is_array($this->_sentinelAddr) && $this->_sentinelAddr) {
$this->_sentinelConn = $this->_RConnect($this->_sentinelAddr);
}
} /**
* 获取redis句柄(如果是多主机,保证连接的是可用的哨兵服务器)
* @param array $hosts
* @return null|Redis
*/
private function _RConnect(array $hosts)
{
$count = count($hosts);
$redis = null;
if ($count == 1) {
$this->_connection($hosts[0]['host'], $hosts[0]['port'], $this->_timeout);
} else {
$i = 0;
while ($redis == null && $i < $count) {
$redis = $this->_connection($hosts[$i]['host'], $hosts[$i]['port'], $this->_timeout);
$i++;
}
}
return $redis;
} /**
* redis 连接句柄
* @param string $host
* @param int $port
* @param int $timeout
* @return null|Redis
*/
private function _connection(string $host, int $port, int $timeout)
{
if (isset(self::$_handle[$host . ':' . $port])) {
return self::$_handle[$host . ':' . $port];
}
try {
$redis = new Redis();
$redis->connect($host, $port, $timeout);
self::$_handle[$host . ':' . $port] = $redis;
} catch (\Exception $e) {
$redis = null;
}
return $redis;
}
}
$hosts = [
[
'host' => '127.0.0.1',
'port' => 26381
],
[
'host' => '127.0.0.1',
'port' => 26380
]
];
$masterName = 'mymaster';
$sredis = new SRedis($hosts, $masterName);
$masterRedis = $sredis->getInstansOf();
if ($masterRedis) {
print_r($masterRedis->hgetall("iplist"));
} else {
echo "redis 服务器连接失败";
}

 

redis哨兵模式下主从切换后,php实现自动切换的更多相关文章

  1. Redis 哨兵模式实现主从故障互切换

    200 ? "200px" : this.width)!important;} --> 介绍 Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 S ...

  2. redis哨兵模式实现主从故障切换

    环境设定base2 172.25.78.12 masterbase3 172.25.78.13 slavebase4 172.25.78.14 slave1.配置一主二从环境在base2上[root@ ...

  3. Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...

  4. [转]Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...

  5. Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步

    Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步,一定要绑定内网IP,而对于跨机房的问题,可以使用iptables进行nat转发来解决.

  6. Redis 哨兵模式(Sentinel)

    上一篇我们介绍了 redis 主从节点之间的数据同步复制技术,通过一次全量复制和不间断的命令传播,可以达到主从节点数据同步备份的效果,一旦主节点宕机,我们可以选择一个工作正常的 slave 成为新的主 ...

  7. Redis 哨兵模式

    主从切换技术的方法是:当主服务器宕机了,需要手动将一台从服务器切换为主服务器,这就需要人工干预,这可能会造成一段时间的服务不可用. 一.哨兵模式的概述: 哨兵是一个独立的进程,作为一个进程,他会独立地 ...

  8. [Redis] Redis哨兵模式部署 - zz胖的博客

    1. 部署Redis集群 redis的安装及配置参考[redis部署] 本文以创建一主二从的集群为例. 1.1 部署与配置 先创建sentinel目录,在该目录下创建8000,8001,8002三个以 ...

  9. Redis哨兵模式+缓存穿透、击穿和雪崩

    一.哨兵模式概述(自动选主机的方式)主从切换技术:当主机宕机后,需要手动把一台从(slave)服务器切换为主服务器,这就需要人工干预,费时费力,还回造成一段时间内服务不可用,所以推荐哨兵架构(Sent ...

  10. Redis哨兵模式的配置

    绪论 现有三台设备,192.168.137.11.192.168.137.12和192.168.137.13,要求在三台设备上实现redis哨兵模式,其中192.168.137.11为master,其 ...

随机推荐

  1. LemurBrowser狐猴浏览器:支持插件扩展、内置免费AI工具的移动端浏览器

    如何选择一款合适的浏览器? 在这个数字化时代,浏览器作为互联网的入口.然而,选择一款合适的浏览器却并不容易. 注释:狐猴浏览器是浏览器新标签页插件Wetab提供的支持在移动端安装插件,内置免费AI工具 ...

  2. MAC地址格式详解

    以太网编址 在数据链路层,数据帧通常依赖于MAC地址来进行数据交换,它如同公网IP地址一样要求具有全球唯一性,这样才可以识别每一台主机.那么MAC地址如何做到这点?它的格式又是什么? MAC地址,英文 ...

  3. Apache HTTP Server 使用

    安装 macOS: brew install apache2 Ubuntu: sudo apt install apache2 使用 配置文件路径: macOS: /opt/homebrew/etc/ ...

  4. Ubuntu 安装 Docker Engine

    Docker Engine (也称作 Docker CE) 是 Docker 官方的社区版包,它不包含在 Ubuntu 默认的存储库中.因此,你无法直接使用 apt install docker-ce ...

  5. 【Docker】之重启容器相关命令

    我想每次打开电脑,只要自动运行docker的时候,马上把设置指定的容器也自动运行起来. 首先查看一下容器启动情况: # 查看docker运行命令 docker ps -a --restart参数有3个 ...

  6. Docker网络下-自定义网络实战

    通过前面两篇的学习,我们对docker网络及四大网络类型都了解了.本文,咱们就来学习docker的自定义网络.我们为什么需要自定义网络呢?是为了让各个主机分门别类,井井有条.方便关联,使得网络之间可以 ...

  7. RGB、HSV和HSL颜色空间

    这个文章写的很清楚了 https://zhuanlan.zhihu.com/p/67930839

  8. Angular Material 18+ 高级教程 – Get Started

    前言 本编是 Angular Material 教程的开篇,我先介绍一下这个教程. 首先,Angular Material 教程不会像 Angular 教程那么注重原理,也很少会逛源码. 所以,如果你 ...

  9. CSS – Reset CSS / Base CSS

    前言 许多 element tag 都有自带的 style. 比如 h1 默认 font-size 是 2 em anchor 默认颜色是 blue 大部分默认 style 并不会是开发人员期望的效果 ...

  10. MyBatis——使用Mapper代理开发

    使用 Mapper 代理开发方式完成入门案例   1.定义与SQL映射文件同名的Mapper接口,并将 Mapper 接口和SQL映射文件放置在同一目录下       (企业开发中,通常是将配置文件统 ...