摘要:在用自定义网络跑容器的时候发现一个问题的自定义网络启动会延迟大概秒换句话说就是如果你使用自定义网络在一个容器启动时想访问另外一个容器会失败但是如果你先等待秒再访问的话就一切正常如果你使用自定义网络在一个容器启动时另外一个容器会卡住一段时间。
Docker Issue Network Delay
在用自定义Docker网络跑容器的时候发现一个问题:Docker的自定义网络启动会延迟大概40秒!
换句话说就是:
如果你使用自定义网络在一个容器启动时想访问另外一个容器会失败!但是如果你先等待40秒再访问的话就一切正常!
如果你使用自定义网络在一个容器启动时ping另外一个容器会卡住一段时间。
解决:加上启动脚本检测网络是否就绪!
可以用类似下面的脚本检测服务是否就绪,或者干脆检查dmesg消息也可以
until nc -z zk 2181; do echo "waiting for zk to be ready"; sleep 0.5; done现象
在用自定义Docker网络跑Kafka的时候发现一个现象:zk服务正常,但是 Kafka始终报告连接不上zk
$ docker run --net=br --ip=192.168.33.88 --name=zk -h=zk -d wurstmeister/zookeeper $ docker run --net=br --ip=192.168.33.91 --name=kf1 -h=kf1 -e KAFKA_ZOOKEEPER_CONNECT=zk -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kf1:9092 -e KAFKA_BROKER_ID=1 --link zk:zk -it wurstmeister/kafka
运行后始终报错:
java.net.NoRouteToHostException: No route to host at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361) at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)
而如果你不用自定义网络的话则一切正常!
$ docker run --name=zk -h=zk -d wurstmeister/zookeeper $ docker run --name=kf1 -h=kf1 -e KAFKA_ZOOKEEPER_CONNECT=zk -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kf1:9092 -e KAFKA_BROKER_ID=1 --link zk:zk -it wurstmeister/kafka分析
那么问题在哪里呢?经过跟踪后终于发现问题在于Docker的自定义网络启动会延迟大概40秒!需要等容器实例dmesg中出现下列消息的时才能正常访问网络中的其他容器实例,这个等待时间大概是40秒
[ 1077.847733] docker1: topology change detected, propagating解决
问题找到了,搜索了一圈也没有找到怎么让这个延迟时间消失的解决方法,好吧,用土办法:既然是因为网络还没准备好,那就等它准备好!
可以用类似下面的脚本检测服务是否就绪,或者干脆检查dmesg消息也可以
until nc -z zk 2181; do echo "waiting for zk to be ready"; sleep 0.5; done
那么只要在Docker容器真正开始运行之前先运行上面的脚本检测网络是否就绪就可以了,查了一下wurstmeister/zookeeper正好有一个CUSTOM_INIT_SCRIPT参数可以干这个事,妥了!
$ docker run --net=br --ip=192.168.33.88 --name=zk -h=zk -d wurstmeister/zookeeper $ docker run --net=br --ip=192.168.33.91 --name=kf1 -h=kf1 -e KAFKA_ZOOKEEPER_CONNECT=zk -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kf1:9092 -e KAFKA_BROKER_ID=1 -e CUSTOM_INIT_SCRIPT="until nc -z zk 2181; do echo "waiting for zk to be ready"; sleep 1; done" --link zk:zk -it wurstmeister/kafka
waiting for kafka to be ready waiting for zk service ready ...... [2017-12-11 09:04:51,046] INFO [Partition user_events-0 broker=1] No checkpointed highwatermark is found for partition user_events-0 (kafka.cluster.Partition) [2017-12-11 09:04:51,047] INFO Replica loaded for partition user_events-0 with initial high watermark 0 (kafka.cluster.Replica) [2017-12-11 09:04:51,050] INFO [Partition user_events-0 broker=1] user_events-0 starts at Leader Epoch 0 from offset 0. Previous Leader Epoch was: -1 (kafka.cluster.Partition) [2017-12-11 09:04:51,087] INFO [ReplicaFetcherManager on broker 1] Removed fetcher for partitions user_events-0 (kafka.server.ReplicaFetcherManager) [2017-12-11 09:04:51,087] INFO [Partition user_events-0 broker=1] user_events-0 starts at Leader Epoch 1 from offset 0. Previous Leader Epoch was: 0 (kafka.cluster.Partition)
另外:
这个方法也适用于启动时需要依赖其他服务就绪的情况,比如等待数据库就绪等
或者某些容器服务初始化时间较长,另外的容器需要等它就绪等
https://github.com/SixQuant/e...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27164.html
摘要:百度搜索资源平台有闪电算法的支持,为了能够保障用户体验,给予优秀站点更多面向用户的机会,闪电算法在年月初上线。下栏是每一个指标的细化性能评估。最后优化之路漫漫,永无止境,天下武功,唯快不破。 showImg(https://segmentfault.com/img/remote/1460000018537491); 首屏作为直面用户的第一屏,其重要性不言而喻,如何加快加载的速度是非常重...
摘要:然而实际业务中还存在另外一种定时任务,它可能需要一些触发条件才开始定时,比如编写博文时候,设置小时之后发送。在消息监听类中,对通道定义了,这里会对延迟消息做具体的逻辑。由于消息的消费是延迟的,从而变相实现了从消息发送那一刻起开始的定时任务。 应用场景 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者...
阅读 2287·2021-11-22 14:56
阅读 1338·2021-09-24 09:47
阅读 858·2019-08-26 18:37
阅读 2787·2019-08-26 12:10
阅读 1477·2019-08-26 11:55
阅读 3100·2019-08-23 18:07
阅读 2253·2019-08-23 14:08
阅读 579·2019-08-23 12:12