leaf-distributer - 分布式算法的組件包
leaf-consistent-hashing
leaf-consistent-hashing是一個遵循PSR-3規范的,分布式算法組件,適用于基于客戶端的集群分布式場景:如Redis、Memcached、MySQL。
特點:
- 使用composer包,便于集成到基于composer的項目中。
- 遵循psr-3標準規范。所以,使用leaf-consistent-hashing替換現有系統的日志組件是非常簡單的。
適用說明:
- 一致性哈希算法相對取模算法,優勢在于:①:節點變更重新哈希的Key落點只影響單臺。②:分布更均勻。
- 本算法組件,適用于基于客戶端的分布式解決方案。 3、特別適用場景:Redis的集群分布式算法(Redis官方在3.0版本才出了自己的分布式解決方法)。 4、雖然基于MySQL做分布式方案解決方案有很多且比較成熟,但對于小團隊而言,使用一致性哈希替代取模算法同樣不失為一種較好的解決方案。 5、本組件未集成取模算法,也沒有集成的必要。 </ol>
- 文件處理器的日志分割。
1.引入leaf-consistent-hashing
引入有2種方式:
1、基于composer的項目的引入方式:
composer require leaf/leaf-consistent-hashing
2、非composer項目引入方式:
\Leaf\Consistent\Hashing\Autoloader::register();
2.leaf-consistent-hashing的基本使用
leaf-consistent-hashing的核心理念是:有一個log manager。你可以向log manager中注冊多個日志處理器,比如:handlerFile,用于記錄文件日志。你還可以再注冊進去一個 handlerMail,用于當記錄error級別的日志的時候,發送報警郵件等。當然,你還可以自己定制化handler,注冊到log manager中。leaf-consistent-hashing默認僅僅提供了文件處理器。
首先:實例化一個日志控制器。
$loger = new \Leaf\Loger\Loger。
然后,實例化一個日志處理器,這里以文件處理器為例:
$handlerFile = new \Leaf\Loger\Handler\HandlerFile();
當然,既然是存儲文件,你可能需要指定文件的存儲路徑,存儲路徑只有文件處理器需要。(倘若你自己寫了日志處理器是短信日志處理器,那么設置路徑的方法就沒有必須要了)
$handlerFile->setLogFile($path);
接下來,我們將日志處理器注冊到日志控制器中。這樣的目的是,當觸發日志控制器的記錄操作的時候,系統會通過文件處理器完成記錄操作。
$loger->addHandler('file',$fileHandler);
最后,我們可以這樣記錄日志。
$loger->info("this is a test string");
集成方式
上面的例子,是基本的使用方式。在你的項目中,你很可能不會每次都實例化日志記錄器才能記錄日志。而是
1、通過注冊樹模式,將日志記錄器注冊到全局樹上。
2、或者是注冊到項目的容器中。
3、注冊到項目application的靜態方法中,以Yii2為例:Yii::info()。
leaf-consistent-hashing提供了一個logDriver,你可以參考其實現,將leaf-consistent-hashing融入到你的項目中:
leaf-consistent-hashing/src/Example/LogDriver.php
3.日志記錄級別說明:
你可以選擇的記錄日志級別有8個。
EMERGENCY
系統不可用。
$loger->emergency('emergency message string');
ALERT
必須立刻采取行動
例如:在整個網站都垮掉了、數據庫不可用了或者其他的情況下,應該發送一條警報短信把你叫醒。
$loger->alert("alert message string");
CRITICAL
緊急情況
例如:程序組件不可用或者出現非預期的異常。
$loger->critical('critical message string');
ERROR
運行時出現的錯誤,不需要立刻采取行動,但必須記錄下來以備檢測。
$loger->error('error message string');
WARNING
出現非錯誤性的異常
例如:使用了被棄用的API、錯誤地使用了API或者非預想的不必要錯誤。
$loger->warning('warning message string');
NOTICE
一般性重要的事件
$loger->notice('notice messsage string');
INFO
一般事件
例如:用戶登錄和SQL記錄。
$loger->info("sql...");
DEBUG
調試詳情
例如:某個斷點的內存占用、執行時間等等。
$loger->debug('debug message string');
4.設置日志級別
你可以自定義日志級別,這樣一來,只有高于或等于此級別的日志才能被記錄。舉例來說,你可以設置記錄級別為warning,那么debug級別的日志將不會記錄。
#use \Leaf\Loger\LogerClass\LogLevel;
$loger->setLogLevel(LogLevel::WARNING);
此時,你執行如下代碼
$logDriver->info('info'); //不記錄 $logDriver->warning('warning'); //記錄 $logDriver->error('error'); //記錄
5.設置日志類別
除了可以設置日志級別外,還可以設置日志類別。
比如:你的項目中有記錄2種類別的日志:application(應用類別)、profile(性能分析類別)。你可以同時在項目中去記錄。但是當項目部署的時候,只開放 application 類別,那么profile的即便有函數調用,但依然不會記錄。
設置日志記錄類別:
$loger->setLogCategory('profile');
設置之后,下面的代碼:
$loger->info('info', [], 'profile'); //記錄 $loger->warning('warning', [], 'app'); //不記錄 $loger->error('error', [], 'profile'); //記錄
6.打開日志實時刷新
如果你的日志是記錄到文件中的。默認情況下,日志組件是關閉實時刷新日志的。也就是說。你多次調用記錄日志的方法,并不會立即將日志信息刷新到文件中,而是當腳本結束的時候才刷新寫入日志。這樣做的好處是,減少高并發下的磁盤IO負載。
當然,你也可以選擇手動開啟。開啟的方式很簡單,實例化文件處理器的時候,如下操作:
/** * 設置日志處理器之文件處理器 */ $fileHandler = new HandlerFile(); $fileHandler->enableRealTimeFlush(); /** * 將文件日志處理器添加到loger中 */ $this->getLoger()->addHandler('file', $fileHandler);