当前位置: 首页 > 后端技术 > PHP

redis-sentinel模式PHP使用总结

时间:2023-03-29 21:26:05 PHP

最近公司使用的项目想把缓存从memcache迁移到redis。运维配置的redis使用模式是sentinel(即哨兵模式),之前没用。但是,记录在这里。简单介绍一下Redis-sentinel:Redis-sentinel是Redis实例的监控管理、通知和实例故障备份服务,是Redis集群的管理工具。在一般的分布式中心节点数据库中,Redis-sentinel的作用是中心节点的工作,监控各个节点的工作情况并进行故障恢复,以提高集群的高可用性(介绍来自http:///www.searchdatabase.com...)我自己的理解是,如果有3台可用的redis服务器a、b、c,其中a为主服务器,b、c为从服务器。在sentinel模式下,如果a出现问题,可以自动将a服务器移除或者降级为从服务器,然后根据一定的策略选择b和c中的一个升级为主服务器,然后a恢复后可以作为从服务器使用,避免了某台服务器出现问题时影响整个redis服务。redis-sentinel模式无疑是对redis服务的一个很好的支持,但是开发者使用起来会有点麻烦。因为比较常用的模式是在程序中直接写一个配置文件,确定redis主从库,程序读取配置文件进行redis操作。如果主库出现问题,必须手动修改配置文件才能继续正常使用。而如果后来被发现,可能会造成不必要的损失。哨兵模式下,程序需要动态获取主从库的ip。即使某个redis服务出现问题,也不会对程序造成影响,从而避免了手动修改配置的问题。关键问题其实就是动态获取主从库的ip、端口等信息。上网查相关资料,大部分都是讲解如何配置sentinel服务的,使用php的方法不多。看了官方的redis-sentinel文档,才知道有对应的获取哨兵信息的API,不过是一些原生的命令而已。php-redis库有支持本地命令的方法,如下所示:/**向redis服务器发送任意内容。*@paramstring$command发送到服务器的必需命令。*@parammixed...$arguments发送到服务器的参数的可选可变数量。*@returnmixed*@example*

*$redis->rawCommand('SET','key','value');//bool(true)*$redis->rawCommand('GET",'key');//string(5)"value"*
*/publicfunctionrawCommand($command,$arguments){}而开发使用的大致流程如下1、根据运维给出的sentinel配置信息连接sentinel,获取需要的信息(注意:这里是sentinel服务的配置信息,与redis不一致).会有多个配置信息(IP,PORT),每个sentinel返回的redis主从配置信息是一致的,所以在执行操作时可以使用其中一个服务返回的信息。//初始化redis对象$redis=newRedis();//连接sentinel服务主机到ip,端口到端口$redis->connect($host,$port);//一些可能用到的命令,其他的可以去查看官方文档//获取主库列表及其状态信息$result=$redis->rawCommand('SENTINEL','masters');//根据配置的主库redis名称获取对应信息//master_name应该是运维通知确定的(也可以从上一步的信息中获取)$result=$redis->rawCommand('SENTINEL','master',$master_name);//根据获取对应的从库到配置的主库redis名称列表及其信息$result=redis->rawCommand('SENTINEL','slaves',$master_name);//获取指定名称的redis主库地址$result=$redis->rawCommand('SENTINEL','get-master-addr-by-name',$master_name)//这个方法可以解析上面se返回的信息将ntinel转换为数组functionparseArrayResult(array$data){$result=array();$计数=计数($数据);对于($i=0;$i<$count;){$record=$data[$i];如果(is_array($record)){$result[]=parseArrayResult($record);$i++;}else{$result[$record]=$data[$i+1];$i+=2;}}return$result;}2.通过以上操作可以获取到redis主从库的信息,并且redis密码是固定的,自己写就可以了。之后就可以按照单例模式使用redis了,运行时注意主从分离。以上只是一个大概的使用流程,可能会根据不同的情况进行调整。以上只是PHP程序如何使用这种模式的简单说明。具体工作原理和配置请移步https://segmentfault.com/a/11...https://segmentfault.com/a/11。..