Linux安装zookeeper
解压zookeeper压缩包
tar -zxf zookeeper-3.4.14.tar.gz
在conf中复制zoo_sample.cfg并重命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg的dataDir和dataLogDir,
默认的只有dataDir=/tmp/zookeeper,这个存放位置是临时目录里
建议在zookeeper安装目录创建data和logs文件夹。将路径改到这里
设置环境变量
vim /etc/profile
export ZOOKEEPER_HOME=/usr/devtools/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
刷新配置
source /etc/profile
启动
zkServer.sh start …/confg/zoo.cfg
查看运行状态
zkServer.sh status
停止服务
zkServer.sh stop
重启服务
zkServer.sh restart
zookeeper目录
- bin:主要的一些运行命令(.sh是linux上运行,.cmd是在window上运行)
- conf:存放配置文件,其中有我们要修改的zk.cfg
- contrib:附加的一些功能
- dist-maven:mvn编译后的目录
- docs:文档
- lib:需要依赖的jar包
- recipes:案例demo代码
- src:源码
zoo.cfg配置
- tickTime:用于计算的时间单元
- initLimit:用于集群,允许从节点连接并同步到master节点的初始化连结时间,以tickTime的倍数来表示
- syncLimit:用于集群,master主节点 与从节点之间发送消息,请求和应答的时间长度(心跳机制)
- dataDir:必须配置(不建议使用/tmp 临时目录)
- dataLogDir:日志目录,如果不配置和dataDir共用
- clientPort:连结服务器的的端口,默认2181
zookeeper基本数据模型:
- 根目录:/
- 每个节点都成为znode
- 节点分为临时节点和永久节点
- 每个zk节点都有各自的版本号
- 每个节点数据发生变化,那么节点版本号会累加
- 修改/删除过时节点,版本号不匹配会报错
- 每个zk节点存储数据不宜过大
- 节点可以设置权限acl,可以通过权限来限制客户的访问
数据模型的基本操作
- 客户端连接
- 查看znode结构
- 关闭客户端连接(Ctrl + c)
zk的作用体现
- master节点选举,主节点挂了以后,从节点会接手工作,并保证这个节点是唯一的,这也就是首脑模式。保证了集群式高可用的
- 统一配置文件管理。只需要部署一台服务器,则可以把配置文件同步更新到所有服务器上。
- 发布与订阅,类似消息队列MQ
- 提供了分布式锁,分布式环境中不同进程争夺资源,类似多线程中的锁
- 集群管理,集群中保证数据的强一致性
zk的常用命令
- ls :查看目录(节点)
- stat:查看节点状态
- ls2:查看节点状态,相当于ls+stat
- get:取出当前节点的数据
- create:
create /demo 属性 创建一个非顺序持久节点demo
create -e /demo 属性 创建一个临时节点demo
create -s /demo 属性 创建一个顺序节点demo - set命令
- delete命令
节点状态信息
cZxid:zookeeper为该节点分配的id
ctime:创建时间
mZxid:修改后分配的id
mtime:修改时间
pZxid:子节点id
cvision:子节点版本号
dataVersion:当前节点的版本号
aclVersion:权限版本号
ephemeralOwner:0x0表示持久节点
dataLength:数据长度
numChildren:子节点个数
watcher
- 针对每个节点的操作,都会有一个监听者
- 当监控的某个对象(znode)发生变化,则会触发watcher事件
- zk中的watcher是一次性的,触发后会立即销毁
- 针对不同类型的操作,触发的watcher是不同的
- 通过get path [watch]设置 watcher事件
- 通过stat path [watch]设置 watcher事件
- 通过setpath [watch]设置 watcher事件
- 。。。。。。
Watcher事件类型
- 创建父节点触发:NodeCreated
- 修改父节点数据触发:NodeDataChanged
- 删除父节点触发:NodeDeleted
- ls为父节点设置watcher,创建/删除子节点触发:NodeChildrenChanged
- ls为父节点设置watcher,修改i子节点不会触发事件
watcher使用场景
- 统一资源配置
- ————————
ACL权限控制
- 针对节点可以设置相关读写等权限,目的为了保障数据的安全性
- 权限permissions可以指定不同的权限范围以及角色
ACL命令行
- getAcl:获得某个节点的acl权限信息
- setAcl:设置某个节点的acl权限信息
- addauth:输入认证授权信息,注册时输入明文密码(登录),但是在zk的系统中,密码是以加密的形式存在的
ACL的构成
- zk的acl通过[scheme:id:permissions]构成
scheme:采用的某种权限机制
id:允许访问的用户
permissions:权限组合字符串
scheme
- world:world下只有一个id,也就是anyone,写法为
world:anyone:[permissions] - auth:认证登录,需要注册用户有权限就可以。形式为
auth:user:password:[permissions] - digest:需要对密码加密才能访问,组合形式为
digest:username:BASE64(SHA1(password)):[permissions] - 当设置为id指定的ip地址,此时限制ip进行访问
- super:代表超级管理员,拥有所有的权限
permissions
- 权限字符串缩写crdwa
- create:创建子节点
- read:获得节点/子节点
- write:设置节点数据
- delete:删除子节点
- admin:设置权限
zookeeper集群搭建
- zk集群,主从节点,心跳机制(选举模式)
- 通过./zkCli.sh -server[ip]:[port]检测集群是否配置成功
伪分布式集群搭建
- 复制三个zookeeper,zoo.cfg配置文件中的clientPort改成不同端口
- 每个zoo.cfg配置文件中都配置servlet
servlet.1=192.168.1.111:2888:3888
servlet.2=192.168.1.111:2889:3889
servlet.3=192.168.1.111:2890:3890 - 在每个dataDir中分别
创建myid文件,内容对应servlet后的X - 启动三个服务器 ./zkServer.sh start …/conf/zoo1.cfg启动对应配置的服务器
- 通过客户端-server[ip]:[port]去连接不同的服务器
- 在客户端去创建节点会发现每个zookeeper数据会同步
真实环境集群搭建
- 需要注意:环境变量的配置,ip配置不同,端口号建议相同
- 启动三个虚拟机,ip设置成不同的
- 修改每个虚拟机上的zoo.cfg配置,保持一致。配置和伪集群一样。只是设置servlet的id为真实id
- 启动三个zookeeper,查看状态会发现有一个leader和两个follower
- 客户端通过ip和port去连接服务器,创建节点
- 在其他虚拟机上去通过客户端连接服务器,可以发现数据同步
zookeeper原生api
建立客户端与服务端的连接
public class ZKConnect implements Watcher{
final static Logger log = LoggerFactory.getLogger(ZKConnect.class);
//单机
public static final String zkServerPath ="192.168.1.110:2181";
//集群
//public static final String zkServerPath ="192.168.1.110:2181 ,192.168.1.111:2181 ";
public static final Integer timeout = 5000;
public static void main(String[] args) throws Exception{
/**
*客户端和服务器连接是一个异步过程,连接成功客户端会收到watch通知
*connectString:服务器Ip地址
*sessionTimeout:超时时间
*watcher:通知事件,不需要的话设置为null
*canBeReadOnly:可读,断开后还是可读数据,只是不能写。读的是旧数据,建议设置false,不使用
*sessionId:会话的Id
*sessionPasswd:会话密码,根据sessionId和sessionPasswd在会话丢失后重新获取lianjie
*/
ZooKeeper zk = new Zookeeper(zkServerPath, timeout, new ZKConnect());
long sessionId = zk.getSessionId();
byte[] sessionPassword = zk.getSessionPasswd();
log.info("客户端开始连接zookeeper服务器");
log.info("连接状态:{}", zk.getState());
//给服务器响应的时间
new Thread().sleep(2000);
log.info("连接状态:{}", zk.getState());
//重新获取连接,实际生产中一般sessionId,sessionPassword会放到session或者redis中。
ZooKeeper zk = new Zookeeper(zkServerPath, timeout, new ZKConnect() ,sessionId, sessionPassword);
}
@Override
public void process(WatchedEvent event){
log.info("实现Watcher类,重写process通知方法,连接成功后会自动执行此方法");
}
}
使用命令查看会话信息
echo dump | nc locahost 2181
去验证连接的是不是同一个会话
节点的增删改查
public class ZKConnect implements Watcher{
private ZooKeeper zookeeper = null;
//单机
public static final String zkServerPath ="192.168.1.110:2181";
public static final Integer timeout = 5000;
public ZKNodeOperator(){};
//创建会话连接
public ZKNodeOperator(String connectString){
try{
zookeeper = new Zookeeper(connectString, timeout, new ZKConnect());
}catch (IOException e){
e.printStackTrace();
if(zookeeper != null){
try{
zookeeper.close();
} catch (InterruptedException e1){
e1.printStackTrace();
}
}
}
};
public static void main(String[] args) throws Exception{
ZKNodeOperator zkServer = new ZKNodeOperator(zkServerPath);
zkServer .createZKNode("/testnode","testnode".getBytes(),Ids.OPEN_ACL_UNSAFE)
}
//创建节点
public void createZKNode(String path, byte[] data, List<ACL> acls){
String result = "";
try{
/**
*同步 创建节点 create() 参数
*path:创建路径
*data:存储的数据的byte[]
*acl:权限策略
* Ids.OPEN_ACL_UNSAFE
* CREATOR_ALL_ACL
*createMode:节点类型,是一个枚举
* PERSISTENT:持久节点
* PERSISTENT_SEQUENTIAL:持久顺序节点
* EPHEMERAL:顺时节点
* EPHEMERAL_SEQUENTIAL:临时顺时节点
*/
result = zookeeper.create(path, data, acls, CreateMode.EPHEMERAL);
System.out.pringln("创建节点");
} catch (Exception e){
e.printStackTrace();
}
}
//同步修改节点path:节点路径,data:数据,version:数据状态
Stat status = zkServer.getZookeeper().setData(“/testnode”, "xyz".getBytes(), 2);
//同步删除节点path:节点路径,version:数据状态版本号
zkServer.getZookeeper().delete("/testnode", 1);
}
################################################

本文详细介绍了在Linux环境下安装ZooKeeper的过程,包括解压、配置环境变量、启动和停止服务等步骤。同时,深入讲解了ZooKeeper的基本数据模型、配置参数、常见命令及集群搭建方法,涵盖伪分布式和真实环境下的集群配置。
6050

被折叠的 条评论
为什么被折叠?



