环境

  • centos7

1.JDK安装

cd /root
tar zxf jdk-8u181-linux-x64.tar.gz 
mv jdk1.8.0_181 /usr/local/ 
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_181' >> /etc/profile 
echo 'export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile 
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile 

2.keekeeper集群安装

  • 2.1keekeeper集群安装

  • keekeeper-3.7.0 zk01 192.168.31.165 zk02 192.168.31.166 zk03 192.168.31.167 ZooKeeper主要有领导者(Leader)、跟随者(Follower)和观察者(Observer)三种角色。 ZooKeeper集群需要是>1的奇数节点。例如3、5、7等等。 注意:三台机只能挂一台,至少有两台才可以正常工作,

  • 安装包下载

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
  • 创建ZooKeeper相关目录
#创建应用目录
mkdir /usr/zookeeper -p 
#创建数据目录
mkdir /data/zookeeper -p 
mkdir /data/zookeeper/data -p 
mkdir /data/zookeeper/logs -p 
  • 解压到指定目录
tar -zvxf apache-zookeeper-3.7.0-bin.tar.gz -C /usr/zookeeper
  • 配置环境变量
#修改环境变量文件
cat >> /etc/profile <<EOF
export ZOOKEEPER_HOME=/usr/zookeeper/apache-zookeeper-3.7.0-bin
export PATH=$ZOOKEEPER_HOME/bin:$PATH
EOF
#使环境变量生效
source /etc/profile
echo $ZOOKEEPER_HOME
  • 2.2配置ZooKeeper
  • ZooKeeper基础配置
#进入ZooKeeper配置目录
cd $ZOOKEEPER_HOME/conf
#新建配置文件
cat > zoo.cfg << EOF
#zk之间心跳间隔2秒
tickTime=2000
#LF初始通信时限
initLimit=10
#LF同步通信时限
syncLimit=5
#Zookeeper保存数据的目录
dataDir=/data/zookeeper/data
#Zookeeper保存日志文件的目录
dataLogDir=/data/zookeeper/logs
#客户端连接 Zookeeper 服务器的端口
clientPort=2181
server.1=192.168.31.165:2888:3888
server.2=192.168.31.166:2888:3888
server.3=192.168.31.167:2888:3888
EOF
  • 配置节点标识
zk01:
echo "1" > /data/zookeeper/data/myid
zk02:
echo "2" > /data/zookeeper/data/myid
zk03:
echo "3" > /data/zookeeper/data/myid
  • 防火墙开放 2181、2888、3888端口

  • 2.3启动ZooKeeper

sh $ZOOKEEPER_HOME/bin/zkServer.sh start
  • 2.4 测试 2.4.1查看节点状态
sh $ZOOKEEPER_HOME/bin/zkServer.sh status

2.4.2客户端连接测试 这里随机选其中一个节点作为客户端连接其他节点即可

sh $ZOOKEEPER_HOME/bin/zkCli.sh -server 192.168.31.165:2181
] ls /

3 Kafka安装部署

  • 3.1 Kafka介绍 Kafka是一个开源的分布式消息引擎/消息中间件 在Kafka集群(Cluster)中,一个Kafka节点就是一个Broker,消息由Topic来承载, 可以存储在1个或多个Partition中,Partition用于主题分片存储。 发布消息的应用为Producer、消费消息的应用为Consumer,多个Consumer可以促 成Consumer Group共同消费一个Topic中的消息。 kafka01 192.168.31.165 kafka02 192.168.31.166 kafka03 192.168.31.167

  • 3.2应用&数据目录

#创建应用目录
mkdir /usr/kafka
#创建Kafka数据目录
mkdir /data/kafka -p 
mkdir /data/kafka/logs-p 
chmod 777 -R /data/kafka
  • 3.3 下载安装包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.8.0/kafka_2.12-2.8.0.tgz
  • 3.4 解压到应用目录
tar -zvxf kafka_2.12-2.8.0.tgz -C /usr/kafka
  • 3.5 Kafka节点配置
cp  /usr/kafka/kafka_2.12-2.8.0/config/server.properties{,.bak}
  • 3.6总体配置设置
cat >  /usr/kafka/kafka_2.12-2.8.0/config/server.properties << EOF 
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
##修改
log.dirs=/data/kafka/logs
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
##修改
zookeeper.connect=192.168.31.165:2181,192.168.31.166:2181,192.168.31.167:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
listeners=PLAINTEXT://192.168.31.165:9092
EOF
  • 3.7分节点配置
cat /usr/kafka/kafka_2.12-2.8.0/config/server.properties
#Kafka01
broker.id=0
listeners=PLAINTEXT://192.168.31.165:9092
#Kafka02
broker.id=1
listeners=PLAINTEXT://192.168.31.166:9092
#Kafka03
broker.id=2
listeners=PLAINTEXT://192.168.31.167:9092
  • 3.8 防火墙开放 9092端口

  • 3.9 启动Kafka

cd /usr/kafka/kafka_2.12-2.8.0
nohup bin/kafka-server-start.sh config/server.properties >> /var/log/kafka-server.log 2>&1 &
  • 3.10 关闭Kafka
bin/kafka-server-stop.sh
  • 3.11 kafka测试 3.11.1、创建Topic 在kafka01(Broker)上创建测试Tpoic:test-ken-io,这里我们指定了3个副本Broker、test-ken-io有2个分区
cd /usr/kafka/kafka_2.12-2.8.0
bin/kafka-topics.sh --create --bootstrap-server 192.168.31.165:9092 --replication-factor 3 --partitions 2 --topic test-ken-io

Topic在kafka01上创建后也会同步到集群中另外两个副本Broker:kafka02、kafka03 3.11.2、查看Topic 我们可以通过命令列出指定Broker的topic信息

cd /usr/kafka/kafka_2.12-2.8.0
bin/kafka-topics.sh --list --bootstrap-server 192.168.31.165:9092
bin/kafka-topics.sh --list --bootstrap-server 192.168.31.166:9092
bin/kafka-topics.sh --list --bootstrap-server 192.168.31.167:9092

3.11.3、发送消息 这里我们向Broker(id=0)的Topic=test-ken-io发送消息

cd /usr/kafka/kafka_2.12-2.8.0
bin/kafka-console-producer.sh --broker-list  192.168.31.165:9092  --topic test-ken-io
#消息内容
> hei body
> hei girl

3.11.4 消费者 从开始位置消费

cd /usr/kafka/kafka_2.12-2.8.0
bin/kafka-console-consumer.sh --bootstrap-server 192.168.31.167:9092 --topic test-ken-io --from-beginning
bin/kafka-console-consumer.sh --bootstrap-server 192.168.31.166:9092 --topic test-ken-io --from-beginning
bin/kafka-console-consumer.sh --bootstrap-server 192.168.31.165:9092 --topic test-ken-io --from-beginning

然后均能收到消息 hei body hei girl 从最新位置消费

bin/kafka-console-consumer.sh --bootstrap-server 192.168.31.165:9092 --topic test-ken-io 

3.11.5 消费者组 一个Consumer group,多个consumer进程,数量小于等于partition分区的数量 test-ken-io只有2个分区,只能有两个消费者consumer进程去轮询消费消息

bin/kafka-console-consumer.sh --bootstrap-server 192.168.31.167:9092 --topic test-ken-io --group testgroup_ken
bin/kafka-console-consumer.sh --bootstrap-server 192.168.31.167:9092 --topic test-ken-io --group testgroup_ken

4 zk作用

  • 4.1 broker在zk中注册 kafka的每个broker(相当于一个节点,相当于一个机器)在启动时,都会在zk中注册,告诉zk其brokerid,在整个的集群中,broker.id/brokers/ids,当节点失效时,zk就会删除该节点,就很方便的监控整个集群broker的变化,及时调整负载均衡。
[zk: 192.168.31.165:2181(CONNECTED) 73] ls /brokers/ids
[0, 1, 2]
  • 4.2 topic在zk中注册 在kafka中可以定义很多个topic,每个topic又被分为很多个分区。一般情况下,每个分区独立在存在一个broker上,所有的这些topic和broker的对应关系都有zk进行维护
[zk: 192.168.31.165:2181(CONNECTED) 73] ls /brokers/topics/test-ken-io/partitions
[0]
  • 4.3 consumer(消费者)在zk中注册 注意:从kafka-0.9版本及以后,kafka的消费者组和offset信息就不存zookeeper了,而是存到broker服务器上。 所以,如果你为某个消费者指定了一个消费者组名称(group.id),那么,一旦这个消费者启动,这个消费者组名和它要消费的那个topic的offset信息就会被记录在broker服务器上。,但是zookeeper其实并不适合进行大批量的读写操作,尤其是写操作。因此kafka提供了另一种解决方案:增加__consumeroffsets topic,将offset信息写入这个topic
[zk: 192.168.31.165:2181(CONNECTED) 83] ls /brokers/topics/__consumer_offsets/partitions
[0, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 5, 6, 7, 8, 9]