最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解租約機制以及在hbase中的應用

 更新時間:2017年02月20日 08:36:56   作者:bryceforphy  
這篇文章主要介紹了詳解租約機制以及在hbase中的應用的相關(guān)資料,需要的朋友可以參考下

詳解租約機制以及在hbase中的應用

為什么需要Lease

分布式系統(tǒng)中為什么需要租約機制,這是因為在分布式系統(tǒng),為了保證服務的高可用,需要在服務發(fā)生故障的時候及時啟動另外一個服務實例以替換故障服務。這樣就需要在服務端和客戶端或者服務端和控制中心維持一個心跳信息,用于服務進程向控制中心匯報當前自己的健康情況,如果控制中心在一段時間收不到服務進程上報的心跳,則會啟動新的進程繼續(xù)對外提供服務。

但是,由于實際網(wǎng)絡情況的復雜性,控制中心無法收到心跳時不能準確地判斷究竟是服務故障了還是服務進程和控制中心之間的網(wǎng)絡發(fā)生了故障。這種情況下控制中心冒然地啟用新進程有可能會造成“雙主”這種情況出現(xiàn)。

為避免上述情況的發(fā)生引入了租約機制,此時服務節(jié)點持續(xù)向控制中心申請短時間租約,控制中心在已派發(fā)的租約過期之前,不會啟用新服務節(jié)點,而服務節(jié)點租約過期時若還無法從控制中心申請到新租約,自己中斷客戶鏈接。

此外,租約機制還可用于客戶端和服務端之間的解藕,避免客戶端進程失去響應時,其占用的服務端資源長期得不到釋放進而影響到服務端的穩(wěn)定。

Lease的實現(xiàn)

在實際系統(tǒng)中,如果依賴一個中心結(jié)點向外發(fā)布lease存在很大的風險,那就是如果該中心結(jié)點發(fā)生宕機或者網(wǎng)絡故障,那么服務節(jié)點由于接收不到新的租約那么會導致整個服務集群進入不可用狀態(tài)。因此,在實際使用中,對外提供lease服務的往往是由多個進程實例組成的另外一套集群,該集群具有高可用性,可以對外提供lease服務,比如zookeeper集群。

HRegionServer的租約Lease管理

租約線程的初始化

在HRegionServer的run主循環(huán)里會調(diào)用preRegistrationInitialization預先初始化一些線程,包括初始化集群連接信息setupClusterConnection()、healthCheckChore、pauseMonitor、initializeZookeeper以及initializeThreads()。

其中在initializeThreads()中會初始化各類線程,這些線程包括了這臺regionServer的lease線程:

this.compactionChecker = new CompactionChecker(this, this.threadWakeFrequency, this); //檢查合并請求 
this.periodicFlusher = new PeriodicMemstoreFlusher(this.threadWakeFrequency, this);  //周期性地檢查memstore的flush請求 
this.leases = new Leases(this.threadWakeFrequency); 

 Leases類的定義如下,它繼承了HasThread這個抽象類,并定義了如下幾個主要的成員變量:

public static final int MIN_WAIT_TIME = 100; 
private final Map<String, Lease> leases = new ConcurrentHashMap<String, Lease>(); 
 
protected final int leaseCheckFrequency; 
protected volatile boolean stopRequested = false; 

 其中Map型成員變量leases負責管理該regionserver進程中的lease實例,我們看看lease類都定義了哪些變量:

private final String leaseName; 
private final LeaseListener listener; 
private int leaseTimeoutPeriod; 
private long expirationTime; 

 leaseTimeoutPeriod是租約時間,expirationTime會在lease被創(chuàng)建時被置位為系統(tǒng)時間與leaseTimeoutPeriod之和,用于周期性地計算該租約已經(jīng)被使用多長時間,如果租約已經(jīng)超過了leaseTimeoutPeriod定義的到期時間,則會觸發(fā)一個expired事件,LeaseListener會監(jiān)聽該事件并調(diào)用leaseExpired方法,不同類型的lease都會繼承LeaseListener接口并實現(xiàn)自己的leaseExpired方法,如下所示是scan lease對該方法的實現(xiàn):

@Override 
public void leaseExpired() {    //處理租約過期 
  RegionScannerHolder rsh = scanners.remove(this.scannerName); 
  if (rsh != null) { 
   RegionScanner s = rsh.s; 
   LOG.info("Scanner " + this.scannerName + " lease expired on region " 
     + s.getRegionInfo().getRegionNameAsString()); 
   try { 
    Region region = regionServer.getRegion(s.getRegionInfo().getRegionName()); 
    if (region != null && region.getCoprocessorHost() != null) { 
     region.getCoprocessorHost().preScannerClose(s); 
    } 
 
    s.close(); 
    if (region != null && region.getCoprocessorHost() != null) { 
     region.getCoprocessorHost().postScannerClose(s); 
    } 
   } catch (IOException e) { 
    LOG.error("Closing scanner for " 
     + s.getRegionInfo().getRegionNameAsString(), e); 
   } 
  } else { 
   LOG.warn("Scanner " + this.scannerName + " lease expired, but no related" + 
    " scanner found, hence no chance to close that related scanner!"); 
  } 
 } 

 客戶端的scan請求是分解成多次RPC請求發(fā)到服務端的,分解的次數(shù)是scan的總數(shù)據(jù)量與客戶端setCache兩者的比值。每個scan請求發(fā)到服務端后會租用一個scanner,用于當前的scan結(jié)束后,后續(xù)的scan可以直接復用已有的資源,但是為防止scanner長期占用服務端資源,通過租約管理,關(guān)閉不再使用的scanner。

OK,回到前面的Leases類,看看它是如何管理regionServer進程中的各個lease的,這部分邏輯在它覆寫的run方法中:

public void run() { 
  long toWait = leaseCheckFrequency; 
  Lease nextLease = null; 
  long nextLeaseDelay = Long.MAX_VALUE; 
 
  while (!stopRequested || (stopRequested && !leases.isEmpty()) ) { 
 
   //睡眠一段時間 
 
   nextLease = null; 
   nextLeaseDelay = Long.MAX_VALUE; 
   for (Iterator<Map.Entry<String, Lease>> it = leases.entrySet().iterator(); it.hasNext();) { 
    Map.Entry<String, Lease> entry = it.next(); 
    Lease lease = entry.getValue(); 
    long thisLeaseDelay = lease.getDelay(TimeUnit.MILLISECONDS); 
    if ( thisLeaseDelay > 0) { 
     if (nextLease == null || thisLeaseDelay < nextLeaseDelay) { 
      nextLease = lease; 
      nextLeaseDelay = thisLeaseDelay; 
     } 
    } else { 
     // A lease expired. Run the expired code before removing from map 
     // since its presence in map is used to see if lease exists still. 
     if (lease.getListener() == null) { 
      LOG.error("lease listener is null for lease " + lease.getLeaseName()); 
     } else { 
      lease.getListener().leaseExpired(); 
     } 
     it.remove(); 
    } 
   } 
  } 
  close(); 
 } 

 我們省略掉一些異常處理,在while的循環(huán)周期中會逐一便利map中管理的lease,計算每個lease的thisLeaseDelay以檢查改lease是否已經(jīng)過期。判斷l(xiāng)ease是否過期的方法很簡單,就是取出當前時間與lease中定義的expirationTime做差,如果差值小于0,則說明該租約已經(jīng)到期,則調(diào)用lease中定義的leaseExpired方法,這與上面我們講過的關(guān)聯(lián)上了。其中thisLeaseDelay決定了下一次的lease檢查在多久之后發(fā)生,thisLeaseDelay的計算依據(jù)是選擇選取所有未過期lease中l(wèi)easeDelay最短的,通過thisLeaseDelay計算toWait時間,用于決定前面的睡眠時間。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 簡潔實用的Java Base64編碼加密異常處理類代碼

    簡潔實用的Java Base64編碼加密異常處理類代碼

    這篇文章主要介紹了簡潔實用的Java Base64編碼加密異常處理類代碼,有一定的實用價值,需要的朋友可以參考下
    2014-07-07
  • Jenkins+maven持續(xù)集成的實現(xiàn)

    Jenkins+maven持續(xù)集成的實現(xiàn)

    這篇文章主要介紹了Jenkins+maven持續(xù)集成的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • SpringBoot 引?MybatisGenerator的實現(xiàn)步驟

    SpringBoot 引?MybatisGenerator的實現(xiàn)步驟

    本文主要介紹了SpringBoot 引?MybatisGenerator的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Mybatis關(guān)聯(lián)查詢遇到的坑-無主鍵的關(guān)聯(lián)數(shù)據(jù)去重問題

    Mybatis關(guān)聯(lián)查詢遇到的坑-無主鍵的關(guān)聯(lián)數(shù)據(jù)去重問題

    這篇文章主要介紹了Mybatis關(guān)聯(lián)查詢遇到的坑-無主鍵的關(guān)聯(lián)數(shù)據(jù)去重問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Sharding JDBC讀寫分離實現(xiàn)原理及實例

    Sharding JDBC讀寫分離實現(xiàn)原理及實例

    這篇文章主要介紹了Sharding JDBC讀寫分離實現(xiàn)原理及實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Java內(nèi)存模型詳解

    Java內(nèi)存模型詳解

    JMM全稱Java Memory Model, 中文翻譯Java內(nèi)存模型,一種符合內(nèi)存模型規(guī)范的,屏蔽了各種硬件和操作系統(tǒng)的訪問差異的,本詳細介紹了Java內(nèi)存模型,感興趣的同學可以參考一下
    2023-04-04
  • java生成縮略圖的方法示例

    java生成縮略圖的方法示例

    這篇文章主要介紹了java生成縮略圖的方法,結(jié)合具體實例形式分析了java生成縮略圖過程中所涉及的各種常見的圖形處理技巧,需要的朋友可以參考下
    2017-03-03
  • java中方法遞歸的簡單示例

    java中方法遞歸的簡單示例

    這篇文章主要給大家介紹了關(guān)于java中方法遞歸的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)

    java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)

    Java在文件任意位置寫入數(shù)據(jù)可以使用RandomAccessFile方法來完成,下面看一個簡單的示例就明白了
    2014-01-01
  • SpringBoot2.x 整合 AntiSamy防御XSS攻擊的簡單總結(jié)

    SpringBoot2.x 整合 AntiSamy防御XSS攻擊的簡單總結(jié)

    本文主要對SpringBoot2.x集成AntiSamy防御XSS攻擊進行簡單總結(jié),其中SpringBoot使用的2.4.5版本,通過示例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-08-08

最新評論

嘉黎县| 启东市| 济阳县| 嘉荫县| 毕节市| 南皮县| 渭南市| 栾川县| 休宁县| 井研县| 河津市| 平谷区| 牙克石市| 迁安市| 闵行区| 湘阴县| 尼玛县| 张家界市| 涞源县| 南皮县| 芒康县| 闽清县| 临泉县| 铅山县| 莱州市| 厦门市| 泸水县| 崇州市| 桐柏县| 寿宁县| 黑河市| 凤冈县| 忻城县| 尤溪县| 和政县| 梁平县| 青田县| 集安市| 秀山| 荔浦县| 额济纳旗|