zookeeper集群+kafka集群

zookeeper集群+kafka集群

zookeeper是一个开源的,分布式的,为分布式架构提供协调服务的APACHE的项目。
保存元数据。数据的走向,发送路径不依赖zookeeper。

zookeeper工作机制:

观察者模式设计的分布式服务器管理架构。
负责存储和管理元数据,记录集群的变化。保存集群变化的信息。

zookeeper的特点:
1、在集群中分为领导者和追随者,组成的集群。
2、只要有半数以上的节点正常工作,整个zookeeper就可以正常工作。(zookeeper在部署时一般奇数台)
3、全局的数据一致。每个zookeeper不论是领导者还是追随者,在访问他们数据时都是一致的。
4、数据更新的原子性,一次更新数据,要么都成功,要么都失败
5、数据更新的实时性能。
6、领导者和追随者根据投票产生

选举机制:

A B C
1、服务器A 启动 发起一次选举,A会投自己一票。A有一票,不够半数。选举无法完成。A进入looking1状态
2、服务器B 启动 再发起一次选举,服务器B也投自己一票,服务器A和服务器B做个比较,myid,谁myid大,
如果A比B小,A会把票改投给B,2票,B自动当选为leader
3、C启动了,自动成为追随者,A也会成为追随者

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

yum install -y java 
java -version
mv apache-zookeeper-3.5.7-bin /opt/zookeeper
cd zookeeper/
cd conf/
ls
cp zoo_sample.cfg   zoo.cfg
vim zoo.cfg

2 tickTime=2000
3 #通信心跳时间,zookeeper服务端和客户端之间通信的时间,单位毫秒
6 initLimit=10
7 #leader和follower初始连接时,最多能容忍的心跳数。秒
10 syncLimit=5
11 #leader和follower之间同步通信的超时时间。如果5*2的时间,发生同步超时,leader就认为fo    llower死了,会把他从集群当中删除
 19 clientPort=2181
 20 #服务端口
 15 dataDir=/opt/zookeeper/data
 16 #数据保存目录
 17 dataLogDir=/opt/zookeeper/logs
 21 server.1=192.168.11.144:3188:3288
192.168.11.144服务器的ip地址
3188:zookeeper集群内部通信的端口
3288:重新选举端口,万一leader挂了,用这个端口进行内部通信,选举新的leader
 22 server.2=192.168.11.145:3188:3288
 23 server.3=192.168.11.146:3188:3288

mkdir /opt/zookeeper/data
mkdir /opt/zookeeper/logs
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/opt/zookeeper'
case $1 in
start)
	echo "---------- zookeeper 启动 ------------"
	$ZK_HOME/bin/zkServer.sh start
;;
stop)
	echo "---------- zookeeper 停止 ------------"
	$ZK_HOME/bin/zkServer.sh stop
;;
restart)
	echo "---------- zookeeper 重启 ------------"
	$ZK_HOME/bin/zkServer.sh restart
;;
status)
	echo "---------- zookeeper 状态 -----
chmod +x /etc/init.d/zookeeper 
chkconfig -add zookeeper
chkconfig --add zookeeper
echo 1 > /opt/zookeeper/data/myid    #三台设备每台对应数值不一样对一台对应1,第二台2,第三台3
service zookeeper start
service zookeeper status

kafka概述

消息队列:MQ
在高并发额环境下,同步的请求来不及处理,请求太多会造成阻塞。
比如大量请求并发到数据库,too many connection报错。
消息队列,使用异步处理方式,可以缓解系统处理请求的压力。

kafka作用:

1、异步处理
2、系统解耦
每个系统之间独立运行,互相之间没有必然的依赖关系。
微服务架构中,通信对于解耦来说至关重要
各个微服务之间独立运行,分别处理各自的请求和消息。提高整个系统的吞吐量和能力。
尤其是电商的订单系统,网站的工单系统,典型的一个消息队列场景。
3、负载均衡
消息队列的负载均衡:把任务发送到多个消费者,多个消费者可以并行处理队列中的消息。
4、流量控制和限流
通过延迟方法,处理生产速率和消费者的处理速度(代码控制)
5、数据同步和分发
跨系统的数据同步和日志收集
6、任务调度和定时任务
7、实时数据处理
8、备份和恢复

消息队列的模式:

1、点对点(已淘汰) 一对一 消费者消费完数据之后,生产者会自动清除已经消费的数据
一个生产者对应一个消费者
2、发布/订阅模式:(一对多,观察者模式,消费者数据在消费完之后不会清除(保留一段时间))
生产者发布一个消息,可以是一个消费者使用,也可以是多个消费者同时使用。(主流)

kafka就是发布/订阅模式的消息队列
主要用于大数据实时处理领域 RabbitMQ也是发布/订阅模式的消息队列(小集群内部使用)。

kafka的特性:

1、高吞吐,低延迟
每秒可以处理几十万条数据,延迟只有几毫米
2、集群的可扩展性(热扩展)
可以吧消息的持久化:生产者发布的消息可以保存到磁盘当中,防止数据丢失(有时间限制)
3、容错性
挂了一个可以继续使用
4、高并发
数千个客户端可以同时读写

kafka组件(面试)

topic 主题 kafka的基本单元,所有生产者发布的消息都是发到主题。
消费者订阅主题,然后消息生产者发布的消息。
生产者 生产者把消息发布到主题
消费者 订阅主题,消费生产者发布的消息。

**偏移量:**消息在分区当中的唯一标识,跟踪和定位消息所在的位置。消费者可以根据偏移量来处理信息。

分区 每个主题都可以分成多个分区,每个分区都是数据的有序子集。
分区当中,保留数据,按照偏移量来有序的存储数据。消费可以根据偏移量来消费指定的分区当中的消息(一般不用)
有分区必须有偏移量
分区还有备份的作用:创建主题的时候创建分区,创建分区时要指定副本数。
分区和我们指定的集群机器数量一般保持一致的。
副本:备份分区的消息,最少要两个,互为本分

经纪人broker 经纪人处理生产者和消费者的请求(kafka)元数据(zookeeper)
zookeeper:保存元数据(ip地址、集群信息)

kafka工作流程(面试):

生产者将消息发布到指定的主题,每个消息都附带一个key和value。
主题有多个分区,生产者将消息写入一个分区(带偏移量)
经纪人(kafka):负责分配和处理生产者的发布请求,偏移量也是经纪人分配(在分区当中是唯一的)。
消费者订阅主题,获取全量的消费者的消费信息(默认模式),也可以从执行的分区获取消息(代码来完成,一般不使用)
生产者发布的消息会在本地保留一段时间,防止消费者有延迟或者处理慢,导致没有成功消费。(默认保留:7天)

在这里插入图片描述

192.168.11.144   kafka    主
192.168.11.145   kafka    客户端1
192.168.11.146   kafka    客户端2

主是生产者,客户端1和客户端2是消费者

192.168.11.144 
-----------------------------------------------kafka主配置----------------------------------------------------------
[root@myslq4 opt]# tar -xf kafka_2.13-3.4.1.tgz 
[root@myslq4 opt]# mv kafka_2.13-3.4.1 /usr/local/kafka
[root@myslq4 opt]# cd /usr/local/kafka/config/
[root@myslq3 config]# vim server.properties
24 broker.id=0      每台主机必须不一样
34 listeners=PLAINTEXT://192.168.11.144:9092
44 num.network.threads=3
#broker处理网络请求的线程数,一般不动
47 num.io.threads=8
#处理磁盘读写的线程数,数制一定大于磁盘数量
51 socket.send.buffer.bytes=102400
#发送套接字的缓冲区的大小
54 socket.receive.buffer.bytes=102400
 #接收套接字缓冲区的大小
57 socket.request.max.bytes=104857600
 #请求套接字缓冲区的大小
63 log.dirs=/usr/local/kafka/logs
64 #日志存放路径
68 num.partitions=1
69 #创建主题时,经纪人指定的分区数,如果指定的分区数不同,这个值可以覆盖
106 log.retention.hours=168
107 #消息的本地持久化保留的时间,168小时
126 zookeeper.connect=192.168.11.144:2181,192.168.11.145:2181,192.168.11.146:2181

[root@myslq3 config]# vim /etc/profile
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/bin
[root@myslq3 config]# source /etc/profile
[root@myslq3 config]# vim /etc/init.d/kafka 
#!/bin/bash
#chkconfig:2345 22 88
#description:Kafka Service Control Script
KAFKA_HOME='/usr/local/kafka'
case $1 in
start)
	echo "---------- Kafka 启动 ------------"
	${KAFKA_HOME}/bin/kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
;;
stop)
	echo "---------- Kafka 停止 ------------"
	${KAFKA_HOME}/bin/kafka-server-stop.sh
;;
restart)
	$0 stop
	$0 start
;;
status)
	echo "---------- Kafka 状态 ------------"
	count=$(ps -ef | grep kafka | egrep -cv "grep|$$")
	if [ "$count" -eq 0 ];then
        echo "kafka is not running"
    else
        echo "kafka is running"
    fi
;;
*)
    echo "Usage: $0 {start|stop|restart|status}"
esac

[root@myslq3 config]# service kafka start
---------- Kafka 启动 ------------


/usr/local/kafka/bin/kafka-topics.sh

/usr/local/kafka/bin/kafka-topics.sh --create --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092 --replication-factor 2 --partitions 3 --topic test9
创建主题命令
--replication-factor 2:创建分区的副本数,最少2个
--partition 3:分区数
--topic test9:主题名称

kafka-console-producer.sh --broker-list 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092 --topic test9
生产者生产消息命令

kafka-console-consumer.sh --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092 --topic test15 --from-beginning    
消费者消费生产者生产的消息

kafka-topics.sh --describe --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092
#查询集群中的主题详细信息


kafka-topics.sh --list --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092
#列出Kafka集群中当前存在的所有主题

service zookeeper status   查看状态

192.168.11.145
-----------------------------------------------kafka客户机1---------------------------------------------------------
[root@myslq4 opt]# tar -xf kafka_2.13-3.4.1.tgz 
[root@myslq4 opt]# mv kafka_2.13-3.4.1 /usr/local/kafka
[root@myslq4 opt]# cd /usr/local/kafka/config/
[root@myslq3 config]# vim server.properties
24 broker.id=1    
#每台主机必须不一样
34 listeners=PLAINTEXT://192.168.11.145:9092
44 num.network.threads=3
#broker处理网络请求的线程数,一般不动
47 num.io.threads=8
#处理磁盘读写的线程数,数制一定大于磁盘数量
51 socket.send.buffer.bytes=102400
#发送套接字的缓冲区的大小
54 socket.receive.buffer.bytes=102400
 #接收套接字缓冲区的大小
57 socket.request.max.bytes=104857600
 #请求套接字缓冲区的大小
63 log.dirs=/usr/local/kafka/logs
64 #日志存放路径
68 num.partitions=1
69 #创建主题时,经纪人指定的分区数,如果指定的分区数不同,这个值可以覆盖
106 log.retention.hours=168
107 #消息的本地持久化保留的时间,168小时
126 zookeeper.connect=192.168.11.144:2181,192.168.11.145:2181,192.168.11.146:2181

[root@myslq3 config]# vim /etc/profile
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/bin
[root@myslq3 config]#source /etc/profile
[root@myslq3 config]# vim /etc/init.d/kafka 
#!/bin/bash
#chkconfig:2345 22 88
#description:Kafka Service Control Script
KAFKA_HOME='/usr/local/kafka'
case $1 in
start)
	echo "---------- Kafka 启动 ------------"
	${KAFKA_HOME}/bin/kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
;;
stop)
	echo "---------- Kafka 停止 ------------"
	${KAFKA_HOME}/bin/kafka-server-stop.sh
;;
restart)
	$0 stop
	$0 start
;;
status)
	echo "---------- Kafka 状态 ------------"
	count=$(ps -ef | grep kafka | egrep -cv "grep|$$")
	if [ "$count" -eq 0 ];then
        echo "kafka is not running"
    else
        echo "kafka is running"
    fi
;;
*)
    echo "Usage: $0 {start|stop|restart|status}"
esac

[root@myslq3 config]# service kafka start
---------- Kafka 启动 ------------

kafka-topics.sh --describe --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092
#查询集群中的主题详细信息


kafka-topics.sh --list --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092
#列出Kafka集群中当前存在的所有主题

service zookeeper status   查看状态

192.168.11.146
-----------------------------------------------kafka客户机2---------------------------------------------------------
[root@myslq4 opt]# tar -xf kafka_2.13-3.4.1.tgz 
[root@myslq4 opt]# mv kafka_2.13-3.4.1 /usr/local/kafka
[root@myslq4 opt]# cd /usr/local/kafka/config/
[root@myslq3 config]# vim server.properties
24 broker.id=2      每台主机必须不一样
34 listeners=PLAINTEXT://192.168.11.146:9092
44 num.network.threads=3
#broker处理网络请求的线程数,一般不动
47 num.io.threads=8
#处理磁盘读写的线程数,数制一定大于磁盘数量
51 socket.send.buffer.bytes=102400
#发送套接字的缓冲区的大小
54 socket.receive.buffer.bytes=102400
 #接收套接字缓冲区的大小
57 socket.request.max.bytes=104857600
 #请求套接字缓冲区的大小
63 log.dirs=/usr/local/kafka/logs
64 #日志存放路径
68 num.partitions=1
69 #创建主题时,经纪人指定的分区数,如果指定的分区数不同,这个值可以覆盖
106 log.retention.hours=168
107 #消息的本地持久化保留的时间,168小时
126 zookeeper.connect=192.168.11.144:2181,192.168.11.145:2181,192.168.11.146:2181

[root@myslq3 config]# vim /etc/profile
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/bin
[root@myslq3 config]#source /etc/profile
[root@myslq3 config]# vim /etc/init.d/kafka 
#!/bin/bash
#chkconfig:2345 22 88
#description:Kafka Service Control Script
KAFKA_HOME='/usr/local/kafka'
case $1 in
start)
	echo "---------- Kafka 启动 ------------"
	${KAFKA_HOME}/bin/kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
;;
stop)
	echo "---------- Kafka 停止 ------------"
	${KAFKA_HOME}/bin/kafka-server-stop.sh
;;
restart)
	$0 stop
	$0 start
;;
status)
	echo "---------- Kafka 状态 ------------"
	count=$(ps -ef | grep kafka | egrep -cv "grep|$$")
	if [ "$count" -eq 0 ];then
        echo "kafka is not running"
    else
        echo "kafka is running"
    fi
;;
*)
    echo "Usage: $0 {start|stop|restart|status}"
esac

[root@myslq3 config]# service kafka start
---------- Kafka 启动 ------------

kafka-topics.sh --describe --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092
#查询集群中的主题详细信息


kafka-topics.sh --list --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092
#列出Kafka集群中当前存在的所有主题

service zookeeper status   查看状态

总结:
zookeeper 就是保存集群的元数据
kafka 工作流程:
组件的作用 消费者、生产者、
kafka消息堆积如何解决?
主要原因:主要在于消费者出现延迟或者处理能力太差,导致消息堆积
解决办法:1、减少kafka持久化保存时间
2、修改主题的分区数,扩大分区数量,提高消费者获取的通道
3、可以指定多个消费者共同工作,处理消息的积压。

#查询集群中的主题详细信息

kafka-topics.sh --list --bootstrap-server 192.168.11.144:9092,192.168.11.145:9092,192.168.11.146:9092
#列出Kafka集群中当前存在的所有主题

service zookeeper status 查看状态


总结:
zookeeper 就是保存集群的元数据
**kafka 工作流程:**
**组件的作用**    消费者、生产者、
kafka消息堆积如何解决?
主要原因:主要在于消费者出现延迟或者处理能力太差,导致消息堆积
解决办法:1、减少kafka持久化保存时间
                  2、修改主题的分区数,扩大分区数量,提高消费者获取的通道 
                  3、可以指定多个消费者共同工作,处理消息的积压。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个基本的在k8s上部署zookeeper + kafka集群的配置教程: 1. 创建一个namespace 首先,我们需要创建一个namespace,用于部署zookeeperkafka集群。可以使用以下命令创建一个名为“zookeeper-kafka”的namespace: ``` kubectl create namespace zookeeper-kafka ``` 2. 部署Zookeeper 接下来,我们需要部署Zookeeper。可以使用以下YAML文件创建一个Zookeeper服务: ``` apiVersion: v1 kind: Service metadata: name: zookeeper spec: selector: app: zookeeper ports: - name: client port: 2181 protocol: TCP - name: follower port: 2888 protocol: TCP - name: leader port: 3888 protocol: TCP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: zookeeper spec: serviceName: zookeeper replicas: 3 selector: matchLabels: app: zookeeper template: metadata: labels: app: zookeeper spec: containers: - name: zookeeper image: zookeeper:3.5.8 ports: - name: client containerPort: 2181 - name: follower containerPort: 2888 - name: leader containerPort: 3888 volumeMounts: - name: datadir mountPath: /data env: - name: ZOO_MY_ID valueFrom: fieldRef: fieldPath: metadata.name - name: ZOO_SERVERS value: zookeeper-0.zookeeper:2888:3888,zookeeper-1.zookeeper:2888:3888,zookeeper-2.zookeeper:2888:3888 volumeClaimTemplates: - metadata: name: datadir spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` 这将创建一个3个Pod的Zookeeper StatefulSet,并创建一个名为“zookeeper”的Service,暴露Zookeeper的客户端端口2181,follower端口2888和leader端口3888。 3. 部署Kafka 现在,我们可以部署Kafka。以下是一个Kafka部署的YAML文件示例: ``` apiVersion: v1 kind: Service metadata: name: kafka spec: type: NodePort selector: app: kafka ports: - name: kafka port: 9092 nodePort: 30092 protocol: TCP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: kafka spec: serviceName: kafka replicas: 3 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: wurstmeister/kafka:2.13-2.7.0 ports: - name: kafka containerPort: 9092 env: - name: KAFKA_BROKER_ID valueFrom: fieldRef: fieldPath: metadata.name - name: KAFKA_ZOOKEEPER_CONNECT value: zookeeper-0.zookeeper:2181,zookeeper-1.zookeeper:2181,zookeeper-2.zookeeper:2181 - name: KAFKA_ADVERTISED_LISTENERS value: PLAINTEXT://$(hostname -f):9092 - name: KAFKA_LISTENERS value: PLAINTEXT://0.0.0.0:9092 - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR value: "3" volumeMounts: - name: datadir mountPath: /data volumeClaimTemplates: - metadata: name: datadir spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` 这将创建一个3个Pod的Kafka StatefulSet和一个名为“kafka”的Service,它将Kafka的9092端口暴露为NodePort 30092。 4. 验证部署 现在,您可以使用以下命令检查ZookeeperKafka是否正在运行: ``` kubectl get pods -n zookeeper-kafka ``` 您应该看到3个Zookeeper和3个Kafka Pod处于“Running”状态。 接下来,您可以使用以下命令检查Kafka是否正在监听端口30092(或您自己选择的端口): ``` kubectl get services -n zookeeper-kafka ``` 您应该看到一个名为“kafka”的service,它将Kafka的9092端口暴露为30092端口。可以使用此端口测试Kafka是否正常运行。 至此,您已经成功地在k8s上部署了zookeeper + kafka集群
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码要你命

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值