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

http://archive.apache.org/dist/zookeeper

kafka

kafka_2.12-2.5.0.tgz

https://mirrors.tuna.tsinghua.edu.cn/apache/kafka

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可参考