# cd /opt/tools
# wget http://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
tar zxvf apache-zookeeper-3.5.8-bin.tar.gz
cp apache-zookeeper-3.5.8-bin /opt/app/zookeeper-1 -rf
cp apache-zookeeper-3.5.8-bin /opt/app/zookeeper-2 -rf
cp apache-zookeeper-3.5.8-bin /opt/app/zookeeper-3 -rf
注:因为我们需要在同一台服务器中部署一个Zookeeper集群(3个节点),所以需要复制三个zookeeper目录出来
# cd /opt/app/zookeeper-1/conf/
# cp zoo_sample.cfg zoo.cfg
# vim zoo.cfg
# zookeeper服务器心跳时间,单位为ms
tickTime=2000
# 投票选举新leader的初始化时间
initLimit=10
# leader与follower心跳检测最大容忍时间,响应超过 syncLimit * tickTime,leader认为follower死掉,从服务器列表删除follower
syncLimit=5
# 数据目录
dataDir=/opt/data/zk1/data
# 日志目录
dataLogDir=/opt/data/zk1/logs
# 对外服务的端口
clientPort=2181
server.1=10.1.3.85:2881:3881
server.2=10.1.3.85:2882:3882
server.3=10.1.3.85:2883:3883
注:上面配置文件中的数据目录和日志目录需自行去创建对应的文件夹。这里server后的数字,与myid文件中的id是一致的。
zookeeper启动会占用三个端口,分别的作用是:
2181:对cline端提供服务
3881:选举leader使用
2881:集群内机器通讯使用(Leader监听此端口)
# cd /opt/app/zookeeper-2/conf/
# cp zoo_sample.cfg zoo.cfg
# vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/data/zk2/data
dataLogDir=/opt/data/zk2/logs
clientPort=2182
# 集群ip配置
server.1=10.1.3.85:2881:3881
server.2=10.1.3.85:2882:3882
server.3=10.1.3.85:2883:3883
# cd /opt/app/zookeeper-3/conf/
# cp zoo_sample.cfg zoo.cfg
# vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/data/zk3/data
dataLogDir=/opt/data/zk3/logs
clientPort=2183
# 集群ip配置
server.1=10.1.3.85:2881:3881
server.2=10.1.3.85:2882:3882
server.3=10.1.3.85:2883:3883
mkdir -p /opt/data/{zk1,zk2,zk3}/{data,logs}
echo 1 >> /opt/data/zk1/data/myid
echo 2 >> /opt/data/zk2/data/myid
echo 3 >> /opt/data/zk3/data/myid
/opt/app/zookeeper-1/bin/zkServer.sh start
/opt/app/zookeeper-2/bin/zkServer.sh start
/opt/app/zookeeper-3/bin/zkServer.sh start
# jps -l|grep zookeeper
98315 org.apache.zookeeper.ZooKeeperMain
71854 org.apache.zookeeper.server.quorum.QuorumPeerMain
71772 org.apache.zookeeper.server.quorum.QuorumPeerMain
71007 org.apache.zookeeper.server.quorum.QuorumPeerMain
# 节点1
# /opt/app/zookeeper-1/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper-1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
# 节点2
# /opt/app/zookeeper-2/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper-2/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost.
Mode: follower
# 节点3
# /opt/app/zookeeper-3/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper-3/bin/../conf/zoo.cfg
Client port found: 2183. Client address: localhost.
Mode: leader
以上可获取每一台zk的Mode信息(leader,follower)leader:为领导者 follower:追随者
一个时候只有一台leader提供对外服务
# cd /opt/tools
# wget https://archive.apache.org/dist/kafka/2.6.0/kafka_2.12-2.6.0.tgz
# tar zxvf kafka_2.12-2.6.0.tgz
# mv kafka_2.12-2.6.0 /opt/app/kafka
# vim /opt/app/kafka/config/server-1.properties
# 每一个broker在集群中的唯一标示,要求是正数。在改变IP地址,不改变broker.id的话不会影响consumers
broker.id=1
# 提供给客户端响应的地址和端口
listeners = PLAINTEXT://10.1.3.85:9091
# 提供给客户端响应的地址和端口(允许外网访问)
advertised.listeners=PLAINTEXT://10.1.3.85:9091
# broker 处理消息的最大线程数
num.network.threads=3
# broker处理磁盘IO的线程数 ,数值应该大于你的硬盘数
num.io.threads=8
# socket的发送缓冲区大小
socket.send.buffer.bytes=102400
# socket的接收缓冲区,socket的调优参数SO_SNDBUFF
socket.receive.buffer.bytes=102400
# socket请求的最大数值,防止serverOOM,message.max.bytes必然要小于socket.request.max.bytes,会被topic创建时的指定参数覆盖
socket.request.max.bytes=104857600
# kafka数据的存放地址,多个地址的话用逗号分割
log.dirs=/opt/data/kafka/kafka-logs-1
# 每个topic的分区个数,若是在topic创建时候没有指定的话会被topic创建时的指定参数覆盖
num.partitions=1
# 我们知道segment文件默认会被保留7天的时间,超时的话就会被清理,那么清理这件事情就需要有一些线程来做。这里就是用来设置恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir=1
# kafka的内部topic consumer_offsets副本数
offsets.topic.replication.factor=1
# 事务主题的复制因子(设置更高以确保可用性)
transaction.state.log.replication.factor=1
# 覆盖事务主题的min.insync.replicas配置,该参数将默认replicas定义为2
transaction.state.log.min.isr=1
# 控制一条消息数据被保存多长时间,默认是7天
log.retention.hours=168
# 日志文件中每个segment的大小,默认为1G
log.segment.bytes=1073741824
# 上面的参数设置了每一个segment文件的大小是1G,那么就需要有一个东西去定期检查segment文件有没有达到1G,多长时间去检查一次,就需要设置一个周期性检查文件大小的时间(单位是毫秒)。
log.retention.check.interval.ms=300000
# 消费者集群通过连接Zookeeper来找到broker。zookeeper连接服务器地址
zookeeper.connect=10.1.3.85:2181,10.1.3.85:2182,10.1.3.85:2183
# ms连接zookeeper超时时间
zookeeper.connection.timeout.ms=18000
# 空消费组延时rebalance,默认值3秒,0为无限时
group.initial.rebalance.delay.ms=0
# 获取消息后提交偏移量的最大时间,超过设定的时间(默认5分钟),服务端也会认为该消费者失效。
max.poll.interval.ms=3600000
#配置是否开启自动创建topic,如果设置为true, kafka会在以下几种场景自动创建topic:
#当一个producer开始往topic写入消息时。
#当一个consumer开始从topic消费消息时。
#当一个client向topic发送元数据请求时。
auto.create.topics.enable=true
# vim /opt/app/kafka/config/server-2.properties
broker.id=2
listeners = PLAINTEXT://10.1.3.85:9092
advertised.listeners=PLAINTEXT://10.1.3.85:9092
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=/opt/data/kafka/kafka-logs-2
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=10.1.3.85:2181,10.1.3.85:2182,10.1.3.85:2183
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
max.poll.interval.ms=3600000
auto.create.topics.enable=true
# vim /opt/app/kafka/config/server-3.properties
broker.id=3
listeners = PLAINTEXT://10.1.3.85:9093
advertised.listeners=PLAINTEXT://10.1.3.85:9093
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=/opt/data/kafka/kafka-logs-3
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=10.1.3.85:2181,10.1.3.85:2182,10.1.3.85:2183
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
max.poll.interval.ms=3600000
auto.create.topics.enable=true
# /opt/app/kafka/bin/kafka-server-start.sh -daemon /opt/app/kafka/config/server-1.properties
# /opt/app/kafka/bin/kafka-server-start.sh -daemon /opt/app/kafka/config/server-2.properties
# /opt/app/kafka/bin/kafka-server-start.sh -daemon /opt/app/kafka/config/server-3.properties
# jps -l|grep kafka
110149 kafka.Kafka
109774 kafka.Kafka
110548 kafka.Kafka
# /opt/app/kafka/bin/kafka-topics.sh --list --zookeeper 10.1.3.85:2181,10.1.3.85:2182,10.1.3.85:2183
# /opt/app/kafka/bin/kafka-topics.sh --create --zookeeper 10.1.3.85:2181 --replication-factor 1 --partitions 1 --topic test
Created topic test.
选项解释:
--create:创建新的Topic
--bootstrap-server:指定要哪台Kafka服务器上创建Topic,主机加端口,指定的主机地址一定要和配置文件中的listeners一致
--zookeeper:指定要哪台zookeeper服务器上创建Topic,主机加端口,指定的主机地址一定要和配置文件中的listeners一致
--replication-factor:创建Topic中的每个分区(partition)中的复制因子数量,即为Topic的副本数量,建议和Broker节点数量一致,如果复制因子超出Broker节点将无法创建
--partitions:创建该Topic中的分区(partition)数量
--topic:指定Topic名称
# /opt/app/kafka/bin/kafka-topics.sh --list --zookeeper 10.1.3.85:2181,10.1.3.85:2182,10.1.3.85:2183
test
# /opt/app/kafka/bin/kafka-console-producer.sh --broker-list 10.1.3.85:9092 --topic test
>
参数解释:
--broker-list:指定使用哪台broker来生产消息
--topic:指定要往哪个Topic中生产消息
我们在Kafka_node1上的Topic生产消息,在Kafka_node3中消费消息,可以得出,Broker存储过消息后会同步给集群内的其它Broker节点
# /opt/app/kafka/bin/kafka-console-consumer.sh --bootstrap-server 10.1.3.85:9091 --topic test --from-beginning
生产者中写入数据
# /opt/app/kafka/bin/kafka-console-producer.sh --broker-list 10.1.3.85:9092 --topic test
>this is producer
消费者中显示
# /opt/app/kafka/bin/kafka-console-consumer.sh --bootstrap-server 10.1.3.85:9091 --topic test --from-beginning
this is producer
# /opt/app/kafka/bin/kafka-topics.sh --describe --bootstrap-server 10.1.3.85:9092 --topic test
Topic: test PartitionCount: 1 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 3 Replicas: 3 Isr: 3
参数解释:
Topic: test:topic名称
PartitionCount:3:分片数量
ReplicationFactor:3:Topic副本数量
# /opt/app/kafka/bin/kafka-topics.sh --delete --bootstrap-server 10.1.3.85:9092 --topic test
# /opt/app/kafka/bin/kafka-topics.sh --list --bootstrap-server 10.1.3.85:9092
test
我们在node1节点删除了Topic,三台节点会同步更新,所以我们的kafka_data在三台node上全部删除