前端监控项目环境搭建-Kafka

目录

[如何把 Docker 容器封装成镜像](#如何把 Docker 容器封装成镜像)

[Docker 部署 Kafka 集群(mac)](#Docker 部署 Kafka 集群(mac))

[Centos 容器启动 rsyslog 服务](#Centos 容器启动 rsyslog 服务)

[Rsyslog 转发日志至 Kafka](#Rsyslog 转发日志至 Kafka)

[node-rdkafka@2.18.0 使用文档](#node-rdkafka@2.18.0 使用文档)

[Librdkafka@2.3.0 国内仓库](#Librdkafka@2.3.0 国内仓库)


如何把 Docker 容器封装成镜像

背景:centos 容器中运行 nginx + rsyslog,另一容器运行 Kafka。centos 容器 rsyslog 无法向 Kafka 生产消息。

要将一个容器封装成一个镜像,你需要使用 Docker 提供的 docker commit 命令。这个命令会基于容器的当前状态创建一个新的镜像。

下面是使用 docker commit 命令的基本步骤:

  1. 首先,确保你有一个正在运行的容器。你可以通过运行 docker ps 来查看当前运行的容器。

  2. 使用 docker commit 命令创建镜像。命令的格式如下:

bash 复制代码
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

其中:

  • [OPTIONS] 是可选的,可以用来指定新镜像的说明等信息。

  • CONTAINER 是要提交的容器的ID或名称。

  • [REPOSITORY[:TAG]] 是新镜像的名称和可选的标签。如果不指定标签,默认标签是latest

例如,如果你有一个名为 my_container 的容器,你想将它封装成名为 my_image 的镜像,并且标签为 v1.0,你可以运行:

bash 复制代码
docker commit my_container my_image:v1.0
  1. 运行命令后,使用 docker images 命令可以查看新创建的镜像。

下面是一个简单的例子:

bash 复制代码
# 创建并运行一个容器
docker run -d --name my_container ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
 
# 提交容器到镜像
docker commit my_container my_image:v1.0
 
# 查看创建的镜像
docker images

执行上述步骤后,你就会有一个包含了特定输出的镜像 my_image:v1.0

Docker 部署 Kafka 集群(mac)

  1. 集群规划

|----------|--------------|---------------------------|----------|
| hostname | ip addr | port | listener |
| zook1 | 172.20.10.11 | 2183:2181 | |
| zook2 | 172.20.10.12 | 2184:2181 | |
| zook3 | 172.20.10.13 | 2185:2181 | |
| kafka1 | 172.20.10.14 | 内部 9093:9093,外部 9193:9193 | |
| kafka2 | 172.20.10.15 | 内部 9094:9094,外部 9194:9194 | |
| kafka3 | 172.20.10.16 | 内部 9095:9095,外部 9195:9195 | |

  1. 创建网络
bash 复制代码
# 配合命令:
docker network create --driver bridge --subnet 172.20.10.0/25 --gateway 172.20.10.1  zk_network

如何在 Docker 中管理和配置容器的网络_怎么修改容器的网络-CSDN博客

  1. 编写 docker 文件
bash 复制代码
# zk-docker-compose.yml

version: '3.4'

services:
  zook1:
    image: zookeeper:latest
    #restart: always #自动重新启动
    hostname: zook1
    container_name: zook1 #容器名称,方便在rancher中显示有意义的名称
    ports:
      - 2183:2181 #将本容器的zookeeper默认端口号映射出去
    volumes:
      # 挂载数据卷 前面是宿主机即本机的目录位置,后面是docker的目录
      - "./zook1/data:/data"
      - "./zook1/datalog:/datalog"
      - "./zook1/logs:/logs"
    environment:
      ZOO_MY_ID: 1 #即是zookeeper的节点值,也是kafka的brokerid值
      ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
    networks:
      zk_network:
        ipv4_address: 172.20.10.11

  zook2:
    image: zookeeper
    #restart: always #自动重新启动
    hostname: zook2
    container_name: zook2 #容器名称,方便在rancher中显示有意义的名称
    ports:
      - 2184:2181 #将本容器的zookeeper默认端口号映射出去
    volumes:
      - "./zook2/data:/data"
      - "./zook2/datalog:/datalog"
      - "./zook2/logs:/logs"
    environment:
      ZOO_MY_ID: 2 #即是zookeeper的节点值,也是kafka的brokerid值
      ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
    networks:
      zk_network:
        ipv4_address: 172.20.10.12

  zook3:
    image: zookeeper
    #restart: always #自动重新启动
    hostname: zook3
    container_name: zook3 #容器名称,方便在rancher中显示有意义的名称
    ports:
      - 2185:2181 #将本容器的zookeeper默认端口号映射出去
    volumes:
      - "./zook3/data:/data"
      - "./zook3/datalog:/datalog"
      - "./zook3/logs:/logs"
    environment:
      ZOO_MY_ID: 3 #即是zookeeper的节点值,也是kafka的brokerid值
      ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
    networks:
      zk_network:
        ipv4_address: 172.20.10.13
networks:
  zk_network:
    name: zk_network
    external: true
bash 复制代码
# kafka-docker-compose.yml

version: '2'

services:
  kafka1:
    image: wurstmeister/kafka
    restart: always #自动重新启动
    hostname: kafka1
    container_name: kafka1
    ports:
      - 9093:9093
      - 9193:9193
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_LISTENERS: INSIDE://:9093,OUTSIDE://:9193
      #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
      KAFKA_ADVERTISED_LISTENERS: INSIDE://172.20.10.14:9093,OUTSIDE://localhost:9193
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
      ALLOW_PLAINTEXT_LISTENER: 'yes'
      JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
    volumes:
      - ./kafka1/wurstmeister/kafka:/wurstmeister/kafka
      - ./kafka1/kafka:/kafka
    external_links:
      - zook1
      - zook2
      - zook3
    networks:
      zk_network:
        ipv4_address: 172.20.10.14

  kafka2:
    image: wurstmeister/kafka
    restart: always #自动重新启动
    hostname: kafka2
    container_name: kafka2
    ports:
      - 9094:9094
      - 9194:9194
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_LISTENERS: INSIDE://:9094,OUTSIDE://:9194
      #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
      KAFKA_ADVERTISED_LISTENERS: INSIDE://172.20.10.15:9094,OUTSIDE://localhost:9194
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
      ALLOW_PLAINTEXT_LISTENER: 'yes'
      JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
    volumes:
      - ./kafka2/wurstmeister/kafka:/wurstmeister/kafka
      - ./kafka2/kafka:/kafka
    external_links:
      - zook1
      - zook2
      - zook3
    networks:
      zk_network:
        ipv4_address: 172.20.10.15

  kafka3:
    image: wurstmeister/kafka
    restart: always #自动重新启动
    hostname: kafka3
    container_name: kafka3
    ports:
      - 9095:9095
      - 9195:9195
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_LISTENERS: INSIDE://:9095,OUTSIDE://:9195
      #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
      KAFKA_ADVERTISED_LISTENERS: INSIDE://172.20.10.16:9095,OUTSIDE://localhost:9195
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
      ALLOW_PLAINTEXT_LISTENER: 'yes'
      JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
    volumes:
      - ./kafka3/wurstmeister/kafka:/wurstmeister/kafka
      - ./kafka3/kafka:/kafka
    external_links:
      - zook1
      - zook2
      - zook3
    networks:
      zk_network:
        ipv4_address: 172.20.10.16
networks:
  zk_network:
    name: zk_network
    external: true
bash 复制代码
# kafka-manager-docker-compose.yml

version: '2'

services:
  kafka-manager:
    image: scjtqs/kafka-manager:latest
    restart: always
    hostname: kafka-manager
    container_name: kafka-manager
    ports:
      - 9000:9000
    external_links:
      # 连接本compose文件以外的container
      - zook1
      - zook2
      - zook3
      - kafka1
      - kafka2
      - kafka3
    environment:
      ZK_HOSTS: zook1:2181,zook2:2181,zook3:2181
      KAFKA_BROKERS: kafka1:9093,kafka2:9094,kafka3:9095
      APPLICATION_SECRET: letmein
      KM_ARGS: -Djava.net.preferIPv4Stack=true
    networks:
      zk_network:
        ipv4_address: 172.20.10.10
networks:
  zk_network:
    name: zk_network
    external: true
  1. 在文件目录下,依次启动docker 文件
bash 复制代码
docker compose -p zookeeper -f ./zk-docker-compose.yml up -d
bash 复制代码
docker compose -f ./kafka-docker-compose.yml up -d
bash 复制代码
docker compose -f ./kafka-manager-docker-compose.yml up -d
  1. 参考链接

docker 部署 kafka集群 【mac】_mac docker kafka-CSDN博客

https://www.cnblogs.com/jay763190097/p/10292227.html

Centos 容器启动 rsyslog 服务

  1. 参考链接

https://zhuanlan.zhihu.com/p/606856175?utm_id=0

Rsyslog 转发日志至 Kafka

  1. 参考链接

最佳实践:Rsyslog转发日志至kafka

日志收集之rsyslog to kafka_rsyslog template kafka-CSDN博客

rsyslog配置详解: https://www.cnblogs.com/jiyanfeng/p/17606513.html

  1. 安装 rsyslog && rsyslog-kafka
bash 复制代码
yum install rsyslog
yum install rsyslog-kafka

安装完成后,查看 /lib64/rysylog/ 中是否存在 omkafka.so,验证 rsyslog-kafka 是否安装成功。

  1. rsyslog 配置

编辑配置文件(路径 `/etc/rsyslog.conf` ),在配置项 `#### MODULES ####` 的下面添加如下配置(或者在 `/etc/rsyslogd/` 目录下添加 `XXX.conf` 配置文件)

bash 复制代码
# 加载 omkafka 和 imfile 模块
module(load="omkafka")
module(load="imfile")
 
# nginx template
template(name="nginxAccessTemplate" type="string" string="%hostname%<-+>%syslogtag%<-+>%msg%\n")
 
# ruleset
ruleset(name="nginx-kafka") {
    # 日志转发 kafka
    action (
        type="omkafka"
	    template="nginxAccessTemplate"
        topic="fee-test"
        broker="localhost:9092"
    )
}
 
# 定义消息来源及设置相关的 action
input(type="imfile" Tag="nginx-accesslog" File="/var/log/nginx/access.log" Ruleset="nginx-kafka")

配置简单说明:

* `localhost:9092` 需要修改为你自己的kafka地址(如果为集群多个地址逗号分隔)

* `/var/log/nginx/access.log` 是监控的nginx日志文件

* `topic: fee-test`后续通过 `kafka-manager` 创建

修改完配置后运行: `rsyslogd -N 1` 查看配置是否报错;`rsyslogd -dn` debug 模式运行。

然后重启 `rsyslog`:`service rsyslog restart` `systemctl restart rsyslog` 。重启后查看 `/var/log/message` 中日志是否报错。

  1. kafka 报错:InvalidReceiveException: Invalid receive (size = 1195725856 larger than 104857600)

将 $KAFKA_HOME/config/server.properties 文件中的 socket.request.max.bytes 值重置为超过数据包大小,然后重新启动 kafka 服务器。将 socket.request.max.bytes 翻倍。

  1. Kafka 配置文件位置

Kafka 配置文件 server.properties 的位置取决于Kafka安装的路径。通常情况下,当你从Apache 官方网站下载 Kafka 或通过工具如 wget curl 命令行工具下载时,配置文件会被放置在 Kafka 安装目录的 config 子目录下。

例如,如果你的 Kafka 安装在 /opt/kafka 目录,那么配置文件 server.properties 的完整路径就是 /opt/kafka/config/server.properties

如果你是通过某种包管理器(如 apt yum)安装的 Kafka,配置文件的位置可能会有所不同,但通常也会在 /etc/kafka /etc/kafka/conf 目录下。

要修改 Kafka 配置,你需要编辑 server.properties 文件,并根据你的需求进行相应的设置。例如,你可以修改 log.dirs 来指定日志文件存放的目录,或者修改 listeners 来指定Kafka 监听的地址和端口。

node-rdkafka@2.18.0 使用文档

  1. 参考链接

node-rdkafka - npm

  1. npm install node-rdkafka 时 node-gyp rebuild 卡住解决办法

node-gyp 需要 Python2.7 环境。

可以使用 npm install --loglevel verbose 查看安装时候的详细日志。

node-rdkafka install 时需要构建,通常会卡住。因为构建需要 node 源码来提供头文件,连接外网下载很慢。so 建议自己下载后放置在 /Users/xxx/Library/Caches/node-gyp/10.23.3 中。

node 区分 arm64 x86 x64 等版本。注意和宿主机的兼容。

bash 复制代码
├── include  
│       └── node  
└── installVersion
bash 复制代码
cat installVersion   
9 

npm install时node-gyp rebuild 卡住解决办法 - 杜神的技术博客 - ITeye博客

https://www.cnblogs.com/mliudong/p/4528539.html

Librdkafka@2.3.0 国内仓库

librdkafka: librdkafka 是 Apache Kafka 的 C/C++ 开发包,提供生产者、消费者和管理客户端 - Gitee.com

相关推荐
y先森2 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy2 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189112 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿3 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡4 小时前
commitlint校验git提交信息
前端
虾球xz5 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇5 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒5 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员5 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐5 小时前
前端图像处理(一)
前端