kafka集群环境搭建

303 阅读7分钟

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

ZooKeeper作为给分布式系统提供协调服务的工具被kafka所依赖。在分布式系统中,消费者需要知道有哪些生产者是可用的,而如果每次消费者都需要和生产者建立连接并测试是否成功连接,那效率也太低了,显然是不可取的。而通过使用ZooKeeper协调服务,Kafka就能将Producer,Consumer,Broker等结合在一起,同时借助ZooKeeper,Kafka就能够将所有组件在无状态的条件下建立起生产者和消费者的订阅关系,实现负载均衡。

image.png

准备工作

环境准备:

准备三台服务器,安装jdk1.8,其中每一台虚拟机的hosts文件中都需要配置如下的内容

192.168.200.11 node1
192.168.200.12 node2
192.168.200.13 node3

修改IP地址

修改网卡配置文件

vi /etc/sysconfifig/network-scripts/ifcfg-ens33
  • bootproto=static,表示使用静态IP
  • onboot=yes,表示将网卡设置为开机启用
  • 将原有的原有IP修改为192.168.200.11
  • 重启网络服务
service network restart
  • 安装目录创建
安装包存放的目录:/export/software
安装程序存放的目录:/export/servers
数据目录:/export/data
日志目录:/export/logs

创建各级目录命令:
mkdir -p /export/servers/
mkdir -p /export/software/
mkdir -p /export/data/
mkdir -p /export/logs/
  • 修改host 执行命令“cd /etc/”进入服务器etc目录
    执行命令“vi hosts”编辑hosts文件
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.200.11 node1
192.168.200.12 node2
192.168.200.13 node3

执行命令”/etc/init.d/network restart“ 重启hosts
执行命令”cat /etc/hosts“可以查看到hosts文件修改成功

Zookeeper集群搭建

  1. Linux安装JDK,三台Linux都安装
# 使用rpm安装JDK
rpm -ivh jdk-8u261-linux-x64.rpm
# 默认的安装路径是/usr/java/jdk1.8.0_261-amd64
# 配置JAVA_HOME
vi /etc/profile
# 文件最后添加两行
export JAVA_HOME=/usr/java/jdk1.8.0_261-amd64 export PATH=$PATH:$JAVA_HOME/bin
# 退出vi,使配置生效
source /etc/profile

查看JDK是否正确安装

java -version
  1. Linux 安装Zookeeper,三台Linux都安装,以搭建Zookeeper集群
# node1操作
# 解压到/opt目录
tar -zxf zookeeper-3.4.14.tar.gz -C /opt
# 配置
cd /opt/zookeeper-3.4.14/conf
# 配置文件重命名后生效
cp zoo_sample.cfg zoo.cfg
#编辑
vi zoo.cfg
# 设置数据目录
dataDir=/var/lagou/zookeeper/data
# 添加
server.1=node1:2881:3881
server.2=node2:2881:3881
server.3=node3:2881:3881

# 退出vim
mkdir -p /var/lagou/zookeeper/data
echo 1 > /var/lagou/zookeeper/data/myid

# 配置环境变量
vi /etc/profile
# 添加
export ZOOKEEPER_PREFIX=/opt/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_PREFIX/bin
export ZOO_LOG_DIR=/var/lagou/zookeeper/log

# 退出vim,让配置生效
source /etc/profile

node2配置

# 配置环境变量
vim /etc/profile
# 在配置JDK环境变量基础上,添加内容
export ZOOKEEPER_PREFIX=/opt/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_PREFIX/bin
export ZOO_LOG_DIR=/var/lagou/zookeeper/log

# 退出vim,让配置生效
source /etc/profile

mkdir -p /var/lagou/zookeeper/data
echo 2 > /var/lagou/zookeeper/data/myid

node3配置

# 配置环境变量
vim /etc/profile
# 在配置JDK环境变量基础上,添加内容
export ZOOKEEPER_PREFIX=/opt/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_PREFIX/bin
export ZOO_LOG_DIR=/var/lagou/zookeeper/log

# 退出vim,让配置生效
source /etc/profile

mkdir -p /var/lagou/zookeeper/data
echo 3 > /var/lagou/zookeeper/data/myid

启动zookeeper

# 在三台Linux上启动Zookeeper
[root@node1 ~]# zkServer.sh start
[root@node2 ~]# zkServer.sh start
[root@node3 ~]# zkServer.sh start

# 在三台Linux上查看Zookeeper的状态
[root@node1 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower

[root@node2 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader

[root@node3 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower

下载安装包

kafka.apache.org/

image.png

由于kafka是scala语言编写的,基于scala的多个版本,kafka发布了多个版本。其中2.11是推荐版本.

上传安装包并解压

使用 rz 命令将安装包上传至 /export/software
1) 切换目录上传安装包
cd /export/software
rz # 选择对应安装包上传即可

2) 解压安装包到指定目录下
tar -zxvf kafka_2.11-1.0.0.tgz -C /export/servers/
cd /export/servers/

3) 重命名(由于名称太长)
mv kafka_2.11-1.0.0 kafka

修改kafka的核心配置文件

cd /export/servers/kafka/config/
vi server.properties

#broker.id 标识了kafka集群中一个唯一broker。
broker.id=0
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600

# 存放生产者生产的数据 数据一般以topic的方式存放
log.dirs=/export/data/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

# zk的信息
zookeeper.connect=node1:2181,node2:2181,node3:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

delete.topic.enable=true
host.name=node1

将配置好的kafka分发到其他二台主机

cd /export/servers
scp -r kafka/ node2:$PWD
scp -r kafka/ node3:$PWD

Linux scp命令用于Linux之间复制文件和目录。

scp是secure copy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。

  • 拷贝后, 需要修改每一台的broker.id 和 host.name和listeners
ip为11的服务器: broker.id=0 , host.name=node1 listeners=PLAINTEXT://node1:9092
ip为12的服务器: broker.id=1 , host.name=node2 listeners=PLAINTEXT://node2:9092
ip为13的服务器: broker.id=2 , host.name=node3 listeners=PLAINTEXT://node3:9092
  • 在每一台的服务器执行创建数据文件的命令
mkdir -p /export/data/kafka

启动集群

注意事项:在kafka启动前,一定要让zookeeper启动起来

cd /export/servers/kafka/bin
#前台启动
./kafka-server-start.sh /export/servers/kafka/config/server.properties

#后台启动
nohup ./kafka-server-start.sh /export/servers/kafka/config/server.properties 2>&1 &

注意:可以启动一台broker,单机版。也可以同时启动三台broker,组成一个kafka集群版

#kafka停止
./kafka-server-stop.sh

可以通过jps查看kafka进程是否已经启动了

登录的前提是, 通过jps是可以看到kafka的进程
登录zookeeper: zkCli.sh
执行: ls /brokers/ids

Docker环境下的Kafka集群搭建

hostnameip addrportlistener
zoo1192.168.0.112184:2181
zoo2192.168.0.122185:2181
zoo3192.168.0.132186:2181
kafka1192.168.0.149092:9092kafka1
kafka2192.168.0.159093:9092kafka1
kafka3192.168.0.169094:9092kafka1
kafka-manager192.168.0.179000:9000
宿主机192.168.200.20

准备工作

克隆VM,修改IP地址为192.168.200.20

vi /etc/sysconfifig/network-scrpits/ifcfg-ens33

安装docker-compose

Compose是用于定义和运行多容器Docker应用程序的工具。

如果我们还是使用原来的方式操作docker,那么就需要下载三个镜像:Zookeeper、Kafka、Kafka-Manager,需要对Zookeeper安装三次并配置集群、需要对Kafka安装三次,修改配置文件,Kafka-Manager安装一次,但是需要配置端口映射机器Zooker、Kafka容器的信息。但是引入Compose之后可以使用yaml格式的配置文件配置好这些信息,每个image只需要编写一个yaml文件,可以在文件中定义集群信息、端口映射等信息,运行该文件即可创建完成集群。

通过Compose,您可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。

Compose 使用的两个步骤:

  • 使用docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 执行docker-compose up 命令来启动并运行整个应用程序。
#curl 是一种命令行工具,作用是发出网络请求,然后获取数据
curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose

#chmod(change mode)命令是控制用户对文件的权限的命令
chmod +x /usr/local/bin/docker-compose

#查看版本
docker-compose --version

拉取镜像

#拉取Zookeeper镜像
docker pull zookeeper:3.4
#拉取kafka镜像
docker pull wurstmeister/kafka
#拉取kafka-manager镜像
docker pull sheepkiller/kafka-manager:latest

创建集群网络

基于Linux宿主机而工作的,也是在Linux宿主机创建,创建之后Docker容器中的各个应用程序可以使用该网络。

#创建
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 kafka
#查看
docker network ls

网络设置

新建网段之后可能会出现

WARNING: IPv4 forwarding is disabled. Networking will not work.

解决方式:

  • 第一步:在宿主机上执行:echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf
  • 第二步:重启network和docker服务
systemctl restart network && systemctl restart docker

搭建过程

每个镜像一个yml文件,Zookeeper、Kafka、Kafka-Manager一个

编写yml文件

  • docker-compose-zookeeper.yml

    • Zookeeper各个节点的信息,端口映射,集群信息,网络配置
  • docker-compose-kafka.yml

  • docker-compose-manager.yml

  • 将yaml文件上传到Docker宿主机中

    • 安装:yum install -y lrzsz
    • 上传到指定目录
  • 开始部署
    使用命令:

docker-compose up -d 
// 参数说明: up表示启动, -d表示后台运行
docker-compose -f /home/docker-compose-zookeeper.yml up -d
// 参数说明: -f:表示加载指定位置的yaml文件
docker-compose -f /home/docker-compose-kafka.yml up -d
docker-compose -f /home/docker-compose-manager.yml up -d