国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解租約機制以及在hbase中的應用

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

2020-08-14 15:56bryceforphy Java教程

這篇文章主要介紹了詳解租約機制以及在hbase中的應用的相關資料,需要的朋友可以參考下

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

為什么需要Lease

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

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

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

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

Lease的實現

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

HRegionServer的租約Lease管理

租約線程的初始化

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

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

?
1
2
3
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這個抽象類,并定義了如下幾個主要的成員變量:

?
1
2
3
4
5
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類都定義了哪些變量:

?
1
2
3
4
private final String leaseName;
private final LeaseListener listener;
private int leaseTimeoutPeriod;
private long expirationTime;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@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請求發到服務端的,分解的次數是scan的總數據量與客戶端setCache兩者的比值。每個scan請求發到服務端后會租用一個scanner,用于當前的scan結束后,后續的scan可以直接復用已有的資源,但是為防止scanner長期占用服務端資源,通過租約管理,關閉不再使用的scanner。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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的循環周期中會逐一便利map中管理的lease,計算每個lease的thisLeaseDelay以檢查改lease是否已經過期。判斷lease是否過期的方法很簡單,就是取出當前時間與lease中定義的expirationTime做差,如果差值小于0,則說明該租約已經到期,則調用lease中定義的leaseExpired方法,這與上面我們講過的關聯上了。其中thisLeaseDelay決定了下一次的lease檢查在多久之后發生,thisLeaseDelay的計算依據是選擇選取所有未過期lease中leaseDelay最短的,通過thisLeaseDelay計算toWait時間,用于決定前面的睡眠時間。

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

原文鏈接:http://blog.csdn.net/bryce123phy/article/details/55668199

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩精品小视频 | 亚洲不卡视频在线观看 | 天天澡天天狠天天天做 | 久久久国产一区二区三区 | 亚洲精品一区二区网址 | 日韩一区二区在线观看 | 日韩精品一区二 | 在线成人av | 国产精品精品视频 | 中文字幕亚洲一区二区va在线 | 国产精品无码永久免费888 | 精品视频三区 | 久久精彩| 国产精品一区视频 | av一区二区不卡 | 国产成人综合一区二区三区 | 精品国产一区二区三区免费 | 日本欧美在线 | 精品国产欧美一区二区 | 综合在线视频 | 欧美福利视频 | 国产精品视频久久久 | 免费毛片网站 | 成人在线网址 | 日韩福利在线 | 国产午夜精品福利 | 一区二区国产精品 | 另类国产ts人妖高潮系列视频 | 欧美日韩精品电影 | 美女羞羞网站 | 嫩草精品| 久久久美女视频 | 一区视频在线 | av在线中文 | 成人黄色电影在线观看 | 久久精品不卡 | 成人国产在线 | 亚洲成人高清 | 精品成人免费一区二区在线播放 | av在线免费观看网址 | 黄色国产一级片 |