1.编写生产者
erlang连接kafka使用三方库brod(https://github.com/klarna/brod)
下面是示例代码
%% API -export([do/2, start/0, r_do/1]). -define(IF(Boolean, True, False), case Boolean of true -> True; _ -> False end). start() -> ok = brod:start(), List = [{"ip", 9092},{"ip", 9091},{"ip", 9093}], ok = brod:start_client(List, client1), ok = brod:start_producer(client1, <<"money">>, _ProducerConfig = []). r_do(Num) -> do(0, Num). do(Now, Max) when Now >= Max -> ok; do(Key, Max) -> Topic = <<"money">>, Role = rand:uniform(5), Type = rand:uniform(900) + 100, Diff = ?IF(rand:uniform(2) =:= 1, -rand:uniform(10000), rand:uniform(10000)), Mijing = rand:uniform(100), Data =#{<<"pkey">>=>Key, <<"role">>=>Role, <<"type">>=>Type, <<"reason">>=>0, <<"num">>=>Diff,<<"mijing">> => Mijing,<<"time">>=>erlang:system_time(millisecond) div 1000 }, brod:produce_cb(client1,Topic,fun(_,MaxPart,_,_)->Key rem MaxPart end,Key,Data,fun(_,_)->ok end), io:format("produce_cb:~p~n", [jiffy:encode(Data)]), do(Key + 1, Max).
把ip改成自己kafka的ip地址即可
2.测试broker crash的情况
建议使用可视化工具KafkaTool( https://www.kafkatool.com/),可以查看kafka各个broker的情况
连接上一节建立的三个zookeeper的client port,完成后如下图
这时尝试让一个broker crash,然后在启动crash的broker,看看能不能恢复
这时要注意,不能使用bin里的脚本正常关闭
正常关闭会把集群内的所有broker全部关闭
使用 ps -ef | grep kafka 找到要操作的broker的进程ID
kill -9 ID
此时会发现,9093的kafka broker消失了,重新启动此broker恢复正常
3.建立topic
可以直接用KafkaTool建立topic
其中有两个重要的参数
partition:由于一个partition同时只能被一个consumer线程消费,所以partition的数量,决定了消费消息的吞吐量。如果只有一个消费者,
那么partition就足够了。
replica:replica表示 每个 partition 在集群中的数量,为了防止某个zookeeper节点崩溃数据丢失,可以设置每个partition在集群中存储多份,
但不能大于zookeeper节点数量,最保险的做法是每个zookeeper都有一份partition,这样只要有一台zookeeper节点存在,数据就
不会丢失,但是这样同步数据的代价会很大,可以根据自己实际需要来调整。
4.测试zookeeper crash的情况
首先用producer生产10条数据
查询到zookeeper2是leader,ps -ef | grep zookeeper2 查询到进程ID,kill进程
此时发现zookeeper3变成了新的leader
在生产10条数据,然后重新打开zookeeper2,发现crash期间生产的数据,同步到了zookeeper2中
5.总结
通过2和4的测试,验证了zookeeper和kafka集群的高可用性,下一节具体介绍flink的数据处理