日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

服务器启动文件,[Zookeeper] 服务端之单机版服务器启动

發布時間:2024/10/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 服务器启动文件,[Zookeeper] 服务端之单机版服务器启动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 服務器端整體概覽圖

概覽圖

ServerCnxnFactory:負責與client之間的網絡交互,支持NIO(默認)以及Netty

SessionTrackerImpl:會話管理器

DatadirCleanupManager:定期清理存在磁盤上的log文件和snapshot文件

PreRequestProcessor,SyncRequestProcessor,FinalRequestProcessor:請求處理流程,責任鏈模式

LearnerHandler:Leader與Learner之間的交互

FileTxnSnapLog:存儲在磁盤上的日志文件

DataTree:體現在內存中的存儲結構

Sessions:Session的相關信息存儲

2 單機版服務器啟動流程

執行QuorumPeerMain的main方法,其中先創建一個QuorumPeerMain對象

調用initializeAndRun方法

protected void initializeAndRun(String[] args)

throws ConfigException, IOException

{

QuorumPeerConfig config = new QuorumPeerConfig();

if (args.length == 1) {

config.parse(args[0]);

}

// Start and schedule the the purge task

DatadirCleanupManager purgeMgr = new DatadirCleanupManager(config

.getDataDir(), config.getDataLogDir(), config

.getSnapRetainCount(), config.getPurgeInterval());

purgeMgr.start();

if (args.length == 1 && config.servers.size() > 0) {

runFromConfig(config);

} else {

LOG.warn("Either no config or no quorum defined in config, running "

+ " in standalone mode");

// there is only server in the quorum -- run as standalone

ZooKeeperServerMain.main(args);

}

}

2.1

args實際上就是zoo.cfg中的配置,如下

2.2

創建DatadirCleanupManager實例,參數有snapDir,dataLogDir,snapRetainCount(要保存snapshot文件的個數),purgeInterval(定期清理的頻率,單位為小時),snapRetainCount與purgeInterval在zoo.cfg中均可以配置

調用DatadirCleanupManager的start方法,里面主要依賴PurgeTask,這也是一個線程,其run方法

PurgeTxnLog的purge方法:

public static void purge(File dataDir, File snapDir, int num) throws IOException {

// snapshot文件保存的數量小于3,拋異常

if (num < 3) {

throw new IllegalArgumentException(COUNT_ERR_MSG);

}

// 根據dataDir和snapDir創建FileTxnSnapLog

FileTxnSnapLog txnLog = new FileTxnSnapLog(dataDir, snapDir);

// 根據給定數量獲取最近的文件

List snaps = txnLog.findNRecentSnapshots(num);

// 獲取數目

int numSnaps = snaps.size();

if (numSnaps > 0) {

// 第二個參數是最近的snapshot文件

purgeOlderSnapshots(txnLog, snaps.get(numSnaps - 1));

}

}

找最近n個snapshot文件:

public List findNRecentSnapshots(int n) throws IOException {

List files = Util.sortDataDir(snapDir.listFiles(), SNAPSHOT_FILE_PREFIX, false);

int count = 0;

List list = new ArrayList();

for (File f: files) {

if (count == n)

break;

if (Util.getZxidFromName(f.getName(), SNAPSHOT_FILE_PREFIX) != -1) {

count++;

list.add(f);

}

}

return list;

}

purgeOlderSnapshots:

static void purgeOlderSnapshots(FileTxnSnapLog txnLog, File snapShot) {

// 從snapshot文件名中獲取zxid

final long leastZxidToBeRetain = Util.getZxidFromName(

snapShot.getName(), PREFIX_SNAPSHOT);

/**

* 我們刪除名稱中帶有zxid且小于leastZxidToBeRetain的所有文件。

* 該規則適用于快照文件和日志文件,

* zxid小于X的日志文件可能包含zxid大于X的事務。

* 更準確的說,命名為log.(X-a)的log文件可能包含比snapshot.X文件更新的事務,

* 如果在該間隔中沒有其他以zxid開頭即(X-a,X]的日志文件

*/

final Set retainedTxnLogs = new HashSet();

//獲取快照日志,其中可能包含比給定zxid更新的事務,這些日志需要保留下來

retainedTxnLogs.addAll(Arrays.asList(txnLog.getSnapshotLogs(leastZxidToBeRetain)));

/**

* Finds all candidates for deletion, which are files with a zxid in their name that is less

* than leastZxidToBeRetain. There's an exception to this rule, as noted above.

*/

class MyFileFilter implements FileFilter{

private final String prefix;

MyFileFilter(String prefix){

this.prefix=prefix;

}

public boolean accept(File f){

if(!f.getName().startsWith(prefix + "."))

return false;

if (retainedTxnLogs.contains(f)) {

return false;

}

long fZxid = Util.getZxidFromName(f.getName(), prefix);

if (fZxid >= leastZxidToBeRetain) {

return false;

}

return true;

}

}

// add all non-excluded log files

List files = new ArrayList();

File[] fileArray = txnLog.getDataDir().listFiles(new MyFileFilter(PREFIX_LOG));

if (fileArray != null) {

files.addAll(Arrays.asList(fileArray));

}

// add all non-excluded snapshot files to the deletion list

fileArray = txnLog.getSnapDir().listFiles(new MyFileFilter(PREFIX_SNAPSHOT));

if (fileArray != null) {

files.addAll(Arrays.asList(fileArray));

}

// remove the old files

for(File f: files)

{

final String msg = "Removing file: "+

DateFormat.getDateTimeInstance().format(f.lastModified())+

"\t"+f.getPath();

LOG.info(msg);

System.out.println(msg);

if(!f.delete()){

System.err.println("Failed to remove "+f.getPath());

}

}

}

先獲取到那些需要保留的文件,之后再去刪除這些不在保留文件之內的文件。

2.3

判斷集群是單機啟動還是集群啟動,集群走runFromConfig(config),單機走ZooKeeperServerMain.main(args)(其實單機版最終走的是ZooKeeperServerMain的runFromConfig,)

runFromConfig方法:

public void runFromConfig(ServerConfig config) throws IOException {

LOG.info("Starting server");

FileTxnSnapLog txnLog = null;

try {

final ZooKeeperServer zkServer = new ZooKeeperServer();

// Registers shutdown handler which will be used to know the

// server error or shutdown state changes.

final CountDownLatch shutdownLatch = new CountDownLatch(1);

zkServer.registerServerShutdownHandler(

new ZooKeeperServerShutdownHandler(shutdownLatch));

// 構建FileTxnSnapLog對象

txnLog = new FileTxnSnapLog(new File(config.dataLogDir), new File(

config.dataDir));

zkServer.setTxnLogFactory(txnLog);

zkServer.setTickTime(config.tickTime);

zkServer.setMinSessionTimeout(config.minSessionTimeout);

zkServer.setMaxSessionTimeout(config.maxSessionTimeout);

// 構建與client之間的網絡通信服務組件

// 這里可以通過zookeeper.serverCnxnFactory配置NIO還是Netty

cnxnFactory = ServerCnxnFactory.createFactory();

cnxnFactory.configure(config.getClientPortAddress(),

config.getMaxClientCnxns());

cnxnFactory.startup(zkServer);

// Watch status of ZooKeeper server. It will do a graceful shutdown

// if the server is not running or hits an internal error.

shutdownLatch.await();

shutdown();

cnxnFactory.join();

if (zkServer.canShutdown()) {

zkServer.shutdown(true);

}

} catch (InterruptedException e) {

// warn, but generally this is ok

LOG.warn("Server interrupted", e);

} finally {

if (txnLog != null) {

txnLog.close();

}

}

}

初始化網絡服務組件后,cnxnFactory.startup(zkServer);

這里以默認網絡服務組件為例NIOServerCnxnFactory

@Override

public void start() {

// ensure thread is started once and only once

if (thread.getState() == Thread.State.NEW) {

thread.start();

}

}

@Override

public void startup(ZooKeeperServer zks) throws IOException,

InterruptedException {

//調用上面的start方法,實際調用thread的start

//也就調用了該類的run方法,啟動網絡服務

start();

//這是ZooKeeperServer

setZooKeeperServer(zks);

zks.startdata();

zks.startup();

}

2.4

zks.startdata()方法:

public void startdata()

throws IOException, InterruptedException {

//check to see if zkDb is not null

if (zkDb == null) {

zkDb = new ZKDatabase(this.txnLogFactory);

}

if (!zkDb.isInitialized()) {

//loadData進行初始化

loadData();

}

}

ZKDatabase在內存中維護了zookeeper的sessions, datatree和commit logs集合。 當zookeeper server啟動的時候會將txnlogs和snapshots從磁盤讀取到內存中

ZKDatabase的loadData()方法:

//如果zkDb已經初始化,設置zxid(內存當中DataTree最新的zxid)

if(zkDb.isInitialized()){

setZxid(zkDb.getDataTreeLastProcessedZxid());

}

else {

// 沒有初始化,就loadDataBase

setZxid(zkDb.loadDataBase());

}

public long loadDataBase() throws IOException {

long zxid = snapLog.restore(dataTree, sessionsWithTimeouts, commitProposalPlaybackListener);

initialized = true;

return zxid;

}

loadDataBase()內部調用的是FileTxnSnapLog的restore方法

2.5

zks.startup()方法:

public synchronized void startup() {

if (sessionTracker == null) {

// 創建會話管理器

createSessionTracker();

}

// 啟動會話管理器

startSessionTracker();

// 設置請求處理器

setupRequestProcessors();

// 注冊jmx

registerJMX();

setState(State.RUNNING);

notifyAll();

}

總結

以上是生活随笔為你收集整理的服务器启动文件,[Zookeeper] 服务端之单机版服务器启动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 孕妇毛片 | 国产在线精品一区 | 亚洲天堂av在线播放 | 国内露脸中年夫妇交换 | 在线91av | 无码任你躁久久久久久老妇 | 国产午夜福利片 | 在线不卡 | 隔壁邻居是巨爆乳寡妇 | 在线看的网站 | 日韩网站在线 | 青青草成人免费 | 午夜资源网 | 日韩欧美视频在线播放 | 丰满岳乱妇一区二区 | 97精品国产97久久久久久春色 | 伊人草草| 四虎一区二区 | 泰国午夜理伦三级 | 日韩免费不卡视频 | 禁断介护av | 国产成人精品网站 | 激情六月天 | 欧美黄色a级片 | 二区中文字幕 | 久久午夜电影网 | 69性视频| 福利视频精品 | 大地资源影视在线播放观看高清视频 | 新超碰97| 大尺度摸揉捏胸床戏视频 | 欧美成人乱码一区二区三区 | 亚洲午夜精品久久 | 永久黄色网址 | 秋霞国产午夜精品免费视频 | 国产一区视频在线免费观看 | 91蝌蚪在线 | 懂色中文一区二区在线播放 | 黄色精品 | 日本亚洲免费 | 欧美三级手机在线观看 | 欧美黄色大片网站 | 精品一区二区三区毛片 | 开心春色激情网 | 国产无遮挡裸体免费视频 | 久久色网站 | 伊人999| 91老女人 | 校园春色亚洲色图 | 人人爽人人射 | 亚洲成人一区在线观看 | 成人aⅴ视频 | 亚洲av无码日韩精品影片 | 在线一本| 91久久视频| www.久久色| 精品无人区无码乱码毛片国产 | 怡红院av在线 | 成年人网站在线观看视频 | 91看片就是不一样 | 中文字幕精品久久久久人妻红杏1 | 亚洲爆爽| 日韩欧美亚洲国产精品字幕久久久 | 国产精品分类 | 在线观看免费观看在线 | 久久人人精品 | 色狠狠av老熟女 | 自拍视频在线播放 | 经典三级视频 | 毛片天堂 | 国产麻豆久久 | 国产露脸国语对白在线 | 懂色av蜜臀av粉嫩av分享吧最新章节 | a免费视频 | 色窝窝综合色窝窝久久 | 日韩卡一卡二 | 91一区二区视频 | 人妻va精品va欧美va | av综合一区 | 亚洲成a人片77777精品 | 久久亚洲aⅴ无码精品 | 啪啪网视频 | 国产精品久久久久久久久动漫 | www.香蕉网 | 18久久久 | av激情在线观看 | 国产欧美日韩三级 | 亚洲三级电影 | 国产精品超碰 | 黄色网址www | av三级在线播放 | 青青青免费在线视频 | 精品人妻一区二区三区久久嗨 | 日韩特级片 | 狠狠操精品 | 国产高清免费在线 | 中文字幕一区av | 自拍偷拍小视频 | 色婷婷激情网 |