Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
主要应用场景是:日志收集系统和消息系统。
Kafka主要设计目标如下:
- 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理。
- Scale out:支持在线水平扩展
首先打个比方,kafka好比就是中央电视台,而中央电视台下面有很多节目,生产者就是制作节目的团队,而消费者就是我们观看这个节目的人,一开始在zookeeper创建一个节目,假设就叫cctv1,有了这个节目名后,我们就得请一个团队来填充这个节目,比如拉广告啊,放电视剧之类的数据,而我们消费者要观看这个节目的话就得需要zookeeper来授权给我们。中央电视台则只是存数据的,相当于一个中间人,和现在中介差不多个意思。
节点规化:
一般要求为奇数个节点,如1、3、5、7,这里演示2个节点如下:
192.168.42.73 node1
192.168.42.74 node2
请注意计算机名要与hostname一致,之后需要写入到本地host进行解析
准备安装包
下载kafka与zookeeper安装包
https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.8.0/kafka_2.12-2.8.0.tgz
并上传至服务器的/root下。
安装zookeeper
tar -xzvf apache-zookeeper-3.7.0-bin.tar.gz -C zookeeper
cd zookeeper
mkdir data
cp config/zoo_sample.cfg zoo.cfg
vi zoo.cfg
#修改默认数据位置
dataDir=/root/zookeeper/data
#最后增加内容
server.1=192.168.42.73:2888:3888
server.2=192.168.42.74:2888:3888
#修改host,主机名要一致
echo '192.168.42.73 node1' >> /etc/hosts
echo '192.168.42.74 node2' >> /etc/hosts
echo 1 > data/myid
cd ..
#将所有文件分发到另外一台服务器
scp zookeeper 192.168.42.74:/root/
#修改另外一台服务器的myid
cd /root/zookeeper/data
sed -i 's/1/2/g' myid
#在所有节点上启动zookeeper
cd /root/zookeeper
bin/zkServer.sh start &
#完成后,它会监听2181、2888、3888端口,并进行选举。
#查看状态
bin/zkServer.sh status
安装kafka
tar -xzvf kafka_2.12-2.8.0.tgz -C
cd kafka
cp config/server.properties config/server.properties.1 #备份配置
vi config/server.properties
#修改
broker.id=0
log.dirs=/root/kafka/data #修改数据位置
mkdir data #新建数据目录
#分发软件包至另外的节点
scp kafka 192.168.42.74:/root/
#修改其它的节点的配置
vi conf/server.properties
#修改
broker.id=1
#在所有节点上启动kafka
bin/kafka-server-start.sh config/server.properties &
看到所有的节点都启动成功。
测试kafka
#创建topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic logbox
#查看topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
#生产数据
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic logbox
#它会打开一个输入流,同时在192.168.42.74上打开一个消费者
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic logbox
#然后我们在数据生产这里所有的输入行都会自动显示在消费者的控制台里面