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. Maven经验分享(五)Maven拷贝资源

    上一章介绍使用ant拷贝资源,这里介绍maven拷贝资源,使用maven-resources-plugin插件. <plugin> <groupId>org.apache.ma ...

  2. Camera | 1.Camera基础知识

    一口君最近在玩瑞芯微的板子,之前写了几篇基于瑞芯微的文章,大家可以学习一下. <瑞芯微rk356x板子快速上手> <Linux驱动|rtc-hym8563移植笔记> <L ...

  3. .NET+WPF 桌面快速启动工具 GeekDesk

    前言 大家在平时工作中,是不是经常为了找某个文件或者应用而在电脑桌面上来回翻找?桌面图标乱七八糟,每次找东西都像在大海捞针一样. 今天给大家介绍一个开源项目 GeekDesk,它能够让桌面焕然一新,工 ...

  4. Java微信授权登录小程序接口

    1.微信授权登录小程序的流程是什么 微信授权登录小程序的流程是一个涉及前端和后端交互的过程,主要目的是让用户能够使用微信账号快速登录小程序,避免重复输入用户名和密码.以下是该流程的详细步骤: 1.1前 ...

  5. 2022 CCPC 广州站 Alice and Her Lost Cat

    1 #include <bits/stdc++.h> 2 using namespace std; 3 #define rg register 4 #define ll long long ...

  6. manim边学边做--直线类

    直线是最常用的二维结构,也是构造其他二维图形的基础.manim中针对线性结构提供了很多模块,本篇主要介绍常用的几个直线类的模块. Line:通用直线 DashedLine:各种类型的虚线 Tangen ...

  7. Python的OpenCV转换图像大小

    在Python中,使用OpenCV库来转换图像大小是一个常见的操作,它可以帮助你调整图像到特定的尺寸,以适应不同的应用场景,比如图像预处理.模型输入等.下面是一个详细的代码示例,展示了如何使用Open ...

  8. SpringBoot 引入第三方 jar

    SpringBoot 引入第三方 jar 项目结构 -BCJS |--lib |--hsm-talos-1.0.1.jar |--src |--pom.xml step1 : 配置第三方 jar 为依 ...

  9. SimCLR: 一种视觉表征对比学习的简单框架《A Simple Framework for Contrastive Learning of Visual Representations》(对比学习、数据增强算子组合,二次增强、投影头、实验细节很nice),好文章,值得反复看

    现在是2024年5月18日,好久没好好地看论文了,最近在学在写代码+各种乱七八糟的事情,感觉要和学术前沿脱轨了(虽然本身也没在轨道上,太菜了),今天把师兄推荐的一个框架的论文看看(视觉CV领域的). ...

  10. TypeScript – 冷知识

    当 generic return 遇上 parameter 报错了.原因是 querySelector 默认返回类型是抽象的 Element. 而 method 参数要求的是具体的 InputElem ...