zookeeper+kafka集群安装部署

在此之前请确保安装jdk,此过程不再赘述。

1、zk集群安装配置(以3个节点集群为例,默认安装目录为/usr/local)

wget http://apache.claz.org/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz .

tar zxf zookeeper-3.4.6.tar.gz

cd zookeeper-3.4.6/conf

cp zoo_sample.cfg zoo.cfg

编辑zoo.cfg,修改dataDir=/data/zookeeper(非必须)

添加集群节点信息(必须):

server.1=ip1:2888:3888

server.2=ip2.105:2888:3888

server.3=ip3.114:2888:3888

其他配置可以默认,也可根据需要修改。然后将 整个zookeeper-3.4.6/目录,copy至其他2个节点(ip2、ip3)。

在每个节点的/data/zookeeper 目录下创建myid文件,文件内容不可重复,即myid为唯一的。

eg: echo "1" > myid

启动zk: /usr/local/zookeeper-3.4.6/bin/zkServer.sh start

停止zk:/usr/local/zookeeper-3.4.6/bin/zkServer.sh stop

2、安装配置kafka(以3个节点集群为例,默认安装目录为/usr/local)

wget http://apache.claz.org/kafka/0.8.2.2/kafka_2.11-0.8.2.2.tgz .

tar zxf kafka_2.11-0.8.2.2.tgz

cd kafka_2.11-0.8.2.2/

配置config/server.properties文件,一般需要配置如下字段,其他按默认即可:

broker.id:  每一个broker在集群中的唯一表示,要求是正数

host.name:  本机ip

log.dirs:   kafka数据的存放地址,多个地址的话用逗号分割,多个目录分布在不同磁盘上可以提高读写性能

log.retention.hours:  数据文件保留多长时间, 存储的最大时间超过这个时间会根据log.cleanup.policy设置数据清除策略

zookeeper.connect:   zk集群的地址

启动kafka:  /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties

停止kafka: /usr/local/kafka/bin/kafka-server-stop.sh/usr/local/kafka/config/server.properties

ps: 启动服务之后,jps查看进程,来检查zk和kafka是否正确启动:

25398 Kafka

637 QuorumPeerMain

二、kafka topic的常见操作

  1. Topic:用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上。

  2. Partition:分区,是Kafka中横向扩展和一切并行化的基础,每个Topic都至少被切分为1个Partition。

  3. Offset:消息在Partition中的编号,编号顺序不跨Partition。

  4. Consumer:用于从Broker中取出/消费Message。

  5. Producer:用于往Broker中发送/生产Message。

  6. Replication:Kafka支持以Partition为单位对Message进行冗余备份,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)。

  7. Leader:每个Replication集合中的Partition都会选出一个唯一的Leader,所有的读写请求都由Leader处理。其他Replicas从Leader处把数据更新同步到本地,过程类似大家熟悉的MySQL中的Binlog同步。

  8. Broker:Kafka中使用Broker来接受Producer和Consumer的请求,并把Message持久化到本地磁盘。每个Cluster当中会选举出一个Broker来担任Controller,负责处理Partition的Leader选举,协调Partition迁移等工作。

创建topic:  /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper ip1:2181,ip2:2181,ip3:2181(zk集群) --replication-factor 2 --partitions 20 --topic test(topic名字)

producer发送消息: /usr/local/kafka/bin/kafka-console-producer.sh --broker-list ip1:9092,ip2:9092,ip3:9092(kafka集群) --topic test

consumer接收消息:   /usr/local/kafka/bin/kafka-console-consumer.sh --zookeeper ip1:2181,ip2:2181,ip3:2181(zk集群) --topic test --from-beginning

查看创建的topic:  /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper ip1:2181,ip2:2181,ip3:2181(zk集群)

删除已创建的topic: /usr/local/kafkabin/kafka-topics.sh --delete --zookeeper ip1:2181,ip2:2181,ip3:2181(zk集群) --topic test

这个命令其实并没有真正删除topic信息,要想彻底删除,需要启动zk客户端去删除,具体操作如下:

1、删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录
2、如果配置了delete.topic.enable=true直接通过命令删除,如果命令删除不掉,直接通过zookeeper-client 删除掉broker下的topic即可。
进入客户端执行:/usr/local/zookeeper-3.4.6/bin/ zkCli.sh
 ls  /consumers

找到topic所在的目录:ls /brokers/topics
找到要删除的topic,执行命令:rmr /brokers/topics/【topic name】即可,此时topic被彻底删除。
另外被标记为marked for deletion的topic你可以在zookeeper客户端中通过命令获得:ls /admin/delete_topics/【topic name】,如果你删除了此处的topic,那么marked for deletion 标记消失

三、线上kafka配置特别说明

broker.id=1921685162
host.name=ip
advertised.host.name=ip
log.dirs=/data/kafka 
log.retention.hours=72   #数据保存3天
zookeeper.connection.timeout.ms=9000    #ZooKeeper集群连接超时时长
zookeeper.sync.time.ms=3000   #ZooKeeper集群中leader和follower之间的同步时间
zookeeper.connect=ip1:2181,ip2:2181,ip3:2181
num.replica.fetchers=4    #leader进行复制的线程数,增大这个数值会增加follower的IO
replica.fetch.wait.max.ms=500    #replicas同leader之间通信的最大等待时间,失败了会重试
replica.socket.timeout.ms=30000   #follower与leader之间的socket超时时间

四、kafka相关api使用

producer 生产者:

Properties props =newProperties();
props.put("zk.connect","ip1:2181,ip2:2181,ip3:2181");
props.put("serializer.class","kafka.serializer.StringEncoder");
props.put("metadata.broker.list","ip1:9092,ip2:9092,ip3:9092");
props.put("producer.type","async");
ProducerConfig config =newProducerConfig(props);
Producer<String, String> producer =newProducer<>(config);
producer.send(newKeyedMessage<String, String>("clicki_test_topic","aaaaaaaaaaa"));

consumer 消费者:

publicclassConsumerTest extendsThread {
    privatefinalConsumerConnector consumer;
    privatefinalString topic;
 
    publicstaticvoid main(String[] args) {
        ConsumerTest consumerThread =newConsumerTest("clicki_test_topic");
        consumerThread.start();
    }
 
    publicConsumerTest(String topic) {
        consumer = kafka.consumer.Consumer
                .createJavaConsumerConnector(createConsumerConfig());
        this.topic = topic;
    }
 
    privatestaticConsumerConfig createConsumerConfig() {
        Properties props =newProperties();
        props.put("zookeeper.connect","ip1:2181,ip2:2181,ip3:2181");
        props.put("group.id","0");
        props.put("zookeeper.session.timeout.ms","400000");
        props.put("zookeeper.sync.time.ms","200");
        props.put("auto.commit.interval.ms","1000");
        returnnewConsumerConfig(props);
    }
 
    @Override
    publicvoidrun() {
        Map<String, Integer> topicCountMap =newHashMap<String, Integer>();
        topicCountMap.put(topic,newInteger(1));
        Map<String, List<KafkaStream<byte[],byte[]>>> consumerMap = consumer
                .createMessageStreams(topicCountMap);
        KafkaStream<byte[],byte[]> stream = consumerMap.get(topic).get(0);
        ConsumerIterator<byte[],byte[]> it = stream.iterator();
        while(it.hasNext())
            System.out.println(newString(it.next().message()));
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值