虛擬機器搭建偽zk叢集
基礎環境
虛擬化軟體:VMware Workstation Pro 12.5.7 下載地址:http://www.nruan.com/vmware12.html
虛擬機器系統版本:CentOS-7-x86_64
zk版本:3.4.11
JDK版本:1.8
本機xshell連線虛擬機器(如果需要使用xshell連線的話)
1、網路配置改為“僅主機模式”
2、虛擬機器系統內修改網路配置檔案
cd /etc/sysconfig/network-scripts/ifcfg-ens33
配置內容如下:
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"#剛開始dhcp,後來改成static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="15bb16c3-19f4-434c-a926-2147fc74de0f"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.197.2"#IP地址
NETMASK="255.255.255.0"# 子網掩碼
3、重啟服務,使配置生效
service network restart # 重啟網路服務`
4、本機網路配置,找到VMnet1,修改ipv4設定
子網掩碼和步驟2中的一致,ip地址和步驟2中的處在同一網段
5、使用xshell,因為網路使用了主機模式,所以無法使用yum命令,解析域名,需要改為NAT,然後在虛擬機器裡跑命令
安裝jdk
mkdir /home/zpzeng/app
tar -zxvf jdk-8u162-linux-x64.tar.gz -C /home/zpzeng/app #解壓
配置環境變數
vi /etc/profile
在檔案最後新增一下內容:
export JAVA_HOME=/home/zpzeng/app/jdk1.8.0_162
export PATH=$PATH:$JAVA_HOME/bin
重新整理配置,使其生效
source /etc/profile
搭建偽zk叢集
1、將zk安裝包copy到/home/zpzeng/zk34/
2、建立三個節點路徑:node1,node2,node3,並將zk壓縮包分別解壓到三個節點路徑下,形成如下的結構
/home/zpzeng/zk34/node1
/home/zpzeng/zk34/node2
/home/zpzeng/zk34/node3
3、在node路徑下,建立data路徑,logs路徑,在data路徑下建立myid檔案。myid檔案的內容是當前節點在叢集中的編號,node1節點的編號就寫成1,後邊的node2的編號是2,node3的編號就是3。
4、為每個節點建立配置檔案
檔案解壓後自帶一個sample的配置檔案,/node1/conf/zoo_sample.cfg。要麼新建一個zoo.cfg的配置檔案,要麼將sample檔案改成zoo.cfg,需要在每個節點上都修改
配置內容如下,可以按照各自需求修改。此處因為是在一臺虛擬機器上模擬3個zk機器,實際zk配置在3臺機器上,配置上有些不一樣,後文會提到。
模擬的時候,每個節點的dataDir,dataLogDir,clientPort要注意不一樣
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/home/zpzeng/zk34/node1/data
dataLogDir=/home/zpzeng/zk34/node1/logs
clientPort=2181
server.1=192.168.197.2:8881:7771
server.2=192.168.197.2:8882:7772
server.3=192.168.197.2:8883:7773
欄位的解釋如下:
tickTime: zookeeper中使用的基本時間單位,毫秒值,比如可以設為1000,那麼基本時間單位就是1000ms,也就是1s。
initLimit: zookeeper叢集中的包含多臺server,其中一臺為leader,叢集中其餘的server為follower,initLimit引數配置初始化連線時,follower和leader之間的最長心跳時間。如果該引數設定為5,就說明時間限制為5倍tickTime,即5*1000=5000ms=5s。
syncLimit: 該引數配置leader和follower之間傳送訊息,請求和應答的最大時間長度。如果該引數設定為2,說明時間限制為2倍tickTime,即2000ms。
dataDir: 資料目錄. 可以是任意目錄,一般是節點安裝目錄下data目錄。
dataLogDir: log目錄, 同樣可以是任意目錄,一般是節點安裝目錄下的logs目錄。如果沒有設定該引數,將使用和dataDir相同的設定。
clientPort: 監聽client連線的埠號。
server.X=A:B:C 其中X是一個數字, 表示這是第幾號server,它的值和myid檔案中的值對應。A是該server所在的IP地址。B是配置該server和叢集中的leader交換訊息所使用的埠。C配置選舉leader時所使用的埠。由於配置的是偽叢集模式,所以各個server的B, C引數必須不同,如果是真正分散式叢集,那麼B和C在各個節點上可以相同,因為即使相同由於節點處於不同的伺服器也不會導致埠衝突。
5、啟動zk叢集
bin/zkServer.sh start
如果沒有執行許可權
chmod a+xwr bin/zkServer.sh
6、啟動之後通過bin/zkServer.sh status 檢視是否真的啟動成功,start之後的結果並不一定是真的啟動成功了
正常結果如下
ZooKeeper JMX enabled by default
Using config: /home/zpzeng/zk34/node3/bin/../conf/zoo.cfg
Mode: leader
ZooKeeper JMX enabled by default
Using config: /home/zpzeng/zk34/node2/bin/../conf/zoo.cfg
Mode: follower
7、如果沒有啟動成功,可以通過Zookeeper.out檢視日誌。
如果開啟out報錯
nohup: failed to run command ‘java’: No such file or directory
那麼在zkServer.sh開頭加入之前配置的jdk地址,重新啟動就好了
export JAVA_HOME=/home/zpzeng/app/jdk1.8.0_162
export PATH=$PATH:$JAVA_HOME/bin
8.在虛擬機器裡啟動
bin/zkCli.sh -server 192.168.197.2
如果是同樣java的報錯,在sh里加上第7步的環境變數配置
如此在虛擬機器裡已經能正常連線了。
但是!在主機裡面,cmd連線虛擬機器叢集連線不上,能ping通ip,但是埠就是連線不上。
然後把虛擬機器的防火牆給幹掉了,下面命令重啟後生效
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
真機部署
1、防火牆應該是開放部分埠
2、zoo.cfg的配置,每個機器的埠可以一樣, 只要配置的ip不一樣就可以