kafka是一种消息中间件
1、消息中间件作用什么
最重要的功能:解耦、异步、并行
2、为什么要用消息中间件
后续在加还没有整理完…
3、kafka结构
Topic是什么?
一个Topic可以认为存储一类消息
程序A产生了一类消息,然后把这类消息放在kafka group中 ,这由程序A产生的这个消息就叫一个topic,B要想获得A的消息,就是要订阅这个消息,才能成为这个topic的消费者
每个topic将被分成多个partition(区)
如果Topic有个1-100 我把1-33分给了P1,34-90分给P2,91-100分给P3 .这样组合在一块才是1-100的数据
每个topic将被分成多个partition(区),此外kafka还可以配置partitions需要备份的个数(replicas) ----Topic由3个partition组成的(p1,p2,p3) ,每个partition还有备份
基于replicated方案,那么就意味着需要对多个备份进行调度;每个partition都有一个server为"leader";leader负责所有的读写操作,如果leader失效,那么将会有其他follower来接管(成为新的leader);follower只是单调的和leader跟进(p1’同步p1的数据),同步消息,保证数据一致,即可…由此可见作为leader的server承载了全部的请求压力,因此从集群的整体考虑,有多少个partitions就意味着有多少个"leader",kafka会将"leader"均衡的分散在每个实例上,来确保整体的性能稳定
上面的图有3个Partitions,每个Partitions,都由两个replicated,在他们两个选一个leader
leader、follower:kafka会选择分区内的一个副本作为leader副本,而其他副本作为follower副本,只有leader副本才能处理读写请求,即producer和consumer只跟leader副本交互,follower副本只是从leader上复制数据
其中partition leader的位置,这个leader是谁,选举放到哪个主机上kafka本身是不存的,kafka只是负责选举,是存在(host:port)注册在zookeeper中
生产一个数据,Partitions在server里有一个appendlog文件,我写一个第一个消息,可能会记录这个p1里,我写第二个消息,可能记录在p2里面,我写第三个里面会记录p3里,他们三个在一起才能保证数据是正确,每写一个消息进来会有一个offset就是偏移量,不管怎么写,读还是一个完整的消息,对这个topic进行读
问 topic有几个partition,和有几个replicated谁决定呢?
答: Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于"round-robin"方式或者通过其他的一些算法等.
kafka的配置文件中配置了 partition的数量和 replication的数量
但是这个是默认值,创建topic时不指定partition数量的话才会使用这个默认值比如我们拿一个创建topic的例子来说:
例子:
创建一个叫做 test的topic,它只有两个分区,一个副本
zookeeper原理 (例子5个zookeeper组成的集群)
- 当一个kafkabroker启动后(启动两个),首先会向zookeeper注册自己的节点信息(临时znode),同时当broker和zookeeper断开连接时,此znode也会被删除.
- 其中partition leader的位置(host:port)注册在zookeeper中
zk认为有2个kafka,集群有2个节点组成
zk简介
•zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务
•zookeeper其实就是一个软件,所有安装了zookeeper的服务器都叫 zookeeper server
• zookeeper server 还分为两类角色(选举机制),由 leader 和 follower 组成,如果leader挂掉,会有选举机制,follower直接替换leader ,leader只有一个,剩下的都是follower
• zookeeper 的所有服务器中的所有数据结构(树形结构)是完全相同的,就是说我搭建一个zookeeper集群,集群里面所有机器的数据是一样的一共有5个zk集群,(我把一些信息写到1号zk里,剩余其他4个就会同步数据)
• 数据是树形结构的,与linux目录结构是一样一样的,zk的每个数据目录就是一个znode
• 我需要运行几个ZooKeeper? 你运行一个zookeeper也是可以的,但是在生产环境中,你最好部署3,5,7个节点。部署的越多,可靠性就越高,当然最好是部署奇数个,偶数个不是不可以的,但是zookeeper集群是以宕机个数过半才会让整个集群宕机的,所以奇数个集群更佳
#下载
https://zookeeper.apache.org/
[root@bogon ~]# mv zookeeper-3.4.14 /usr/local/
[root@bogon ~]# cd /usr/local/zookeeper-3.4.14/
root@bogon zookeeper-3.4.14]# cd conf
[root@bogon conf]# mv zoo_sample.cfg zoo.cfg
[root@bogon conf]# pwd
/usr/local/zookeeper-3.4.14/conf
tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
tdataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
tclientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
下面这两个可以不需要掌握:(默认值就好)
tinitLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
tsyncLimit:这个配置项标识 Leader 与Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是2*2000=4 秒
启动
[root@bogon conf]# /usr/local/zookeeper-3.4.14/bin/zkServer.sh start
netstat -tulnp|grep java #要是有2181端口就是启动起来了
QuorumPeerMain #是zookeeper 不能把它禁掉
#安装 kafka
http://kafka.apache.org/downloads
[root@bogon config]# vim server.properties
更改了监听地址、更改连接zk的地址
#启动
[root@bogon kafka_2.11-2.1.1]# /var/www/html/kafka_2.11-2.1.1/bin/kafka-server-start.sh /var/www/html/kafka_2.11-2.1.1/config/server.properties
nohup /var/www/html/kafka_2.11-2.1.1/bin/kafka-server-start.sh /var/www/html/kafka_2.11-2.1.1/config/server.properties >> /var/www/html/kafka_2.11-2.1.1/output.log 2>&1 &
chmod a+x startup.sh
netstat -tulnp |grep java
参考文章
https://blog.youkuaiyun.com/luanpeng825485697/article/details/81036028
https://blog.youkuaiyun.com/laojiaqi/article/details/79034798