作者:吟伶逸慧喜靖 | 来源:互联网 | 2023-06-04 14:04
近期需要整理MIT6.824 中 分布式系统协调服务 zookeeper 的一些知识,想要在Mac 本地搭建一个可以方便运行调试的zookeeper环境,这玩意竟然耗费了一上午的时间,实在是不可忍;当然,主要还是因为对Java的编译运行环境 以及 周边工具不太熟悉。
希望能够为后续想要学习的同学们节省更多的时间。
OS环境:MAC zookeeper 版本:3.5.8 (更高版本 因为变更了编译配置,所以没有去搞) java环境:15.0.1
文章目录 1. 编译前基本环境准备 2. 编译 及 导入 Intellij IDEA 3. Zookeeper 运行环境配置
1. 编译前基本环境准备 安装基本的java以及jdk 运行java --version
,显示如下: 表示java环境已经配置好了,不需要再进行java环境的配置。
否则需要执行如下步骤: a. 安装java brew install java
b. 安装jdk环境,通过https://www.oracle.com/java/technologies/javase-jdk15-downloads.html 下载mac操作系统的最新版本jdk,直接按照正常的软件安装方式安装即可。
安装软件,这里还是用强大通用的intellij-idea
即可 brew cask intall intellij-idea
,可能需要搞一个破解的,这里就看大家各显神通了,淘宝、闲鱼啥的
安装maven
,用来安装java的包依赖 brew install mvnvm
最后运行mvn --version
,显示如下表示安装成功
通过mvn 安装idea
的java依赖包 mvn -e idea:idea
或者 也可以通过 后面下载好的zookeeper代码中的pox.xml
导入到idea打开的zookeeper项目中
安装ant https://ant.apache.org/bindownload.cgi 下载最新的tar包,将解压好的目录中的bin文件可以添加到环境变量中export PATH=$PATH:/xxx/bin/
。 大家都说这是一个巨古老的java编译方式,比较好奇zookeeper为什么还会一直用
zookeeper 3.5.8 源码准备
git clone https://github.com/apache/zookeeper.gitgit checkout branch-3.5.8
2. 编译 及 导入 Intellij IDEA 编译 zookeeper代码 a. cd zookeeper
b. ant eclipse
导入Intellij IDEA 打开zookeeper目录即可
项目的依赖配置,这里主要是指定一下jdk版本即可 command + ;
打开项目配置 或者 File --> Project Structure 因为我们已经下载了最新版本的sdk,所以这里Add JDK之后会默认打开已经下载好的目录,直接Open即可
配置zookeeper项目的依赖包 找到zookeeper目录下的pox.xml文件,右键点击 进行Reimport
3. Zookeeper 运行环境配置 zoo.cfg 配置 zookeeper服务运行的时候需要加载zoo.cfg 文件,这个文件默认是没有的,但是zoo_sample.cfg
文件存储在下载好的源码目录中:zookeeper/conf
可以cp zoo_sample.cfg zoo.cfg
,可以直接用默认的配置即可(测试也只是本地运行,非集群模式)
zookeeper 的编译运行配置 zk的运行需要通过主类 org.apache.zookeeper.server.ZooKeeperServerMain
启动 编辑 run configuration
将主类信息,zoo.cfg绝对路径,你的zookeeper主目录添加进去 如下:
运行 点击运行,Intellij IDEA会先编译,再运行zk server
如果,编译过程中出现如下问题: a. SLF4J: Class path contains multiple SLF4J bindings.
同时这个错误下应该还会有两个冲突路径,大体原因是再初始化日志模块时发现zk依赖了两个日志类,java认为是有冲突的,我的做法是将其中的一个直接注掉(mv xx xx-bak),因为我的两个冲突日志类是一样的,之前执行mvn -e idea:idea的时候有一部分类导入了两次。
或者更好的解决办法是 从项目的依赖中将另一个类的路径 标记为exclude中的一项。
b. log4j:WARN No appenders could be found for logger
这个问题同样是日志问题,是找不到log4j的初始化配置,即同样存在于目录zookeeper/conf/log4j.properties
文件。
我的做法是直接将绝对路径设置到运行时的编译配置中。 回到 Exit configuration command + option + r
添加路径: -Dlog4j.configuration=file:/Users/xxxxx/IdeaProjects/zookeeper/conf/log4j.properties
到VM options
选项中即可 再次运行 即zk sever 已经正常启动,并输出日志:
链接测试 再用终端的zkCli.sh
工具链接测试,能够与server通信,进入zk交互命令行成功
cd /zookeeper/bin sh zkCli.sh.. . 2020-11-15 13:31:40,529 [ myid:] - INFO [ main:ClientCnxn@1653] - zookeeper.request.timeout value is 0. feature enabled= Welcome to ZooKeeper! 2020-11-15 13:31:40,539 [ myid:localhost:2181] - INFO [ main-SendThread( localhost:2181) :ClientCnxn$SendThread@1112 ] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL ( unknown error) JLine support is enabled 2020-11-15 13:31:40,554 [ myid:localhost:2181] - INFO [ main-SendThread( localhost:2181) :ClientCnxn$SendThread@959 ] - Socket connection established, initiating session, client: /127.0.0.1:58600, server: localhost/127.0.0.1:2181 2020-11-15 13:31:40,599 [ myid:localhost:2181] - INFO [ main-SendThread( localhost:2181) :ClientCnxn$SendThread@1394 ] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x10057c92b3d0000, negotiated timeout = 30000WATCHER::WatchedEvent state:SyncConnected type:None path:null[ zk: localhost:2181( CONNECTED) 4] stat / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1