leaf-distributer - 分布式算法的組件包

jopen 8年前發布 | 8K 次閱讀 算法 leaf-distributer

leaf-consistent-hashing

leaf-consistent-hashing是一個遵循PSR-3規范的,分布式算法組件,適用于基于客戶端的集群分布式場景:如Redis、Memcached、MySQL。

 特點:

  1. 使用composer包,便于集成到基于composer的項目中。
  2. 遵循psr-3標準規范。所以,使用leaf-consistent-hashing替換現有系統的日志組件是非常簡單的。

適用說明:

  1. 一致性哈希算法相對取模算法,優勢在于:①:節點變更重新哈希的Key落點只影響單臺。②:分布更均勻。
  2. 本算法組件,適用于基于客戶端的分布式解決方案。 3、特別適用場景:Redis的集群分布式算法(Redis官方在3.0版本才出了自己的分布式解決方法)。 4、雖然基于MySQL做分布式方案解決方案有很多且比較成熟,但對于小團隊而言,使用一致性哈希替代取模算法同樣不失為一種較好的解決方案。 5、本組件未集成取模算法,也沒有集成的必要。
  3. </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);

    todo.計劃內容:

    • 文件處理器的日志分割。

    項目地址: https://github.com/donghongshuai/leaf-distributer

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!