一、搭建zookeeper集群
1、下载镜像
shell
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz ./
$ tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz
$ rm -rf apache-zookeeper-3.5.5-bin.tar.gz
$ sudo mv apache-zookeeper-3.5.5-bin /usr/local/apache-zookeeper-3.5.52、修改配置文件
创建配置文件:
shell
$ cd /usr/local/apache-zookeeper-3.5.5/conf
$ sudo vi zookeeper.cfg填入配置:
ini
tickTime=3000
dataDir=/data/zookeeper/data
dataLogDir=/var/log/zookeeper/dataLog
initLimit=5
syncLimit=2
autopurge.purgeInterval=3
autopurge.snapRetainCount=5
standaloneEnabled=false
reconfigEnabled=true
dynamicConfigFile=/data/zookeeper/conf/zoo_replicated.cfg.dynamic3、创建动态修改配置文件
shell
$ sudo mkdir -p /data/zookeeper/conf
$ sudo vi /data/zookeeper/conf/zoo_replicated.cfg.dynamic
# server.<positive id> = <address1>:<port1>:<port2>[:role];[<client port address>:]<client port>**
server.1=zookeeper1.bewindoweb.com:2888:3888:participant;2181
server.2=zookeeper2.bewindoweb.com:2888:3888:participant;2181
server.3=zookeeper3.bewindoweb.com:2888:3888:participant;21814、本地创建域名映射
shell
$ sudo vi /etc/hosts
10.x.x.x zookeeper1.bewindoweb.com
10.x.x.x zookeeper2.bewindoweb.com
10.x.x.x zookeeper3.bewindoweb.com
$ sudo /etc/init.d/networking restart5、创建myid文件
shell
$ sudo mkdir -p /data/zookeeper/data
$ sudo vi /data/zookeeper/data/myid
$ 三台机器分别写入1,2,3……6、在zkServer.sh第44行添加JMX配置
端口采用熟悉的1099
shell
……
then
JMXLOCALONLY=false
fi
JMXPORT=1099 ## 添加在此处第 44 行
if [ "x$JMXDISABLE" = "x" ] || [ "$JMXDISABLE" = 'false' ]
then7、配置好PROMETHEUS监控
在zkServer.sh的JMXPORT之后加入prometheus代理相关代码,强行绑定到JVMFLAGS参数上,因为启动的逻辑较为复杂,所以直接通过JVMFLAGS间接地把参数传递到启动命令上。
shell
JMXPORT=1099
PROMETHEUS_PORT=9090
PROMETHEUS_DIR=$(dirname ""$PWD")"/prometheus" # 添加
PROMETHEUS_FILE="$PROMETHEUS_DIR/prometheus-zookeeper.yml" # 添加
PROMETHEUS_JAR="$PROMETHEUS_DIR/jmx_prometheus_javaagent-0.12.0.jar" # 添加
……
then
JVMFLAGS=……
fi
JVMFLAGS="$JVMFLAGS -javaagent:$PROMETHEUS_JAR=$PROMETHEUS_PORT:$PROMETHEUS_FILE" # 添加在zookeeper目录下创建prometheus文件夹,并下载jmx_prometheus_javaagent-0.12.0.jar、prometheus-zookeeper.yml
8、部署集群
把当前的操作系统制作为镜像,例如AWS可以制作AMI,阿里云可以制作副本镜像,复制成3台,分别修改相应的hosts、myid,并分别启动服务器。部署的时候注意要分多个可用区部署,避免一个机房挂掉整个集群就挂掉了。
shell
// 可以通过start-foregound前台启动排查启动问题
$ sudo /usr/local/apache-zookeeper-3.5.5/bin/zkServer.sh start-foreground /usr/local/apache-zookeeper-3.5.5/conf/zookeeper.cfg
// 正常情况都后台启动
$ sudo /usr/local/apache-zookeeper-3.5.5/bin/zkServer.sh start /usr/local/apache-zookeeper-3.5.5/conf/zookeeper.cfg
// 更简洁的
cd /usr/local/apache-zookeeper-3.5.5/bin
./zkServer.sh start ../zookeeper.cfg9、测试prometheus agent是否正常
shell
curl -s localhost:9090/metrics10、prometheus 机器参数监控
除了要监控zookeeper程序的运行参数,操作系统的参数也非常重要,例如CPU、内存、磁盘。我们之前就出现过性能测试时,磁盘打满导致所有业务全崩的情况…
下载node_exporter-0.18.1.linux-amd64.tar.gz(2020.2.20刚出了1.0.0版本,毕竟是正式版本,也可以关注一下),放到服务器prometheus文件夹下,解压后执行:
shell
$ sudo nohup ./node exporter >/dev/null 2>&1 &二、kafka集群搭建
1、下载镜像
shell
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.2.1/kafka_2.12-2.2.1.tgz
$ tar -zxvf kafka_2.12-2.2.1.tgz
$ rm -rf kafka_2.12-2.2.1.tgz
$ sudo mv kafka_2.12-2.2.1 /usr/local/kafka_2.12-2.2.12、修改配置文件
服务器配置:
shell
$ cd /usr/local/kafka_2.12-2.2.1/config
$ sudo vi server.properties
broker.id=1(注意切换,默认填的0,一定不要从0开始,会遇到很多问题)
zookeeper.connect=zookeeper1.bewindoweb.com:2181,zookeeper2.bewindoweb.com:2181,zookeeper3.bewindoweb.com:2181
log.dir=/var/log/kafka-logs
# log.flush.interval.messages=null (请不要设置,默认也是注释掉的)
log.retention.bytes=1073741824
log.retention.hours=24
log.segment.bytes=104857600
num.partitions=12注意下面这些配置默认不存在,需要手动添加
shell
auto.create.topics.enable=false
# compression.type=producer
delete.topic.enable=true
message.max.bytes=131072
default.replication.factor=3
retention.bytes=1073741824
log.cleanup.policy=delete3、zookeeper域名映射
shell
$ sudo vi /etc/hosts
10.x.x.x zookeeper1.bewindoweb.com
10.x.x.x zookeeper2.bewindoweb.com
10.x.x.x zookeeper3.bewindoweb.com
$ sudo /etc/init.d/networking restart4、修改kafka启动java参数,开启jmx
shell
$ sudo vi /usr/local/kafka_2.12-2.2.1/bin/kafka-server-start.sh
第29行,堆分配为4G(因为AWS的m5.large有8G内存,充分利用)
export KAFKA_HEAP_OPTS="-Xmx4G -Xms4G"
然后在这个if之后增加JMX_PORT环境变量,端口采用熟悉的1099:
if
export KAFKA_HEAP_OPTS=……
fi
export JMX_PORT=1099
EXTRA……5、配置好PROMETHEUS监控
在JMXPORT之后加入prometheus代理相关代码。
shell
export JMXPORT=1099
export PROMETHEUS_PORT=9090
export PROMETHEUS_DIR=$(dirname ""$PWD")"/prometheus" # 添加
export PROMETHEUS_FILE="$PROMETHEUS_DIR/prometheus-kafka.yml" # 添加
export PROMETHEUS_JAR="$PROMETHEUS_DIR/jmx_prometheus_javaagent-0.12.0.jar" # 添加
export KAFKA_OPTS="-javaagent:$PROMETHEUS_JAR=$PROMETHEUS_PORT:$PROMETHEUS_FILE" # 添加同样地,在kafka目录下创建prometheus文件夹,并下载jmx_prometheus_javaagent-0.12.0.jar、prometheus-kafka.yml
6、配置集群
制作镜像,复制3台,分别修改相应的hosts、config/server.properties的broker.id,并分别启动服务器,部署的时候注意要分多个可用区部署。
shell
// 前台查看日志
$ sudo /usr/local/kafka_2.12-2.2.1/bin/kafka-server-start.sh /usr/local/kafka_2.12-2.2.1/config/server.properties
// 后台运行
$ sudo /usr/local/kafka_2.12-2.2.1/bin/kafka-server-start.sh -daemon /usr/local/kafka_2.12-2.2.1/config/server.properties7、测试kafka
创建topic
shell
$ sudo /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --create --zookeeper zookeeper1.bewindoweb.com:2181 --replication-factor 3 --partitions 12 --topic test在任意一台机器上发消息
shell
$ ./kafka-console-producer.sh --broker-list 10.53.39.230:9092 --topic test在任意一台机器上连接任意broker消费消息
shell
$ ./kafka-console-consumer.sh --bootstrap-server 10.53.1.227:9092 --topic test --from-beginning去观察消费者是否接收到消息。
8、测试prometheus agent是否正常
shell
curl -s localhost:9090/metrics9、prometheus 机器参数监控
下载node_exporter-0.18.1.linux-amd64.tar.gz(2020.2.20刚出了1.0.0版本,毕竟是正式版本,也可以关注一下),放到服务器prometheus文件夹下,解压后执行:
shell
$ sudo nohup ./node exporter >/dev/null 2>&1 &三、kafka的特殊处理
我们后来测试宕机的时候,发现宕机成只剩1台之后出现了一个奇怪的现象:只能发布,不能消费。
1、原因
仔细分析了一下,kafka现在的新版本都把消费偏移保存在主题__consume_offset里面,而这个主题默认的副本数是1,也就是有机器宕机了,这个数据就丢失了。而已经存在的订阅者会去找这个offset进行消费,然而并不能找到对应的数据,因此消费失败。
2、解决方法
解决方法是动态增加__consume_offsets的副本因子。
(1)查看现在该主题的分区情况
shell
./kafka-topics.sh --zookeeper zookeeper1.bewindoweb.com:2181 --topic __consumer_offsets --describe(2)根据具体情况,编写想要调整的预期结果文件
示例:
json
{
"version": 1,
"partitions": [
{
"topic": "__consumer_offsets",
"partition": 0, # 一般从0~49,共50个分区
"replicas": [
2, # brokerId,这里我们有3台broker,因此是1,2,3,顺序注意轮换
1,
3
]
},
{
"topic": "__consumer_offsets",
"partition": 1,
"replicas": [
1,
3,
2
]
},
{
"topic": "__consumer_offsets",
"partition": 2,
"replicas": [
3,
2,
1
]
},
……完整的文件:replicas.json(提取码:sv24)
(3)将json放入指定文件夹,执行重分区
shell
./kafka-reassign-partitions.sh --zookeeper zookeeper1.bewindoweb.com:2181 --reassignment-json-file ../script/replicas.json --execute(4)查看执行结果有没有成功
shell
./kafka-reassign-partitions.sh --zookeeper zookeeper1.bewindoweb.com:2181 --reassignment-json-file ../script/replicas.json --verify(5)查看新的分区情况
shell
./kafka-topics.sh --zookeeper zookeeper1.bewindoweb.com:2181 --topic __consumer_offsets --describe这个时候就会在3台机器都有副本了,即使宕机2台只剩1台,也能够正常运行。
参考资料:
附录、常见操作
添加主题,副本因子3,分区数12
shell
$ sudo /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --create --zookeeper zookeeper1.bewindoweb.com:2181 --replication-factor 3 --partitions 12 --topic YOUR_KAFKA_TOPIC查看当前的所有主题
shell
$ sudo /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --zookeeper zookeeper1.bewindoweb.com:2181


粤公网安备44030602007943号