文章目录

一、搭建zookeeper集群

1、下载镜像

$ 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.5

2、修改配置文件

创建配置文件:

$ cd /usr/local/apache-zookeeper-3.5.5/conf
$ sudo vi zookeeper.cfg

填入配置:

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.dynamic

3、创建动态修改配置文件

$ 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;2181

4、本地创建域名映射

$ 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 restart

5、创建myid文件

$ sudo mkdir -p /data/zookeeper/data
$ sudo vi /data/zookeeper/data/myid
$ 三台机器分别写入1,2,3……

6、在zkServer.sh第44行添加JMX配置

端口采用熟悉的1099

……
then
    JMXLOCALONLY=false
fi

JMXPORT=1099 ## 添加在此处第 44 行

if [ "x$JMXDISABLE" = "x" ] || [ "$JMXDISABLE" = 'false' ]
then

7、配置好PROMETHEUS监控

在zkServer.sh的JMXPORT之后加入prometheus代理相关代码,强行绑定到JVMFLAGS参数上,因为启动的逻辑较为复杂,所以直接通过JVMFLAGS间接地把参数传递到启动命令上。

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.jarprometheus-zookeeper.yml

8、部署集群

把当前的操作系统制作为镜像,例如AWS可以制作AMI,阿里云可以制作副本镜像,复制成3台,分别修改相应的hosts、myid,并分别启动服务器。部署的时候注意要分多个可用区部署,避免一个机房挂掉整个集群就挂掉了。

// 可以通过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.cfg

9、测试prometheus agent是否正常

curl -s localhost:9090/metrics

10、prometheus 机器参数监控

除了要监控zookeeper程序的运行参数,操作系统的参数也非常重要,例如CPU、内存、磁盘。我们之前就出现过性能测试时,磁盘打满导致所有业务全崩的情况…

下载node_exporter-0.18.1.linux-amd64.tar.gz(2020.2.20刚出了1.0.0版本,毕竟是正式版本,也可以关注一下),放到服务器prometheus文件夹下,解压后执行:

$ sudo nohup ./node exporter >/dev/null 2>&1 &

二、kafka集群搭建

1、下载镜像

$ 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.1

2、修改配置文件

服务器配置:

$ 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

注意下面这些配置默认不存在,需要手动添加

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=delete

3、zookeeper域名映射

$ 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 restart

4、修改kafka启动java参数,开启jmx

$ 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代理相关代码。

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.jarprometheus-kafka.yml

6、配置集群

制作镜像,复制3台,分别修改相应的hosts、config/server.properties的broker.id,并分别启动服务器,部署的时候注意要分多个可用区部署。

// 前台查看日志
$ 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.properties

7、测试kafka

创建topic

$ 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

在任意一台机器上发消息

$ ./kafka-console-producer.sh --broker-list 10.53.39.230:9092 --topic test

在任意一台机器上连接任意broker消费消息

$ ./kafka-console-consumer.sh --bootstrap-server 10.53.1.227:9092 --topic test --from-beginning

去观察消费者是否接收到消息。

8、测试prometheus agent是否正常

curl -s localhost:9090/metrics

9、prometheus 机器参数监控

下载node_exporter-0.18.1.linux-amd64.tar.gz(2020.2.20刚出了1.0.0版本,毕竟是正式版本,也可以关注一下),放到服务器prometheus文件夹下,解压后执行:

$ sudo nohup ./node exporter >/dev/null 2>&1 &

三、kafka的特殊处理

我们后来测试宕机的时候,发现宕机成只剩1台之后出现了一个奇怪的现象:只能发布,不能消费。

1、原因

仔细分析了一下,kafka现在的新版本都把消费偏移保存在主题__consume_offset里面,而这个主题默认的副本数是1,也就是有机器宕机了,这个数据就丢失了。而已经存在的订阅者会去找这个offset进行消费,然而并不能找到对应的数据,因此消费失败。

2、解决方法

解决方法是动态增加__consume_offsets的副本因子。

(1)查看现在该主题的分区情况

./kafka-topics.sh --zookeeper zookeeper1.bewindoweb.com:2181 --topic __consumer_offsets --describe

(2)根据具体情况,编写想要调整的预期结果文件

示例:

{
    "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放入指定文件夹,执行重分区

./kafka-reassign-partitions.sh --zookeeper zookeeper1.bewindoweb.com:2181 --reassignment-json-file ../script/replicas.json --execute

(4)查看执行结果有没有成功

./kafka-reassign-partitions.sh --zookeeper zookeeper1.bewindoweb.com:2181 --reassignment-json-file ../script/replicas.json --verify

(5)查看新的分区情况

./kafka-topics.sh --zookeeper zookeeper1.bewindoweb.com:2181 --topic __consumer_offsets --describe

这个时候就会在3台机器都有副本了,即使宕机2台只剩1台,也能够正常运行。

参考资料:

附录、常见操作

添加主题,副本因子3,分区数12

$ 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

 查看当前的所有主题 

$ sudo /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --zookeeper zookeeper1.bewindoweb.com:2181


转载请注明出处http://www.bewindoweb.com/288.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠