摘要:模式對服務無疑是一個很好的支持,但是在開發人員使用時會稍微麻煩一些。而在模式下需要程序動態獲取主從庫的,即使某臺服務出現問題,也不會影響到程序,這樣就避免了手動修改配置的問題。以上只是一個大體的使用過程,不同情況可能有所調整。
近期公司所用項目的緩存想要由memcache遷移到redis,運維給配置的redis使用模式是sentinel(即哨兵模式的),這種模式之前沒用過,在此記錄一下。
簡單介紹下Redis-sentinel:
Redis-sentinel是Redis實例的監控管理、通知和實例失效備援服務,是Redis集群的管理工具。在一般的分布式中心節點數據庫中,Redis-sentinel的作用是中心節點的工作,監控各個其他節點的工作情況并且進行故障恢復,來提高集群的高可用性
(簡介來自http://www.searchdatabase.com...)
我自己的理解就是,假如有a,b,c 3臺可用的redis服務器,其中a為主服務器,b,c為從服務器。
在sentinel模式下如果a出現問題,可以自動將a服務器拿掉或者降級為從服務器,然后從b和c中根據一定策略選擇一臺升級為主服務器,之后a恢復后作為從服務器使用,避免了了由于某臺服務器出現問題時影響整個redis服務。
redis-sentinel模式對redis服務無疑是一個很好的支持,但是在開發人員使用時會稍微麻煩一些。因為可能更常用的模式就是直接在程序中寫好一個配置文件,redis主從庫都是確定的,程序讀取配置文件進行redis操作。假如主庫出現問題,必須手動修改配置文件才能繼續正常使用。而如果發現的比較晚可能會造成不必要的損失。
而在sentinel模式下需要程序動態獲取主從庫的ip,即使某臺redis服務出現問題,也不會影響到程序,這樣就避免了手動修改配置的問題。而關鍵問題其實就是動態獲取主從庫的ip,端口等信息了。
在網上查相關資料,大部分都是講解如何配置sentinel服務,而php對應使用方法不太多。看了官方redis-sentinel文檔后了解到獲取sentinel信息是有對應API的,只不過是一些原生命令。
而php-redis庫是有支持原生命令的方法的,如下:
/* * 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 ) {}
而在開發使用大致過程如下
1、根據運維給的sentinel配置信息連接sentinel,獲得需要的信息(注意:此處是sentinel服務的配置信息,和redis的并不一致)。配置信息(IP,PORT)會有多個,每個sentinel返回的redis主從配置信息是一致的,所以進行操作時使用其中一臺服務返回的信息即可。
//初始化redis對象 $redis = new Redis(); //連接sentinel服務 host為ip,port為端口 $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) //這個方法可以將以上sentinel返回的信息解析為數組 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、通過以上操作已經可以獲取到redis主從庫的信息,redis密碼是固定的,自己寫好就OK。之后就可以按照單例模式去使用redis了,注意操作時主從分離。
以上只是一個大體的使用過程,不同情況可能有所調整。
已上只是簡單說了下php程序如何去使用這種模式,具體工作原理和配置請移步
https://segmentfault.com/a/11...
https://segmentfault.com/a/11...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25840.html
摘要:模式對服務無疑是一個很好的支持,但是在開發人員使用時會稍微麻煩一些。而在模式下需要程序動態獲取主從庫的,即使某臺服務出現問題,也不會影響到程序,這樣就避免了手動修改配置的問題。以上只是一個大體的使用過程,不同情況可能有所調整。 近期公司所用項目的緩存想要由memcache遷移到redis,運維給配置的redis使用模式是sentinel(即哨兵模式的),這種模式之前沒用過,在此記錄一下...
摘要:環境說明需求與目標本文將通過對目前主流的幾種高可用方案進行對比分析,并基于騰訊云和等基礎產品進行搭建配置測試總結。 本文來源 | 云+社區專欄文章作者 | 萬守兵,騰訊云資深架構師。8年以上大型互聯網公司運維工作經驗,騰訊云資深遷云架構師,一直從事大型互聯網服務端架構設計和優化工作。個人專注于云計算、k8s和 DevOps領域。 導讀:在企業實際生產環境中為了能夠給業務上層應用提供高...
閱讀 2949·2021-11-23 09:51
閱讀 1666·2021-10-15 09:39
閱讀 1056·2021-08-03 14:03
閱讀 2880·2019-08-30 15:53
閱讀 3437·2019-08-30 15:52
閱讀 2487·2019-08-29 16:17
閱讀 2788·2019-08-29 16:12
閱讀 1647·2019-08-29 15:26