一。安装zookeeper 伪集群
此处不采用kafka安装包自带的zookeeper,而是自己独立安装zookeeper。
zookeeper 版本:zookeeper-3.4.11.tar.gz。
1.将zookeeper-3.4.11.tar.gz解压缩到目录 D:\Program Files\zookeeper-3.4.11\zookeeper-1
新建目录
tmp/data, tmp/log。
3.配置zoo.cfg和日志设置
conf目录,拷贝zoo_sample.cfg 到 文件 zoo.cfg.
修改conf\zoo.cfg:
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\Program Files\\zookeeper-3.4.11\\zookeeper-1\\tmp\\data
#事务日志路径,默认值为dataDir
dataLogDir=D:\\Program Files\\zookeeper-3.4.11\\zookeeper-1\\tmp\\log
# the port at which the clients will connect
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
修改bin\zkEnv.cmd: 设置日志路径及日志相关属性。注意:REM 是注解
REM set ZOO_LOG_DIR=%~dp0%..
set ZOO_LOG_DIR=%~dp0%..\log
REM set ZOO_LOG4J_PROP=INFO,CONSOLE
set ZOO_LOG4J_PROP=INFO,CONSOLE,ROLLINGFILE
因为此处设置的值会覆盖log4j.properties中的一些属性,如:zookeeper.root.logger,zookeeper.log.dir
在
zookeeper1/tmp/data
目录下新建文件:
myid
。内容为
1
,与
server.1
对应。
5.
拷贝
zookeeper1
到
zookeeper2
和
zookeeper3
。
修改配置文件
zoo.cfg:
Zookeeper2
的
zoo.cfg:
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\Program Files\\zookeeper-3.4.11\\zookeeper-2\\tmp\\data
#事务日志路径,默认值为dataDir
dataLogDir=D:\\Program Files\\zookeeper-3.4.11\\zookeeper-2\\tmp\\log
# the port at which the clients will connect
clientPort=2182
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
Zookeeper3
的
zoo.cfg:
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\Program Files\\zookeeper-3.4.11\\zookeeper-3\\tmp\\data
#事务日志路径,默认值为dataDir
dataLogDir=D:\\Program Files\\zookeeper-3.4.11\\zookeeper-3\\tmp\\log
# the port at which the clients will connect
clientPort=2183
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
修改
zookeeper2
的
myid
文件内容为‘
2
’,
zookeeper3
的
myid
文件内容为‘
3
’。
6.
启动
zookeeper
:
Zookeeper1: bin/zkServer.cmd
Zookeeper2: bin/zkServer.cmd
Zookeeper3: bin/zkServer.cmd
7.
查看
zookeeper
状态:
jps
8.
测试
znode
:
(
1
)连接一个
zookeeper
服务节点:
bin/zkCli.cmd
或者
bin/zkCli.cmd -server 127.0.0.1: 2182
指定具体某个服务节点。
(
2
)查询现有
znodes
:
ls /
(
3
)新增
znode
:
create /testNode helloworld Created /testNode
(
4
)新增
znode
成功后,会发现另外两个
zookeeper
中也相应的增加了
/testNode
节点。
二。安装kafka伪集群
kafka版本:kafka_2.11-1.0.0.tgz
1.将kafka_2.11-1.0.0.tgz解压缩到D:\Program Files\kafka_2.11-1.0.0\broker-1
2.配置server.properties
将相关属性设为以下值:
#broker.id=0
broker.id=1
delete.topic.enable=true
listeners=PLAINTEXT://:9092
# kafa 数据存放地址
log.dirs=D:\\data\\kafka\\broker-1
#zookeeper集群地址
zookeeper.connect=localhost:2181,localhost:2182,localhost:2183
3.修改bin\windows\kafka-run-class.bat: 设置日志文件路径
set LOG_DIR="d:\\logs\\kafka\\broker-1"
备注:log.dirs 和 LOG_DIR对应的目录可以不用手动生成,kafka会自动生成。
4. 拷贝broker-1 到 broker-2,broker-3
修改对应的配置文件
broker-2 :
server.properties文件:
#broker.id=0
broker.id=2
delete.topic.enable=true
listeners=PLAINTEXT://:9093
# kafa 数据存放地址
log.dirs=D:\\data\\kafka\\broker-2
#zookeeper集群地址
zookeeper.connect=localhost:2181,localhost:2182,localhost:2183
bin\windows\kafka-run-class.bat 文件:
set LOG_DIR="d:\\logs\\kafka\\broker-2"
broker-3 :
server.properties文件:
#broker.id=0
broker.id=3
delete.topic.enable=true
listeners=PLAINTEXT://:9094
# kafa 数据存放地址
log.dirs=D:\\data\\kafka\\broker-3
#zookeeper集群地址
zookeeper.connect=localhost:2181,localhost:2182,localhost:2183
bin\windows\kafka-run-class.bat 文件:
set LOG_DIR="d:\\logs\\kafka\\broker-3"
5.启动 kafka
broker-1: bin\windows\kafka-server-start.bat config\server.properties
broker-2: bin\windows\kafka-server-start.bat config\server.properties
broker-3: bin\windows\kafka-server-start.bat config\server.properties
启动后此时通过zookeeper客户端链接任何一个zookeeper服务端,查看 该zookeeper服务端下的znode节点:ls /,会发现多出了一个brokers 节点。
之所以任何一个zookeeper服务端的内容都一样,这是因为zookeeper会对任何一个zookeeper服务端执行相同的写操作。这是zookeeper的特性。
6. 测试topic
任选一个broker(即kafka设备) 执行新增topic的命令。此处我们通过broker-2新增一个复制因子为2的topic:
此时,连接任何一个zookeeper服务端查看:
会发现zookeeper服务端中保存了kafka的topic信息。
查看topic的信息:
"leader":该节点负责所有指定分区的读和写,每个节点的领导都是随机选择的。
"replicas":备份的节点,无论该节点是否是leader或者目前是否还活着,只是显示。
"isr":备份节点的集合,也就是活着的节点集合。
从中可以看出,my-replicated-topic 是作用在 broker-1和broker-2设备上,因为复制因子是2,所以只在2各设备上保存该topic的数据。
我们查看在broker-1的数据存储目录D:\data\kafka\broker-1下会发现新增的文件夹:my-replicated-topic-0,该文件下就是保存my-replicated-topic 这个topic的所有数据。
同样broker-2的数据存储目录下也有一样的文件夹!而broker-3设备则没有。
备注:其实 在连接zookeeper服务器的时候,只需要写一个zookeeper服务器地址就可以,因为zookeeper会对所有zookeeper服务器进行相同的写操作。而通常要写所有的zookeeper服务器地址是因为防止其中有的服务器链接失败的i情况。
7. 测试发布信息和消费信息
发布信息:
消费消息:
备注: 发布消息时,--broker-list 可以列出所有的broker,也可以只列个别,甚至列出的broker可以不是该topic保存数据所在的设备,比如此处可以只设为 localhost:9094, 即broker3,my-replicated-topic 的数据只保存在broker1和broker2,但此处也能正常发送消息。猜想这些是通过broker中设置的zookeerper列表进行连接的,所以可以任何一个可以连接到zookeeper的broker。
同样 消费信息时,--zookeeper 可以设置多个zookeeper服务地址,也可以只设置部分或一个,建议设置所有的zookeeper服务地址。
我们现在测试备份的功能:
my-replicated-topic 现在的leader是1,机broker-1负责my-replicated-topic的分区的读写。
现在停掉broker-1,我们再看下效果:
leader 变为了2。Isr 也由1,2变为了2,表示现在broker1已经不在同步备份集合里了。
但是消费还是能正常进行,因为broker-2中有备份数据: