kafka性能优化,掌握好这几点方法学习Linux

2019-09-11 16:04栏目:公司领导
TAG:

2018 掌握好这几点方法学习Linux,一定比别人更快入门运维!,2018linux

Kafka性能优化之坎坷路(2),kafka性能优化

接上一篇:

题外话:
 上一篇简单说了一下自己对kafka的一些基础理解,以及c++中如何利用librdkafka来实现我们自己的业务需求。这一篇就来研究研究一些另类玩法,跟代码无关,用到的技术也不算新,但是令我感到意外的是,竟然没有人这么使用过,实践过。。。
 我挺难受的,这么一些通用且实用,而且通过很简单的操作就能提升数倍性能的方法,竟然甚少人去使用他们,甚至闻所未闻。忽然觉得中国这个IT环境里,怎么才能造就出伟大的程序员,公司注重的是利益,领导注重的是结果,不懂技术的人做领导,懂技术的人被领导,面试靠张嘴,工作靠开会,晋升靠资历,找工作靠学历。。。
 百分之99的项目,“先出一个版本,后面再考虑优化”“这个需求很简单,怎么实现我不管,明天我就要”,然而。。永远没有时间梳理,也无暇思考。项目永远很急,程序员永远在加班。。。以前的代码永远要靠下一任调bug。。。

扯远了,回归正题吧。

一.Kafka环境搭建
 网上有很多环境搭建的教程示例,看了一下,几乎全是千篇一律,都是相互转过来转过去,没有考虑到实际应用场景,也不考虑性能到底怎么样,也不考虑为何要这么搭,反正大家都是按这个套路来的,甚至我想找一篇搭建5个节点集群的都找不到。
 实际生产环境中,我们的kafka是搭建在服务器上的,我们都知道每台服务器搭建一个节点,多个节点组成一个集群。我们也知道kafka的性能瓶颈是在网络IO和磁盘读写速度上。
正常情况下这么搭建当然是没问题的,而且kafka本身是为短消息而设计的,但是在绝大多数应用场景中,我们不得不实时传输图片这种大消息,假设我们要搭建一个支持日吞吐量4000万数据的集群,每条消息1M,
我们来算一下:
 假设每个节点带宽是1000Mbps,可传输的字节数就1000/8=125M, 如果要支持每秒钟处理500条数据,那需要一个多大的集群呢?
好的,500条*1M=500M, 500M/125M=4。 也就是4个节点的集群。没毛病吧老铁?
没毛病么?毛病很大啊。我们算的这500M仅仅是数据吞吐量的带宽,但是吞吐量吞吐量,有吞也有吐啊。
最简单的1份生产1份消费,各需要占掉其中一半的带宽,那我们要达到每秒钟生产500条消费500条,最少就需要1000M字节的带宽。
这只是最理想的环境,实际应用中,必然不止一个用户要从kafka中消费数据,假设有3个用户要从集群中消费数据,还要支持每秒500条,这就意味着我这个集群的吞吐总量要达到每秒钟2000M字节,网络io比特率要满足每秒钟20000Mbps,如果每个节点采用千兆网卡,那意味着我需要一个由20台服务器组成的集群。一台服务器保守点配置一般的5万块钱一台,那就需要100万成本。
这明显不对啊,kafka不是号称吞吐量宇宙第一的么,怎么会要靠堆积服务器的数量来满足仅仅是每秒处理500条数据的需求呢?
这其中一定有问题,我要去找官方要个说法去,这跟你们吹出来的完全不符合啊,逗我呢吧?
求带麻袋,我们再仔细回过头来想一想,问题出在哪呢,我们的计算也没问题,这还是算的最最理想的情况下,实际的生产环境可能更差。不对,一定有问题。

仔细屡了又屡,真的没问题,我们公司就是这么用的啊,我们公司也是这么用的啊,没毛病吧老铁?
没毛病么?毛病很大啊。通过上面的计算我们很显然会得出一个强有力而且官方可验证的结论,限制kafka性能的只能是网络带宽不够大。有没有办法解决呢?换万兆带宽?整个都换成万兆,那不得了,成本又翻了一倍,200万成本。

好吧,接下来就是我们如何解决这个网络瓶颈的实践之路了:
    既然我们的瓶颈是在网络上,网络的瓶颈又是在网卡上,把千兆网卡换万兆网卡又不现实,那就只剩一条路了,加多块网卡。OK,一般的服务器都支持4网口+1管理口,先来插上四根网线,配置四个ip地址。没毛病,然后我们就想了,既然都有四块网卡,每块网卡又有独立的ip地址了,那我们是不是可以在一台机器上搭建4个kafka节点,每个节点绑定一块网卡呢,来试试吧,很激动。。。按照教程,一步一步,摩擦摩擦,biu的一。。。。纳尼??竟然起不来??难道我配置出问题了?检查一遍,给我起。。。检查两遍,给我起。。。检查三遍。。。百度谷歌,检查四遍。。。什么鬼???kafka难道不支持在一台机器上开多个进程?不对啊,不是还有在一台机器上搭建伪集群的教程摆在那呢,那说明不是kafka的问题。然后又是一顿查,一顿乱试,终于。。我们检验出了真相:在同一台机器上起多个kafka需要配置端口号不一样,而且新版kafka逐渐废弃了host.name和port这两个配置项,所有相关的配置,只需要配置listeners即可。
再全部删掉重新来过,配网卡ip,配listeners,给我起!哈哈哈,终于起来了,而且可以正常生产消费数据了,我真是太厉害了,这么难的问题竟然被我搞定了,经过这么多努力,我们终于可以实现一块网卡对应一个kafka节点的伟大愿望了,还有谁??  然而。。。俗话说的好。。。不要高兴的太早。。。太早。。早。。

来吧,让我们看一看你的网络IO瓶颈能不能达到4000Mbps吧,手指飞快的输入一串代码:sar -n DEV 1  
当当当。。随着生产线程数的增多,网络io很快达到1000Mbps了,我要再加10个生产! sar -n DEV 1 当当当。。。什么?网络io竟然还是1000Mbps,不对不对,怎么肥四?抓个包看一看,四个ip分别建立tcp链接并开始交互数据,没问题啊,再仔细一瞅,我去,为啥所有ip指向的都是同一个mac地址,这不科学啊,是在逗我吧?我不信,肯定是我哪里配置错了,肯定是我心不够虔诚,肯定是我启动的方式不对。。。我不信,我不信。。。我不信。。。让我们再试一遍。。两遍。。。三遍。。。
求带麻袋,所有网卡ip都指向了一个mac地址,是不是说需要手动配置网卡的路由信息,让每个网卡都通过自己的路由来转发数据,查资料,看教程,看man手册,配置路由。。让我们再虔诚的试一次。。。试两次。。。试三次。。。不玩了。。我要回家,我想妈妈。。。

静下心来再想想:我们现在可以确认的是,在一台机器上搭建集群是可行的,只需配置端口号不一样即可,每个kafka节点绑定一块网卡的方式不可行,即使把套接字绑定到一个特定网卡的ip上,数据包离开主机时会首先经过路由表,路由表会寻找最低成本的网络接口(任意静态的接口)进行发送,我们配置的四块网卡具有相同的成本,因为四块网卡是在同一个子网内(即同一个网段),因此传输率不会超过单张网卡的传输率,如果要解决这个问题,那么可行的途径是手动配置路由表信息,而且要保证四块网卡的ip位于不同的网段上,并要确保不同的网段是可以连通的。

好吧,实际应用中我们是被分配ip的那一个,而不是可以任意分配网段的那一个,显然这种方式也不可行,但是起码我们总结出了一套可行方案不是么。

我们花了大量的时间研究kafka跟网卡之间的关系,但忽然回过头来想,发现我们不知不觉中绕了一个大弯。归根结底,我们是要解决网络带宽的问题,结果反而把自己绕到跟kafka的关联上了,既然在一台机器上可以搭建伪集群,那么为什么不把这台机器的所有网卡做一个绑定呢?

从Centos7开始使用team模式,链路聚合的方式进行多网卡绑定,让我们来试一试吧:
详细说明请参考官方文档:

要明确的是,用于绑定的网卡,不应该配置任何静态的IP地址,进行绑定之前,需要将所有网卡恢复到初始化状态。而且一台服务器只能有一个网关。
我们需要的是增加带宽模式的绑定,至于其它模式,请自行研究,通过NetworkManager来配置一下:

  1. 创建team1,并选择模式:
    命令:nmcli connection add con-name team1 type team ifname team1 config '{"device": "team1", "runner": {"name": "loadbalance","tx_hash": ["eth", "ipv4", "ipv6"],"tx_balancer": {"name": "basic"}}}'
  1. ag真人,添加网卡进行绑定(本机一共四块网卡)
    命令:nmcli connection add con-name team1-port1 type team-slave ifname enp2s0f0 master team1
    nmcli connection add con-name team1-port2 type team-slave ifname enp2s0f1 master team1
    nmcli connection add con-name team1-port3 type team-slave ifname enp2s0f2 master team1
    nmcli connection add con-name team1-port4 type team-slave ifname enp2s0f3 master team1
  1. 给绑定后的虚拟网卡设置IP地址和网关
    命令:nmcli connection modify team1 ipv4.addresses 192.20.25.100/24 ipv4.gateway 192.20.25.254 ipv4.method manual
    备注:ipv4.addresses 192.20.25.100/24这里是四块网卡聚合成一块网卡的ip地址和子网掩码缩写。
    ipv4.gateway 192.20.25.254这里是网卡的网关配置。
  1. 启动team1
    命令:nmcli connection up team1 

5.重启网络
命令:systemctl restart network

  1. 查看状态
    命令:teamdctl team1 state
    备注:这里应该显示了4块网卡的信息。
  1. 列出team1的端口
    命令:teamnl team1 ports
    备注:这里应该显示了4块网卡的信息。

其余的操作:nmcli device disconnect  enp2s0f0 (禁用其中的一块)
nmcli device connect enp2s0f0(启用其中的一块)
ip link set down enp2s0f0 (关闭掉其中的一块进行测试)

  1. 查看网络
    命令:ip add
    备注:这里就可以显示出team1的信息(ip和网关等信息)。

至此,配置多网卡链路聚合结束。

万分期待中,我们在其之上搭建了一个kafka伪集群,开始测试。。。开10个生产!
当当当。。。网络IO达到1000Mbps,2000Mbs,3000Mbps,3600Mbps...天呐,竟然成功了。。。而且带宽损失率竟然不超过百分之10.。。

我们成长在一个幸运的时代,学习进步的成本如此之小,

我们成长在一个不幸的时代,学习进步的成本如此之大。

BKJIA.com 综合报道】什么是ITIL?

**

如今有很多关于Linux的书籍,博客。大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多Linux初学者望而却步,未入其门就路过了。

下面给大家找了一下一个资深Linux用户关于学习Linux的一些建议:

随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。作为一个 Linux系统管理员,我看了许多有关Linux的文档和书籍,并为学习Linux付出了许多艰苦的努力。当真正获得了一份正式的Linux系统管理工作后,我更加深刻地理解了Linux的灵魂:服务与多用户。Linux系统知识是非常广博的,但是只要掌握了重点知识,管理它并没有想象中的那么可怕。在下面我会将作为系统管理员的一些工作心得和总结出来的经验系统地介绍给大家。

一、 学习的目的

通过Linux的学习掌握UNIX的目的想必不用多说了,在这个网络人才身价倍增的年代,想靠技术吃饭又不想掌握网络和编程技术是不明智的。当一人第一次听说Linux并跃跃欲试的时候,总会提出几个?

它是什么(What)? 

为什么要用它(Why)? 

怎样学习它(How)?

做为开放源码运动的主要组成部分,Linux的应用越来越广泛,从我们平时的娱乐、学习,到商业、政府办公,再到大规模计算的应用。为了满足人们的需求,各种各样的、基于Linux的应用软件层出不穷。只要具备了LinuX的基本功,并具有了自学的能力之后,都可以通过长期的学习将专项内容予以掌握。

二、 从命令开始学习

常常有些朋友一接触Linux 就是希望构架网站,根本没有想到要先了解一下Linux 的基础。这是相当困难的。虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行,无论图形界面发展到什么水平这个原理是不会变的,Linux命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文件的制作。这里笔者把它们中比较重要的和使用频率最多的命令,按照它们在系统中的作用分成几个部分介绍给大家,通过这些基础命令的学习我们可以进一步理解 Linux系统:

●**安装和登录命令:login、 shutdown、 halt、 reboot 、mount、umount 、chsh **文件处理命令:file、 mkdir、 grep、dd、 find、 mv 、ls 、diff、 cat、 ln
●**系统管理相关命令: df、 top、 free、 quota 、at、 lp、 adduser、 groupadd kill、 crontab、 tar、 unzip、 gunzip 、last ●网络操作命令:ifconfig、 ip 、ping 、 netstat 、telnet、 ftp、 route、 rlogin rcp 、finger 、mail 、nslookup ●系统安全相关命令:** passwd 、su、 umask 、chgrp、 chmod、chown、chattr、sudo、 pswho

三、 选择好的入门Linux书籍和相关视频

在各个Linux论坛中,我们看到最多的问题往往是某个新手,在安装或使用linux的过程中遇到一个具体的问题就开始提问,很多都是重复性的问题,甚至有不少人连基本的问题描述都不是很清楚。这说明很多初学linux的人还没有掌握基本功。怎样才能快速提高掌握linux的基本功呢? 

最有效的方法莫过于学习权威的linux工具书,工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。编者不再这里做过多推荐,建议入门的童鞋们多在网上搜搜相关书籍的评价以及介绍,切记零基础的童鞋不要选择内容过深的书籍。

目前网络上也有很多免费的相关视频,建议没有接触过或者刚接触运维行业的童鞋先多去看看一些免费的基础视频或者参加一些线下的免费行业介绍讲座,这样才能知道该如何入门,如何着手学习或者选择什么方式学习,这都是很重要的。

四 、养成在命令行下工作的习惯

一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢,但是熟悉后,您未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。即使是通过一条缓慢的调制解调器线路,它也能操纵几千公里以外地远程系统。

五、用Unix思维思考Linux

由于Linux是参照Unix的思想来设计的,理解和掌握它就必须以Unix的思维来进行,而不能以Windows思维。不可否认,windows 在市场上的成功很大一部分在于技术思想的独到之处。可是这个创新是在面对个人用户的前提下进行的,而面对着企业级的服务应用,它还是有些力不从心。多年来在计算机操作系统领域一直是二者独大:unix在服务器领域,Windows在个人用户领域。由此可见,用户需求决定了所采用的操作系统。不管什么原因,如果要学习Linux,那么首先要将思维从Windows的“这个小河” 中拖出来,放入Unix的海洋。

六 、学习shell和Python

对于Shell(中文名称壳),习惯Windows的读者肯定是非常陌生的,因为Windows只有一个“Shell”(如果可以说是Shell的话),那就是Windows自己。用一句话容易理解的解释就是,shell是用户输入命令与系统解释命令之间的中介。最直观的说法,一种Shell有一套自己的命令。举一个容易理解的例子,Linux的标准Shel是Bash Shel;Solaris的shell是B shell;Linux的Shell是以命令行的方式表现出来的。读者可能会不理解,Windows从命令行“进化”到了图形界面,那么Linux现在还使用命令行岂不是一种倒退?

当初刚刚接触Linux时就曾有过这种想法。可是后来发现,如果使用图形界面,那么分配给应用软件的资源就少了,在价格昂贵的服务器上,能够以较低的硬件配置实现同样的功能是非常重要的。

下面举例说明:

一台服务器有1GB内存,假设其中512MB用于处理图形界面,若要安装一个需要784MB内存的数据库软件,惟一的办法就是扩大内存。但是如果使用命令行,系统可能只需要64MB内存,其它的内存就可以供数据库软件使用了。使用命令行,不仅是内存,而且CPU及硬盘等资源的占用都要节省很多。

所以,作为服务器使用命令行是优点而不是缺点。既然Shell有这么多优点,就必须要学习它。

七、关注行业趋势更新技能

Linux运维的招聘要求感觉与往年同样薪资的招聘要求高了许多,又得会各种开源工具.还得懂K8S和docker。但凡15K以上的工资,都必须要会python,而且是要有一定的pythonweb开发能力,2016年这个时候一般的运维都是要求: shell/python/php,三选一,会点就行,但是2017年不一样了,python要具有一定的web开发能力才可以。如果不要求会python的,也势必要求shell很精通。

 这里给出一点小的技能提升的建议: 大致需要学习下这四个部分:

  • 自动化运维(Ansible,Puppet,Saltstack等)

  • Devops(Docker,K8s,Jenkins,Jira等), 

  • 云服务技术(虚拟化、OpenStack、AWS及阿里云各种产品服务架构等)

  • python

上面几条仅供参考,不一定适合所有人,具体的学习方法还有自己取舍了!

Linux云计算免费课程火热开启,5天免费**运维干货内容免费听,点击文末“阅读原文”**即可免费听运维课**速速来抢~~~~

**PS:记得查收小编送你的免费大礼包呦~**

福利 | 一万多套PPT模板等你免费来拿!无条件领取!


**免费送 | 1000多套简历模板免费拿,附赠简历制作教程!**

免费领 | 《Shell脚本 100例》电子书免费拿,运维必备干货~

▼▼点击【阅读原文】,免费听5天Linux运维干货分享课,火热开讲中,速来抢!

ITIL(信息技术基础设施库)是Information Technology Infrastructure Library的缩写。ITIL是英国政府中央计算机与电信管理中心(CCTA)在20世纪90年代初期发布的一套IT服务管理最佳实践指南,旨在解决IT服务质量不佳的情况。在此之后,CCTA又在主流IT资源管理软件厂商近年来所做出的一系列实践和探索的基础之上,总结了IT服务的最佳实践经验,形成了一系列基于流程的方法,用以规范IT服务的水平。

ITIL就是旨在解决并纠正这些可能出现的弊端,它提供了一个指导性框架,这个框架可以保留组织现有IT管理方法中的合理部分,同时增加必要的技术,并且方便了各种IT职能间的沟通和协调。但它并不是一套理论模式,而是以全球最佳实际经验为依据,基于高质量、合理定义、可重复流程等运作为基础,确立的可持续改进的计划。

中国从引入ITIL的理念已经有五六年时间,到现在整个业界对ITIL的接受程度有了很大提高,越来越多的CIO开始给注重ITIL服务管理的重要性。他们也逐渐应用ITIL作为他们企业IT服务管理的蓝本。

ITIL最佳实践框架介绍

优秀的IT运维管理软件将ITIL项目实施经验抽象为知识、流程与模板,用专业的IT运维管理经验知识,帮助企业系统的规划与管理IT服务与运维,以提高企业的业务运作效率,降低业务流程的运作成本与风险。  

 
图1

将ITIL先进的设计理念加以管理经验,形成一套完整的切实可行的ITIL实施依据,将整个的ITIL分为四大实施阶段,各个阶段的特点如下:

计划

 
表1

版权声明:本文由ag真人发布于公司领导,转载请注明出处:kafka性能优化,掌握好这几点方法学习Linux