Kafka運維大全:優(yōu)化匈挖、監(jiān)控、故障處理

以下文章來源于DBAplus社群 康愤,作者小火牛

DBAplus社群

圍繞Database儡循、Bigdata、AiOps的企業(yè)級專業(yè)社群征冷。頂級大咖择膝、技術(shù)干貨,每天精品原創(chuàng)文章推送检激,每周線上技術(shù)分享肴捉,每月線下技術(shù)沙龍,受眾20W+呵扛。

Kafka概念

Kafka是分布式發(fā)布-訂閱消息系統(tǒng)。它最初由LinkedIn公司開發(fā)筐带,之后成為Apache項目的一部分今穿。Kafka是一個分布式的、可劃分的伦籍、冗余備份的蓝晒、持久性的日志服務(wù)。它主要用于處理活躍的流式數(shù)據(jù)帖鸦。分布式系統(tǒng)芝薇,易于向外擴展。所有的producer作儿、broker和consumer都會有多個洛二,均為分布式的。無需停機即可擴展機器攻锰。

Kafka設(shè)計方案

消息持久化及其緩存

磁盤性能:在傳統(tǒng)的磁盤寫入很慢晾嘶,因為它使用隨機寫入50k/s(6個7200轉(zhuǎn)的sata硬盤組成的raid-5),但是線性寫入速度有300ms/s的速度娶吞,所以Kafka利用線性寫入的方式垒迂。

線性寫入:將數(shù)據(jù)調(diào)用操作系統(tǒng)文件接口寫到文件系統(tǒng)里面去這樣就緩存到操作系統(tǒng)的頁面緩存中,然后傳統(tǒng)意思來說將其flush一下到磁盤中妒蛇,但是Kafka并沒有這樣机断,而是保存在頁面緩存中(相當(dāng)于放在內(nèi)存當(dāng)中)并沒有進行flush操作楷拳,這樣他就會提供比較高的讀的性能,下次讀就從內(nèi)核頁面緩存中讀數(shù)據(jù)吏奸,但是內(nèi)存中存儲數(shù)量不是無限大的欢揖,所以我們配置參數(shù)(每當(dāng)接收到N條信息或者每過M秒),進行一個flush操作苦丁,從而可以為系統(tǒng)硬件崩潰時“處于危險之中”的數(shù)據(jù)在量上加個上限浸颓。

Kafka的緩存不是在內(nèi)存中保存盡可能多的數(shù)據(jù)并在需要時將這些數(shù)刷新到文件系統(tǒng),而是做完全相反的事情旺拉,將所有的數(shù)據(jù)立即寫入文件系統(tǒng)中的持久化的日志中产上,但不進行刷新數(shù)據(jù)的調(diào)用,實際這么做意味著數(shù)據(jù)被傳輸?shù)給s內(nèi)核的頁面緩存中去了蛾狗,隨后在根據(jù)配置刷新到硬盤晋涣。

Kafka安裝

安裝優(yōu)化主要修改config目錄下的server.properties文件,需要修改的參數(shù)值主要有 broker.id沉桌、host.name谢鹊、log.dirs。

brokerid是對Kafka集群各個節(jié)點的一個標(biāo)識留凭,比如xx.xxx.xx.1 當(dāng)做節(jié)點一佃扼,則brokerid=1;xx.xxx.xx.2 當(dāng)做節(jié)點二蔼夜,則brokerid=2 兼耀;host.name需要配置的是本機ip或者主機名映射。如下圖:

image

log.dirs是配置Kafka數(shù)據(jù)日志的本地磁盤求冷。

image

生產(chǎn)集群中瘤运,我們還需要配置Kafka進程的啟動內(nèi)存,通過配置kafka-server-start.sh匠题,分配10g內(nèi)存拯坟,5g初始化內(nèi)存。如下圖:

image

啟動Kafka集群并檢查zk路徑上Kafka節(jié)點是否全部上線韭山。

image

Kafka優(yōu)化

以下為實際生產(chǎn)集群Kafka優(yōu)化配置項郁季,標(biāo)紅部分為權(quán)限控制配置,后續(xù)會有專門一章來描述钱磅。

下面兩個參數(shù)巩踏,如果在生產(chǎn)集群中寫死了無法批量修改配置。

broker.id=2

listeners=SASL_PLAINTEXT://hosip:9092

可以按如下配置续搀,將自動生成brokeid塞琼,自動識別host.name。

broker.id=2

listeners=SASL_PLAINTEXT://:9092

zookeeper.connect=zkip1:2181,zkip2:2181,zkip3:2181/kafka

Timeout in ms for connecting to zookeeper

delete.topic.enable=true

zookeeper.connection.timeout.ms=60000

zookeeper.session.timeout.ms=60000

controlled.shutdown.enable=true

很重要

unclean.leader.election.enable=true

auto.create.topics.enable=false

副本拉取線程數(shù)

num.replica.fetchers=4

auto.leader.rebalance.enable=true

leader.imbalance.per.broker.percentage=10

leader.imbalance.check.interval.seconds=3600

副本拉取的最小大小1mb

replica.fetch.min.bytes=1

副本拉取的最大大小20mb

replica.fetch.max.bytes=20971520

多長時間拉取一次副本

replica.fetch.wait.max.ms=500

超過多長時間副本退出isr

replica.socket.timeout.ms=60000

replica.fetch.wait.max.ms=1000

緩存大小

replica.socket.receive.buffer.bytes=131072

num.network.threads=7

num.io.threads=13

每當(dāng)producer寫入10000條消息時禁舷,刷數(shù)據(jù)到磁盤

log.flush.interval.messages=10000

每間隔1秒鐘時間彪杉,刷數(shù)據(jù)到磁盤

log.flush.interval.ms=1000

socket.receive.buffer.bytes=1048576

socket.send.buffer.bytes=1048576

queued.max.requests=10000

sasl.enabled.mechanisms=PLAIN

sasl.mechanism.inter.broker.protocol=PLAIN

allow.everyone.if.no.acl.found=false

super.users=User:admin

authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer

security.inter.broker.protocol=SASL_PLAINTEXT

Kafka常用操作

啟動Kafka進程:

nohup kafka-server-start.sh /usr/local/kafka/config/server.properties >/dev/null 2>&1 & 注意

創(chuàng)建主題:

$KAFKA_HOME/bin/kafka-topics.sh --create --topic logstash-yarnnodelog --replication-factor 3 --partitions 9 --zookeeper zkip:2181/kafka

主題列表:

$KAFKA_HOME/bin/kafka-topics.sh --list --zookeeper zkip:2181

啟動消費者進程:

$KAFKA_HOME/bin/kafka-console-consumer.sh --zookeeper zkip:2181 --topic topic-test --from-beginning

kafka-console-consumer.sh --bootstrap-server brokerip:9092 --from-beginning --topic logstash --new-consumer --consumer.config=/opt/beh/core/kafka/config/consumer.properties

啟動生產(chǎn)者進程:

$KAFKA_HOME/bin/kafka-console-producer.sh --broker-list brokerip:9092 --topic topic-test

刪除主題:

$KAFKA_HOME/bin/kafka-topics.sh --zookeeper zkip:2181 --delete --topic topic-test

描述主題:

$KAFKA_HOME/bin/kafka-topics.sh --describe --zookeeper zkip:2181/ --topic test20160807

Kafka權(quán)限控制

配置服務(wù)端權(quán)限控制屬性server.properties:

vi /opt/beh/core/kafka/config/server.properties

修改brokerid

zookeeper.connect=zkip1:2181, zkip2:2181, zkip3:2181

Timeout in ms for connecting to zookeeper

zookeeper.connection.timeout.ms=6000

listeners=SASL_PLAINTEXT://:9092

security.inter.broker.protocol=SASL_PLAINTEXT

sasl.enabled.mechanisms=PLAIN

sasl.mechanism.inter.broker.protocol=PLAIN

auto.create.topics.enable=false

allow.everyone.if.no.acl.found=false

delete.topic.enable=true

super.users=User:admin

authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer

配置服務(wù)端權(quán)限控制用戶:

KafkaServer {

    org.apache.kafka.common.security.plain.PlainLoginModule required

    username="admin"

    password="admin"

    user_admin="admin"

    user_hadoop="hadoop"

    user_producer1="producer1_test"

    user_consumer1="consumer1_test"

    user_producer2="producer2_test"

    user_consumer2="consumer2_test";

    };

配置客戶端權(quán)限控制用戶:

vi kafka_client_consumer_jaas.conf

KafkaClient {

    org.apache.kafka.common.security.plain.PlainLoginModule required

    username="consumer1"

    password="consumer1_test";

    };

Vi kafka_client_producer_jaas.conf

KafkaClient {

    org.apache.kafka.common.security.plain.PlainLoginModule required

    username="producer1"

    password="producer1_test";

    };

配置生產(chǎn)及消費權(quán)限控制屬性producer.properties:

consumer.properties

echo security.protocol=SASL_PLAINTEXT >> producer.properties

echo sasl.mechanism=PLAIN >> producer.properties

echo security.protocol=SASL_PLAINTEXT >> consumer.properties

echo sasl.mechanism=PLAIN >> consumer.properties

vi producer.properties

security.protocol=SASL_PLAINTEXT

sasl.mechanism=PLAIN

vi consumer.properties

security.protocol=SASL_PLAINTEXT

sasl.mechanism=PLAIN

配置服務(wù)端啟動腳本:

/opt/beh/core/kafka/bin/

vi server-start

export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/beh/core/kafka/config/kafka_server_jaas.conf"

nohup kafka-server-start.sh /opt/beh/core/kafka/config/server.properties &

配置生產(chǎn)消費運行腳本:

vi kafka-console-producer.sh

if [ "x$KAFKA_OPTS" ]; then

export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/beh/core/kafka/config/kafka_client_jaas.conf"

fi

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then

export KAFKA_HEAP_OPTS="-Xmx512M"

fi

exec (dirname0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"

vi kafka-console-consumer.sh

if [ "x$KAFKA_OPTS" ]; then

export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/beh/core/kafka/config/kafka_client_jaas.conf"

fi

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then

export KAFKA_HEAP_OPTS="-Xmx512M"

fi

exec (dirname0)/kafka-run-class.sh kafka.tools.ConsoleConsumer "$@"

賦權(quán)命令

未賦予任何權(quán)限時:

image

測試命令:

啟動服務(wù):

nohup kafka-server-start.sh /opt/beh/core/kafka/config/server.properties &

確認(rèn)環(huán)境無授權(quán)信息:

kafka-acls.sh --list --authorizer-properties zookeeper.connect=localhost:2181

賦予某個用戶處理集群的權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:admin --operation ClusterAction --cluster --add (更新metedata權(quán)限)

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:admin --cluster --add

創(chuàng)建主題:

$KAFKA_HOME/bin/kafka-topics.sh --create --topic topic-test1 --replication-factor 2 --partitions 4 --zookeeper localhost:2181

賦予topic權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:Bob --allow-principal User:Alice --allow-host xxx.xx.xx.0 --allow-host xxx.xx.xx.1 --operation Read --operation Write --topic Test-topic

- 指定主題指定用戶 -

為主題賦予某個用戶的生產(chǎn)權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:producer1 --topic=topic-test --operation Write --add

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:producer1 --topic=test1 --operation Write --add

為主題賦予某個用戶在所有消費者組消費*權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:producer1 --consumer --topic=topic-test --group=* --add

為主題賦予某個用戶在某個消費者組消費*權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:hadoop --consumer --topic=topic-test1 --group=test-consumer-group --add

- 指定主題全部用戶 -

為主題賦予全部用戶的生產(chǎn)權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:* --producer --topic=topic-test1 --add

為主題賦予全部用戶在所有消費者組消費*權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:* --consumer --topic=topic-test1 --group=* --add

為主題賦予全部用戶在某個消費者組消費*權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:* --consumer --topic=topic-test1 --group=test-consumer-group --add

- 所有主題指定用戶 -

為所有主題賦予某個用戶的生產(chǎn)權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:producer1 --topic=* --operation Write --add

為所有主題賦予某個用戶在某個消費者組消費權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:hadoop --consumer --topic=* --group=test-consumer-group --add

為所有主題賦予某個用戶在全部消費者組消費權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:hadoop --consumer --topic=* --group=* --add

- 所有主題全部用戶 -

為所有主題賦予全部用戶的生產(chǎn)權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:* --topic=* --operation Write --add

為所有主題賦予全部用戶在某個消費者組消費權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:* --consumer --topic=* --group=topic-test --add

為所有主題賦予全部用戶在全部消費者組消費權(quán)限:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:* --consumer --topic=* --group=* --add

移除權(quán)限:

bin/kafka-acls.sh --authorizer-properties zookeeper.connect=data-rt-dev02:2181/kafka_test10 --remove --allow-principal User:Bob --allow-principal User:Alice --allow-host xxx.xx.xx.0 --allow-host xxx.xx.xx.1 --operation Read --operation Write --topic test

查看權(quán)限:

查看所有用戶的所有權(quán)限:

kafka-acls.sh --list --authorizer-properties zookeeper.connect=localhost:2181

查看某個用戶所擁有的權(quán)限:

kafka-acls.sh --list --authorizer-properties zookeeper.connect=localhost:2181 User:hadoop

查看某個主題所擁有的權(quán)限:

kafka-acls.sh --list --authorizer-properties zookeeper.connect=localhost:2181 --topic=topic-test1

生產(chǎn)消費測試

啟動生產(chǎn)者:

$KAFKA_HOME/bin/kafka-console-producer.sh --broker-list broker1:9092 --topic topic-test --producer.config=/opt/beh/core/kafka/config/producer.properties

啟動消費者:

kafka-console-consumer.sh --bootstrap-server broker1:9092 --from-beginning --topic topic-test --new-consumer --consumer.config=/opt/beh/core/kafka/config/consumer.properties

Kafka權(quán)限控制的java代碼示例:

put("sasl.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required username="consumer1" password="consumer1_test";");

            put("security.protocol", "SASL_PLAINTEXT");

            put("sasl.mechanism", "PLAIN");

Kafka維護存儲均衡

  • 評估數(shù)據(jù)量:要求研發(fā)提前評估topic一個周期全量的數(shù)據(jù)大小毅往。

  • 計算磁盤總存儲:如一塊盤825g,一個節(jié)點20快盤派近,10個節(jié)點攀唯。那么磁盤總存儲就是165000g。

  • 預(yù)估實際數(shù)據(jù)存儲占比:topic一個周期全量數(shù)據(jù)大小占磁盤總存儲的百分比渴丸,超過百分之六十侯嘀,即要求研發(fā)減少存儲周期。

  • 計算磁盤總塊數(shù):一個節(jié)點20快盤谱轨,10個節(jié)點戒幔,總磁盤塊數(shù)200個。

  • 合理預(yù)分區(qū):分區(qū)數(shù)量為磁盤總數(shù)的整數(shù)倍土童。如所有的topic總數(shù)據(jù)量為50000gb诗茎,磁盤個數(shù)為200,那么就可以設(shè)置總分區(qū)數(shù)為200,400,600.具體多少分區(qū)數(shù)視業(yè)務(wù)決定献汗。若分區(qū)數(shù)為400敢订,那么一個分區(qū)的大小約125g。例如某一個topic:cbss001的預(yù)估數(shù)據(jù)量是210g罢吃,那么通過計算可以將其分成兩個分區(qū)楚午。這樣根據(jù)Kafka副本落盤策略,各個主機磁盤就能保證最大限度的存儲均衡尿招。

Kafka常見故障處理

  • 壞盤會導(dǎo)致節(jié)點宕掉矾柜,及時更換壞盤,重啟節(jié)點即可泊业。

  • unclean.leader.election.enable 該參數(shù)為true配置到topic中會引起消息重復(fù)消費把沼。但為false時啊易,會引起節(jié)點9092端口斷開連接吁伺,導(dǎo)致Kafka進程假死。

  • 內(nèi)存溢出租谈,其會導(dǎo)致節(jié)點副本不能上線isr篮奄。

  • 進程,文件數(shù)限制也會造成節(jié)點報錯割去,后續(xù)調(diào)優(yōu)中會給出優(yōu)化參數(shù)窟却。

  • flower副本不能及時同步leader副本,同步超時導(dǎo)致副本下線isr呻逆。

  • 消費offset越界夸赫,這種情況首先重啟節(jié)點,若還是報錯咖城,則找到該offset越界的分區(qū)茬腿,刪除幾條message呼奢,再次查看。知道不報錯為止切平。

Kafka集群擴容下線節(jié)點

使用自動遷移工具

下面的示例將把foo1,foo2兩個主題的所有分區(qū)都遷移到新的broker機器5,6上握础。最后,foo1,foo2兩個主題的所有分區(qū)都厚在brokers 5,6上悴品。

vi topics-to-move.json

{"topics": [{"topic": "foo1"}, {"topic": "foo2"}], "version":1 }

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181

--topics-to-move-json-file topics-to-move.json --broker-list "5,6" --generate Current partition replica assignment

{"version":1,

"partitions":[

{"topic":"foo1","partition":2,"replicas":[1,2]}, {"topic":"foo1","partition":0,"replicas":[3,4]}, {"topic":"foo2","partition":2,"replicas":[1,2]}, {"topic":"foo2","partition":0,"replicas":[3,4]}, {"topic":"foo1","partition":1,"replicas":[2,3]},{"topic":"foo2","partition":1,"replicas":[2,3]}

]

}

Proposed partition reassignment configuration

{"version":1,

"partitions":[

{"topic":"foo1","partition":2,"replicas":[5,6]},{"topic":"foo1","partition":0,"replicas":[5,6]},

{"topic":"foo2","partition":2,"replicas":[5,6]},{"topic":"foo2","partition":0,"replicas":[5,6]},

{"topic":"foo1","partition":1,"replicas":[5,6]},{"topic":"foo2","partition":1,"replicas":[5,6]}

]

}

工具生成了一個把主題foo1,foo2所有分區(qū)遷移到brokers 5,6上的計劃禀综。注意,分區(qū)遷移還沒有開始苔严。它只是告訴你當(dāng)前分配計劃和新計劃的提議定枷。為了防止萬一需要回滾,新的計劃應(yīng)該保存起來邦蜜。

新的調(diào)整計劃應(yīng)該保存成一個json文件(如:expand-cluster-reassignment.json)依鸥,并以–execute選項的方式,如下:

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file expand-cluster-reassignment.json --execute

Current partition replica assignment

{"version":1,

"partitions":[

{"topic":"foo1","partition":2,"replicas":[1,2]}, {"topic":"foo1","partition":0,"replicas":[3,4]}, {"topic":"foo2","partition":2,"replicas":[1,2]}, {"topic":"foo2","partition":0,"replicas":[3,4]}, {"topic":"foo1","partition":1,"replicas":[2,3]}, {"topic":"foo2","partition":1,"replicas":[2,3]}

] }

Save this to use as the --reassignment-json-file option during rollback Successfully started reassignment of partitions

{"version":1,

"partitions":[

{"topic":"foo1","partition":2,"replicas":[5,6]}, {"topic":"foo1","partition":0,"replicas":[5,6]}, {"topic":"foo2","partition":2,"replicas":[5,6]}, {"topic":"foo2","partition":0,"replicas":[5,6]}, {"topic":"foo1","partition":1,"replicas":[5,6]}, {"topic":"foo2","partition":1,"replicas":[5,6]}

]

}

執(zhí)行驗證:–verify

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file custom-reassignment.json --verify

Status of partition reassignment: Reassignment of partition [foo1,0]

completed successfully

Reassignment of partition [foo2,1]

completed successfully

Kafka日志保留周期設(shè)置

log.retention.bytes (一個topic的大小限制 =分區(qū)數(shù)*log.retention.bytes)

log.retention.minutes

log.retention.bytes和log.retention.minutes任意一個達到要求悼沈,都會執(zhí)行數(shù)據(jù)刪除

Kafka指定topic賦參

kafka-configs.sh --zookeeper zkip1:2181 --describe --entity-type topics --entity-name CdrNormal

Configs for topics:CdrNormal are retention.ms=86400000

Kafka集群監(jiān)控

Python腳本監(jiān)控Kafka存活節(jié)點:

!/usr/bin/python

coding:utf-8

import pycurl

import json

import StringIO

import time

import sys

import zookeeper

zk=zookeeper.init("zkip1:2181")

t = zookeeper.get_children(zk,"/brokers/ids")

d=0

for i in t:

d=d+1

b=16-d

if d == 16:

print "ok cb實時kafka1節(jié)點存活正常"

sys.exit(0)

else:

print "Critical cb實時kafka1節(jié)點有:",b,"個死去節(jié)點"

sys.exit(2)

Python腳本監(jiān)控Kafka各節(jié)點磁盤存儲:

!/usr/bin/python

coding:utf-8

import paramiko

import sys

hostname = ['IP1',' IP2']

username = sys.argv[1]

password = sys.argv[2]

percent = sys.argv[3]

disk={}

error=""

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for i in range(0,len(hostname)):

ssh.connect(hostname[i],22,username,password)

stdin,stdout,stderr = ssh.exec_command("df -TPh|awk '+$6>%s {print $7}'" % percent)

path = stdout.readlines()

#print path

disk[hostname[i]]=path

#print disk

it=iter(disk.keys())

print disk.values()

for key in hostname:

print i

print disk[hostname[i]]

print disk[next(it)]

print len(disk[next(it)])

if len(disk[next(it)])==0:

if not disk:

print("未采集到集群信息!")

sys.exit(0)

else:

for i in disk.keys():

    #print disk.get(i)

    if not disk.get(i):

        continue

    else:

        error += "節(jié)點"+i+":"

    for j in range(0,len(disk[i])):

        if j == len(disk[i])-1:

           error += disk[i][j].encode('utf-8')+"贱迟。"

        else:

           error += disk[i][j].encode('utf-8')+","

if not error:

    print("cb_rt_kafka業(yè)務(wù)數(shù)據(jù)采集集群正常")

    sys.exit(0)

else:

    #print ("cb_rt_kafka業(yè)務(wù)數(shù)據(jù)采集集群,%s,磁盤存儲超出百分之七十") % error.replace("\n", "")

    print ("cb_rt_kafka業(yè)務(wù)數(shù)據(jù)采集集群,%s,磁盤存儲超出百分之%s") % (error.replace("\n", ""),percent)

    sys.exit(2)

ssh.close()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市絮供,隨后出現(xiàn)的幾起案子衣吠,更是在濱河造成了極大的恐慌,老刑警劉巖壤靶,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缚俏,死亡現(xiàn)場離奇詭異,居然都是意外死亡贮乳,警方通過查閱死者的電腦和手機忧换,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來向拆,“玉大人亚茬,你說我怎么就攤上這事∨遥” “怎么了刹缝?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颈将。 經(jīng)常有香客問我梢夯,道長,這世上最難降的妖魔是什么晴圾? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任颂砸,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘人乓。我一直安慰自己梗醇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布撒蟀。 她就那樣靜靜地躺著叙谨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪保屯。 梳的紋絲不亂的頭發(fā)上手负,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音姑尺,去河邊找鬼竟终。 笑死,一個胖子當(dāng)著我的面吹牛切蟋,可吹牛的內(nèi)容都是我干的统捶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼柄粹,長吁一口氣:“原來是場噩夢啊……” “哼喘鸟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驻右,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤什黑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后堪夭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愕把,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年森爽,在試婚紗的時候發(fā)現(xiàn)自己被綠了恨豁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡爬迟,死狀恐怖橘蜜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雕旨,我是刑警寧澤扮匠,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布捧请,位于F島的核電站凡涩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疹蛉。R本人自食惡果不足惜活箕,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望可款。 院中可真熱鬧育韩,春花似錦克蚂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悉罕,卻和暖如春赤屋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壁袄。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工类早, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗜逻。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓涩僻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栈顷。 傳聞我的和親對象是個殘疾皇子逆日,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 在軟件項目的生命周期中,開發(fā)只占開始的一小部分萄凤,大部分時間我們要對項目進行運行維護屏富,Kafka相關(guān)的項目也不例外。...
    柴詩雨閱讀 8,163評論 0 7
  • 大致可以通過上述情況進行排除 1.kafka服務(wù)器問題 查看日志是否有報錯蛙卤,網(wǎng)絡(luò)訪問問題等狠半。 2. kafka p...
    生活的探路者閱讀 7,575評論 0 10
  • 一、入門1颤难、簡介Kafka is a distributed,partitioned,replicated com...
    HxLiang閱讀 3,343評論 0 9
  • kafka安裝目錄下的bin目錄包含了很多運維可操作的shell腳本神年,列舉如下: 接下來詳細(xì)說明每個腳本的使用方法...
    阿飛的博客閱讀 9,726評論 5 15
  • 姓名:陳權(quán) 公司:青檸養(yǎng)車 【知~學(xué)習(xí)】 《輕課口語》打卡第608天 【行~實踐】 一、修身 肌肉鍛練 二行嗤、努力 ...
    水青檸閱讀 79評論 0 0