近来在研究mqtt+kafka+zookeeper,因为传统的mqtt->DB方式,在程序重启的时候,避免不了会丢失一些数据,但是如果使用mqtt->kafka->DB的方式,那么就可以很大限度的避免数据的丢失。
OK,话不多说,先要部署zookeeper集群,网上示例文章很多,但是自己也免不了走了很多坑,记录下。
本人是在ubuntu的系统下部署的,其他系统,比如centos等估计也差不多。
1、下载安装配置jdk环境,这点就不废话了
2、下载zookeeper
到 http://mirror.bit.edu.cn/apache/zookeeper/ 下载zookeeper压缩文件,并上传到服务器。笔者用的是3.4.12版本。
也可以在服务器用 wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz 命令直接下载,免得还要去上传那么麻烦,反正笔者是这么做了。
3、解压、配置zookeeper
然后肯定要经过一阵噼里啪啦的解压操作(tar -zxvf zookeeper-3.4.12.tar.gz)
解压之后,移动到你想要放置的目录,打开zookeeper配置文件
cd /usr/local/zookeeper/zookeeper-3.4.12/conf
复制zoo_sample.cfg 文件,命名为zoo.cfg,zookeeper启动时,会找zoo.cfg文件
cp zoo_sample.cfg zoo.cfg
编辑 zoo.cfg 文件
vi zoo.cfg
将配置文件设置成如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
server.1=0.0.0.0:2888:3888
server.2=192.168.52.131:2888:3888
server.3=192.168.52.133:2888:3888
然后在dataDir设置的路径上(/usr/local/zookeeper/data),生成一个myid的文件,内容写上1
cd /usr/local/zookeeper/data
vi myid
1
:wq
以上,有几点坑:
- zookeeper集群, 必须要3个以上
- 本机地址,直接写0.0.0.0(写成本机IP,反正我是启动不了)
myid文件的内容数字x,就是配置文件上,本机server设置的server.x,后面其他机子部署的时候,也要写上相应的数值,范围是1-255
配置项(转载):
参数名 | 说明 |
---|---|
clientPort | 无默认值,必须配置,不支持系统属性方式配置。当前服务器对外提供服务端口,客户通过此端口与服务器建立连接,一般设置为1281。集群中不需要统一端口,可任意配置端口。 |
dataDir | 无默认值,必须配置。服务器存储快照文件目录。默认情况下,如果没有配置dataLogDir,那么事务日志也会存储在这个目录中。建议将事务日志目录独立配置。 |
tickTime | 默认值:3000(ms),,不支持系统属性方式配置。用于配置zookeeper中最小时间单元长度,很多运行时的时间间隔都是使用它的倍数来表示的。 |
initLimit | Leader Zookeeper接收集群其他服务器初始化等待最大时间(10*tickTime)。 |
syncLimit | Leader Zookeeper和集群其他服务器通信最大时间(5*tickTime)。 |
server.id=host:port:port 解析
每一行此配置表示一个集群中的一台服务器。其中id为Server ID,用来标识该机器在集群中的编号。同时,在所在服务器的数据目录(/tmp/zookeeper)下创建一个myid文件,该文件只有一行内容,并且是一个数字,就是对应每台服务器的Server ID数字。
比如server.1=IP1:2888:3888的myid中的内容就是1。不同服务器的ID需要保持不同,并且和zoo.cfg文件中server.id中的id和myid文件的内容保持一致。id的取值范围为1~255。
其中,server.id中配置参数的第一个port是集群中其他机器与Leader之间通信的端口,第二个port为当Leader宕机或其他故障时,集群进行重新选举Leader时使用的端口。
----------------------------------------------------------------------------------------------------------
接下来,其他机子,也按照这种方式配置,配置文件内容一样,唯一不同的是server.x,是本机,就写0.0.0.0,否则就写对应的ip,同事dataDir目录下myid要以0.0.0.0的server.x对应,就OJBK了。
4、启动zookeeper
进入zookeeper的bin目录
cd /usr/local/zookeeper/zookeeper-3.4.12/bin
启动
./zkServer.sh start
然后你就会看到
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
然后过一会儿,查看zookeeper启动状态
./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: follower
也可以通过java提供的工具查看是否启动:
jps -lm
1075 org.apache.zookeeper.server.quorum.QuorumPeerMain /usr/local/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
1543 sun.tools.jps.Jps -lm
其他机子,也通过这样的方式,启动zookeeper。
如果启动失败,可以查看bin目录下的zookeeper.out的打印日志,看下是什么错误。
以下记录本人遇到的启动失败错误
Invalid config, exiting abnormally
我遇到这个问题,就是本地ip没有写成0.0.0.0,直接写本机的ip去了,所以,怎么启动都失败nohup: failed to run command `java': No such file or directory
mmp,遇到这个问题,一直以为是jdk没装好(当然也有可能,要自己检测下),后面搞来搞去,才知道是zookeeper文件夹权限问题。我使用ubuntu的账户运行的,然后zookeeper文件夹的拥有者,不是ubuntu的,所以一直报错。所以我就更改了zookeeper整个文件夹的拥有者为ubuntu,再次运行,就毛问题都没了。
sudo chown ubuntu -R zookeeper
之后再遇到什么问题,再记录。
感谢您的阅读。