ELK7.x版本+kafka容器化部署(多主机)

1、场景:三台主机,172.31.1.14 部署 logstash+kafka;172.31.1.15部署es节点1(数据节点)+kabana;172.31.1.30 部署es节点2(数据节点)+es节点3(非数据节点)
2、容器化方式:docker-compose 单机编排
3、坑点:1、容器之间需要打通网络,否则es集群无法建立;
2、配置文件外挂,经常调整的参数要写入配置文件,固定的配置可以写入docker-compose.yml的环境变量里,否认后期改动配置,需要重建容器影响比较大。
3、es集群至少3个节点,2个节点无法建立集群
4、索引分片提前规划好,7.x版本默认为1个
5、最好自己指定容器网络,否则默认网络会影响主机通信(有时候容器网络和主机网络同一个)
6、挂载目录及文件创建好需要添加权限,chmod 777 目录 -R
4、docker-compose.yml文件内容
4.1 logstash+kafka

version: '3.3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    restart: always
    #自定义网络
    networks:
      extnetwork:
        ipv4_address: 10.1.1.3 #指定IP
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    restart: always
    depends_on:
      - zookeeper
    #自定义网络
    networks:
      extnetwork:
        ipv4_address: 10.1.1.4 #指定IP
    extra_hosts:
      - "kafka:10.1.1.4"
      - "zookeeper:10.1.1.3"
    environment:
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
      - KAFKA_LISTENERS=PLAINTEXT://kafka:9092
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 9092:9092
  logstash:
    image: logstash:7.7.0
    container_name: elk_logstash
    restart: always
    depends_on:
      - kafka
    #自定义网络
    networks:
      extnetwork:
        ipv4_address: 10.1.1.5 #指定IP
    volumes:
      - /data/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
      - /data/elk/logstash/jvm.options:/usr/share/logstash/config/jvm.options
      - /data/elk/logstash/pipelines.yml:/usr/share/logstash/config/pipelines.yml
      - /data/elk/logstash/GeoLite2-City.mmdb:/usr/share/logstash/config/GeoLite2-City.mmdb
    extra_hosts:
      - "elasticsearch:172.31.1.15"
      - "kafka:10.1.1.4"
      - "zookeeper:10.1.1.3"
#指定网络配置
networks:
  extnetwork:
    ipam:
      config:
      - subnet: 10.1.1.0/24

4.2 es节点1(数据节点)+kabana

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.7.0  #镜像
    container_name: elk_elasticsearch #定义容器名称
    restart: always  #开机启动,失败也会一直重启
    #自定义网络
    networks:
      extnetwork:
        ipv4_address: 10.1.1.3 #指定IP
    environment:
      - "ES_JAVA_OPTS=-Xms10g -Xmx10g" #设置使用jvm内存大小
      - "node.name=node0"
      - "bootstrap.memory_lock=true"
    volumes:
      - /data/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - /data/elk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
      - /data/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /etc/localtime:/etc/localtime
    extra_hosts:
      - "node0:10.1.1.3"
      - "node1:10.1.2.30"
      - "node2:10.1.2.31"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"] # 设置检测程序
      interval: 5m # 设置检测间隔
      timeout: 10s # 设置检测超时时间
      retries: 3 # 设置重试次数
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: kibana:7.7.0
    container_name: elk_kibana
    restart: always
    #自定义网络
    networks:
      extnetwork:
        ipv4_address: 10.1.1.4 #指定IP
    extra_hosts:
      - "elasticsearch:172.31.1.15"
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址
    volumes:
      - /data/elk/kibana/kibana:.yml:/usr/share/kibana/config/kibana.yml
      - /etc/localtime:/etc/localtime
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5601"] # 设置检测程序
      interval: 5m # 设置检测间隔
      timeout: 10s # 设置检测超时时间
      retries: 3 # 设置重试次数
    ports:
      - 5601:5601


#指定网络配置
networks:
  extnetwork:
    ipam:
      config:
      - subnet: 10.1.1.0/24

4.3 部署es节点2(数据节点)+es节点3(非数据节点)

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.7.0  #镜像
    container_name: elk_elasticsearch_node1  #定义容器名称
    restart: always  #开机启动,失败也会一直重启
    networks:
      extnetwork:
        ipv4_address: 10.1.2.30 #指定IP
    environment:
      - "bootstrap.memory_lock=true"
      - "ES_JAVA_OPTS=-Xms8g -Xmx8g" #设置使用jvm内存大小
    volumes:
      - /data/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - /data/elk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
      - /data/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /etc/localtime:/etc/localtime
    extra_hosts:
      - "node1:10.1.2.30"
      - "node0:10.1.1.3"
      - "node2:10.1.2.31"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"] # 设置检测程序
      interval: 5m # 设置检测间隔
      timeout: 10s # 设置检测超时时间
      retries: 3 # 设置重试次数
    ports:
      - 9200:9200
      - 9300:9300
  elasticsearch_node2:
    image: elasticsearch:7.7.0  #镜像
    container_name: elk_elasticsearch_node2  #定义容器名称
    restart: always  #开机启动,失败也会一直重启
    networks:
      extnetwork:
        ipv4_address: 10.1.2.31 #指定IP
    environment:
      - "bootstrap.memory_lock=true"
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g" #设置使用jvm内存大小
    volumes:
      - /data/elk/elasticsearch/elasticsearch_slave.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /etc/localtime:/etc/localtime
    extra_hosts:
      - "node1:10.1.2.30"
      - "node0:10.1.1.3"
      - "node2:10.1.2.31"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"] # 设置检测程序
      interval: 5m # 设置检测间隔
      timeout: 10s # 设置检测超时时间
      retries: 3 # 设置重试次数
    ports:
      - 9201:9200
      - 9301:9300
networks:
  extnetwork:
    ipam:
      config:
      - subnet: 10.1.2.0/24

5、es容器所在主机打通网络,通过添加路由实现
172.31.1.15:
route add -net 10.1.2.0/24 gw 172.31.1.30
172.31.1.30:
route add -net 10.1.1.0/24 gw 172.31.1.15
6、验证es集群状态
curl http://172.31.1.30:9200/_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1638934652 03:37:32 elasticsearch green 3 2 130 92 0 0 0 0 - 100.0%

<think>嗯,用户想知道Ansible自动化部署中常用的中间件列表及其使用场景。首先,我需要回忆一下Ansible相关的知识。Ansible是一个自动化工具,主要用于配置管理、应用部署等。中间件的话,可能包括Web服务器、数据库、消息队列、缓存系统这些常见的组件。比如Nginx、Apache、MySQL、Redis、RabbitMQ之类的。 接下来,要确定哪些中间件在Ansible中被频繁使用。可能需要参考Ansible Galaxy或者常见的Playbook示例。比如,Nginx和Apache作为Web服务器,肯定是常用的。数据库方面,MySQL、PostgreSQL、MongoDB这些应该都有对应的角色。消息队列的话,RabbitMQ、Kafka,缓存系统如Redis、Memcached。还有应用服务器像Tomcat、Docker和Kubernetes这类容器化工具可能也算中间件的一部分? 然后,使用场景需要对应每个中间件。比如Nginx用于反向代理和负载均衡,Apache用于传统的Web服务。数据库的话,关系型和非关系型的应用场景不同。消息队列用于解耦系统组件,缓存系统提高性能。应用服务器如Tomcat运行Java应用,容器化技术用于微服务部署。 另外,还要考虑Ansible部署这些中间件的具体方法,比如使用官方提供的角色或者社区贡献的Playbook。可能需要提到Ansible Galaxy上的流行角色,比如geerlingguy的Nginx、MySQL角色,这些被广泛使用和验证过。 用户可能还希望知道如何开始使用这些中间件的部署,所以需要简要说明步骤,比如安装角色、编写Playbook、配置变量等。同时,注意事项方面,安全性、性能调优、高可用性这些也是关键点,比如部署MySQL时的安全加固,Redis的持久化配置等。 最后,生成相关问题时要考虑用户可能的后续疑问,比如如何编写特定中间件的Playbook,如何处理依赖关系,性能优化方法,或者如何结合其他工具如Docker使用Ansible。这样能帮助用户更深入地学习和应用。</think>### Ansible 自动化部署常用中间件及使用场景 Ansible 作为基础设施即代码(IaC)工具,广泛用于中间件的自动化部署与管理。以下是常用中间件及其典型应用场景: --- #### 1. **Web 服务器** - **Nginx** - **场景**:反向代理、负载均衡、静态资源托管 - **Ansible 部署示例**: ```yaml - name: 安装 Nginx ansible.builtin.apt: name: nginx state: present - name: 启动 Nginx 服务 ansible.builtin.service: name: nginx state: started ``` - **优化方向**:配置 TLS 加密、启用 HTTP/2[^1] - **Apache HTTP Server** - **场景**:传统 Web 服务、动态内容处理(如 PHP) - **Ansible 角色**:`geerlingguy.apache`(社区推荐角色) --- #### 2. **数据库** - **MySQL/MariaDB** - **场景**:关系型数据存储、事务处理 - **部署要点**:安全加固(如密码策略)、主从复制配置[^2] - **PostgreSQL** - **场景**:复杂查询、GIS 数据处理 - **Ansible 模块**:`community.postgresql` 提供用户/数据库管理 - **MongoDB** - **场景**:非结构化数据存储、高扩展性需求 - **部署难点**:分片集群自动化配置 --- #### 3. **消息队列** - **RabbitMQ** - **场景**:系统解耦、异步任务处理 - **Ansible 角色**:`ansible-role-rabbitmq`(支持集群部署) - **Kafka** - **场景**:高吞吐量日志处理、实时流数据管道 - **部署挑战**:ZooKeeper 依赖管理、分区策略优化 --- #### 4. **缓存系统** - **Redis** - **场景**:会话存储、热点数据缓存 - **关键配置**:持久化(RDB/AOF)、哨兵模式高可用 ```yaml - name: 安装 Redis ansible.builtin.apt: name: redis-server state: latest ``` - **Memcached** - **场景**:简单键值缓存、分布式内存对象缓存 --- #### 5. **应用服务器** - **Tomcat** - **场景**:Java Web 应用部署 - **Ansible 实践**:WAR 包部署、JVM 参数调优 - **Docker** - **场景**:容器化应用生命周期管理 - **模块**:`community.docker` 支持镜像/容器操作 - **Kubernetes** - **场景**:微服务编排、自动扩缩容 - **部署工具**:`kubespray`(基于 Ansible 的 K8s 部署方案) --- #### 6. **监控与日志** - **Elastic Stack (ELK)** - **场景**:日志聚合与分析(Filebeat + Logstash + Elasticsearch + Kibana) - **Prometheus** - **场景**:指标监控、告警规则管理 - **Ansible 集成**:通过 `node_exporter` 收集主机指标 --- ### 部署方法论 1. **使用 Ansible Galaxy 角色** 例如 `geerlingguy.redis` 提供 Redis 标准化部署模板。 2. **配置分离** 通过 `group_vars` 和 `host_vars` 管理中间件差异化配置。 3. **幂等性设计** 确保 Playbook 可重复执行(如使用 `state` 参数控制资源状态)。 --- ### 注意事项 - **安全性**:数据库默认密码需重置,服务端口需防火墙管控 - **性能调优**:根据硬件资源配置连接池、线程数等参数 - **高可用**:通过 Ansible 实现中间件集群的自动扩缩容 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值