zookeeper安装简略笔记

本文详细介绍了在Linux环境下安装ZooKeeper的过程,包括解压、配置环境变量、启动和停止服务等步骤。同时,深入讲解了ZooKeeper的基本数据模型、配置参数、常见命令及集群搭建方法,涵盖伪分布式和真实环境下的集群配置。
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,可以通过权限来限制客户的访问
数据模型的基本操作
  1. 客户端连接
  2. 查看znode结构
  3. 关闭客户端连接(Ctrl + c)
zk的作用体现
  1. master节点选举,主节点挂了以后,从节点会接手工作,并保证这个节点是唯一的,这也就是首脑模式。保证了集群式高可用的
  2. 统一配置文件管理。只需要部署一台服务器,则可以把配置文件同步更新到所有服务器上。
  3. 发布与订阅,类似消息队列MQ
  4. 提供了分布式锁,分布式环境中不同进程争夺资源,类似多线程中的锁
  5. 集群管理,集群中保证数据的强一致性
zk的常用命令
  1. ls :查看目录(节点)
  2. stat:查看节点状态
  3. ls2:查看节点状态,相当于ls+stat
  4. get:取出当前节点的数据
  5. create:
    create /demo 属性 创建一个非顺序持久节点demo
    create -e /demo 属性 创建一个临时节点demo
    create -s /demo 属性 创建一个顺序节点demo
  6. set命令
  7. 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
    1. create:创建子节点
    2. read:获得节点/子节点
    3. write:设置节点数据
    4. delete:删除子节点
    5. admin:设置权限

zookeeper集群搭建

  • zk集群,主从节点,心跳机制(选举模式)
  • 通过./zkCli.sh -server[ip]:[port]检测集群是否配置成功
伪分布式集群搭建
  1. 复制三个zookeeper,zoo.cfg配置文件中的clientPort改成不同端口
  2. 每个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
  3. 在每个dataDir中分别创建myid文件,内容对应servlet后的X
  4. 启动三个服务器 ./zkServer.sh start …/conf/zoo1.cfg启动对应配置的服务器
  5. 通过客户端-server[ip]:[port]去连接不同的服务器
  6. 在客户端去创建节点会发现每个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);
}	

################################################

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值