在同一台机器(即伪集群)上,启动三个zookeeper,三个分别使用不同的配置文件
Zookeeper的单机版安装
从官网上下载zookeeper的安装包
1 准备:安装之前请自行安装jdk(如java8)
2 使用wget 命令或者xshell editplus工具远程上传tar包到Linux
(1)使用wget 命令下载zookeeper安装包到linux环境下
命令: wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
(2)推荐方法zookeeper-3.4.14.tar.gz(或者zookeeper-3.4.6.tar.gz等自己选择下载):
点击下载: https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
3 解压zookeeper到安装目录(安装目录自己指定如:/usr/local/zk-standalone/)
tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local/zk-standalone/
重命名:
mv zookeeper-3.4.14.tar.gz zookeeper
进入到zookeeper的conf目录
cd zookeeper/conf/ && cp zoo_sample.cfg zoo.cfg
有三个文件,zookeeper的配置文件叫做zoo.cfg,这里边没有,我们把 zoo_sample.cfg 拷贝一份出来,
使用vim 编辑器编辑zoo.cfg 这是原本的配置,
我们需要更改的地方有以下几点
dataDir是zookeeper的数据目录,可以任意选择,但是这个目录必须要提前创建好,zookeeper是不会帮你创建的
dataDir=/usr/local/zk-standalone/zookeeper3/data
dataLogdir是zookeeper的日志目录,应该要谨慎的选择日志目录,目录必须要提前创建好,如果将日志存放在比较繁忙的设备上,将大大影响系统性能
dataLogDir=/usr/local/zk-standalone/zookeeper3/logData
限制zookeeper的客户端链接数量,设置为0或者不设置表示取消对并发连接的设置
maxClientCnxns=0
最小会话超时时间和最大会话超时时间
minSessionTimeout=4000
maxSessionTimeout=10000
server.id 其中1表示这是第几号server,用来做集群中的区别的192.168.9.103是该server所在的ip地址
2888是该server和集群中的leader通信端口,3888是选举leader的端口
server.1=zkcluster:2881:3881
注意:
指定主机名和ip映射关系=>Linux下/etc/hosts文件
写入如:192.168.9.103 zkcluster
在之前设置的dataDir中新建myid文件,写入一个数字,该数字表示这是第几号server,该数字必须和zoo.cfg文件中的server.X中的X一 一对应
#在dataDir中创建myid文件并写入 1
echo 1 >myid
#查看myid
cat myid
更改后的文件如下
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zk-standalone/zookeeper3/data
logDataDir=/usr/local/zk-standalone/zookeeper3/logData
clientPort=2181
进入到zookeeper的安装目录 执行bin/zkServer.sh start
出现 QuorumPeerMain这个进程的时候就说明zookeeper已经安装成功了
[root@zcczxx zk-cluster]# jps
42913 QuorumPeerMain
43081 Jps
接下里进入zookeeper的客户端查看
进入zookeeper的安装目录执行bin/zkCli.sh
执行ls / 查看当前根目录下的节点 发现有一个zookeeper的节点
至此zookeeper的单机版安装成功!
集群版
(1)安装JDK
1.下载linux jdk8的tar包上传至服务器
使用xftp将jdk源码包,上传到/usr/local(软件一般安装到这个目录)
2.解压tar包
tar -zxvf jdk-8u271-linux-x64.tar.gz
删除tar包
rm -f jdk-8u181-linux-x64.tar.gz
3.配置环境变量
/etc/profile文件的改变会涉及到系统的环境,也就是有关Linux环境变量的东西
所以,我们要将jdk配置到/etc/profile,才可以在任何一个目录访问jdk
vim /etc/profile
在profile文件末尾添加如下配置:
export JAVA_HOME=/usr/local/jdk1.8.0_217 #jdk安装目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
保存并退出
配置环境立即生效:
source /etc/profile
4.验证是否安装成功
javac
java -version
至此安装配置jdk8结束
(2)Zookeeper压缩包上传到服务器
(3)将Zookeeper解压 ,创建data目录 ,将 conf下zoo_sample.cfg 文件改名为 zoo.cfg
(4)建立/usr/local/zookeeper-cluster目录,将解压后的Zookeeper复制到以下三个目录
mkdir /usr/local/zookeeper-cluster/zookeeper-1
mkdir /usr/local/zookeeper-cluster/zookeeper-2
mkdir /usr/local/zookeeper-cluster/zookeeper-3
配置每一个Zookeeper 的dataDir(zoo.cfg) clientPort 分别为2181 2182 2183
修改2181
vim /usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
clientPort=2181
dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data
dataLogDir=/usr/local/zk-cluster/zookeeper-1/logData
修改2182
/usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
clientPort=2182
dataDir=/usr/local/zookeeper-cluster/zookeeper-2/data
dataLogDir=/usr/local/zk-cluster/zookeeper-2/logData
修改2183
/usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
clientPort=2183
dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data
dataLogDir=/usr/local/zk-cluster/zookeeper-3/logData
2.2.3配置集群
在每个zookeeper的 data 目录下创建一个 myid 文件,内容分别是1、2、3 。这个文件就是记录每个服务器的ID
-------知识点小贴士------
如果你要创建的文本文件内容比较简单,我们可以通过echo 命令快速创建文件
格式为:
echo 内容 >文件名
例如我们为第一个zookeeper指定ID为1,则输入命令
echo 1 > myid
(2)在每一个zookeeper 的 zoo.cfg配置客户端访问端口(clientPort)和集群服务器IP列表。
集群服务器IP列表如下
server.1=192.168.25.140:2881:3881
server.2=192.168.25.140:2882:3882
server.3=192.168.25.140:2883:3883
解释:server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口
2.2.4启动集群
启动集群就是分别启动每个实例。
zookeeper-1/bin/zkServer.sh start
zookeeper-2/bin/zkServer.sh start
zookeeper-3/bin/zkServer.sh start
启动后我们查询一下每个实例的运行状态
zookeeper-1/bin/zkServer.sh status
zookeeper-2/bin/zkServer.sh status
zookeeper-3/bin/zkServer.sh status
先查询第一个服务Mode为follower表示是跟随者(从)
再查询第二个服务Mod 为leader表示是领导者(主)
查询第三个为跟随者(从)
2.2.5模拟集群异常
(1)首先我们先测试如果是从服务器挂掉,会怎么样
把3号服务器停掉,观察1号和2号,发现状态并没有变化
由此得出结论,3个节点的集群,从服务器挂掉,集群正常
(2)我们再把1号服务器(从服务器)也停掉,查看2号(主服务器)的状态,发现已经停止运行了。
由此得出结论,3个节点的集群,2个从服务器都挂掉,主服务器也无法运行。因为可运行的机器没有超过集群总数量的半数。
(3)我们再次把1号服务器启动起来,发现2号服务器又开始正常工作了。而且依然是领导者。
(4)我们把3号服务器也启动起来,把2号服务器停掉(汗~~干嘛?领导挂了?)停掉后观察1号和3号的状态。发现新的leader产生了~
由此我们得出结论,当集群中的主服务器挂了,集群中的其他服务器会自动进行选举状态,然后产生新得leader
(5)我们再次测试,当我们把2号服务器重新启动起来(汗~~这是诈尸啊!)启动后,会发生什么?2号服务器会再次成为新的领导吗?我们看结果
我们会发现,2号服务器启动后依然是跟随者(从服务器),3号服务器依然是领导者(主服务器),没有撼动3号服务器的领导地位。哎~退休了就是退休了,说了不算了,哈哈。
由此我们得出结论,当领导者产生后,再次有新服务器加入集群,不会影响到现任领导者。
error 错误
安装zookeeper时候,可以查看进程启动,但是状态显示报错:Error contacting service. It is probably not running
安装zookeeper-3.4.6的时候,启动正常没报错,但zkServer.sh status查看状态的时候却出现错误,如下:
JMX enabled by default
Using config: /hadoop/zookeeper/bin/…/conf/zoo.cfg
Error contacting service. It is probably not running.
jps查看进程,却发现进程已启动
7313 QuorumPeerMain
如:没有jps命令时
安装open-jdk后发现jps不能用,此时需要安装另外一个包才能使用
通过以下命令进行安装:
sudo yum install java-1.8.0-openjdk-devel.x86_64
在网上查阅资料一共有三种解决方法:
如果配置了日志(dataLogDir=/usr/local/zk-cluster/zookeeper-1/logData)可以首先查看日志记录
1,打开zkServer.sh 找到status)
STAT=echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode
在nc与localhost之间加上 -q 1 (是数字1而不是字母l)
如果已存在则去掉
注:因为zookeeper是3.4.5版本,所以在我的zkServer.sh脚本文件里根本没有这一行,所以没有生效
2,调用sh zkServer.sh status 遇到这个问题。百度,google了后发现有人是修改sh脚本里的一个nc的参数来解决,可在3.4.5的sh文件里并没有找到nc的调用。配置文档里指定的log目录没有创建导致出错,手动增加目录后重启,问题解决。
注:我想不是日志的问题所以这个方法根本就没有试
3,创建数据目录,也就是在你zoo.cfg配置文件里dataDir指定的那个目录下创建myid文件,并且指定id,改id为你zoo.cfg文件中server.1=localhost:2888:3888中的 1.只要在myid头部写入1即可.
注:在我第二次安装的时候,没有将myid文件创建在dataDir指定的那个目录下,也报了该错误。之后在dataDir指定的那个目录下创建myid文件就没有报错。
4 因为防火墙没有关闭。关闭防火墙:
#查看防火墙状态
service iptables status 或者systemctl status iptables
#关闭防火墙
service iptables stop 或者 systemctl stop iptables
#查看防火墙开机启动状态
chkconfig iptables --list
#关闭防火墙开机启动
chkconfig iptables off
注意:我的确在开始时候没有关闭防火墙,但是当我关闭防火墙之后也没有解决问题。
5 没有建立主机和ip之间的映射关系。
建立主机和ip之间映射关系的命令为 vim /etc/hosts 在文件的末端加入各个主机和ip地址之间的映射关系就可以了。
注意:只有在建立了映射关系之后,才可以将在同一个网段下的机器利用主机名进行文件传递。问题解决!
Linux的/etc/hosts文件