Kafka

修炼之道

字母哥出品

课程大纲

白话消息队列

字母哥出品

kafka 与快递柜

  • 异步解耦:有了快递柜,消费者不用等待快递员,用户体验增强
  • 流量削峰:早高峰快件多,放入快递柜,用户不用疲于等待与接收事件阻塞耗时
  • 缓冲批处理:一次性取多个邮件,爽!

消息队列缺点

  • 引入复杂度

  • 导致暂时的数据不一致

  • 极端情况下,接受"消息可能会丢失"的事实

通用消息传递模型

字母哥出品

P2P模型(点对点模型)

集群消费模式(消费者组模式)

Publish/Subscribe模型(发布订阅模型)

kafka修炼之道

典型应用场景解析

字母哥出品

请求同步处理模型

结合消息队列请求异步处理模型

单体应用解耦

数据库为核心的应用

消息队列为核心的应用

kafka修炼之道

核心概念解析

字母哥出品

代理商broker

集群代理商

主题与分区

分区与消费者组

分区副本与高可用

分区副本的数据同步

几个重要名词及一个参数

  • AR(Assigned Replicas)

  • ISR(In Sync Replicas)

  • OSR(Out Sync Replicas)

  • replica.lag.time.max.ms默认值10秒

kafka修炼之道

单机版shell脚本

快速安装

字母哥出品

安装JDK

查询已安装java安装包

# 通过该命令查找安装包
rpm -qa | grep java

# 或者通过yum命令查找安装包
yum list installed |grep java

卸载openjdk安装包

rpm -e --nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115;
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5;
yum -y remove java-1.4.2-gcj-compat-1.4.2.0-40jpp.115;
yum -y remove java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5;

解压JDK安装包

tar -zxvf jdk-11.0.13_linux-x64_bin.tar.gz  -C  /usr/local/

/etc/profile配置环境变量

export JAVA_HOME=/usr/local/jdk-11.0.13;
export CLASSPATH=.:${JAVA_HOME}/lib:$CLASSPATH;
export PATH=${JAVA_HOME}/bin:$PATH;

安装包

  • kafka_2.13-2.8.0.tgz

  • apache-zookeeper-3.6.3-bin.tar.gz

  • setup.sh

修改setup.sh

启动zookeeper

/opt/zookeeper/default/bin/zkServer.sh start
# 查看zookeeper状态
/opt/zookeeper/default/bin/zkServer.sh status

启动kafka

/opt/kafka/default/bin/kafka-server-start.sh \
-daemon \
/opt/kafka/default/config/server.properties

创建topic

/opt/kafka/default/bin/kafka-topics.sh --create \
--bootstrap-server 192.168.1.111:9092 \
--replication-factor 3 --partitions 1 \
--topic test

查看topic详情

/opt/kafka/default/bin/kafka-topics.sh \
--describe --bootstrap-server 192.168.1.111:9092 \
--topic test

模拟生产数据

/opt/kafka/default/bin/kafka-console-producer.sh \
--bootstrap-server 192.168.1.111:9092 \
--topic test

模拟消费数据

/opt/kafka/default/bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.1.111:9092 \
--from-beginning --topic test

kafka修炼之道

企业级kafka

生产集群安装

字母哥出品

安装kafka集群几大步骤

  • 准备工作-服务器规划设置

  • 集群服务器之间免密登录

  • zookeeper集群搭建(kafka3不需要)

  • kafka2.0&3.0集群搭建

  • 集群测试与调优(安全策略)

本节内容介绍-准备工作

  • 服务器规划与ip映射

  • linux下新建用户

  • 开放防火墙端口

  • 最大打开文件句柄数

主机规划

ip主机名称规划用户
192.168.1.111zimug1kafka
192.168.1.112zimug2kafka
192.168.1.113zimug3kafka

设置主机名称

hostnamectl set-hostname zimug1

/etc/hosts文件格式说明

127.0.0.1  localhost.localdomain localhost  
192.168.1.100 zimug.com zimug

我的配置

192.168.1.111  zimug1
192.168.1.112  zimug2
192.168.1.113  zimug3

新建用户

adduser kafka

修改用户密码

passwd kafka

防火墙管理

  • 启动防火墙: systemctl start firewalld

  • 关闭防火墙: systemctl stop firewalld

  • 查看防火墙状态: systemctl status firewalld

  • 开机禁用 : systemctl disable firewalld

  • 开机启用 : systemctl enable firewalld

开放kafka端口

firewall-cmd --zone=public --add-port=9092/tcp --permanent;
firewall-cmd --zone=public --add-port=2181/tcp --permanent;
firewall-cmd --zone=public --add-port=2888/tcp --permanent;
firewall-cmd --zone=public --add-port=3888/tcp --permanent;

加载配置生效

firewall-cmd --reload

查看开放端口

firewall-cmd --list-all
cat /proc/sys/fs/file-max;
cat  /proc/sys/fs/nr_open;

解决“Too many open files”异常

/etc/security/limits.conf

kafka  soft   nofile     65535
kafka  hard   nofile     65535

kafka修炼之道

集群主机免密登录

字母哥出品

  • 集群主机免密登录原理

  • 生成密钥&转发公钥

  • 集群主机之间连通性测试

免密登录原理

免密登录规划主机

ip主机名称规划用户
192.168.1.111zimug1kafka
192.168.1.112zimug2kafka
192.168.1.113zimug3kafka

修改目录权限

chmod 755 ~/;
chmod 700 ~/.ssh/;
chmod 600 ~/.ssh/authorized_keys;

kafka修炼之道

zookeeper

集群安装

字母哥出品

  • zookeeper简介

  • 磁盘目录规划及配置文件说明

  • 执行安装及shell脚本说明

  • 启动服务及检查服务状态

zookeeper简介

  • 软件安装目录和数据存储目录通常分开存储。

  • 数据存储目录规划,/data单独挂载一块磁盘,/data/zookeeper存放zk数据

  • 主机规划,一定要是奇数个

ip主机名称规划用户
192.168.1.111zimug1kafka
192.168.1.112zimug2kafka
192.168.1.113zimug3kafka

配置文件说明

> more /home/kafka/zookeeper/apache-zookeeper-3.6.3-bin/conf/zoo.cfg

dataDir=/home/kafka/data/zookeeper/data

server.1=zimug1:2888:3888
server.2=zimug2:2888:3888
server.3=zimug3:2888:3888
> more /home/kafka/data/zookeeper/data/myid
1

kafka修炼之道

shell脚本

一键安装集群

  • 手动安装怎么操作?

  • 使用脚本一键安装集群

  • 在一台服务器上启停整个集群

  • 安装JDK

  • 主机与IP映射

  • 新建kafka用户

  • 开放防火墙端口-kafka服务端口、zk服务端口

  • 扩大最大打开文件句柄数

  • 集群主机之间免密登录

  • 一键安装zookeeper集群(3.x版本不需要)

kafka修炼之道

集群高可用

配置与验证

高可用测试

  • 测试正常生产消费

  • 停掉一个节点

  • 停掉两个节点

创建主题

kafka-topics.sh --create \
--bootstrap-server zimug1:9092,zimug2:9092,zimug3:9092 \
--replication-factor 3 --partitions 1 \
--topic test

查看主题

kafka-topics.sh --describe \
--bootstrap-server zimug1:9092,zimug2:9092,zimug3:9092 \
-topic test

生产数据

kafka-console-producer.sh --topic test \
--bootstrap-server zimug1:9092,zimug2:9092,zimug3:9092

消费数据

kafka-console-consumer.sh --topic test \
--from-beginning --bootstrap-server zimug1:9092,zimug2:9092,zimug3:9092

建议参数

# 允许默认创建Topic
auto.create.topics.enable=true
# __consumer_offsets的分区数设置(n>1,建议值3)
offsets.topic.replication.factor=n

修改分区副本数

kafka-reassign-partitions.sh \
--bootstrap-server zimug1:9092,zimug2:9092,zimug3:9092 \
--reassignment-json-file ./offsets-topic.json --execute

验证修改分区副本数

kafka-reassign-partitions.sh \
--bootstrap-server zimug1:9092,zimug2:9092,zimug3:9092 \
--reassignment-json-file ./offsets-topic.json --verify