zookeeper集群搭建
zookeeper概述
Zookeeper是一个分布式的、开源的分布式应用协调服务。它暴露了一组简单的基础原件,分布式应用可以在这些原件之上实现更高级别的服务,如同步、配置维护、群组、和命名。它被设计成容易编程实现的,并且使用一个常见的文件系统的树型结构的数据模型。它运行在Java中,并且绑定了Java和C。
众所周知,协调服务很难做对。它们特别容易发生像文件竞争条件问题和死锁的错误。Zookeeper的动机就是缓解分布式应用从头开始实现分布式协调服务的责任。设计目标
简单。Zookeeper允许程序通过一个共享的类似于标准文件系统的有组织的分层命名空间分布式处理协调。命名空间包括:数据寄存器 - 在Zookeeper中叫znodes, 它和文件、目录一样。和一般文件系统的不同之处是,它的设计就是为了存储,Zookeeper的数据保持在内存中,这就意味着它可以实现高吞吐量和低延迟的数据。
Zookeeper的实现提供了一个优质的高性能、高可用,严格的访问顺序。Zookeeper的性能方面意味着它可以用于大型的分布式系统。可靠性方面防止它成为一个单点故障。严格的顺序意味着可以在客户端实现复杂的同步原件。
复制。像分布式处理一样,Zookeeper自己在处理协调的时候要复制多个主机。
Zookeeper服务的组成部分必须彼此都知道彼此,它们维持了一个内存状态影像,连同事务日志和快照在一个持久化的存储中。只要大多数的服务器是可用的,Zookeeper服务就是可用的。客户端连接到一个单独的服务。客户端保持了一个TCP连接,通过这个TCP连接发送请求、获取响应、获取watch事件、和发送心跳。如果这个连接断了,会自动连接到其他不同的服务器。
序列。Zookeeper用数字标记每一个更新,用它来反射出所有的事务顺序。随后的操作可以使用这个顺序去实现更高级的抽象,例如同步原件。
快速。它在”Read-dominant”工作负载中特别快。Zookeeper 应用运行在数以千计的机器上,并且它通常在读比写多的时候运行的最好,读写大概比例在10:1。
zookeeper集群服务器数量必须是奇数台,因此集群最少3太服务器,本案例以CentOS7 mini为例,分三台服务器。
永久修改主机名:hostnamectl –static set-hostname 你的主机名称
1.下载zookeeper
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.2-alpha/zookeeper-3.5.2-alpha.tar.gz
tar -zxvf zookeeper-3.5.2-alpha.tar.gz
mv zookeeper-3.5.2-alpha /root/zookeeper # 将zookeeper放在root目录下
2.配置zookeeper
cd /root/zookeeper
mkdir data # 存数据用
mkdir logs # 存日志用
cp /conf/zoo_sample.cfg /conf/zoo.cfg # 建立配置文件
编辑zoo.cfg,增如下几行代码:
dataLogDir=/root/zookeeper/logs # 配置日志存放目录
server.1=192.168.1.101:2888:3888 # zookeeper服务器1
server.2=192.168.1.102:2888:3888 # zookeeper服务器2
server.3=192.168.1.103:2888:3888 # zookeeper服务器3
改如下一行代码:
dataDir=/root/zookeeper/data # 配置数据存放目录
设置myid:
echo 1 > /root/zookeeper/data/myid
3.配置各服务器节点
假设如上步骤都是在zookeeper服务器1执行的,那么服务器1的zookeeper已经配置完毕。现在配置zookeeper服务器2和3。
将zookeeper拷贝至服务器2和3:
scp -r /root/zookeeper root@192.168.1.102:/root
... # 输入192.168.1.102服务器的密码进行拷贝
echo 2 > /root/zookeeper/data/myid # 设置myid
scp -r /root/zookeeper root@192.168.1.102:/root
...# 输入192.168.1.103服务器的密码进行拷贝
echo 3 > /root/zookeeper/data/myid # 设置myid
4.关闭防火墙服务
service iptables stop # 关闭防火墙
如果执行以上命令,提示‘Failed to stop iptables.service:Unit iptables.service not loaded.’,那么你可能需要安装iptables-services包,具体安装命令:
yum install iptables-services
附:
service iptables start # 开启
service iptables stop # 关闭
service iptables status # 当前状态
或:
systemctl start iptables.service # 开启
systemctl stop iptables.service # 关闭
systemctl status iptables.service # 当前状态
5.修改环境变量
vi /etc/profile(修改文件)
在profile文件中添加内容:
export ZOOKEEPER_HOME=/root/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
重新编译文件:
source /etc/profile
注意:3台zookeeper都需要修改
6.启动zookeeper服务
zkServer.sh start
查看当前状态:
zkServer.sh status
当查看当前状态时,如果你发现报错:‘Error contacting service. It is probably not running.’,这很有可能是你防火墙没有关闭,所以,1.请先开启防火墙,再关闭防火墙。
出现这个错误的时候,我们可以从日志中查看详情。具体步骤:
1.先停止zookeeper服务: zkServer.sh stop
2.以start-foreground方式启动,会看到启动日志:zkServer.sh start-foreground如果关闭防火墙仍然没有解决这个问题,那么有可能是 2.没有建立主机和ip之间的映射关系
1.用vim打开/etc/hosts文件,添加映射关系
hosts文件的格式:IP地址 主机名/域名
2.
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.101 mini1 mini1 # 增 192.168.1.102 mini2 mini2 # 增 192.168.1.103 mini3 mini3 # 增
7.停止zookeeper服务
zkServer.sh stop
8.zookeeper集群自动启动脚本
创建文件start.sh,写入yi一下内容:
#!/bin/sh
echo "start zkServer..."
for i in 1 2 3
do
ssh mini$1 "source /etc/profile;/root/zookeeper/bin/zkServer start"
done
执行:
chmod +x start.sh # 给脚本加执行权限
bash start.sh
... # 依次输入各服务器的登录密码即可