redis哨兵模式下主从切换后,php实现自动切换
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实现自动切换的更多相关文章
- Redis 哨兵模式实现主从故障互切换
200 ? "200px" : this.width)!important;} --> 介绍 Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 S ...
- redis哨兵模式实现主从故障切换
环境设定base2 172.25.78.12 masterbase3 172.25.78.13 slavebase4 172.25.78.14 slave1.配置一主二从环境在base2上[root@ ...
- Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)
Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...
- [转]Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)
Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...
- Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步
Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步,一定要绑定内网IP,而对于跨机房的问题,可以使用iptables进行nat转发来解决.
- Redis 哨兵模式(Sentinel)
上一篇我们介绍了 redis 主从节点之间的数据同步复制技术,通过一次全量复制和不间断的命令传播,可以达到主从节点数据同步备份的效果,一旦主节点宕机,我们可以选择一个工作正常的 slave 成为新的主 ...
- Redis 哨兵模式
主从切换技术的方法是:当主服务器宕机了,需要手动将一台从服务器切换为主服务器,这就需要人工干预,这可能会造成一段时间的服务不可用. 一.哨兵模式的概述: 哨兵是一个独立的进程,作为一个进程,他会独立地 ...
- [Redis] Redis哨兵模式部署 - zz胖的博客
1. 部署Redis集群 redis的安装及配置参考[redis部署] 本文以创建一主二从的集群为例. 1.1 部署与配置 先创建sentinel目录,在该目录下创建8000,8001,8002三个以 ...
- Redis哨兵模式+缓存穿透、击穿和雪崩
一.哨兵模式概述(自动选主机的方式)主从切换技术:当主机宕机后,需要手动把一台从(slave)服务器切换为主服务器,这就需要人工干预,费时费力,还回造成一段时间内服务不可用,所以推荐哨兵架构(Sent ...
- Redis哨兵模式的配置
绪论 现有三台设备,192.168.137.11.192.168.137.12和192.168.137.13,要求在三台设备上实现redis哨兵模式,其中192.168.137.11为master,其 ...
随机推荐
- kubernetes中集成istio出现拉取配置中心数据失败导致服务启动失败
荐
由于在k8s使用了grpc,所以这里我们集成istio来实现http2的自动发现以及负载均衡,但是随着节点增加,istio之前同步配置时间边长导致第一次启动时,服务启动拉取配置时istio却还没初始化 ...
- 火山引擎ByteHouse助力车企实现高性能数据分析
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 新能源汽车市场正在迎来飞速发展时期.根据 IDC 预测,中国乘用车市场中,新能源车市场规模将在2028年超过 ...
- You are currently using minified code outside of NODE_ENV === 'production'. This means that you are running a slower development build of Redux.
You are currently using minified code outside of NODE_ENV === 'production'. This means that you are ...
- java游戏服务器2023年7月22日
name 卡牌军团 放置卡牌游戏 开发语言: java mysql 通信http 账号服务器 提供验证等功能 中心服务器 跨服功能 排行榜 公会
- 将微信小程序的代码上传到github
在微信小程序端上传的时候会报错,昨天整了一晚上,没有解决.今天偶然发现了解决方案,下面分为两种情况来说. 一.未生成git仓库 将一号区域的代码粘贴到微信小程序的终端即可 二.已生成了git仓库 将二 ...
- el-form 自定义验证规则,手动触发某项验证
1. ui <el-form ref="xXXForm" :rules="XXXFormRules" > <el-form-item labe ...
- 【YashanDB知识库】自动选举配置错误引发的一系列问题
问题现象 问题出现的步骤/操作: 配置自动选举,数据库备库手动发起switch over,命令会报错 主.备库变为只读状态,数据库无法进行读写操作 shutdown immediate 停止数据库,此 ...
- Dell R920 服务器iDrac口默认账号密码和IP
Dell服务器iDrac口默认账号密码和IP 账号:root 密码:calvin IP:192.168.0.120/24
- 超轻量级、支持插件的 .NET 网络通信框架
前言 给大家推荐一个轻量级的.支持插件的综合网络通信库:TouchSocket. TouchSocket 的基础通信功能包括 TCP.UDP.SSL.RPC 和 HTTP.其中,HTTP 服务器支持 ...
- 一,初始 MyBatis-Plus
一,初始 MyBatis-Plus @ 目录 一,初始 MyBatis-Plus 1. MyBatis-Plus 的概述 2. 入门配置第一个 MyBatis-Plus 案例 3. 补充说明: 3.1 ...