摘要:模式對(duì)服務(wù)無(wú)疑是一個(gè)很好的支持,但是在開發(fā)人員使用時(shí)會(huì)稍微麻煩一些。而在模式下需要程序動(dòng)態(tài)獲取主從庫(kù)的,即使某臺(tái)服務(wù)出現(xiàn)問題,也不會(huì)影響到程序,這樣就避免了手動(dòng)修改配置的問題。以上只是一個(gè)大體的使用過程,不同情況可能有所調(diào)整。
近期公司所用項(xiàng)目的緩存想要由memcache遷移到redis,運(yùn)維給配置的redis使用模式是sentinel(即哨兵模式的),這種模式之前沒用過,在此記錄一下。
簡(jiǎn)單介紹下Redis-sentinel:
Redis-sentinel是Redis實(shí)例的監(jiān)控管理、通知和實(shí)例失效備援服務(wù),是Redis集群的管理工具。在一般的分布式中心節(jié)點(diǎn)數(shù)據(jù)庫(kù)中,Redis-sentinel的作用是中心節(jié)點(diǎn)的工作,監(jiān)控各個(gè)其他節(jié)點(diǎn)的工作情況并且進(jìn)行故障恢復(fù),來(lái)提高集群的高可用性
(簡(jiǎn)介來(lái)自http://www.searchdatabase.com...)
我自己的理解就是,假如有a,b,c 3臺(tái)可用的redis服務(wù)器,其中a為主服務(wù)器,b,c為從服務(wù)器。
在sentinel模式下如果a出現(xiàn)問題,可以自動(dòng)將a服務(wù)器拿掉或者降級(jí)為從服務(wù)器,然后從b和c中根據(jù)一定策略選擇一臺(tái)升級(jí)為主服務(wù)器,之后a恢復(fù)后作為從服務(wù)器使用,避免了了由于某臺(tái)服務(wù)器出現(xiàn)問題時(shí)影響整個(gè)redis服務(wù)。
redis-sentinel模式對(duì)redis服務(wù)無(wú)疑是一個(gè)很好的支持,但是在開發(fā)人員使用時(shí)會(huì)稍微麻煩一些。因?yàn)榭赡芨S玫哪J骄褪侵苯釉诔绦蛑袑懞靡粋€(gè)配置文件,redis主從庫(kù)都是確定的,程序讀取配置文件進(jìn)行redis操作。假如主庫(kù)出現(xiàn)問題,必須手動(dòng)修改配置文件才能繼續(xù)正常使用。而如果發(fā)現(xiàn)的比較晚可能會(huì)造成不必要的損失。
而在sentinel模式下需要程序動(dòng)態(tài)獲取主從庫(kù)的ip,即使某臺(tái)redis服務(wù)出現(xiàn)問題,也不會(huì)影響到程序,這樣就避免了手動(dòng)修改配置的問題。而關(guān)鍵問題其實(shí)就是動(dòng)態(tài)獲取主從庫(kù)的ip,端口等信息了。
在網(wǎng)上查相關(guān)資料,大部分都是講解如何配置sentinel服務(wù),而php對(duì)應(yīng)使用方法不太多。看了官方redis-sentinel文檔后了解到獲取sentinel信息是有對(duì)應(yīng)API的,只不過是一些原生命令。
而php-redis庫(kù)是有支持原生命令的方法的,如下:
/* * Send arbitrary things to the redis server. * @param string $command Required command to send to the server. * @param mixed ...$arguments Optional variable amount of arguments to send to the server. * @return mixed * @example ** $redis->rawCommand("SET", "key", "value"); // bool(true) * $redis->rawCommand("GET", "key"); // string(5) "value" **/ public function rawCommand( $command, $arguments ) {}
而在開發(fā)使用大致過程如下
1、根據(jù)運(yùn)維給的sentinel配置信息連接sentinel,獲得需要的信息(注意:此處是sentinel服務(wù)的配置信息,和redis的并不一致)。配置信息(IP,PORT)會(huì)有多個(gè),每個(gè)sentinel返回的redis主從配置信息是一致的,所以進(jìn)行操作時(shí)使用其中一臺(tái)服務(wù)返回的信息即可。
//初始化redis對(duì)象 $redis = new Redis(); //連接sentinel服務(wù) host為ip,port為端口 $redis->connect($host, $port); //可能用到的部分命令,其他可以去官方文檔查看 //獲取主庫(kù)列表及其狀態(tài)信息 $result = $redis->rawCommand("SENTINEL", "masters"); //根據(jù)所配置的主庫(kù)redis名稱獲取對(duì)應(yīng)的信息 //master_name應(yīng)該由運(yùn)維告知(也可以由上一步的信息中獲取) $result = $redis->rawCommand("SENTINEL", "master", $master_name); //根據(jù)所配置的主庫(kù)redis名稱獲取其對(duì)應(yīng)從庫(kù)列表及其信息 $result = redis->rawCommand("SENTINEL", "slaves", $master_name); //獲取特定名稱的redis主庫(kù)地址 $result = $redis->rawCommand("SENTINEL", "get-master-addr-by-name", $master_name) //這個(gè)方法可以將以上sentinel返回的信息解析為數(shù)組 function parseArrayResult(array $data) { $result = array(); $count = count($data); for ($i = 0; $i < $count;) { $record = $data[$i]; if (is_array($record)) { $result[] = parseArrayResult($record); $i++; } else { $result[$record] = $data[$i + 1]; $i += 2; } } return $result; }
2、通過以上操作已經(jīng)可以獲取到redis主從庫(kù)的信息,redis密碼是固定的,自己寫好就OK。之后就可以按照單例模式去使用redis了,注意操作時(shí)主從分離。
以上只是一個(gè)大體的使用過程,不同情況可能有所調(diào)整。
已上只是簡(jiǎn)單說了下php程序如何去使用這種模式,具體工作原理和配置請(qǐng)移步
https://segmentfault.com/a/11...
https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61905.html
摘要:模式對(duì)服務(wù)無(wú)疑是一個(gè)很好的支持,但是在開發(fā)人員使用時(shí)會(huì)稍微麻煩一些。而在模式下需要程序動(dòng)態(tài)獲取主從庫(kù)的,即使某臺(tái)服務(wù)出現(xiàn)問題,也不會(huì)影響到程序,這樣就避免了手動(dòng)修改配置的問題。以上只是一個(gè)大體的使用過程,不同情況可能有所調(diào)整。 近期公司所用項(xiàng)目的緩存想要由memcache遷移到redis,運(yùn)維給配置的redis使用模式是sentinel(即哨兵模式的),這種模式之前沒用過,在此記錄一下...
摘要:環(huán)境說明需求與目標(biāo)本文將通過對(duì)目前主流的幾種高可用方案進(jìn)行對(duì)比分析,并基于騰訊云和等基礎(chǔ)產(chǎn)品進(jìn)行搭建配置測(cè)試總結(jié)。 本文來(lái)源 | 云+社區(qū)專欄文章作者 | 萬(wàn)守兵,騰訊云資深架構(gòu)師。8年以上大型互聯(lián)網(wǎng)公司運(yùn)維工作經(jīng)驗(yàn),騰訊云資深遷云架構(gòu)師,一直從事大型互聯(lián)網(wǎng)服務(wù)端架構(gòu)設(shè)計(jì)和優(yōu)化工作。個(gè)人專注于云計(jì)算、k8s和 DevOps領(lǐng)域。 導(dǎo)讀:在企業(yè)實(shí)際生產(chǎn)環(huán)境中為了能夠給業(yè)務(wù)上層應(yīng)用提供高...
閱讀 3286·2021-11-24 09:38
閱讀 2158·2021-11-23 09:51
閱讀 1750·2021-10-13 09:39
閱讀 2624·2021-09-23 11:53
閱讀 1408·2021-09-02 15:40
閱讀 3660·2019-08-30 15:54
閱讀 1135·2019-08-30 13:04
閱讀 2566·2019-08-30 11:01