Docker создает кластер Zookeeper&Kafka

Docker

Совет переднего ряда: последние новостиdocker-compole.ymlПожалуйста, перейдите на github, чтобы получить его,READMEЕсть соответствующие шаги операции.Адрес на гитхабе:GitHub.com/JA Case l IU/…

недавно учусьKafka, При подготовке к тестированию состояния кластера слишком хлопотно открывать три виртуальные машины или открывать три разных номера портов в одной виртуальной машине (ну... в основном лень).

Подготовка окружающей среды

Компьютер с доступом в Интернет и виртуальная машина CentOS7

Зачем использовать виртуальную машину? Из-за используемого ноутбука IP-адрес будет меняться каждый раз, когда вы подключаетесь к сети, и вы должны постоянно изменять файл конфигурации, что слишком громоздко и неудобно для тестирования. (Этой проблемы можно избежать через виртуальную сеть Docker, которую не разбирали в ходе эксперимента)

Установка докера

Пропустите этот шаг, если Docker уже установлен

  1. Docker поддерживает следующие версии CentOS:
  2. CentOS 7 (64-разрядная версия): требуется, чтобы система была 64-разрядной, а версия ядра системы была 3.10 или более поздней.
  3. CentOS 6.5 (64-разрядная версия) или более поздняя версия: требуется 64-разрядная система и версия ядра системы 2.6.32-431 или более поздняя.
  4. CentOS поддерживает Docker только в ядре в релизной версии.

ням установить

Для Docker требуется система CentOS с версией ядра выше 3.10. Проверьте указанные выше предварительные условия, чтобы убедиться, что ваша версия CentOS поддерживает Docker.

# 查看内核版本
$ uname -a
#安装 Docker
$ yum -y install docker
#启动 Docker 后台服务
$ service docker start
# 由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
$ docker run hello-world

Установка скрипта

  1. Войдите в Centos с правами sudo или root.
  2. Убедитесь, что пакет yum обновлен до последней версии.
$ sudo yum update
  1. Получите и выполните сценарий установки Docker.
$ curl -fsSL https://get.docker.com -o get-docker.sh
# 执行这个脚本会添加 docker.repo 源并安装 Docker。
$ sudo sh get-docker.sh

запустить докер

$ sudo systemctl start docker
# 验证 docker 是否安装成功并在容器中执行一个测试的镜像。
$ sudo docker run hello-world
$ docker ps

Зеркальное ускорение

Когда я начал настраивать источник домашнего зеркала, я отказался, но после его использования я обнаружил, что скорость загрузкиduang~поднялся сразу. Поэтому настоятельно рекомендуется настраивать отечественные зеркальные источники. открыть/создать/etc/docker/daemon.jsonфайл, добавьте следующее:

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

Строительство кластера Zookeeper

Зеркало смотрителя зоопарка: смотритель зоопарка: 3.4

Подготовка зеркала

$ docker pull zookeeper:3.4

Найти зеркала можно наhub.docker.com/docker pull images:TAG // расшифровывается как pullTAGверсияimageзеркало

Создайте автономный контейнер Zookeeper

Сначала мы создаем автономный модуль самым простым способом.Zookeeperузел, а затем мы создаем другие узлы на основе этого примера.

$ docker run --name zookeeper -p 2181:2181 -d zookeeper:3.4

По умолчанию файл конфигурации в контейнере находится в,/conf/zoo.cfg, каталоги данных и журналов по умолчанию/dataа также/datalog, при необходимости вы можете сопоставить указанный выше каталог с хостом.Описание параметра

  1. --name: указать имя контейнера
  2. -p: назначить номер порта порту, предоставленному контейнером
  3. -d: запустить контейнер в фоновом режиме и вывести идентификатор контейнера

Кластерная конструкция

других узловZookeeperМетод создания контейнера аналогичен созданию самостоятельного контейнера, но необходимо указать узлы отдельно.idИ измените многоузловую конфигурацию в файле, соответствующая команда создания выглядит следующим образом:

Создайте новую сеть докеров

$ docker network create zoo_kafka
$ docker network ls

Контейнер Zookeeper 1

$ docker run -d \
     --restart=always \
     -v /opt/docker/zookeeper/zoo1/data:/data \
     -v /opt/docker/zookeeper/zoo1/datalog:/datalog \
     -e ZOO_MY_ID=1 \
     -p 2181:2181 \
     -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
     --name=zoo1 \
     --net=viemall-zookeeper \
     --privileged \
     zookeeper:3.4

Зоопарк контейнер 2

$ docker run -d \
     --restart=always \
     -v /opt/docker/zookeeper/zoo2/data:/data \
     -v /opt/docker/zookeeper/zoo2/datalog:/datalog \
     -e ZOO_MY_ID=2 \
     -p 2182:2181 \
     -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
     --name=zoo2 \
     --net=viemall-zookeeper \
     --privileged \
     zookeeper:3.4

Зоопарк контейнер 3

$ docker run -d \
     --restart=always \
     -v /opt/docker/zookeeper/zoo3/data:/data \
     -v /opt/docker/zookeeper/zoo3/datalog:/datalog \
     -e ZOO_MY_ID=3 \
     -p 2183:2181 \
     -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
     --name=zoo3 \
     --net=viemall-zookeeper \
     --privileged \
     zookeeper:3.4

Хотя этот метод также достигает того, чего мы хотим, шаги слишком громоздки, и его сложно поддерживать (поздняя стадия ленивого рака), поэтому мы используемdocker-composeспособ достижения.

docker-compose создает кластер zookeeper

Создайте новую сеть докеров

$ docker network create --driver bridge --subnet 172.23.0.0/25 --gateway 172.23.0.1  zoo_kafka
$ docker network ls

Напишите скрипт docker-compose.yml

Как использовать:

  1. Установитьdocker-compose
# 获取脚本
$ curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 赋予执行权限
$chmod +x /usr/local/bin/docker-compose
  1. Создать в любом каталогеdocker-compose.ymlфайл, скопируйте следующее
  2. Выполнение заказаdocker-compose up -d

сравнение команд

Заказ объяснять
docker-compose up запустить все контейнеры
docker-compose up -d Запустите и запустите все контейнеры в фоновом режиме
docker-compose up --no-recreate -d Не создавать заново остановленные контейнеры
docker-compose up -d test2 Запустите только контейнер test2
docker-compose stop стоп-контейнер
docker-compose start запустить контейнер
docker-compose down остановить и уничтожить контейнер

docker-compose.ymlссылка на скачивание:GitHub.com/JA Case l IU/… docker-compose.ymlПодробности

version: '2'
services:
  zoo1:
    image: zookeeper:3.4 # 镜像名称
    restart: always # 当发生错误时自动重启
    hostname: zoo1
    container_name: zoo1
    privileged: true
    ports: # 端口
      - 2181:2181
    volumes: # 挂载数据卷
      - ./zoo1/data:/data
      - ./zoo1/datalog:/datalog 
    environment:
      TZ: Asia/Shanghai
      ZOO_MY_ID: 1 # 节点ID
      ZOO_PORT: 2181 # zookeeper端口号
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper节点列表
    networks:
      default:
        ipv4_address: 172.23.0.11

  zoo2:
    image: zookeeper:3.4
    restart: always
    hostname: zoo2
    container_name: zoo2
    privileged: true
    ports:
      - 2182:2181
    volumes:
      - ./zoo2/data:/data
      - ./zoo2/datalog:/datalog
    environment:
      TZ: Asia/Shanghai
      ZOO_MY_ID: 2
      ZOO_PORT: 2181
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    networks:
      default:
        ipv4_address: 172.23.0.12

  zoo3:
    image: zookeeper:3.4
    restart: always
    hostname: zoo3
    container_name: zoo3
    privileged: true
    ports:
      - 2183:2181
    volumes:
      - ./zoo3/data:/data
      - ./zoo3/datalog:/datalog
    environment:
      TZ: Asia/Shanghai
      ZOO_MY_ID: 3
      ZOO_PORT: 2181
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    networks:
      default:
        ipv4_address: 172.23.0.13

networks:
  default:
    external:
      name: zoo_kafka

проверять

Из рисунка мы видим, что естьLeader,дваFlower, пока нашZookeeperКластер уже настроен

Zookeeper

Строительство кластера Kafka

С вышеуказанным основанием перейдите кKafkaС кластером все еще проблема? На самом деле это всего лишь несколько переменных с разными значениями.

В приведенном выше примере вам не нужно много работать, чтобы получить один узелKafka, используйте его напрямуюdocker-composeСпособ развертывания трех узлов фактически одинаков.Как упоминалось выше, на самом деле некоторые атрибуты отличаются.На данный момент нам не нужно создавать новую сеть Docker, а использовать предыдущую для ее построения напрямую.ZookeeperСети, созданной при кластеризации, достаточно!

Подготовка окружающей среды

Зеркало Кафки: wurstmeister/kafka Кафка-менеджер изображение: овцеубийца/кафка-менеджер

# 不指定版本默认拉取最新版本的镜像
docker pull wurstmeister/kafka
docker pull sheepkiller/kafka-manager

Напишите скрипт docker-compose.yml

Как использовать:

  1. Установитьdocker-compose
# 获取脚本
$ curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 赋予执行权限
$chmod +x /usr/local/bin/docker-compose
  1. Создать в любом каталогеdocker-compose.ymlфайл, скопируйте следующее
  2. Выполнение заказаdocker-compose up -d

сравнение команд

Заказ объяснять
docker-compose up запустить все контейнеры
docker-compose up -d Запустите и запустите все контейнеры в фоновом режиме
docker-compose up --no-recreate -d Не создавать заново остановленные контейнеры
docker-compose up -d test2 Запустите только контейнер test2
docker-compose stop стоп-контейнер
docker-compose start запустить контейнер
docker-compose down остановить и уничтожить контейнер

docker-compose.ymlссылка на скачивание:GitHub.com/JA Case l IU/… docker-compose.ymlподробности

version: '2'

services:
  broker1:
    image: wurstmeister/kafka
    restart: always
    hostname: broker1
    container_name: broker1
    privileged: true
    ports:
      - "9091:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_LISTENERS: PLAINTEXT://broker1:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker1:9092
      KAFKA_ADVERTISED_HOST_NAME: broker1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
      JMX_PORT: 9988
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./broker1:/kafka/kafka\-logs\-broker1
    external_links:
    - zoo1
    - zoo2
    - zoo3
    networks:
      default:
        ipv4_address: 172.23.0.14

  broker2:
    image: wurstmeister/kafka
    restart: always
    hostname: broker2
    container_name: broker2
    privileged: true
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_LISTENERS: PLAINTEXT://broker2:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker2:9092
      KAFKA_ADVERTISED_HOST_NAME: broker2
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
      JMX_PORT: 9988
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./broker2:/kafka/kafka\-logs\-broker2
    external_links:  # 连接本compose文件以外的container
    - zoo1
    - zoo2
    - zoo3
    networks:
      default:
        ipv4_address: 172.23.0.15

  broker3:
    image: wurstmeister/kafka
    restart: always
    hostname: broker3
    container_name: broker3
    privileged: true
    ports:
      - "9093:9092"
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_LISTENERS: PLAINTEXT://broker3:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker3:9092
      KAFKA_ADVERTISED_HOST_NAME: broker3
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
      JMX_PORT: 9988
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./broker3:/kafka/kafka\-logs\-broker3
    external_links:  # 连接本compose文件以外的container
    - zoo1
    - zoo2
    - zoo3
    networks:
      default:
        ipv4_address: 172.23.0.16

  kafka-manager:
    image: sheepkiller/kafka-manager:latest
    restart: always
    container_name: kafka-manager
    hostname: kafka-manager
    ports:
      - "9000:9000"
    links:            # 连接本compose文件创建的container
      - broker1
      - broker2
      - broker3
    external_links:   # 连接本compose文件以外的container
      - zoo1
      - zoo2
      - zoo3
    environment:
      ZK_HOSTS: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
      KAFKA_BROKERS: broker1:9092,broker2:9092,broker3:9092
      APPLICATION_SECRET: letmein
      KM_ARGS: -Djava.net.preferIPv4Stack=true
    networks:
      default:
        ipv4_address: 172.23.0.10

networks:
  default:
    external:   # 使用已创建的网络
      name: zoo_kafka

проверять

мы открытыkafka-manager, путь доступа, host ip: 9000;

Kafka-Manager
Если показано, заполнитеZookeeperАдрес кластера, рисуем его в самый низ и нажимаемsaveНажмите на кластер, который вы только что добавили, и вы увидите, что в кластере есть три узла.
Kafka-Cluster

Проблемы, возникающие при строительстве

  1. Смонтировать том данных, бесконечный перезапуск, просмотрlogПодсказка: chown: смена владельца '/var/lib/mysql/....': разрешение отклонено Решение:
    • Добавьте --привилегированный=true для запуска докера, чтобы добавить определенные разрешения для контейнера.
    • Временно отключить selinux: setenforce 0
    • Добавьте правило selinux для изменения текста безопасности монтируемого каталога.
  2. kafka-manager сообщает об ошибках, связанных с jmx, Решение:
    • Добавьте переменную среды JMX_PORT=port в каждый узел kafka.
    • Кроме того, было обнаружено, что он не может быть подключен, и это была проблема с сетевым подключением, поэтому каждый порт jmx был снова открыт, а затем для решения проблемы был выпущен брандмауэр.
    • KAFKA_ADVERTISED_HOST_NAMEЛучше всего установить IP-адрес хоста и код или инструменты, отличные от хоста для подключения, и следующие порты также должны быть установлены как открытые порты.
[error] k.m.j.KafkaJMX$ - Failed to connect to service:jmx:rmi:///jndi/rmi://9.11.8.48:-1/jmxrmi java.lang.IllegalArgumentException: requirement failed: No jmx port but jmx polling enabled!
  1. посмотреть в контейнереtopicВременами следующая ошибка (не только команда темы, похоже, все пойдет не так)
$ bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
# 以下是错误
Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 7203; nested exception is:
        java.net.BindException: Address already in use

Решение: добавить перед командойunset JMX_PORT;команда, приведенная выше команда преобразуется в:

$ unset JMX_PORT;bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1

Приложение: Общие инструкции Docker

# 查看所有镜像
docker images
# 查看所有运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 获取所有容器ip
$ docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
# 查看容器内部日志
$ docker logs -f <容器ID>
# 进入容器内部
$ docker exec -it <容器ID> /bin/basj
# 创建容器 -d代表后台启动
docker run --name <容器名称> -e <参数> -v <挂载数据卷> <容器ID>
# 重启容器
docker restart <容器ID>
# 关闭容器
docker stop <容器id>
# 运行容器
docker start <容器id>