kafka集群搭建
kafka相关术语
Producer: 消息生产者,就是向kafka broker发消息的客户端
Consumer: 消息消费者,向kafka broker取消息的客户端
Consumer Group(简称"CG"):消费者组
Broker:一台kafka服务器就是一个broker,一个集群由多个broker组成,一个broker可以容纳多个topic
Topic: 可以理解为一个队列,生产者和消费者面向的就是一个topic
Parition: 为了实现扩展性,一个非常大的topic可以分不到多个broker(即服务器)上,一个topic可以分为多个pairtition,每个partition是一个有序的队列。
Replica: 副本,为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个leader和若干个follower。
Leader: 每个分区多个副本为"主",生产者发送数据的对象,以及消费者消费数据的对象都是leader。
Follower: 每个分区多个副本中的"从",实时从leader中同步数据,保持和leader数据的同步。leader发生故障时,某个follower会成为新的leader。
部署kafka环境
下载略
环境变量写到/etc/profild.d/下面
export KAFKA_HOME=/oldboyedu/softwares/kafka
export PATH=$PATH:$KAFKA_HOME/bin
创建软连接略
修改配置文件:/oldboyedu/softwares/kafka/config/server.properties
...
broker.id=101
log.dirs=/oldboyedu/data/kafka-3.0.0
zookeeper.connect=10.0.0.102:2181,10.0.0.103:2181,10.0.0.104:2181/oldboyedu-kafka-3.0.0
3>:启动kafka节点
kafka-server-start.sh -daemon /oldboyedu/softwares/kafka/config/server.properties
topic管理:
1.查看topic信息
kafka-topics.sh --bootstrap-server 10.0.0.105:9092 --list
2.创建topic
kafka-topics.sh --bootstrap-server 10.0.0.105:9092 --create --topic linux79 --partitions 3 --replication-factor 2
3.查看topic的详细信息
kafka-topics.sh --bootstrap-server 10.0.0.105:9092 --describe
kafka-topics.sh --bootstrap-server 10.0.0.105:9092 --describe --topic linux79
4.修改topic的分区数量
kafka-topics.sh --bootstrap-server 10.0.0.105:9092 --alter --topic linux79 --partitions 4
kafka-topics.sh --bootstrap-server 10.0.0.105:9092 --alter --topic linux79 --partitions 10
5.topic的删除
kafka-topics.sh --bootstrap-server 10.0.0.105:9092 --delete --topic linux79
kafka-topics.sh --bootstrap-server 10.0.0.105:9092 --delete --topic linux79,linux80
早期kafka 0.8.2版本测试
1.查看topic信息:
cd /oldboyedu/softwares/kafka_2.11-0.8.2.2/bin
./kafka-topics.sh --zookeeper 10.0.0.102:2181/oldboyedu-kafka-0.8.2 --list
2.创建topic信息:
./kafka-topics.sh --zookeeper 10.0.0.102:2181/oldboyedu-kafka-0.8.2 --create --topic oldboyedu-linux79 --partitions 3 --replication-factor 2
3.启动生产者
./kafka-console-producer.sh --broker-list 10.0.0.101:19092 --topic oldboyedu-linux79
4.启动消费者
./kafka-console-consumer.sh --zookeeper 10.0.0.102:2181/oldboyedu-kafka-0.8.2 --topic oldboyedu-linux79 --from-beginning
5.启动消费者时可以指定消费者组名称
vim ../config/consumer.properties
...
group.id=oldboyedu-linux79-kafka
./kafka-console-consumer.sh --zookeeper 10.0.0.102:2181/oldboyedu-kafka-0.8.2 --topic oldboyedu-linux79 --from-beginning --consumer.config ../config/consumer.properties
kafka 1.1.0版本部署实战:
1.修改配置文件
vim /oldboyedu/softwares/kafka_2.11-1.1.0/config/server.properties
...
broker.id=101
listeners=PLAINTEXT://:29092
log.dirs=/oldboyedu/data/kafka-1.1.0
zookeeper.connect=10.0.0.102:2181,10.0.0.103:2181,10.0.0.104:2181/oldboyedu-kafka-1.1.0
2.同步数据
data_rsync.sh /oldboyedu/softwares/kafka_2.11-1.1.0
3.修改配置文件
for (( hostId=101;hostId<=105;hostId++ )); do ssh elk${hostId}.oldboyedu.com "sed -ri 's#(broker.id=)101#\1${hostId}#' /oldboyedu/softwares/kafka_2.11-1.1.0/config/server.properties"; done
4.启动服务
for (( hostId=101;hostId<=105;hostId++ )); do ssh elk${hostId}.oldboyedu.com "/oldboyedu/softwares/kafka_2.11-1.1.0/bin/kafka-server-start.sh -daemon /oldboyedu/softwares/kafka_2.11-1.1.0/config/server.properties"; done
5.停止服务
for (( hostId=101;hostId<=105;hostId++ )); do ssh elk${hostId}.oldboyedu.com "/oldboyedu/softwares/kafka_2.11-1.1.0/bin/kafka-server-stop.sh -daemon /oldboyedu/softwares/kafka_2.11-1.1.0/config/server.properties"; done
6.验证服务
for (( hostId=101;hostId<=105;hostId++ )); do ssh elk${hostId}.oldboyedu.com "grep ^broker.id /oldboyedu/softwares/kafka_2.11-1.1.0/config/server.properties"; done
7.
cd /oldboyedu/softwares/kafka_2.11-1.1.0/bin
3.启动生产者
./kafka-console-producer.sh --broker-list 10.0.0.101:29092 --topic oldboyedu
4.启动消费者
./kafka-console-consumer.sh --zookeeper 10.0.0.102:2181/oldboyedu-kafka-1.1.1 --topic oldboyedu --from-beginning # offset存储在ZK集群,官方已经不推荐使用!
./kafka-console-consumer.sh --bootstrap-server 10.0.0.102:29092 --topic oldboyedu --from-beginning # offset存储在broker集群,官方推荐使用!:
脚本:data_rsync.sh
# 判断用户传参
if [ $# -ne 1 ];then
tput setaf 1
echo """
Please enter the path to synchronize,
Usage: $0 {path} [start_hostIP[-stop_hostIP]]
"""
tput setaf 7
exit
fi
# 获取父路径
dirPath=`dirname $1`
# 获取子路径
fileName=`basename $1`
# 进入到父路径
cd $dirPath
# 同步数据
for (( hostId=102;hostId<=105;hostId++ ))
do
tput setaf 2
echo "======= elk${hostId}.oldboyedu.com: $1 ======"
tput setaf 7
rsync -lr $fileName `whoami`@elk${hostId}.oldboyedu.com:$dirPath
if [ $? == 0 ];then
echo "数据同步成功!"
fi
done
脚本:manager-kafka.sh
# 判断用户传参
if [ $# -ne 1 ];then
tput setaf 1
echo """
Args Invalid, Usage : $0 {start|stop|restart|status}
"""
tput setaf 7
exit
fi
case $1 in
start)
echo "启动服务"
# ssh elk102.oldboyedu.com "zkServer.sh start"
# ssh elk103.oldboyedu.com "zkServer.sh start"
# ssh elk104.oldboyedu.com "zkServer.sh start"
# for (( hostId=102; hostId<=104; hostId++ )); do
# ssh elk${hostId}.oldboyedu.com "zkServer.sh start"
# done
ansible kafka -m shell -a 'kafka-server-start.sh -daemon /oldboyedu/softwares/kafka/config/server.properties'
;;
stop)
echo "停止服务"
# for (( hostId=102; hostId<=104; hostId++ )); do
# ssh elk${hostId}.oldboyedu.com "zkServer.sh stop"
# done
ansible kafka -m shell -a 'kafka-server-stop.sh'
;;
restart)
echo "重启服务"
ansible kafka -m shell -a 'kafka-server-stop.sh'
sleep 10
ansible kafka -m shell -a 'kafka-server-start.sh -daemon /oldboyedu/softwares/kafka/config/server.properties'
;;
status)
echo "查看服务"
;;
*)
echo Args Invalid, Usage : $0 {start|stop|restart|status}
;;
esac