kafka+zookeeper 高可用部署
- 操作流程
- 基础环境准备
- zookeeper目录一览
- ZooKeeper常用配置项说明
- kafka架构
- java部署
- zookeeper集群部署
- zookeeper配置
- zookeeper启动
- zookeeper集群查看&连接测试
- kafka集群部署
- kafka配置
- kafka启动
- kafka测试
操作流程
基础环境准备
名称 | 版本 | 获取方式 |
jdk | jdk-8u181-linux-x64.rpm | https://www.oracle.com/java/technologies/downloads/#jdk17-linux |
zookeeper | zookeeper-3.4.14.tar.gz | |
kafka | kafka_2.12-2.5.0.tgz |
zookeeper目录一览
zookeeper | 目录 |
zookeeper | /app/zookeeper/ |
数据 | /app/zookeeper/data |
日志 | /app/zookeeper/logs |
配置文件 | /usr/local/zookeeper/conf/zoo.cfg |
节点标识 | /app/zookeeper/data/myid |
ZooKeeper常用配置项说明
header 1 | header 2 | 说明 |
tickTime | CS通信心跳间隔 | 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每间隔 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位 |
initLimit | LF初始通信时限 | 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数 |
syncLimit | LF同步通信时限 | 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数 |
dataDir | 数据文件目录 | Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里 |
dataLogDir | 日志文件目录 | Zookeeper保存日志文件的目录 |
clientPort | 客户端连接端口 | 客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求 |
server.N | 服务器名称与地址 | 从N开始依次为:服务编号、服务地址、LF通信端口、选举端口;例如:server.1=10.0.0.162:2888:3888 |
kafka架构
在kafka集群(cluster)中,一个kafka节点就是一个broker,消息由Topic来承载,可以存储在一个或多个Partition中。发布消息的应用为Producer,消费消息的应用为Consumer,多个Consumer可以促成Consumer Group共同消费一个Topic中的消息
概念/对象 | 简单说明 |
Broker | kafka节点 |
Topic | 主题,用来承载消息 |
Partition | 分区,用于主题分片存储 |
Producer | 生产者,向主题发布消息的应用 |
Consumer | 消费者,从主题订阅消息的应用 |
Consumer Group | 消费者组,由多个消费者组成 |
java部署
rpm -ivh jdk-8u221-linux-x64.rpm
java -version
zookeeper集群部署
!!!!! 三个节点都部署
// 创建zookeeper相关目录
mkdir /app/zookeeper/{data,logs} -p
// 将下载好的zookeeper解压
tar xf zookeeper-3.4.14.tar.gz -C /usr/local/
ln -s /usr/local/zookeeper-3.4.14/ /usr/local/zookeeper
// 配置环境变量
vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
// 使环境变量生效
source /etc/profile
zookeeper配置
// zookeeper基础配置
cd /usr/local/zookeeper/conf
mv zoo_sample.cfg zoo_sample.cfg_bak
// 新生成配置文件
vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/app/zookeeper/data
dataLogDir=/app/zookeeper/logs
clientPort=2181
server.1=192.168.122.10:2888:3888
server.2=192.168.122.11:2888:3888
server.3=192.168.122.12:2888:3888
// 配置节点标识:
zk01:
echo "1" >/app/zookeeper/data/myid
zk02
echo "2" >/app/zookeeper/data/myid
zk03
echo "3" >/app/zookeeper/data/myid
// 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
// 防火墙设置
firewall-cmd --add-port=2181/tcp --permanent
firewall-cmd --add-port=2888/tcp --permanent
firewall-cmd --add-port=3888/tcp --permanent
#重新加载防火墙配置
firewall-cmd --reload
zookeeper启动
// 进入zookeeper的bin目录
cd /usr/local/zookeeper/bin/
sh zkServer.sh start
// 出现以下字样表示启动成功
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
zookeeper集群查看&连接测试
// 查看节点状态
sh zkServer.sh status
// 状态信息
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper/bin/../conf/zoo.cfg
Mode: follower
// 如果为领导者节点则Mode:leader
// 客户端连接测试
#这里随机选其中一个节点作为客户端连接其他节点即可
sh zkCli.sh -server 192.168.122.11:2181
// 正常连接后会进入ZooKeeper命令行,显示如下:
[zk: 192.168.122.11:2181(CONNECTED) 0]
// 输入命令测试:
[zk: 192.168.122.11:2181(CONNECTED) 0] ls /
[zookeeper]
kafka集群部署
!!! 所有节点
// 创建kafka数据目录
mkdir -p /app/kafka/logs
chmod 777 -R /app/kafka
// 将下载好的kafka解压
tar xf kafka_2.12-2.5.0.tgz -C /usr/local/
ln -s /usr/local/kafka_2.12-2.5.0/ /usr/local/kafka
kafka配置
!!! 所有节点
cd /usr/local/kafka
vim config/server.properties
// 配置日志目录,指定zookeeper服务器
# A comma separated list of directories under which to store log files
log.dirs=/app/kafka/logs
# root directory for all kafka znodes.
zookeeper.connect=10.0.0.11:2181,10.0.0.12:2181,10.0.0.13:2181
!!! 分节点配置
vim /usr/local/kafka/config/server.properties
// kafka-01 节点
broker.id=0
#listeners=PLAINTEXT://:9092
listeners=PLAINTEXT://192.168.122.10:9092
// kafka-02 节点
broker.id=1
#listeners=PLAINTEXT://:9092
listeners=PLAINTEXT://192.168.122.11:9092
// kafka-03 节点
broker.id=2
#listeners=PLAINTEXT://:9092
listeners=PLAINTEXT://192.168.122.12:9092
// 防火墙 (关闭/策略)
systemctl stop firewalld
systemctl disable firewalld
// 开放端口
firewall-cmd --add-port=9092/tcp --permanent
firewall-cmd --reload
kafka启动
cd /usr/local/kafka/
./bin/kafka-server-start.sh config/server.properties &
// 启动成功后输出示例(最后几行)
[2020-01-02 15:30:36,944] INFO Kafka version: 2.3.0 (org.apache.kafka.common.utils.AppInfoParser)
[2020-01-02 15:30:36,945] INFO Kafka commitId: fc1aaa116b661c8a (org.apache.kafka.common.utils.AppInfoParser)
[2020-01-02 15:30:36,945] INFO Kafka startTimeMs: 1577950236938 (org.apache.kafka.common.utils.AppInfoParser)
[2020-01-02 15:30:36,946] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)
kafka测试
// 创建topic
在kafka-01(Broker)上创建测试Tpoic:test-ken-io,这里我们指定了3个副本、1个分区
/usr/local/kafka/bin/kafka-topics.sh --create --bootstrap-server 192.168.122.10:9092 --replication-factor 3 --partitions 1 --topic test-ken-io
// 查看topic
我们可以通过命令列出指定Broker的
/usr/local/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.122.10:9092
// 发送消息
这里我们在broker-01的topic=test-ken-io发送消息
/usr/local/kafka/bin/kafka-console-producer.sh --broker-list 192.168.122.10:9092 --topic test-ken-io
#消息内容
> test by ken.io
// 消费消息
在kafka-02上消费broker-03的消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.122.12:9092 --topic test-ken-io --from-beginning
// 在kafka-03上消费broker-02的消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.122.11:9092 --topic test-ken-io --from-beginning
然后均能收到消息
test by ken.io
这是因为两个消费消息的命令是经历了两个不通的Consumer
如果我们启动Consumer指定Consumer Group id就可以作为一个消费组协同工,1个消息同时只能呗一个Consumer消费到
bin/kafka-console-consumer.sh --bootstrap-server 192.168.122.12:9092 --topic test-ken-io --from-beginning --group testgroup_ken
bin/kafka-console-consumer.sh --bootstrap-server 192.168.122.11:9092 --topic test-ken-io --from-beginning --group testgroup_ken
// 删除topic
#./bin/kafka-topics --delete --zookeeper 【zookeeper server:port】 --topic 【topic name】
./bin/kafka-topics.sh --delete --zookeeper 192.168.122.11:2181 --topic test-ken-io
// 删除topic可参考