• kafka集群搭建


    一、安装多节点ZooKeeper集群

    下面就是在本机一台机器上安装3个节点的ZooKeeper集群,在多台机器上安装的方法和一台机器上是一样的,就是配置文件有微小的调整。

    1.下载ZooKeeper包

    https://www-us.apache.org/dist/zookeeper/stable/

    下载带bin的tar.gz文件,目前是apache-zookeeper-3.5.6-bin.tar.gz

    解压

    tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz

    把解压文件移动到/usr/local

    sudo mv apache-zookeeper-3.5.6-bin /usr/local/

    2.创建配置文件

    在ZooKeeper的conf目录下创建3个配置文件zoo1.cfg,zoo2.cfg,zoo3.cfg,如果是在多台服务器上安装ZooKeeper集群可以取相同的配置文件名字。

    zoo1.cfg

    tickTime=2000

    dataDir=/home/xl/zookeeper/data_logs/zookeeper1

    clientPort=2181

    initLimit=5

    syncLimint=2

    server.1=localhost:2888:3888

    server.2=localhost:2889:3889

    serve.3=localhost:2890:3890

    zoo2.cfg

    tickTime=2000

    dataDir=/home/xl/zookeeper/data_logs/zookeeper2

    clientPort=2182

    initLimit=5

    syncLimint=2

    server.1=localhost:2888:3888

    server.2=localhost:2889:3889

    serve.3=localhost:2890:3890

    zoo3.cfg

    tickTime=2000

    dataDir=/home/xl/zookeeper/data_logs/zookeeper3

    clientPort=2183

    initLimit=5

    syncLimint=2

    server.1=localhost:2888:3888

    server.2=localhost:2889:3889

    serve.3=localhost:2890:3890

    关键参数:

    -tickTime:zookeeper最小的时间单位,用于丈量心跳时间和超时时间等。通常设置成默认值2秒即可。

    -dataDire:非常重要的参数!ZooKeeper会在内存中保存系统快照,并定期写入该路径指定的文件夹中。生产环境中需要注意该文件夹的磁盘占用情况。这个文件夹需要自己提前生成,不会根据配置文件自动生成。

    -clientPort:ZooKeeper监听客户端连接的端口,一般设置为默认值2181即可。如果是多机器安装方案,可以指定相同的端口号,只要确保没有端口冲突就行,包括配置文件中所有端口没有冲突。

    -initLimit:指定follower节点初始时连接leader节点的最大tick次数。假设是5,表示follower必须要在5×tickTime时间内连接上leader,否则被视为超时。

    -syncLimit:设定了follower节点与leader节点进行同步的最大时间。也是以tickTime为单位。

    -server.x=host:port:port:x必须是一个全局唯一的整数,且需要与myid文件中数字相对应,范围为1~255。第一个端口用于使follower节点连接leader节点,第二个端口用于leader选举。

    3.创建myid文件

    myid文件必须位于配置文件中的dataDir中,具体命令如下:

    echo "1" > /home/xl/zookeeper/data_logs/zookeeper1/myid

    echo "2" > /home/xl/zookeeper/data_logs/zookeeper2/myid

    echo "3" > /home/xl/zookeeper/data_logs/zookeeper3/myid

    4.启动ZooKeeper

    在ZooKeeper目录下执行命令:

    bin/zkServer.sh start conf/zoo1.cfg

    bin/zkServer.sh start conf/zoo2.cfg

    bin/zkServer.sh start conf/zoo3.cfg

    5.检查集群状态

    bin/zkServer.sh status conf/zoo1.cfg

    bin/zkServer.sh status conf/zoo2.cfg

    bin/zkServer.sh status conf/zoo3.cfg

    会显示出leader和follower:

    ZooKeeper JMX enabled by default
    Using config: conf/zoo1.cfg
    Client port found: 2181. Client address: localhost.
    Mode: follower

    ZooKeeper JMX enabled by default
    Using config: conf/zoo2.cfg
    Client port found: 2182. Client address: localhost.
    Mode: leader

    ZooKeeper JMX enabled by default
    Using config: conf/zoo3.cfg
    Client port found: 2183. Client address: localhost.
    Mode: follower

    表明broker2是整个集群的leader,其他两个broker是follower,表明ZooKeeper集群启动成功。

    也可以用jsp命令查看:

    $jsp

    7104 Jps
    6851 QuorumPeerMain
    6920 QuorumPeerMain
    6798 QuorumPeerMain

    ZooKeeper的主进程名是QuorumPeerMain。如果是在多台机器上搭建ZooKeeper集群,那么每台机器上都至少应该有一个这样的进程被启动。

    二、安装多节点kafka集群

    使用一台机器模拟一个3节点的kafka集群的搭建。

    1.下载kafka安装包

    https://www-us.apache.org/dist/kafka/2.3.0/

    下载kakfa_2.11-2.3.0.tgz,其中2.11是相应的Scala版本。

    解压

    tar -zxvf kafka_2.11-2.3.0.tgz

    把解压文件移动到/usr/local下

    sudo mv kafka_2.11-2.3.0 /usr/local/

    2.创建配置文件

    conf/server1.properties

    broker.id=0

    listeners=PLAINTEXT://localhost:9092

    log.dirs=/home/xl/kafka/data_logs/kafka1

    zookeeper.connect=localhost:2181,localhost:2182,localhost:2183

    zookeeper.connection.timeout.ms=6000

    delete.topic.enable=true

    unclean.leader.election.enable=false

    conf/server2.properties

    broker.id=1

    listeners=PLAINTEXT://localhost:9093

    log.dirs=/home/xl/kafka/data_logs/kafka2

    zookeeper.connect=localhost:2181,localhost:2182,localhost:2183

    zookeeper.connection.timeout.ms=6000

    delete.topic.enable=true

    unclean.leader.election.enable=false

    conf/server3.properties

    broker.id=2

    listeners=PLAINTEXT://localhost:9094

    log.dirs=/home/xl/kafka/data_logs/kafka3

    zookeeper.connect=localhost:2181,localhost:2182,localhost:2183

    zookeeper.connection.timeout.ms=6000

    delete.topic.enable=true

    unclean.leader.election.enable=false

    重要参数:

    -broker.id:整个集群中必须是唯一的整数,给每台服务器指定不同的broker id。

    -listeners:broker监听器的csv列表,格式是[协议]://[主机名]:[端口]。该参数主要用于客户端连接broker使用,可以认为是broker端开放给clients的监听端口。如果不指定主机名,则表示绑定默认网卡;如果主机名是0.0.0.0,表示绑定所有网卡。kafka当前支持的协议类型包括PLAINTEXT、SSL及SASL_SSL等。对于未启动安全的kafka集群,使用PLAINTEXT足矣。如果启用了安全认证,可以考虑使用SSL或SASL_SSL协议。

    -zookeeper.connection:必须同时指定所有的ZooKeeper节点。

    -log.dirs:非常重要的参数!指定了kafka持久化消息的目录。必须设定,必须提前生成。若待保存的消息数量非常多,那么最好确保该文件夹下有充足的磁盘空间。该参数可以设置多个目录,以逗号分隔。在实际使用过程中,指定多个目录的做法是被推荐的,这样kafka可以把负载均匀地分配到多个目录下。

    -unclean.leader.election.enable:false表示在ISR为空而此时leader又宕机了,kafka不允许从剩下存活的非ISR副本中选择一个当leader。

    -delete.topic.enable:是否允许kafka删除topic。

    3.启动kafka服务器

    bin/kafka-server-start.sh config/server1.properties

    bin/kafka-server-start.sh -daemon config/server2.properties

    bin/kafka-server-start.sh -daemon config/server3.properties

    -daemon:表示启动后的kafka服务器后台运行。

    查看kafka的logs目录下的server.log可以确认kafka broker是否已经成功启动。

    也可以用jps命令:

    $jps

    12240 Kafka
    6851 QuorumPeerMain
    12325 Jps
    6920 QuorumPeerMain
    11163 Kafka
    11867 Kafka
    6798 QuorumPeerMain

    kafka的主进程名是Kafka。

    如果需要为集群增加更多的broker节点,只需要配置一份类似的配置文件,然后利用该文件直接运行启动命令即可。

    三、验证部署

    1.测试topic创建与删除

    topic能够正确地创建与删除才能说明kafka集群在正常工作,因为通常它都表明了kafka的控制器controller已经被成功地选举出来并开始履行自身的职责。

    创建一个topic,名为test-topic,3个分区,每个分区都分配3个副本:

    bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --create --topic test-topic --partitions 3 --replication-factor 3

    Created topic test-topic.表明创建成功。

    验证:

    $bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 -list
    test-topic
    $bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --describe --topic test-topic

    Topic:test-topic PartitionCount:3 ReplicationFactor:3 Configs:
    Topic: test-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
    Topic: test-topic Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
    Topic: test-topic Partition: 2 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2

    删除topic:

    $bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --delete --topic test-topic

    Topic test-topic is marked for deletion.
    Note: This will have no impact if delete.topic.enable is not set to true.

    这仅仅表示该topic被成功地标记为“待删除”,至于topic是否会被真正删除取决于broker端参数delete.topic.enable。

    验证是否删除了:

    $bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 -list

    输出就没有test-topic了。

    2.测试消息发送与消费

    打开两个终端,一个用于发送消息,另一个用于接受消息:

    bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9093,localhost:9094 --topic test-topic
    bin/kafka-console-consumer.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic test-topic --from-beginning

    3.生产者吞吐量测试

    $bin/kafka-producer-perf-test.sh --topic test-topic --num-records 500000 --record-size 200 --throughput -1 --producer-props bootstrap.servers=localhost:9092,localhost:9093,localhost:9094 acks=-1

    311727 records sent, 62345.4 records/sec (11.89 MB/sec), 1680.5 ms avg latency, 2362.0 ms max latency.
    500000 records sent, 72432.275822 records/sec (13.82 MB/sec), 1690.16 ms avg latency, 2362.00 ms max latency, 1794 ms 50th, 2285 ms 95th, 2311 ms 99th, 2339 ms 99.9th.

    表明这台机器上运行一个kafka producer的平均吞吐量是13MB/s,即占用104Mb/s,评价每秒能发送72432条消息,平均延时是1.69秒,最大延时是2.36秒,平均有50%的消息发送需要花费1.79秒。

    4.消费者吞吐量测试

    $bin/kafka-consumer-perf-test.sh --broker-list localhost:9092,localhost:9093,localhost:9094 --fetch-size 2000 --messages 500000 --topic test-topic

    start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec
    2019-10-17 16:09:12:558, 2019-10-17 16:09:14:792, 95.3674, 42.6891, 500003, 223815.1298, 36, 2198, 43.3883, 227480.8917

    表明该环境中consumer在2秒多的时间内总共消费了95MB的消息,吞吐量为42MB/s。

  • 相关阅读:
    sqlserver2012附加数据库2005版本时出现的问题
    jQuery实现评论还剩多少个字
    在mvc3中经常使用身份验证实现
    Windows Phone学习(1):棋子未动,先观全局
    使用jquery.pagination.js实现无刷新分页
    Javascript和JQuery中常用的随机数产生函数(很好用)
    网页打印样式设置(页眉,页脚,页边距)
    rdlc到设置宽度后自动换行(转)
    VSS忘记Admin密码和修改默认登陆用户
    解决jquery 修改onclick事件后IE兼容模式下立刻执行的问题
  • 原文地址:https://www.cnblogs.com/xl717/p/11693416.html
Copyright © 2020-2023  润新知