分布式鎖是控制分布式系統之間同步訪問共享資源的一種方式,須要相互排斥來防止彼此干擾來保證一致性。
利用zookeeper的強一致性能夠完畢鎖服務。zookeeper的官方文件是列舉了兩種鎖。獨佔鎖和共享鎖。
獨佔鎖保證不論什麼時候都僅僅有乙個程序能或者資源的讀寫許可權。共享鎖能夠同一時候有多個讀,可是同一時刻最多僅僅能有乙個寫,讀和寫是相互排斥的。
我們準備來實現相互排斥的鎖,依照官網的思路,給定乙個鎖的路徑,如/lock,全部要申請這個鎖的程序都在/lock資料夾下建立乙個/lock/lock-的暫時序列節點,並監控/lock的子節點變化事件。當子節點傳送變化時用get_children()獲取子節點的列表,假設發現程序發現自己擁有最小的乙個序號,則獲得鎖。
處理業務完成後須要釋放鎖,此時僅僅須要刪除該暫時節點就可以。簡單來說就是永遠是擁有最小序號的程序獲得鎖。
使用鎖有兩個主要的函式,就是lock
或unlock
.定義為
接下來在看詳細的實現。
lock *lock(zhandle_t *zkhandle,const char *path)
}else
return lock;
}
lock
函式初始化鎖後,會持續的嘗試加鎖,直到成功。儘管我是這樣實現的。可是過於簡單粗暴(哈哈)。假設拿不到鎖的話。持續就會堵塞在lock
函式。
int unlock(zhandle_t *zkhandle,lock * *lock)
free(*lock);
*lock = null;
return ret;
}return zok;
}
unlock
函式就很easy了。就是將create_lock
中建立的暫時序列節點刪除就能夠了。
接下來在看下模擬程式的功能。
> ./mylock -h
usage : [mylock] [-h] [-p path][-s ip:port]
-h show help
-p lock path
-s zookeeper server ip:port
for example:
mylock -s 172.17.0.36:2181 -p /lock
模擬程式有3個選項。
當中-s
:為zookeeper的server的ip:port.
-p
: 為鎖的路徑。
分別同一時候執行多個mylock程式,就能夠看到各個程式之間是怎樣獲取鎖的了。
最後是完整的**:
#include#include#include#include"zookeeper.h"
#include"zookeeper_log.h"
char g_host[512]= "172.17.0.36:2181";
char g_path[512]= "/lock";
typedef struct lock
lock;
void print_usage();
void get_option(int argc,const char* argv);
/**********unitl*********************/
void print_usage()
void get_option(int argc,const char* argv)
}} lock *create_lock(zhandle_t *zkhandle,const char *path)
; int bufferlen = sizeof(path_buffer);
lock * lock = null;
int ret = zoo_exists(zkhandle,path,0,null);
if(ret != zok)else
}if(ret == zok)else
}if(ret == zok)
return lock;
}int try_lock(zhandle_t *zkhandle,lock *lock)
else
}for(i = 0; i < children.count; ++i)
}return ret;
}lock *lock(zhandle_t *zkhandle,const char *path)
}else
return lock;
}int unlock(zhandle_t *zkhandle,lock * *lock)
free(*lock);
*lock = null;
return ret;
}return zok;
}int main(int argc, const char *argv)
int ret = zoo_exists(zkhandle,g_path,0,null);
if(ret != zok)else
}if(ret == zok )
}zookeeper_close(zkhandle);
return 0;
}
協調服務 Zookeeper實踐
事務日誌 zoo.cfg檔案中,datadir 快照日誌 執行時日誌 bin zookeeper.out public class connectiondemo countdownlatch.await system.out.println zookeeper.getstate zookeeper....
Zookeeper簡易實踐操作
1.解壓zookeeper tar zvxf zookeeper安裝包所在路徑 c zookeeper解壓後所在路徑 2.修改名字 mv 帶版本號zookeeper的路徑 改名字為zookeeper的路徑 3.建立目錄 建立data和logs目錄 在 zookeeper 的安裝目錄下建立 dxccd...
Zookeeper場景實踐 (8) 分布式佇列
按照zookeeper典型應用場景一覽 裡的說法,分布式佇列有兩種,一種是常規的先進先出佇列,另一種是要等到佇列成員聚齊之後的才統一按序執行。第二種佇列可以先建立乙個 queue,賦值為n,表達佇列的大小。然後每個佇列成員加入時,就判斷是否達到佇列要求的大小,如果是可以進行下一步動作,否則繼續等待佇...