zookeeper編程
集中管理配置文件實現服務治理vim
如爲了經過網絡訪問一個系統,咱們得知道對方的IP地址,可是IP地址對人很是不友好,這個時候咱們就須要使用域名來訪問。可是計算機是不能識別域名的。怎麼辦呢?若是咱們每臺機器裏都備有一份域名到IP地址的映射,這個卻是能解決一部分問題,可是若是域名對應的IP發生變化了又該怎麼辦呢?因而咱們有了DNS這個東西。咱們只須要訪問一個你們熟知的(known)點,它就會告訴你這個域名對應的IP是什麼。在咱們的應用中也會存在不少這類問題,特別是在咱們的服務特別多的時候,若是咱們在本地保存服務的地址的時候將很是不方便,可是若是咱們只須要訪問一個你們都熟知的訪問點,這裏提供統一的入口,那麼維護起來將方便得多了。bash
如在一個分佈式環境中,爲了提升可靠性,咱們的集羣的每臺服務器上都部署着一樣的服務。可是,一件事情若是集羣中的每一個服務器都進行的話,那相互之間就要協調,編程起來將很是複雜。而若是咱們只讓一個服務進行操做,那又存在單點。一般還有一種作法就是使用分佈式鎖,在某個時刻只讓一個服務去幹活,當這臺服務出問題的時候鎖釋放,當即fail over到另外的服務。這在不少分佈式系統中都是這麼作,這種設計有一個更好聽的名字叫Leader Election(leader選舉)。好比HBase的Master就是採用這種機制。但要注意的是分佈式鎖跟同一個進程的鎖仍是有區別的,因此使用的時候要比同一個進程裏的鎖更謹慎的使用服務器
在分佈式的集羣中,常常會因爲各類緣由,好比硬件故障,軟件故障,網絡問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集羣。這個時候,集羣中其餘機器須要感知到這種變化,而後根據這種變化作出對應的決策。好比咱們是一個分佈式存儲系統,有一箇中央控制節點負責存儲的分配,當有新的存儲進來的時候咱們要根據如今集羣目前的狀態來分配存儲節點。這個時候咱們就須要動態感知到集羣目前的狀態。還有,好比一個分佈式的SOA架構中,服務是一個集羣提供的,當消費者訪問某個服務時,就須要採用某種機制發現如今有哪些節點能夠提供該服務(這也稱之爲服務發現,好比Alibaba開源的SOA框架Dubbo就採用了Zookeeper做爲服務發現的底層機制)。還有開源的Kafka隊列就採用了Zookeeper做爲Cosnumer的上下線管理。網絡
tar xzvf filename架構
mv filename zookeeper框架
cd zookeeper分佈式
mkdir data logs測試
cd confspa
cp zoo_sample.cfg zoo.cfg
修改文件 zoo.cfg
tickTime=2000
dataDir=/home/live/zookeeper/data
dataLogDir=/home/live/zookeeper/logs
clientPort=2181
vim ~/.bash_prifile
把$HOME/zookeeper/bin添加到PATH中
mkdir ~/scripts
cd scripts
vim zkserver.sh
#!/bin/sh
zookeeper_dir=/home/live/zookeeper
zookeeper_command_path=/home/live/zookeeper/bin
zookeeper_process="zookeeper"
case $1 in
start)
cd $zookeeper_command_path;./zkServer.sh start
;;
stop)
cd $zookeeper_command_path;./zkServer.sh stop
;;
restart)
cd $zookeeper_command_path;./zkServer.sh stop;
cd $zookeeper_command_path;./zkServer.sh start
;;
status)
Process=`ps -ef|grep ${zookeeper_process}|grep -v grep |grep -v $0| wc -l`
if [ "$Process" = 0 ];then
echo "$process stopping."
cd $zookeeper_command_path;./zkServer.sh status
else
echo "$process starting."
cd $zookeeper_command_path;./zkServer.sh status
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
sh scripts/zkserver.sh start
~/zookeeper/bin/zkCli.sh -server z1:2181
create /asd asd
get /asd
tar xzvf filename
mv filename zookeeper
cd zookeeper
mkdir data logs
vim data/myid
寫入1,……n
1、配置主機名
vim /etc/hosts
……
2、zookeeper配置文件
cd conf
cp zoo_sample.cfg zoo.cfg
修改文件 zoo.cfg
tickTime=2000
dataDir=/home/live/zookeeper/data
dataLogDir=/home/live/zookeeper/logs
clientPort=2181
server.n=主機名:2888:3888
前一個端口表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;後一個端口 表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口
vim ~/.bash_prifile
把$HOME/zookeeper/bin添加到PATH中
mkdir ~/scripts
cd scripts
vim zkserver.sh
#!/bin/sh
zookeeper_dir=/home/live/zookeeper
zookeeper_command_path=/home/live/zookeeper/bin
zookeeper_process="zookeeper"
case $1 in
start)
cd $zookeeper_command_path;./zkServer.sh start
;;
stop)
cd $zookeeper_command_path;./zkServer.sh stop
;;
restart)
cd $zookeeper_command_path;./zkServer.sh stop;
cd $zookeeper_command_path;./zkServer.sh start
;;
status)
Process=`ps -ef|grep ${zookeeper_process}|grep -v grep |grep -v $0| wc -l`
if [ "$Process" = 0 ];then
echo "$process stopping."
cd $zookeeper_command_path;./zkServer.sh status
else
echo "$process starting."
cd $zookeeper_command_path;./zkServer.sh status
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
sh scripts/zkserver.sh start
~/zookeeper/bin/zkCli.sh -server z1:2181
create /asd asd
get /asd
vim /etc/profile
JAVA_HOME=?/jdk1.7.0_75
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
JRE_HOME=$JAVA_HOME/jre
export JAVA_HOME
export CLASSPATH
export JRE_HOME
export PATH
用echo stat | nc localhost 2191查看zookeeper狀態,先從follower開始升級,最後升級leader
如部署時操做
配置等與部署時一致
scp -r -P2828 ?/zookeeper-3.4.8/ root@192.168.14.36:?
/usr/local/zookeeper/bin/zkServer.sh stop
rm -rf /usr/local/zookeeper
ln -sv /usr/local/zookeeper-3.4.8/ /usr/local/zookeeper
/usr/local/zookeeper/bin/zkServer.sh start
/usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
使用ZooInspector查看