Zookeeper 下载安装 单机 集群

博文目录


下载安装

官网
官网下载
apache-zookeeper-3.6.2-bin.tar.gz
apache-zookeeper-3.5.8-bin.tar.gz

cd /application
wget https://mirrors.ocf.berkeley.edu/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
tar zxf apache-zookeeper-3.5.8-bin.tar.gz
mv apache-zookeeper-3.5.8-bin zookeeper-3.5.8
cd zookeeper-3.5.8

单机模式

我习惯把数据和配置都放到一起, 所以在zookeeper目录下创建 mrathena 目录

# 到 conf 目录中复制一份儿默认配置, 并重命名, 默认使用 zoo.cfg 配置文件
# bin/zkServer.sh 启动默认读取 conf/zoo.cfg 作为配置文件
# 如果要指定的配置文件只是一个文件名, 没有包含路径, 那也会去 conf 目录下找
# 如果要指定的配置文件除了文件名还包含路径, 那会从当前工作目录下找这个指定的目录和配置文件
# 如果在zookeeper目录下, 执行 bin/zkServer.sh start mrathena/zoo.cfg
# 如果在zookeeper/mrathena目录下, 执行 ../bin/zkServer.sh start ../mrathena/zoo.cfg
cp conf/zoo_sample.cfg mrathena/zookeeper.config.standalone.2181

编辑 zookeeper.standalone.config.2181 中的部分配置

  • tickTime:用于配置Zookeeper中最小时间单位的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示的。
  • initLimit:该参数用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器再启动过程中,会与Leader建立连接并完成数据的同步,从而确定自己对外提供服务的起始状态。Leader服务器允许Follower再initLimit 时间内完成这个工作。
  • syncLimit:Leader 与Follower心跳检测的最大延时时间
  • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
  • admin.enableServer: 从3.5版本起, 内嵌了一个简易jetty服务, 用于查看(管理?)一些信息, 默认使用8080端口, 可以添加该配置为false来禁用, 也可以添加 admin.serverPort 来指定其他端口
  • server.A=B:C:D:E 其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。如果需要通过添加不参与集群选举以及事务请求的过半机制的 Observer节点,可以在E的位置,添加observer标识。
# 调整 dataDir 配置, 其他配置保持默认
dataDir=/application/zookeeper-3.5.8/mrathena/data.standalone.2181
admin.enableServer=false

启动

# 如果在zookeeper目录下, 执行 bin/zkServer.sh start mrathena/zoo.cfg
# 如果在zookeeper/mrathena目录下, 执行 ../bin/zkServer.sh start ../mrathena/zoo.cfg
bin/zkServer.sh start mrathena/zookeeper.config.standalone.2181
../bin/zkServer.sh start ../mrathena/zookeeper.config.standalone.2181
../bin/zkServer.sh stop ../mrathena/zookeeper.config.standalone.2181

集群模式(类似于Redis的主从模式)

Zookeeper 集群模式一共有三种类型的角色

  • Leader: 处理所有的事务请求(写请求),可以处理读请求,集群中只能有一个Leader
  • Follower:只能处理读请求,同时作为 Leader的候选节点,即如果Leader宕机,Follower节点要参与到新的Leader选举中,有可能成为新的Leader节点。
  • Observer:只能处理读请求。不能参与选举

本例搭建的是伪集群模式,即一台机器上启动四个zookeeper实例组成集群,一个leader, 两个follower, 一个observer,真正的集群模式无非就是实例IP地址不同,搭建方法没有区别

配置

cp zookeeper.config.standalone.2181 zookeeper.config.cluster.2281

在 zookeeper.config.cluster.2281 中添加如下配置信息, 复制多份, 修改 dataDir 和 clientPort

# 3281:该服务器与集群中leader服务器交换信息的端口, 因为是伪集群配置, 所以要分配不同的端口
# 4281:选举时服务器相互通信的端口, 因为是伪集群配置, 所以要分配不同的端口
# participant:是参与者,leader/follower的身份在启动时选举确认, observer:观察者,不参与选举
# 经过测试, 这里配置内网IP就可以了
server.1=172.16.138.202:3281:4281:participant
server.2=172.16.138.202:3282:4282:participant
server.3=172.16.138.202:3283:4283:participant
server.4=172.16.138.202:3284:4284:observer
cp zookeeper.config.cluster.2281 zookeeper.config.cluster.2282
cp zookeeper.config.cluster.2281 zookeeper.config.cluster.2283
cp zookeeper.config.cluster.2281 zookeeper.config.cluster.2284
dataDir=/application/zookeeper-3.5.8/mrathena/data.cluster.2282
clientPort=2282

创建各节点的数据文件夹, 并创建唯一servierId标识文件myid

mkdir data.cluster.2281 data.cluster.2282 data.cluster.2283 data.cluster.2284
echo 1 > data.cluster.2281/myid
echo 2 > data.cluster.2282/myid
echo 3 > data.cluster.2283/myid
echo 4 > data.cluster.2284/myid

启动 停止 查看状态

../bin/zkServer.sh start ../mrathena/zookeeper.config.cluster.2281
../bin/zkServer.sh start ../mrathena/zookeeper.config.cluster.2282
../bin/zkServer.sh start ../mrathena/zookeeper.config.cluster.2283
../bin/zkServer.sh start ../mrathena/zookeeper.config.cluster.2284
../bin/zkServer.sh stop ../mrathena/zookeeper.config.cluster.2281
../bin/zkServer.sh stop ../mrathena/zookeeper.config.cluster.2282
../bin/zkServer.sh stop ../mrathena/zookeeper.config.cluster.2283
../bin/zkServer.sh stop ../mrathena/zookeeper.config.cluster.2284
../bin/zkServer.sh status ../mrathena/zookeeper.config.cluster.2281
../bin/zkServer.sh status ../mrathena/zookeeper.config.cluster.2282
../bin/zkServer.sh status ../mrathena/zookeeper.config.cluster.2283
../bin/zkServer.sh status ../mrathena/zookeeper.config.cluster.2284

也可以通过 查看 /zookeeper/config 节点数据来查看集群配置

[zk: localhost:2281(CONNECTED) 1] get /zookeeper/config
server.1=172.16.138.202:3281:4281:participant
server.2=172.16.138.202:3282:4282:participant
server.3=172.16.138.202:3283:4283:participant
server.4=172.16.138.202:3284:4284:observer
version=0
[zk: localhost:2281(CONNECTED) 2] 

客户端连接

bin/zkCli.sh -server ip1:port1,ip2:port2,ip3:port3
../bin/zkCli.sh -server 172.16.138.202:2281,172.16.138.202:2282,172.16.138.202:2283,172.16.138.202:2284

Zookeeper

private static final String ADDRESS = "116.62.162.48:2281,116.62.162.48:2282,116.62.162.48:2283,116.62.162.48:2284";
private static final int SESSION_TIMEOUT = 60 * 1000;
private static ZooKeeper zooKeeper;
private static final String NODE = "/zookeeper/config";

@Before
public void before() {
	try {
		CountDownLatch countDownLatch = new CountDownLatch(1);
		zooKeeper = new ZooKeeper(ADDRESS, SESSION_TIMEOUT, event -> {
			if (event.getState() == Watcher.Event.KeeperState.SyncConnected && event.getType() == Watcher.Event.EventType.None) {
				countDownLatch.countDown();
				log.info("连接成功!");
			}
		});
		log.info("连接中...");
		countDownLatch.await();
	} catch (Throwable cause) {
		cause.printStackTrace();
	}
}

@Test
public void getTest() {
	try {
		Watcher watcher = new Watcher() {
			@SneakyThrows
			@Override
			public void process(WatchedEvent event) {
				if (event.getType() == Event.EventType.NodeDataChanged && null != event.getPath() && event.getPath().equals(NODE)) {
					byte[] data = zooKeeper.getData(NODE, this, null);
					log.info(new String(data));
				}
			}
		};
		Stat stat = new Stat();
		byte[] data = zooKeeper.getData(NODE, watcher, stat);
		log.info(new String(data));
		TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
	} catch (Throwable cause) {
		cause.printStackTrace();
	}
}

Apache Curator

private static final String ADDRESS = "116.62.162.48:2281,116.62.162.48:2282,116.62.162.48:2283,116.62.162.48:2284";
private static CuratorFramework curator;
private static final String NODE = "/zookeeper/config";

@Test
public void before2() {
	RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
	CuratorFramework curator = CuratorFrameworkFactory.newClient(ADDRESS, retryPolicy);
	curator.start();
}

@Before
public void before() {
	RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
	curator = CuratorFrameworkFactory.builder()
			.connectString(ADDRESS)
			.sessionTimeoutMs(60 * 1000)  // 会话超时时间
			.connectionTimeoutMs(60 * 1000) // 连接超时时间
			.retryPolicy(retryPolicy)
//				.namespace("curator") // 包含隔离名称(初始目录节点?)
			.build();
	curator.start();
}

@Test
public void getSetDataTest() {
	try {
		log.info(new String(curator.getData().forPath(NODE)));
	} catch (Throwable cause) {
		cause.printStackTrace();
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值