The Mirages

樱桃沟夹事

武汉这次冠状病毒的疫情的死亡人数已经超过了当年SARS的死亡人数了。

感动很多,愤怒也很多。感动的都是平凡人的故事,愤怒的确实整个国家机器。比如红十字会,慈善总会这些。不知道为什么郭美美事件过去那么多年,居然一点都没有改变。

感动的平凡人在襄阳城「空巷里的一束光」唱的「你的答案」这样平凡的行为。

SARS的时候还只是一个学生,同时还在上海,没有特别的影响,记得就是学校提前放假了,后面又给补回来了。

记得整个上海应该就只有2个还是4个人得的。而这次的人数北京和上海都已经超过300人了。

现在还在武汉的人,我理解都是老实人啊,要不然在宣布封城的那8个小时应该加紧跑了出来,比如像LJ她的公公婆婆应该赶紧跑北京来的,可留在武汉,前两天还都没有住上院,就是每天去医院取药,回家自己吃,属于自生自灭的阶段。

阅读全文 »

由于现有的日志量越来越多了,原先一直用的gzip进行压缩的,默认的级别,可最近看着是越来越不行,是有必要进行新的选择。

选择的方向是就是zstd

在CentOS中直接

1
sudo yum install zstd -y

就可以安装完成

由于是日志文件,我们单个分割是57MB的大文件

阅读全文 »

线上有一个topic碰到突增,但是限制于topic的分区太少,消费实在太慢,导致影响到用户的感受。

首先我们看下这个topic

1
2
3
4
5
6
7
8
9
10
11
12
./bin/kafka-topics.sh --zookeeper prod-zk1:2181 --describe --topic Events

Topic: Events Partition: 0 Leader: 2 Replicas: 2,0 Isr: 2,0
Topic: Events Partition: 1 Leader: 2 Replicas: 0,1,2 Isr: 2,0
Topic: Events Partition: 2 Leader: 2 Replicas: 1,2,0 Isr: 2,0
Topic: Events Partition: 3 Leader: 2 Replicas: 2,1,0 Isr: 2,0
Topic: Events Partition: 4 Leader: 2 Replicas: 0,2,1 Isr: 2,1
Topic: Events Partition: 5 Leader: 0 Replicas: 1,0 Isr: 1,0
Topic: Events Partition: 6 Leader: 2 Replicas: 2,0 Isr: 2,0
Topic: Events Partition: 7 Leader: 2 Replicas: 0,1,2 Isr: 2,1
Topic: Events Partition: 8 Leader: 0 Replicas: 1,2,0 Isr: 1,0
Topic: Events Partition: 9 Leader: 1 Replicas: 2,1,0 Isr: 1,0

我们看到这个topic就10个分区,但是副本数却有些是2,有些是1。这种是否可以直接增加分区呢,答案是不行的。

你要这个时候增加分区就会报

1
requirement failed: All partitions should have the same number of replicas.
阅读全文 »

最近碰到一个kafka流量引发的故障。期初的现象是我们有些consumer超时。于是去看了下kafka broker的日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[2020-XX-XX YY:35:51,703] WARN [ReplicaFetcherThread-0-0], Error in fetch kafka.server.ReplicaFetcherThread$FetchRequest@712892d4 (kafka.server.ReplicaFetcherThread)
java.io.IOException: Connection to 0 was disconnected before the response was read
at kafka.utils.NetworkClientBlockingOps$$anonfun$blockingSendAndReceive$extension$1$$anonfun$apply$1.apply(NetworkClientBlockingOps.scala:87)
at kafka.utils.NetworkClientBlockingOps$$anonfun$blockingSendAndReceive$extension$1$$anonfun$apply$1.apply(NetworkClientBlockingOps.scala:84)
at scala.Option.foreach(Option.scala:257)
at kafka.utils.NetworkClientBlockingOps$$anonfun$blockingSendAndReceive$extension$1.apply(NetworkClientBlockingOps.scala:84)
at kafka.utils.NetworkClientBlockingOps$$anonfun$blockingSendAndReceive$extension$1.apply(NetworkClientBlockingOps.scala:80)
at kafka.utils.NetworkClientBlockingOps$.recursivePoll$2(NetworkClientBlockingOps.scala:137)
at kafka.utils.NetworkClientBlockingOps$.kafka$utils$NetworkClientBlockingOps$$pollContinuously$extension(NetworkClientBlockingOps.scala:143)
at kafka.utils.NetworkClientBlockingOps$.blockingSendAndReceive$extension(NetworkClientBlockingOps.scala:80)
at kafka.server.ReplicaFetcherThread.sendRequest(ReplicaFetcherThread.scala:244)
at kafka.server.ReplicaFetcherThread.fetch(ReplicaFetcherThread.scala:229)
at kafka.server.ReplicaFetcherThread.fetch(ReplicaFetcherThread.scala:42)
at kafka.server.AbstractFetcherThread.processFetchRequest(AbstractFetcherThread.scala:107)
at kafka.server.AbstractFetcherThread.doWork(AbstractFetcherThread.scala:98)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)

这里写着id为0的broker连接超时啊。那就重启id 0的broker了。可重启了之后发现如下日志了

1
2
3
4
5
6
[2020-XX-YY 14:13:27,728] INFO Partition [Event,196] on broker 1: Shrinking ISR for partition [Event,196] from 1,2 to 1 (kafka.cluster.Partition)
[2020-XX-YY 14:13:43,752] INFO Partition [Event,196] on broker 1: Expanding ISR for partition [Event,196] from 1 to 1,2 (kafka.cluster.Partition)
[2020-XX-YY 14:13:57,729] INFO Partition [Event,196] on broker 1: Shrinking ISR for partition [Event,196] from 1,2 to 1 (kafka.cluster.Partition)
[2020-XX-YY 14:14:16,304] INFO Partition [Event,196] on broker 1: Expanding ISR for partition [Event,196] from 1 to 1,2 (kafka.cluster.Partition)
[2020-XX-YY 14:14:37,510] INFO Partition [Event,196] on broker 1: Shrinking ISR for partition [Event,196] from 1,2 to 1 (kafka.cluster.Partition)
[2020-XX-YY 14:14:48,230] INFO Partition [Event,196] on broker 1: Expanding ISR for partition [Event,196] from 1 to 1,2 (kafka.cluster.Partition)

这里你看这一会儿Shrinking,一会儿Expanding。而且间隔时间相当的短,现在想来是很快的连接超时了。

这时候明显大家就慌了,远程办公就这点不好啊.

阅读全文 »

上篇有提到firewalld和iptables的区别。那就比较好奇firewalld的其他状态。

首先测试了22端口,这个端口在firewalld里是开放的,但是实际上机器上没有监听这个端口。这里我们看到,实际服务器返回的也是一个TCP-RESET。

然后又测试了一个被firewalld屏蔽的端口,实际服务器上也没有监听这个端口。这里我们可以看到返回的是ICMP的destination unreachable。

接着我们测试了一个被firewalld屏蔽的端口,实际服务器上监听了这个端口。这里我们可以看到返回的也是ICMP的destination unreachable。

最后我们直接屏蔽某个端口,发现也一样是返回ICMP的destination unreachable。

1
2
3
<rule family="ipv4">
<port protocol="tcp" port="10050"/>
<reject/>
阅读全文 »

在iptables中,我们一般封闭端口都是使用DROP参数,这样client端是不知道服务器已经DROP掉对应请求了,会继续进行等待,直到超时。

而像nc这种软件会根据这个其实是可以检测到服务器是否开启了这些端口。

但是我发现使用firewalld封闭后,用nc测试直接显示refused的

1
2
3
$ nc 202.96.209.5 29327 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: No route to host.

而用iptables的话必须得是

1
# iptables -A INPUT -p tcp -m tcp --dport 29327 -j REJECT --reject-with tcp-reset
阅读全文 »

本文是「kafka权威指南」的第三章笔记。

在设置生产者之前我们先看看整个生产者到kafka broker的流程是怎么样的。

这个图是原文里的。

可以看到一个标准的ProducerRecord是必须要包含Topic和Value,然后Partition和Key是可选的。

从图中也可以看到,生产者需要把Key,Value序列化成数组,然后再去网络上传输。

如果record里有包含了Partition了,那就不需要分区器干活了,如果没有包含,那分区器就会根据record对象的key来选择一个分区。

选好分区之后,那生产者就知道往哪个topic和分区里发送记录了。然后这个记录就被添加到一个记录批次里,这个批次里所有消息都会被发送到相同的topic和分区上,这是由一个独立线程来处理的。

阅读全文 »

不知道从什么时候开始,就非常害怕爆炸了。

记得小时候我堂兄结婚,他们家放高升(二踢脚),好像直接把我吓的关屋里了,有没有钻床底下有点记不清了。

还有一次是在我爷爷家,不知道谁放了一个哑巴高升,可到最后居然落到我旁边表弟的头上就炸了,那场景我至今都可以很清晰回想起来。

要说怕这些吧,可还经常玩,可随着年龄的增加是越来越不敢玩了。

明明小时候经常放鞭炮的,还经常拿手里点着了直接扔出去放呢,但也失手过几次在手里直接炸了。

可现在看到气球有时候就比较恐惧,特别是当它飘向某个尖锐物体的时候,或者眼看着某人一脚踩下去的时候,都会有一种揪心的恐惧。

阅读全文 »

kafka这个服务是不怎么耗资源的,基本上没有特殊的要求,除了磁盘容量大点,别的要求真不高。

这个也是记录了「kafka权威指南」第二章内容

硬件

磁盘

  • 磁盘吞吐量:大多数客户端在发送消息之后会一直等待到至少有一个服务器确认消息已经成功提交为止。这个通知基本就是leader发出的。而kafka本身由于使用了0拷贝和顺序读写的特性,因此速度是相当快的。HDD和SSD的差距我记得测试过就只有10%的差距。
    当然这个还是看自己的实际读写量了。
  • 磁盘容量:这个就是自己topic一天的大小 * 副本数 * 保留天数 * 120% / broker数量, 这基本就是你每个服务器所需要的磁盘容量了。

内存

阅读全文 »

kafka现在是所有队列组件里最常用的,虽然跟Rabbitmq这些相比还缺乏一些特性,但是它实在是成长的太快了,而且支持集群化,这个是最赞的,同时由于使用0拷贝,日志追加,所以它的磁盘效率非常高。

但是kafka的运维难度前期并不大,但是在后期主要的难点是在扩容,缩容阶段。主要是因为磁盘IO,网络IO的原因。导致了很多瓶颈点产生。

本文是读了「kafka权威指南」第二章的一个摘要总结。

broker整体配置

log.dirs

kafka是把所有消息都写入到磁盘,这个参数可以指定多个目录进行消息写入。而写入的原则是最少使用原则。
但是我们在实际使用中,不建议写多个,宁愿使用raid,LVM条带方式来扩展单目录的写入速度。

阅读全文 »
0%