首先如果我开始做一个消息队列,最开始的时候可能就是一台单机上的一个单一的log日志,不断地向这个日志中追加消息即可。

后来,可能由于一个log日志支撑不了太多的读写请求,于是就对这个log日志进行了拆分。于是就出现了一个topic有多个log日志的情况。

一条消息来了,可以保存到任意的log文件中,当然也可以自己指定算法来使得某个生产者产生的消息都保存到一个固定的log文件中。

这样好像性能上来了,但是这样每个log都是没有副本机制的,也就是说如果一个log日志如果坏掉的话,这个topic的一部分数据就全部都丢失了。

这种情况我觉得是不能忍受的,所以就想到了要把多个log都同时同步到多台其他的机器上去。这时候,原来的那台单机上分布的都是最主要的log日志,其他机器只是负责实时备份了一下这些log日志。这样有什么问题呢?问题就是你发现了,备份机器基本上没啥用,除非原来的那台机器上确实出现了log丢失的情况,其他的备份机器才能派上用场。就出现了最主要的那台机器忙死了,一直要负责写和读请求,这样从架构上考虑是不太均衡的。那么这时候能不能让读请求去副本机器上去读呢?当然可以。这样写的请求发送到最主要的那台机器,其他的读请求发送到备份机器,这样很好地缓解了原来的那台单机的读写压力。

这时候我如果作为开发者,我会想,这样好像还是能继续优化一下。因为如果那台最主要的机器一直负责写的话,磁盘不停被写容易坏。其他机器备份机器好像就只负责读,基本上磁盘不容易坏。能不能均摊这些读写压力。可以把一个topic下的多个分区的只写log均衡分布到多台备份机器上。这样比如我虽然写的都是某个topic,但是消息会均衡的写到不同机器上去。相当于打散了只写log和备份log到不同机器上。只写log所在的就是该分区的主管。其他的备份log就是该分区的小弟。这样就能做到每一台机器都是平等的。不再从机器上去区分只写机器和只读机器了。每台机器都是可读可写的,只不过只读的可能是分区A,只写的是分区B。相当于这台机器是分区B的老大,同时也是分区A的小弟。

kafka的演进历史的更多相关文章

  1. Hadoop YARN学习之Hadoop框架演进历史简述

    Hadoop YARN学习之Hadoop框架演进历史简述(1) 1. Hadoop在其发展的过程中经历了多个阶段: 阶段0:Ad Hoc集群时代 标志着Hadoop的起源,集群以Ad Hoc.单用户方 ...

  2. JVM系列.JDK演进历史

    Java程序员为什么要了解虚拟机相关的知识 Java程序在设计之初就号称"一次编译,到处运行".Java之所以能做到"一次编译,处处运行"是因为Java虚拟机隐 ...

  3. 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力

    1.引言   达达创立于2014年5月,业务覆盖全国37个城市,拥有130万注册众包配送员,日均配送百万单,是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利 ...

  4. 从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结

    一.引言 移动互联网技术改变了旅游的世界,这个领域过去沉重的信息分销成本被大大降低.用户与服务供应商之间.用户与用户之间的沟通路径逐渐打通,沟通的场景也在不断扩展.这促使所有的移动应用开发者都要从用户 ...

  5. 从游击队到正规军:马蜂窝旅游网的IM系统架构演进之路

    本文引用自马蜂窝公众号,由马蜂窝技术团队原创分享. 一.引言 今天,越来越多的用户被马蜂窝持续积累的笔记.攻略.嗡嗡等优质的分享内容所吸引,在这里激发了去旅行的热情,同时也拉动了马蜂窝交易的增长.在帮 ...

  6. 《吃透MQ系列》之扒开Kafka的神秘面纱

    大家好,这是<吃透 MQ 系列>的第二弹,有些珊珊来迟,后台被好几个读者催更了,实属抱歉! 这篇文章拖更了好几周,起初的想法是:围绕每一个具体的消息中间件,不仅要写透,而且要控制好篇幅,写 ...

  7. Java I/O演进与Linux网络I/O模型

    参考文章: 简书-浅谈Linux五种IO:http://www.jianshu.com/p/486b0965c296 一.linux基础概念 1.1 内存空间 linux系统中的使用的是虚拟存储器,即 ...

  8. (基础篇 走进javaNIO)第一章-java的i/o演进之路

    Java 是由 SUN公司在 1995 年首先发布 的编程语 言和计算平 台.这基础技术 支持最新 的程序 ,包括 实用程序 .游 戏和业 务应用程序 .J ava 在世界各地 的 8.5  亿 多 ...

  9. Spark Streaming和Kafka集成深入浅出

    写在前面 本文主要介绍Spark Streaming基本概念.kafka集成.Offset管理 本文主要介绍Spark Streaming基本概念.kafka集成.Offset管理 一.概述 Spar ...

随机推荐

  1. go语言中运算符

    Go语言学习笔记(运算符)-day01 go语言中与其他语言一样,存在多种运算符,下表列出了go语言中的运算符类型 算数运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算数运算符 运算符 描述 ...

  2. 音视频入门-19-使用giflib处理GIF图片

    * 音视频入门文章目录 * GIFLIB The GIFLIB project 上一篇 [手动生成一张GIF图片], 自己生成了一张 GIF 动态图 rainbow.gif. 下面,使用 GIFLIB ...

  3. Angular入门到精通系列教程(7)- 组件(@Component)基本知识

    1. 概述 2. 创建Component 组件模板 视图封装模式 特殊的选择器 :host inline-styles 3. 总结 环境: Angular CLI: 11.0.6 Angular: 1 ...

  4. Nginx 安装与配置教程

    标签: Nginx Linux Windows 配置 描述: Ubuntu 下以及 Windows 下 Nginx 的配置:配置详解:有关 Nginx 如何配置 Nginx 在 Ubuntu 下的安装 ...

  5. 【Linux】dd命令进行磁盘备份

    运用dd命令,将/dev/sdb磁盘中所有的数据全部备份到/dev/sdc磁盘上,需要的命令如下 dd  if=/dev/sdb of=/dev/sdc bs=1024k 说明,if是需要备份的磁盘  ...

  6. 转发:[服务器]SSL安装证书教程

    [服务器]SSL安装证书教程   来自阿里云教程 Tomcat服务器安装SSL证书 安装PFX格式证书 https://help.aliyun.com/document_detail/98576.ht ...

  7. kubernets之pod简介

    一  k8s集群里面的最小单位是pod 1.1 一个较为简单的pod的配置文件 apiverson: api的版本号 kind: 资源的种类 metadata: pod的种类等相关信息 spec: p ...

  8. Flink源码剖析:Jar包任务提交流程

    Flink基于用户程序生成JobGraph,提交到集群进行分布式部署运行.本篇从源码角度讲解一下Flink Jar包是如何被提交到集群的.(本文源码基于Flink 1.11.3) 1 Flink ru ...

  9. PAT练习num1-害死人补偿命的3n+1猜想

    卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 年的世界 ...

  10. JavaScript学习总结(基础知识)

    js代码引入 方式1: <script> alert('欢迎来到德玛西亚!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script sr ...