十年河东,十年河西,莫欺少年穷windows
学无止境,精益求精服务器
windows环境下配置部署kafka服务完成后,怎样作到kafka自动启动?我是经过bat文件来实现的。ide
个人文件路径:优化
关于windows环境下如何部署kafka消息中间件,请参考鄙人博客:windows 10 环境下配置kafka,及我所遇到的坑 orm
启动kafka以前,要先启动依赖项ZooKeeper服务,所以,咱们再D:\tool\batl文件夹下创建名为:startKafka.bat的文件,其内容以下:server
cd D:\tool\kafka\kafka_2.12-2.7.0 D: bin\windows\zookeeper-server-start.bat config\zookeeper.properties
啥意思呢?中间件
切换到目录:D:\tool\kafka\kafka_2.12-2.7.0 下,执行子文件夹bin/windows 中的 zookeeper-server-start.bat 及 config文件夹下的 zookeeper.properties ,用于启动Zookeeper服务。对象
这些文件均在kafka部署目录下,若有疑问,可参考鄙人博客:windows 10 环境下配置kafka,及我所遇到的坑 blog
其次在新建一个名为:startKafka.bat 的文件,其内容以下:队列
cd D:\tool\kafka\kafka_2.12-2.7.0 D: bin\windows\kafka-server-start.bat config\server.properties
啥意思呢?
和上述同样,没必要解释了。
有了这两个文件,咱们就能够经过C# 服务的方式来执行这两个Bat文件了,这样作的好处是:即时服务器重启,也能作到kafka自启动。
C#程序以下【我写的控制台程序,修改成windows 服务程序便可】
class Program { static void Main(string[] args) { //首先启动ZooKeeper Task.Run(delegate { StartProcess(@"D:\tool\bat\", "startZooKeeper.bat"); }); //30秒的时间 ZooKeeper 启动完成 若是30秒都不能启动完成,要么出问题了,要么您该换服务器了 Thread.Sleep(30000); //启动kafka Task.Run(delegate { StartProcess(@"D:\tool\bat\", "startKafka.bat"); }); Console.Read(); } private static void StartProcess(string path ,string fileName) { Process proc = new Process(); string targetDir = string.Format(path); proc.StartInfo.WorkingDirectory = targetDir; proc.StartInfo.FileName = fileName; proc.StartInfo.Arguments = string.Format("10"); proc.Start(); proc.WaitForExit(); } }
这样,就能够作到服务器重启时,kafka服务也会重启。
1.broker
Kafka单个节点称为broker,一个Kafka服务就是一个broker,多个broker能够组成一个Kafka集群.
2.topic (主题)
topic至关于传统消息系统MQ中的一个队列queue,producer端发送的message必须指定是发送到哪一个topic上.在一个大型的应用系统中,
能够根据功能的不一样,区分不一样的topic(订单的topic,登陆的topic,金额的topic等等)
3. partition(分区)
一个topic下面能够有多个partition,kafka在接收到message后,会将这个message进行load blance根据(hash(message)%[broker_num])均匀的将这个message分配在不一样的partition上。 partition的配置个数通常与kafka的集群数保持一致便可(即broker的数量)
4.partition replica (分区副本)
partition replica 是partition 的副本数据,是为了防止数据丢失的一种优化,partition 不会和 replica 在同一台broker上。
Replica 的数量与partition数量保持一致便可作到高可用
5. Segment(片段)
partition 在物理结构上能够分为多个segment,每一个segment 上存放着message信息
6.producer
生产message,发送到topic上
7.consumer
订阅指定的topic,消费topic上面的message信息
8.Consumer group
多个consumer 能够组成一个consumer group
1.partition
kafka的message是1个key-value对的形式,或者只有topic 和value.当没有key的时候默认是null.大多数状况下都会分配1个key,这个key有2方面信息: 1.元数据信息 2.帮助partition分区,把这个key当成了路由,同一批数据写进一个partition上 一个message 就是一个producer record(生产记录)对象,必须包含的有topic和value这2个参数,partition和key是能够不存在的 全部的message是同一个key,将会被分配到同一个partition上 当一个key为null的时候,它将会使用默认的partition,这个partition的做用是它会随机的把这个key所对应的producer record 放到其中的1个prtition中 尽可能的使topic上的数据分布均匀,以防止数据倾斜 若是显示的指定了一个key,那么这个partition它会根据这个key的hash值,再根据partition的数量取模,决定message存放到topic上的哪一个partition中 :当存入的message有key 和无key 时数据发送到partition的位置如何?
当存入的message有key存在时,message会被随机发往不一样的分区上。
当存入的message没有key值时,message会被发往同一个分区上。
结论: 当一个key或者一批key映射同一partition时,全部的partition都要计算映射关系,不必定指的是可用的partition,由于在多个partition中,当某个partition挂掉时,也要参加到计算中,这就意味着,当你写数据时,若是是发送到了这个挂掉的partition上时,会发送失败 在一个conusmer group里面只有一个consumer client 读其中的一个partition,不可能存在多个group里面多个consumer读同一个partition