kafka集群搭建

痞子三分冷 提交于 2019-12-01 16:34:14

一、安装多节点ZooKeeper集群

下面就是在本机一台机器上安装3个节点的ZooKeeper集群,在多台机器上安装的方法和一台机器上是一样的,就是配置文件有微小的调整。

1.下载ZooKeeper包

https://www-us.apache.org/dist/zookeeper/stable/

下载带bin的tar.gz文件,目前是apache-zookeeper-3.5.6-bin.tar.gz

解压

tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz

把解压文件移动到/usr/local

sudo mv apache-zookeeper-3.5.6-bin /usr/local/

2.创建配置文件

在ZooKeeper的conf目录下创建3个配置文件zoo1.cfg,zoo2.cfg,zoo3.cfg,如果是在多台服务器上安装ZooKeeper集群可以取相同的配置文件名字。

zoo1.cfg

tickTime=2000

dataDir=/home/xl/zookeeper/data_logs/zookeeper1

clientPort=2181

initLimit=5

syncLimint=2

server.1=localhost:2888:3888

server.2=localhost:2889:3889

serve.3=localhost:2890:3890

zoo2.cfg

tickTime=2000

dataDir=/home/xl/zookeeper/data_logs/zookeeper2

clientPort=2182

initLimit=5

syncLimint=2

server.1=localhost:2888:3888

server.2=localhost:2889:3889

serve.3=localhost:2890:3890

zoo3.cfg

tickTime=2000

dataDir=/home/xl/zookeeper/data_logs/zookeeper3

clientPort=2183

initLimit=5

syncLimint=2

server.1=localhost:2888:3888

server.2=localhost:2889:3889

serve.3=localhost:2890:3890

关键参数:

-tickTime:zookeeper最小的时间单位,用于丈量心跳时间和超时时间等。通常设置成默认值2秒即可。

-dataDire:非常重要的参数!ZooKeeper会在内存中保存系统快照,并定期写入该路径指定的文件夹中。生产环境中需要注意该文件夹的磁盘占用情况。这个文件夹需要自己提前生成,不会根据配置文件自动生成。

-clientPort:ZooKeeper监听客户端连接的端口,一般设置为默认值2181即可。如果是多机器安装方案,可以指定相同的端口号,只要确保没有端口冲突就行,包括配置文件中所有端口没有冲突。

-initLimit:指定follower节点初始时连接leader节点的最大tick次数。假设是5,表示follower必须要在5×tickTime时间内连接上leader,否则被视为超时。

-syncLimit:设定了follower节点与leader节点进行同步的最大时间。也是以tickTime为单位。

-server.x=host:port:port:x必须是一个全局唯一的整数,且需要与myid文件中数字相对应,范围为1~255。第一个端口用于使follower节点连接leader节点,第二个端口用于leader选举。

3.创建myid文件

myid文件必须位于配置文件中的dataDir中,具体命令如下:

echo "1" > /home/xl/zookeeper/data_logs/zookeeper1/myid

echo "2" > /home/xl/zookeeper/data_logs/zookeeper2/myid

echo "3" > /home/xl/zookeeper/data_logs/zookeeper3/myid

4.启动ZooKeeper

在ZooKeeper目录下执行命令:

bin/zkServer.sh start conf/zoo1.cfg

bin/zkServer.sh start conf/zoo2.cfg

bin/zkServer.sh start conf/zoo3.cfg

5.检查集群状态

bin/zkServer.sh status conf/zoo1.cfg

bin/zkServer.sh status conf/zoo2.cfg

bin/zkServer.sh status conf/zoo3.cfg

会显示出leader和follower:

ZooKeeper JMX enabled by default
Using config: conf/zoo1.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

ZooKeeper JMX enabled by default
Using config: conf/zoo2.cfg
Client port found: 2182. Client address: localhost.
Mode: leader

ZooKeeper JMX enabled by default
Using config: conf/zoo3.cfg
Client port found: 2183. Client address: localhost.
Mode: follower

表明broker2是整个集群的leader,其他两个broker是follower,表明ZooKeeper集群启动成功。

也可以用jsp命令查看:

$jsp

7104 Jps
6851 QuorumPeerMain
6920 QuorumPeerMain
6798 QuorumPeerMain

ZooKeeper的主进程名是QuorumPeerMain。如果是在多台机器上搭建ZooKeeper集群,那么每台机器上都至少应该有一个这样的进程被启动。

二、安装多节点kafka集群

使用一台机器模拟一个3节点的kafka集群的搭建。

1.下载kafka安装包

https://www-us.apache.org/dist/kafka/2.3.0/

下载kakfa_2.11-2.3.0.tgz,其中2.11是相应的Scala版本。

解压

tar -zxvf kafka_2.11-2.3.0.tgz

把解压文件移动到/usr/local下

sudo mv kafka_2.11-2.3.0 /usr/local/

2.创建配置文件

conf/server1.properties

broker.id=0

listeners=PLAINTEXT://localhost:9092

log.dirs=/home/xl/kafka/data_logs/kafka1

zookeeper.connect=localhost:2181,localhost:2182,localhost:2183

zookeeper.connection.timeout.ms=6000

delete.topic.enable=true

unclean.leader.election.enable=false

conf/server2.properties

broker.id=1

listeners=PLAINTEXT://localhost:9093

log.dirs=/home/xl/kafka/data_logs/kafka2

zookeeper.connect=localhost:2181,localhost:2182,localhost:2183

zookeeper.connection.timeout.ms=6000

delete.topic.enable=true

unclean.leader.election.enable=false

 

conf/server3.properties

broker.id=2

listeners=PLAINTEXT://localhost:9094

log.dirs=/home/xl/kafka/data_logs/kafka3

zookeeper.connect=localhost:2181,localhost:2182,localhost:2183

zookeeper.connection.timeout.ms=6000

delete.topic.enable=true

unclean.leader.election.enable=false

重要参数:

-broker.id:整个集群中必须是唯一的整数,给每台服务器指定不同的broker id。

-listeners:broker监听器的csv列表,格式是[协议]://[主机名]:[端口]。该参数主要用于客户端连接broker使用,可以认为是broker端开放给clients的监听端口。如果不指定主机名,则表示绑定默认网卡;如果主机名是0.0.0.0,表示绑定所有网卡。kafka当前支持的协议类型包括PLAINTEXT、SSL及SASL_SSL等。对于未启动安全的kafka集群,使用PLAINTEXT足矣。如果启用了安全认证,可以考虑使用SSL或SASL_SSL协议。

-zookeeper.connection:必须同时指定所有的ZooKeeper节点。

-log.dirs:非常重要的参数!指定了kafka持久化消息的目录。必须设定,必须提前生成。若待保存的消息数量非常多,那么最好确保该文件夹下有充足的磁盘空间。该参数可以设置多个目录,以逗号分隔。在实际使用过程中,指定多个目录的做法是被推荐的,这样kafka可以把负载均匀地分配到多个目录下。

-unclean.leader.election.enable:false表示在ISR为空而此时leader又宕机了,kafka不允许从剩下存活的非ISR副本中选择一个当leader。

-delete.topic.enable:是否允许kafka删除topic。

3.启动kafka服务器

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

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

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

-daemon:表示启动后的kafka服务器后台运行。

查看kafka的logs目录下的server.log可以确认kafka broker是否已经成功启动。

也可以用jps命令:

$jps

12240 Kafka
6851 QuorumPeerMain
12325 Jps
6920 QuorumPeerMain
11163 Kafka
11867 Kafka
6798 QuorumPeerMain

kafka的主进程名是Kafka。

如果需要为集群增加更多的broker节点,只需要配置一份类似的配置文件,然后利用该文件直接运行启动命令即可。

 

三、验证部署

1.测试topic创建与删除

topic能够正确地创建与删除才能说明kafka集群在正常工作,因为通常它都表明了kafka的控制器controller已经被成功地选举出来并开始履行自身的职责。

创建一个topic,名为test-topic,3个分区,每个分区都分配3个副本:

bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --create --topic test-topic --partitions 3 --replication-factor 3

Created topic test-topic.表明创建成功。

验证:

$bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 -list
test-topic
$bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --describe --topic test-topic

Topic:test-topic PartitionCount:3 ReplicationFactor:3 Configs:
Topic: test-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: test-topic Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: test-topic Partition: 2 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2

删除topic:

$bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --delete --topic test-topic

Topic test-topic is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.

这仅仅表示该topic被成功地标记为“待删除”,至于topic是否会被真正删除取决于broker端参数delete.topic.enable。

验证是否删除了:

$bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 -list

输出就没有test-topic了。

 

2.测试消息发送与消费

打开两个终端,一个用于发送消息,另一个用于接受消息:

bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9093,localhost:9094 --topic test-topic
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic test-topic --from-beginning

 

3.生产者吞吐量测试

$bin/kafka-producer-perf-test.sh --topic test-topic --num-records 500000 --record-size 200 --throughput -1 --producer-props bootstrap.servers=localhost:9092,localhost:9093,localhost:9094 acks=-1

311727 records sent, 62345.4 records/sec (11.89 MB/sec), 1680.5 ms avg latency, 2362.0 ms max latency.
500000 records sent, 72432.275822 records/sec (13.82 MB/sec), 1690.16 ms avg latency, 2362.00 ms max latency, 1794 ms 50th, 2285 ms 95th, 2311 ms 99th, 2339 ms 99.9th.

表明这台机器上运行一个kafka producer的平均吞吐量是13MB/s,即占用104Mb/s,评价每秒能发送72432条消息,平均延时是1.69秒,最大延时是2.36秒,平均有50%的消息发送需要花费1.79秒。

 

4.消费者吞吐量测试

$bin/kafka-consumer-perf-test.sh --broker-list localhost:9092,localhost:9093,localhost:9094 --fetch-size 2000 --messages 500000 --topic test-topic

start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec
2019-10-17 16:09:12:558, 2019-10-17 16:09:14:792, 95.3674, 42.6891, 500003, 223815.1298, 36, 2198, 43.3883, 227480.8917

表明该环境中consumer在2秒多的时间内总共消费了95MB的消息,吞吐量为42MB/s。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!