ZooKeeper、kafka的安装与部署

    • ZooKeeper的安装与部署

  1. 安装Java

更新软件包

sudo apt-get update

安装openjdk-11-jdk

sudo apt-get install openjdk-11-jdk

查看java版本,看看是否安装成功

:~$ java -version

openjdk version "11.0.15" 2022-04-19

OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.18.04.1)

OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.18.04.1, mixed mode, sharing)

    • 安装Zookeeper

2.1系统

银河麒麟V4.0

ZooKeeper是用Java编写的,运行在Java环境上,因此,在部署zk的机器上需要安装Java运行环境。为了正常运行zk,我们需要JRE1.6或者以上的版本。

对于集群模式下的ZooKeeper部署,3个ZooKeeper服务进程是建议的最小进程数量,而且不同的服务进程建议部署在不同的物理机器上面,以减少机器宕机带来的风险,以实现ZooKeeper集群的高可用。

ZooKeeper对于机器的硬件配置没有太大的要求。例如,在Yahoo!内部,ZooKeeper部署的机器其配置通常如下:双核处理器,2GB内存,80GB硬盘。

2.2下载

可以从 https://zookeeper.apache.org/releases.html 下载ZooKeeper,目前最新的稳定版本为 3.7.1 版本,可以自行选择一个速度较快的镜像来下载即可。

2.3目录说明

ZooKeeper软件的文件和目录

  • bin目录
    zk的可执行脚本目录,包括zk服务进程,zk客户端,等脚本。其中,.sh是Linux环境下的脚本,.cmd是Windows环境下的脚本。

  • conf目录
    配置文件目录。zoo_sample.cfg为样例配置文件,需要修改为自己的名称,一般为zoo.cfg。log4j.properties为日志配置文件。

  • lib
    zk依赖的包。

2.4单机模式

ZooKeeper的安装包括单机模式安装,以及集群模式安装。

单机模式较简单,是指只部署一个zk进程,客户端直接与该zk进程进行通信。

在开发测试环境下,通过来说没有较多的物理资源,因此我们常使用单机模式。当然在单台物理机上也可以部署集群模式,但这会增加单台物理机的资源消耗。故在开发环境中,我们一般使用单机模式。

但是要注意,生产环境下不可用单机模式,这是由于无论从系统可靠性还是读写性能,单机模式都不能满足生产的需求。

2.5运行配置

上面提到,conf目录下提供了配置的样例zoo_sample.cfg,要将zk运行起来,需要将其名称修改为zoo.cfg。

打开zoo.cfg,可以看到默认的一些配置。

  • tickTime
    时长单位为毫秒,为zk使用的基本时间度量单位。例如,1 * tickTime是客户端与zk服务端的心跳时间,2 * tickTime是客户端会话的超时时间。
    tickTime的默认值为2000毫秒,更低的tickTime值可以更快地发现超时问题,但也会导致更高的网络流量(心跳消息)和更高的CPU使用率(会话的跟踪处理)。

  • clientPort
    zk服务进程监听的TCP端口,默认情况下,服务端会监听2181端口。

  • dataDir
    无默认配置,必须配置,用于配置存储快照文件的目录。如果没有配置dataLogDir,那么事务日志也会存储在此目录。

2.6启动

在Windows环境下,直接双击zkServer.cmd即可。在Linux环境下,进入bin目录,执行命令

./zkServer.sh start

这个命令使得zk服务进程在后台进行。如果想在前台中运行以便查看服务器进程的输出日志,可以通过以下命令运行:

./zkServer.sh start-foreground

执行此命令,可以看到大量详细信息的输出,以便允许查看服务器发生了什么。

使用文本编辑器打开zkServer.cmd或者zkServer.sh文件,可以看到其会调用zkEnv.cmd或者zkEnv.sh脚本。zkEnv脚本的作用是设置zk运行的一些环境变量,例如配置文件的位置和名称等。

2.7 连接

如果是连接同一台主机上的zk进程,那么直接运行bin/目录下的zkCli.cmd(Windows环境下)或者zkCli.sh(Linux环境下),即可连接上zk。

直接执行zkCli.cmd或者zkCli.sh命令默认以主机号 127.0.0.1,端口号 2181 来连接zk,如果要连接不同机器上的zk,可以使用 -server 参数,例如:

bin/zkCli.sh -server 192.168.1.95:2181

2.8集群模式

单机模式的zk进程虽然便于开发与测试,但并不适合在生产环境使用。在生产环境下,我们需要使用集群模式来对zk进行部署。

注意

在集群模式下,建议至少部署3个zk进程,或者部署奇数个zk进程。如果只部署2个zk进程,当其中一个zk进程挂掉后,剩下的一个进程并不能构成一个quorum的大多数。因此,部署2个进程甚至比单机模式更不可靠,因为2个进程其中一个不可用的可能性比一个进程不可用的可能性还大。

2.9运行配置

在集群模式下,所有的zk进程可以使用相同的配置文件(是指各个zk进程部署在不同的机器上面),例如如下配置:

  1. tickTime=2000

  1. dataDir=/home/myname/zookeeper

  1. clientPort=2181

  1. initLimit=5

  1. syncLimit=2

  1. server.1=192.168.1.1:2888:3888

  1. server.2=192.168.1.2:2888:3888

  1. server.3=192.168.1.3:2888:3888

  • initLimit
    ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。
    当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。initLimit配置follower与leader之间建立连接后进行同步的最长时间。

  • syncLimit
    配置follower和leader之间发送消息,请求和应答的最大时间长度。

  • tickTime
    tickTime则是上述两个超时配置的基本单位,例如对于initLimit,其配置值为5,说明其超时时间为 2000ms * 5 = 10秒。

  • server.id=host:port1:port2
    其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。
    host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。

  • dataDir
    其配置的含义跟单机模式下的含义类似,不同的是集群模式下还有一个myid文件。myid文件的内容只有一行,且内容只能为1 - 255之间的数字,这个数字亦即上面介绍server.id中的id,表示zk进程的id。

注意

如果仅为了测试部署集群模式而在同一台机器上部署zk进程,server.id=host:port1:port2配置中的port参数必须不同。但是,为了减少机器宕机的风险,强烈建议在部署集群模式时,将zk进程部署不同的物理机器上面。

2.10 启动

假如我们打算在三台不同的机器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一个zk进程,以构成一个zk集群。

三个zk进程均使用相同的 zoo.cfg 配置:

  1. tickTime=2000

  1. dataDir=/home/myname/zookeeper

  1. clientPort=2181

  1. initLimit=5

  1. syncLimit=2

  1. server.1=192.168.1.1:2888:3888

  1. server.2=192.168.1.2:2888:3888

  1. server.3=192.168.1.3:2888:3888

在三台机器dataDir目录( /home/myname/zookeeper 目录)下,分别生成一个myid文件,其内容分别为1,2,3。然后分别在这三台机器上启动zk进程,这样我们便将zk集群启动了起来。

2.11连接

可以使用以下命令来连接一个zk集群:

bin/zkCli.sh -server 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181

  • 1

成功连接后,可以看到如下输出:

  1. 2016-06-28 19:29:18,074 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@770537e4

  1. Welcome to ZooKeeper!

  1. 2016-06-28 19:29:18,146 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@975] - Opening socket connection to server 192.168.229.162/192.168.229.162:2181. Will not attempt to authenticate using SASL (unknown error)

  1. JLine support is enabled

  1. 2016-06-28 19:29:18,161 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@852] - Socket connection established to 192.168.229.162/192.168.229.162:2181, initiating session

  1. 2016-06-28 19:29:18,199 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server 192.168.229.162/192.168.229.162:2181, sessionid = 0x3557c39d2810029, negotiated timeout = 30000

  1. WATCHER::

  1. WatchedEvent state:SyncConnected type:None path:null

  1. [zk: 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181(CONNECTED) 0]

  • 11

图2:客户端连接zk集群的输出日志

从日志输出可以看到,客户端连接的是192.168.229.162:2181进程(连接上哪台机器的zk进程是随机的),客户端已成功连接上zk集群。

  • contrib目录
    一些用于操作zk的工具包。

  • recipes目录
    zk某些用法的代码示例

问题及解决

故障1、

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed;

完整的原报错是OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed;error='Out of memory' (errno=12)

原因是内存不足(内存溢出),我是因为项目太多,服务器内存太小,启动最后一个项目的时候报这个错了,这个时候你可以用free -h命令查看显示的结果如下图:

开始的时候,我的Swap都是0,这是我后来设置完后的截图。

当内存不足我们可以使用Swap中的内存,虽然不是很建议,因为会有点慢的。但这也是一个办法。它的原理就是将磁盘空间的一步分内存变成内存。

上正菜:

创建swapfile:# dd if=/dev/zero of=swapfile bs=1024 count=500000 (of是空间名称,count是空间大小,bs是单位,这里是kb,你可以将bs=1024改为bs=1G,后面的count就可以该为count=2,就是创建2G大小的swap文件)

将swapfile设置为swap空间:# mkswap swapfile

启用交换空间: # swapon swapfile (删除交换空间命令 swapoff swapfile)

到这里你就可以再用free -h命令查看内存情况,就会发现Swap中的内存增加了,这样你就可以愉快的启动项目了。

故障2

Exception in thread “main“ joptsimple.UnrecognizedOptionException: zookeeper is not a recognized

用–bootstrap-server 192.168.31.51:9092 替代原先的–zookeeper 启动

    • 安装Kafka

kafka基本概念

Broker: 消息中间件的处理节点,一个kafka节点就是一个broker

Topic: 用于对消息进行归类,每条消息都要指定一个Topic

Producer: 消息生产者,向broker发送消息

Consumer: 消息消费者,从broker读取消息

下载地址:https://kafka.apache.org/downloads银河麒麟下可以用wget直接下载,我是下载到了/home/www/kafka目录

解压

tar –zxvf kafka_2.13-3.2.tgz

创建日志存储

:~$ cd kafka/

:~/kafka$ mkdir logs

进入kafka解压目录,修改kafka-server 的配置文件

vim config/server.properties

修改配置文件中21、31、36和60行

broker.id=1

listeners=PLAINTEXT://:9092

advertised.listeners=PLAINTEXT://192.168.1.95:9092

log.dirs=/home/wzj/kafka/logs

功能验证

:~$ ps –ef |grep zoo

启动Kafka服务,使用 kafka-server-start.sh 启动 kafka 服务

bin/kafka-server-start.sh config/server.properties

创建topic

使用 kafka-topics.sh 创建单分区单副本的 topic demo1

bin/kafka-topics.sh --create --topic demo1 --bootstrap-server 172.16.30.18:9092

查看 topic 列表

./bin/kafka-topics.sh --bootstrap-server 172.16.30.18:9092 --describe --topic demo1

产生消息,创建消息生产者

./bin/kafka-console-producer.sh --broker-list 172.16.30.18:9092 --topic demo1

消费消息,创建消息消费者

./bin/kafka-console-consumer.sh --bootstrap-server 172.16.30.18:9092 --topic demo1

从当前主题的最后一条消息的offset(偏移量位置)+1开始消费

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic demo1

从当前主题的第一条消息开始消费

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic demo1

a

b

c

关于消息的细节

消息的特性:

1.消息是顺序存储的 2.消息是有偏移量的 3.消费时可以指明偏移量进行消费

生产者将信息发送给broker,broker会将消息保存在kafka本地的日志文件中(配置文件中log.dirs指定的目录下)

librdkafka是一个开源的Kafka客户端C/C++实现,提供了Kafka生产者、消费者接口。

    • Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍

https://gitcode.net/mirrors/edenhill/librdkafka?utm_source=csdn_github_accelerator

安装librdkafka

首先在github上下载librdkafka源码,解压后进行编译;

cd librdkafka-master

chmod 777 configure lds-gen.py

./configure

make

make install

在make的时候,如果是64位Linux会报下面这个异常

/bin/ld:librdkafka.lds:1: syntax error in VERSION script

只要Makefile.config第46行里面的WITH_LDS=y这一行注释掉就不会报错了。

注释掉:#WITH_LDS=y,然后再make

最终头文件和库文件会分别安装在

/usr/local/include/librdkafka

/usr/local/lib

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值