中间件

183 阅读13分钟

CentOS7 下安装minio

软件下载

CentOS7 下安装nginx

软件下载-源码安装

nginx下载地址

软件安装

  1. 源码下载 nginx 的官网中提供三种类型版本 MainLine version --主线版本 Stable version -- 稳定版本 Legacy version -- 之前的稳固版本
  2. 官网图示 image.png
  3. 选择最新的Stable version 的pgp 进行下载
nginx-1.24.0.tar.gz
  1. 创建nginx的安装文件的存放目录
mkdir /opt/nginx_install/
  1. nginx目录授权
sudo chown user:user /opt/nginx_install/
  1. 上传安装文件 将下载的nginx 源文件上传到目录/opt/nginx_install/
  2. 解压缩安装文件
tar -zxvf nginx-1.24.0.tar.gz
  1. 给解压缩的文件授权
chmod 777 nginx-1.24.0

9.安装nginx-Building nginx from Sources 进入安装文件目录

./configure
  1. command configure 执行完毕后执行make命令
make
  1. commad make 执行完毕后执行命令make install命令
sudo -s make install
  1. 安装完成后,nginx会被默认设置在目录/usr/local/nginx 同时nginx的默认端口为80.

image.png 在linux中端口号为1024及其以上可以使用普通用户启动 13. 修改默认的端口号808080 14. 启动nginx 并验证是否安装成功

# 启动
sudo /usr/local/nginx/sbin/nginx

# 使用curl 指令访问nginx 服务器,页面显示nginx的欢迎页 
curl http://127.0.0.1:8080

MAC 上离线安装nginx

软件下载

nginx 下载地址

安装

  1. 解压文件
  tar -zxvf nginx-xxx.tar.gz
  1. 进入解压目录
  cd nginx-1.19.3
  1. 执行下述命令
   ./configure make
   sudo make install
  1. 启动
   sudo /usr/local/nginx/sbin/nginx

  1. 验证启动是否成功
   [Welcome to nginx!](http://127.0.0.1/)
  1. 停止
   sudo /usr/local/nginx/sbin/nginx -s stop

nginx的应用

nginx 配置中的location 路径

  1. 绝对路径配置
 location /api/tenant/ {
    ......;
<p align=left>    
   # proxy_pass 的值以"/"结尾的场合,表示绝对路径。
   # 即就是location后的path完全替代于proxy_pass   
   
</p>
   proxy_pass http://xx.xxx.xxx.xxx:8080/api/tenant/;
 }

上述配置为当客户端请求为: nginx.domain.com/api/tenant/… 的场合

  1. 请求会被location path 为 /api/tenant/的配置

Windows下安装kafka

apache-zookeeper,kafka

首先安装zookeeper

  1. 解压缩zookeeper 安装文件
  2. 修改配置
    • 在解压目录下~/conf/zoo_sample.cfg
    • copy 文件zoo_sample.cfg 文件,并命名为zoo.cfg
    • 在zookeeper的安装目录下创建data目录
    • 设置zookeeper的数据目录 dataDir=D:\\queue\\apache-zookeeper\\data
    • 配置设定audit.enable=true
  3. 配置环境变量
    • 电脑-》属性-》高级属性-》环境变量
    • 创建ZOOKEEPER_HOME=D:\queue\apache-zookeeper
    • 配置PATH %ZOOKEEPER_HOME%\bin;

zookeeper安装中的问题

问题:
事象:zookeeper无法启动
原因:zookeeper的安装目录存在空格 解决方案: 重新确定其安装目录,排除空格

问题: 事象:zookeeper 启动后提示ZooKeeper audit is disabled
原因: Zookeeper的日志服务默认关闭
解决方案:在文件zoo.cfg文件中追加audit.enable=true

安装Kafka

  1. 解压缩文件kafka安装文件
  2. 修改配置
    • 在解压目录下~/config/zookeeper.properties
    • 配置dataDir=D:\\queue\\apache-zookeeper\\data

启动

  1. 启动zookeeper
cd D:\kafka
start bin\windows\zookeeper-server-start.bat config\zookeeper.properties
  1. 启动kafka
cd D:\kafka\bin\windows
kafka-server-start.bat ..\..\config\server.properties

Centos7下安装kafka

解压缩文件

  1. apache-zookeeper-3.8.4-bin.tar.gz
  2. kafka_2.13-3.7.0.tgz

配置设定

  1. zookeeper 的配置设定

    • zookeeper的conf目录下copy 文件zoo_sample.cfg 为 zoo.cfg
    • 配置信息【zoo.cfg】文件中追加内容
    # set audit
    audit.enable=true
    
  2. kafka 的配置设定

    • kafka的config 目录下的service.properties文件内容追加
      listeners=PLAINTEXT://10.238.221.114:9092
      advertised.listeners=PLAINTEXT://10.238.221.114:9092
    

3.依据kafka的config目录下的zookeeper.properties 中的内容创建目录

 dataDir=/tmp/zookeeper
  1. 安装后的脚本

    • zookeeper
    #!/bin/bash
    
     # Define the start and stop commands for Zookeeper
     START_COMMAND="/home/iaas/zookeeper/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start"
     STOP_COMMAND="/home/iaas/zookeeper/apache-zookeeper-3.8.4-bin/bin/zkServer.sh stop"
    
     # Function to start Zookeeper server
     start_zookeeper() {
       echo "Starting Zookeeper server..."
       # Call the start command
       $START_COMMAND /home/iaas/kafka/kafka_2.13-3.7.0/config/zookeeper.properties
     }
    
     # Function to stop Zookeeper server
     stop_zookeeper() {
         echo "Stopping Zookeeper server..."
         # Call the stop command
         $STOP_COMMAND
     }
    
     # Perform the corresponding action based on the provided parameter
     case "$1" in
         start)
             start_zookeeper
             ;;
         stop)
             stop_zookeeper
             ;;
         *)
             echo "Usage: $0 {start|stop}"
             exit 1
             ;;
     esac
    
     exit 0
    
    
    
    • 启动时,使用超级管理员启动
     sudo sh zookeeper.sh start
    
    • kafka
    #!/bin/bash
    
    # 定义 Kafka 的启动命令、停止命令和创建主题命令
    START_COMMAND="/home/iaas/kafka/kafka_2.13-3.7.0/bin/kafka-server-start.sh"
    STOP_COMMAND="/home/iaas/kafka/kafka_2.13-3.7.0/bin/kafka-server-stop.sh"
    CREATE_TOPIC_COMMAND="/home/iaas/kafka/kafka_2.13-3.7.0/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic"
    
    # 函数:启动 Kafka 服务器
    start_kafka() {
       echo "Starting Kafka server..."
       # 调用启动命令
        $START_COMMAND /home/iaas/kafka/kafka_2.13-3.7.0/config/server.properties &
    }
    
    # 函数:停止 Kafka 服务器
    stop_kafka() {
       echo "Stopping Kafka server..."
       # 调用停止命令
       $STOP_COMMAND
    }
    
    # 函数:创建主题
    create_topic() {
       local topic_name="$1"
       echo "Creating Kafka topic: $topic_name"
       # 调用创建主题的命令
       $CREATE_TOPIC_COMMAND "$topic_name"
    }
    
    # 根据传递的参数执行相应的操作
    case "$1" in
       start)
           start_kafka
           ;;
       stop)
           stop_kafka
           ;;
       create)
           if [ $# -ne 2 ]; then
               echo "Usage: $0 create <topic_name>"
               exit 1
           fi
           create_topic "$2"
           ;;
       *)
           echo "Usage: $0 {start|stop|create <topic_name>}"
           exit 1
           ;;
    esac
    
    exit 0
    
    • 创建主题的场合,其CREATE_TOPIC_COMMAND="/home/iaas/kafka/kafka_2.13-3.7.0/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic 中的localhost 一定要与kafka中的service.properties 设定的内容保存一致,否则会发生disconnection

启动,停止脚本

#!/bin/bash

# 定义 Kafka 和 Zookeeper 的启动命令、停止命令和创建主题命令
KAFKA_START_COMMAND="/home/iaas/kafka/kafka_2.13-3.7.0/bin/kafka-server-start.sh"
KAFKA_STOP_COMMAND="/home/iaas/kafka/kafka_2.13-3.7.0/bin/kafka-server-stop.sh"
ZOOKEEPER_START_COMMAND="/home/iaas/zookeeper/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start"
ZOOKEEPER_STOP_COMMAND="/home/iaas/zookeeper/apache-zookeeper-3.8.4-bin/bin/zkServer.sh stop"
CREATE_TOPIC_COMMAND="/home/iaas/kafka/kafka_2.13-3.7.0/bin/kafka-topics.sh --create --bootstrap-server  10.238.221.114:9092 --replication-factor 1 --partitions 1 --topic"

# 函数:启动 Kafka 服务器
start_kafka() {
    echo "Starting Kafka server..."
    # 调用启动命令
     $KAFKA_START_COMMAND /home/iaas/kafka/kafka_2.13-3.7.0/config/server.properties &
}

# 函数:停止 Kafka 服务器
stop_kafka() {
    echo "Stopping Kafka server..."
    # 调用停止命令
    $KAFKA_STOP_COMMAND
}

# 函数:启动 Zookeeper 服务器
start_zookeeper() {
    echo "Starting Zookeeper server..."
    # 调用 Zookeeper 启动命令
    nohup $ZOOKEEPER_START_COMMAND  /home/iaas/kafka/kafka_2.13-3.7.0/config/zookeeper.properties> /dev/null 2>&1 &
}

# 函数:停止 Zookeeper 服务器
stop_zookeeper() {
    echo "Stopping Zookeeper server..."
    # 调用 Zookeeper 停止命令
    $ZOOKEEPER_STOP_COMMAND
}

# 函数:创建主题
create_topic() {
    local topic_name="$1"
    echo "Creating Kafka topic: $topic_name"
    # 调用创建主题的命令
    $CREATE_TOPIC_COMMAND "$topic_name"
}

# 根据传递的参数执行相应的操作
case "$1" in
    start)
        start_zookeeper
        start_kafka
        ;;
    stop)
        stop_kafka
        stop_zookeeper
        ;;
    create)
        if [ $# -ne 2 ]; then
            echo "Usage: $0 create <topic_name>"
            exit 1
        fi
        create_topic "$2"
        ;;
    *)
        echo "Usage: $0 {start|stop|create <topic_name>}"
        exit 1
        ;;
esac

exit 0

kafka 基本概念以及常见的问题

简介:

分布式的发布订阅的消息系统。高吞吐量,性能优越,确保消息的顺序传输。支持离线以及实时的数据处理。同时支持水平拓展

消息队列的作用

  1. 削峰
  2. 解耦
  3. 异步
  4. 冗余存储
  5. 可恢复
  6. 消息的顺序性保障以及回溯性消费功能

核心架构

  1. 生产者
  2. 消费者
  3. zookeeper集群 kafka 2.8 版本之后无需zookeeper

生产者Producer将消息发送到Broker,Broker负责将收到的消息存储到磁盘中,而消费者Consumer负责从Broker中订阅消息

graph TD
Producer--> Broker
Broker-->Consumer

kafka 如何确保高可用

在kafka0.8之后提供了HA机制,集replica副本机制。每个partition上的数据都会同步到其他奇迹。构建对应的副本。所有的replica会选举一个leader,其作为生产者与消费者的直接交互组件。其他的副本作为leader的follower。写数据的场合,leader负责将数据同步到所有的follower上。数据读取的场合,只从leader上获取数据即可。kafka 负责将一个partition的所有replica分布到不同的机器上,提高其容错机制。在副本的机制上若某个broker宕机时且broker上存在某个分区上的leader的场合。分区会从其对应的副本的follower中重新选举一个leader.由新的leader继续提供读写服务。实现其高可用。

kafka 如何确保快速地读写消息

  1. 顺序读写:磁盘分为随机读写以及顺序读写。
  2. Page cache kafka 利用了系统本身的缓存机制
  3. 零拷贝,直接将数据从内核空间的读缓冲区直接拷贝到内核空间的socket缓冲区。避免在内核空间以及用户空间之间的穿梭
  4. 分区分段+索引 kafka的message是按照topic 进行分类存储的。topic 中又按照分区的方式分配到不同的broker上。每个分区相当于文件夹,二该分区的方式其就是按照segement分段存储的。从而每次操作时直接定位操作。同时为了进一步提高查询效率。kafka 默认创建了索引文件。
  5. 批量的读写。kafka 中数据的读写是批量操作的而不是单条。此方式可以有效避免频繁的网络传输带来的时间消耗。
  6. 批量压缩 kafka把所有的消息变更成一个个批量的文件,并进行合理的批量压缩。从而减少网络IO

Springboot 项目中kafka 的配置参数

配置参数-Consumer  Configs

1. group.id
   用来唯一标识consumer进程所在组的字符串,如果设置同样的group  id,表示这些processes都是属于同一个consumer  group
2. consumer.id
   不需要设置,一般自动产生。程序启动后会自动生成对应的consumer client id
3. socket.timeout.ms 
   默认值:30*100
   网络请求的超时限制。真实的超时限制是   max.fetch.wait+socket.timeout.ms
4. socket.receive.buffer.bytes
   默认值:64*1024
   socket用于接收网络请求的缓存大小
5. fetch.message.max.bytes
   默认值:1024*1024
   单次拉取请求中能够接收的最大消息字节数。它指定了消费者从 Kafka 服务器端拉取消息时所允许的最大数据量。
6. num.consumer.fetchers
   默认值:1 
   用于配置 Kafka 消费者并发拉取线程的数量。它指定了消费者在每个消费者线程中同时进行拉取消息的数量。
   为了提高消费者的吞吐量,可以增加消费者的并发拉取线程,每个线程处理多个分区的消息,从而实现并行拉取和处理。

7. auto.commit.enable
   默认值:true
   用于指定消费者是否启用自动提交偏移量(offset)的功能。
   当 auto.commit.enable 设置为 true 时,消费者将自动定期地提交偏移量到 Kafka 服务器。 
   自动提交是指消费者在消费消息后,会将当前的消费位置(偏移量)异步提交到 Kafka 服务器。Kafka 服务器会记录这个提交的偏移量,
   以便在消费者断开连接或重启后,可以继续从上一次提交的位置继续消费消息
8. auto.commit.interval.ms
   默认值:60*1000
   consumer向zookeeper提交offset的频率,单位是毫秒
9. queued.max.message.chunks
   默认值:2
   设置消费者在读取消息时允许的最大消息块数量
   该参数与fetch.message.max.bytes 相关联。当message过大时,会采取分块的方式进行传输。每个块的最大传输量为fetch.message.max.bytes
10. rebalance.max.retries
    默认值:4
    设置在消费者组发生再平衡时的最大重试次数。消费者组中的消费者数量发生变化时,Kafka 会重新分配分区给消费者,以保证每个分区都能被消费者组中的消费者进行处理。再平衡发生时,消费者需要重新分配分区并重新进行消费位置的定位。
11. fetch.min.bytes
    默认值:1
    每次fetch请求时,server应该返回的最小字节数。如果没有足够的数据返回,请求会等待,直到足够的数据才会返回。
12. fetch.wait.max.ms
    默认值:100
    如果没有足够的消息可供拉取,或者可拉取消息的总字节数尚未达到 fetch.min.bytes 的要求,消费者将等待一段时间以获取更多的消息。fetch.wait.max.ms 参数指定了消费者在等待新消息之前允许的最大时间
13. rebalance.backoff.ms
    默认值:2000
    参数指定了在进行再平衡重试之前的等待时间。如果再平衡失败,则消费者会在等待指定的时间后进行重试。
14. refresh.leader.backoff.ms
    默认值:200
    设置消费者在尝试刷新分区的领导者信息时的重试间隔。
    在 Kafka 中,每个分区都有一个领导者负责处理消息的读写。当消费者与分区的领导者发生连接错误或网络中断时,需要进行分区领导者信息的刷新,以获取最新的可用分区领导者。
    efresh.leader.backoff.ms 参数指定了消费者在尝试刷新分区领导者信息时的重试间隔。如果刷新失败,消费者会在等待指定的时间后进行重试。
15. auto.offset.reset
    默认值:latest
    设置当消费者在一个新的消费者组或者消费者在消费一个已经被删除的主题分区时的起始消费偏移量。
    当一个消费者加入消费者组或者一个分区的偏移量已经被删除(比如,由于数据过期或者主题分区被重新分配),消费者需要确定从哪个位置开始消费消息。auto.offset.reset 提供了以下选项:
    earliest:当消费者在一个新的消费者组中或者消费者在消费一个已经被删除的主题分区时,从最早的可用偏移量开始消费。
    latest:当消费者在一个新的消费者组中或者消费者在消费一个已经被删除的主题分区时,从最新的偏移量(即当前最新的消息)开始消费。
    none:如果消费者在消费一个已经被删除的主题分区时,抛出 NoOffsetForPartitionException 异常。
    需要注意的是,auto.offset.reset 设置仅在消费者加入一个新的消费者组时,即没有关于消费者组和分区偏移量的先前记录。
16. consumer.timeout.ms
    默认值:-1
    如果没有消息可用,即使等待特定的时间之后也没有,则抛出超时异常
    这个超时时间是指在消费者向 Kafka 服务器发送拉取请求后,等待服务器返回消息的最大时间间隔。
    在 Kafka 的早期版本(例如 0.10.x)中,consumer.timeout.ms 在消费者拉取消息时起作用,当超过指定的时间后,如果没有从 Kafka 服务器接收到消息,则会抛出 ConsumerTimeoutException 异常。然而,从 Kafka 0.11 版本开始,该属性已被弃用,并不再对消费者的拉取操作产生影响。
    从 Kafka 0.11 版本开始,消费者的拉取操作将通过 poll 方法来实现,该方法不再受 consumer.timeout.ms 的影响。取而代之,消费者可以使用 poll 方法的超时参数来控制等待时间,例如 consumer.poll(Duration.ofMillis(100))。
17. exclude.internal.topics
    默认值:false
    消费者是否应该从订阅的主题中排除内部主题。
    内部主题是由 Kafka 服务器在运行过程中使用的特定主题,用于存储元数据、消费者偏移量和其他内部信息。这些内部主题的名称通常以__开头。
    exclude.internal.topics 设置为 true,消费者将会排除内部主题并且只消费非内部主题的消息。这将具有以下影响:
    消费者只消费用户自定义的主题消息:内部主题中的消息将不会被消费者接收和处理。这可以确保消费者只关注业务相关的消息,而忽略了与 Kafka 服务器操作和管理有关的内部消息。
    减少不必要的消费压力:内部主题通常包含了 Kafka 服务器的元数据、消费者组和偏移量信息等。由于这些内部主题会频繁地产生数据,消费者消费这些消息可能会导致额外的消费压力。通过排除内部主题,可以减轻消费者的负载,集中处理业务相关的消息。
    提升消费者的性能和效率:由于排除了内部主题,消费者可以更快地处理和消费非内部主题的消息。消费者不再需要处理和过滤内部主题,而是专注于业务相关的消息,从而提高了消费者的性能和效率。
    需要注意的是,排除内部主题可能对一些特定场景造成影响。如果应用程序需要访问和处理内部主题的消息,例如监控或管理用例,那么将 exclude.internal.topics 设置为 true 可能会对应用程序的功能造成一定的限制。
    在这种情况下,应该将 exclude.internal.topics 设置为 false 或不设置,以便消费者可以接收和处理内部主题的消息。
    综上所述,将 exclude.internal.topics 设置为 true 可以让消费者只关注业务相关的主题消息,减少消费压力,提升性能和效率。但需要注意,在一些特定场景下可能需要访问和处理内部主题的消息。
18. paritition.assignment.strategy
     默认值:range
    partition.assignment.strategy是Kafka消费者组的配置属性之一,用于指定分区的分配策略。
    Kafka使用分区来实现消息的并行处理和负载均衡。当消费者组中有多个消费者时,分区分配策略决定了如何将主题的分区分配给消费者,以实现并行消费和公平负载。