задний план
Поскольку текущий реестр использования основного продукта компанииconsul
,consul
Для обеспечения высокой доступности требуется кластеризация.Традиционный метод (Nginx/HAProxy) будет иметь проблему с единой точкой отказа.Чтобы решить эту проблему, я начал изучать, как полагаться только наconsul
Способ сделать регистрацию кластера, после дня метания, наконец-то проверил, что может пройтиКластерная версия ConsulClientПри регистрации кластера я также столкнулся с некоторыми проблемами в процессе развертывания и внедрения.Настоящим я записываю и делюсь этим, надеясь помочь нуждающимся студентам.
Сравнение кластера кластеров версии хоста и докера
Развертывание кластера в режиме переадресации клиент+сервер включает два варианта: первый — прямое развертывание в режиме хоста, второй — два.client
+3server
, каждыйconsul
Инстанс развертывает хост (подходит для местных тиранов).Преимущества этого режима - простое насилие и относительно простая эксплуатация и обслуживание. Схема развертывания архитектуры этого режима выглядит следующим образом:
Выбираем другой экономичный режим,docker
Преимущество в экономии ресурсов, а недостаток в управлении многимиdocker
Зеркало, до внедрения платформ управления контейнерами, таких как k8s, последующая деятельностьdocker
Эксплуатация и обслуживание этого режима будет более хлопотным.Схема развертывания архитектуры этого режима выглядит следующим образом:
Из архитектурных диаграмм двух вышеупомянутых режимов мы можем ясно понять, что режим развертывания хоста является наиболее простым и прямым, иdocker
Хотя модель экономит ресурсы, она увеличивает сложность и усложняет эксплуатацию и техническое обслуживание. Однако этот режим должен быть хорошим выбором в текущей контейнерной среде. Причина очень проста. Поскольку ресурсы используются полностью, эксплуатация и обслуживание контейнера могут быть выполнены платформой эксплуатации и обслуживания контейнера, такой как k8s. Давайте попрактикуемся в контейнеризацииconsul
Развертывание кластера.
Подготовка окружающей среды
Здесь подготовлены два виртуальных хоста, поскольку они виртуальные хосты, внешний IP-адрес одинаковый, поэтому мы различаем их по порту.
主机A:192.168.23.222:10385 内网ip:192.168.236.3
主机B:192.168.23.222:10585 内网ip:192.168.236.5
Конфигурация развертывания
Шаг 1. Установите среду Docker на хост(Возьмите Centos в качестве примера)
yum install docker
Шаг 2. Извлеките образ Consul для развертывания.
docker pull consul
Шаг 3. Назначьте IP-сегмент хосту Docker, чтобы предотвратить дублирование нескольких IP-адресов хоста.
- Изменить на хосте А
docker
из/etc/docker/daemon.json
файл, добавьте следующее
"bip": "172.17.1.252/24"
- Редактировать на хосте B
docker
из/etc/docker/daemon.json
файл, добавьте следующее
"bip": "172.17.2.252/24"
Конфигурация здесь для хостаdocker
Экземпляр назначает IP, потому что последующиеdocker
Будет выполнена межхостовая регистрация, если она зарегистрирована по умолчанию,docker
Это внутренняя сеть используемого хоста, которая вызывает повторение IP-адреса, поэтому здесь выполняется ручное распределение IP-адресов.Конечно, вы можете настроить приведенную выше конфигурацию IP-адресов.
Шаг 4: Разверните Consul на хосте A
Node1:
docker run -d --name=node_31 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 11300:8300 \
-p 11301:8301 \
-p 11301:8301/udp \
-p 11302:8302/udp \
-p 11302:8302 \
-p 11400:8400 \
-p 11500:8500 \
-p 11600:8600 \
consul agent -server -join=172.17.1.1 -bootstrap-expect=3 -node=node31 \
-data-dir=/consul/data/ -client 0.0.0.0 -ui
Здесь выделены несколько параметров:
--name
:Даdocker
Имя контейнера, которое отличается для каждого экземпляра контейнера.
-node
:Даconsul
Название узла, которое отличается для каждого узла
-bootstrap-expect
: количество узлов, которые должны запустить кластер, здесь значение равно 3.
-data-dir
:Даconsul
Каталог центра обработки данных должен быть указан сconsul
Разрешения на чтение и запись, иначе запуск сообщит об ошибке.
После успешного запуска выполните команду для просмотраconsul
узел.
docker exec -t node_31 consul members
Результат выглядит следующим образом:
Node Address Status Type Build Protocol DC Segment
node31 172.17.1.1:8301 alive server 1.6.2 2 dc1 <all>
Это указывает на то, что первый узел запускается нормально, а затем остальные узлы хоста A запускаются нормально.
Node2:
docker run -d --name=node_32 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 9300:8300 \
-p 9301:8301 \
-p 9301:8301/udp \
-p 9302:8302/udp \
-p 9302:8302 \
-p 9400:8400 \
-p 9500:8500 \
-p 9600:8600 \
consul agent -server -join=172.17.1.1 -bootstrap-expect=3 -node=node32 \
-data-dir=/consul/data/ -client 0.0.0.0 -ui
Node3:
docker run -d --name=node_33 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 10300:8300 \
-p 10301:8301 \
-p 10301:8301/udp \
-p 10302:8302/udp \
-p 10302:8302 \
-p 10400:8400 \
-p 10500:8500 \
-p 10600:8600 \
consul agent -server -join=172.17.1.1 -bootstrap-expect=3 -node=node33 \
-data-dir=/consul/data/ -client 0.0.0.0 -ui
После запуска трех узлов выполните команду для проверки состояния узлов:
docker exec -t node_31 consul operator raft list-peers
Результат выглядит следующим образом:
Node ID Address State Voter RaftProtocol
node32 ee186aef-5f8a-976b-2a33-b20bf79e7da9 172.17.1.2:8300 follower true 3
node33 d86b6b92-19e6-bb00-9437-f988b6dac4b2 172.17.1.3:8300 follower true 3
node31 0ab60093-bed5-be77-f551-6051da7fe790 172.17.1.1:8300 leader true 3
Здесь показано, что триserver
узлов завершили развертывание кластера и выбралиnode_31
в качестве главного узла. Наконец, разверните клиент в хост-кластере, и все готово.
Node4 (клиентский узел)
docker run -d --name=node_34 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302/udp \
-p 8302:8302 \
-p 8400:8400 \
-p 8500:8500 \
-p 8600:8600 \
consul agent -retry-join=172.17.1.1 \
-node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node34 -client 0.0.0.0 -ui
воплощать в жизньdocker exec -t node_31 consul members
команда, результат следующий:
Node Address Status Type Build Protocol DC Segment
node31 172.17.1.1:8301 alive server 1.6.2 2 dc1 <all>
node32 172.17.1.2:8301 alive server 1.6.2 2 dc1 <all>
node33 172.17.1.3:8301 alive server 1.6.2 2 dc1 <all>
node34 172.17.1.4:8301 alive client 1.6.2 2 dc1 <default>
Здесь хост Аconsul
Все узлы запущены, развертывание кластера завершено, можно сказать, что это однохостовая версия.consul
кластер, то следующее, что нам нужно сделать, это поместить хост Bconsul
Его можно добавить в кластер хоста А.
Шаг 5: Разверните консуль на хосте B
Node5
docker run -d --name=node_51 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 11300:8300 \
-p 11301:8301 \
-p 11301:8301/udp \
-p 11302:8302/udp \
-p 11302:8302 \
-p 11400:8400 \
-p 11500:8500 \
-p 11600:8600 \
consul agent -server -join=172.17.1.1 -bootstrap-expect=3 -node=node_51 \
-data-dir=/consul/data/ -client 0.0.0.0 -ui
Node6
docker run -d --name=node_52 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 9300:8300 \
-p 9301:8301 \
-p 9301:8301/udp \
-p 9302:8302/udp \
-p 9302:8302 \
-p 9400:8400 \
-p 9500:8500 \
-p 9600:8600 \
consul agent -server -join=172.17.1.1 -bootstrap-expect=3 -node=node_52 \
-data-dir=/consul/data/ -client 0.0.0.0 -ui
Node7
docker run -d --name=node_53 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 10300:8300 \
-p 10301:8301 \
-p 10301:8301/udp \
-p 10302:8302/udp \
-p 10302:8302 \
-p 10400:8400 \
-p 10500:8500 \
-p 10600:8600 \
consul agent -server -join=172.17.1.1 -bootstrap-expect=3 -node=node_53 \
-data-dir=/consul/data/ -client 0.0.0.0 -ui
После развертывания трех серверных узлов хоста B выполняем командуdocker exec -t node_51 consul members
Проверьте состояние узла кластера
Node Address Status Type Build Protocol DC Segment
node_51 172.17.2.1:8301 alive server 1.6.2 2 dc1 <all>
почему толькоnode_51
А как насчет этого единственного узла? Проблема в узле? Мы запрашиваем тот же запрос на хосте B, и результаты следующие:
node31 172.17.1.1:8301 alive server 1.6.2 2 dc1 <all>
node32 172.17.1.2:8301 alive server 1.6.2 2 dc1 <all>
node33 172.17.1.3:8301 alive server 1.6.2 2 dc1 <all>
node34 172.17.1.4:8301 alive client 1.6.2 2 dc1 <default>
Узлы хоста А имеют только узлы своих машин, а все узлы хоста Б не зарегистрированы.Почему так? Причина в том,consul
Связанный IP-адрес — это IP-адрес интрасети контейнера, внутренняя связь хоста возможна, но связь между хостами не может передаваться через адрес интрасети, так как мы это делаем? Мы можем перенаправить его с помощью правил маршрутизации и перенаправить адрес внутренней сети запроса хоста A в контейнер хоста B на хост B. Здесь мы начинаем назначать ip контейнеру.
Выполняем следующую команду на хосте A:
route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.236.5
Эта команда означает, добавить правило маршрутизации172.17.2.1~172.17.2.254
Диапазон IP-запросов, все перенаправлены на192.168.236.5
По адресу это наш хост Б.
Точно так же хост B также выполняет следующие команды:
route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.236.3
После завершения добавления выполнитеdocker exec -t node_53 consul members
Заказ:
Node Address Status Type Build Protocol DC Segment
node31 172.17.1.1:8301 alive server 1.6.2 2 dc1 <all>
node32 172.17.1.2:8301 alive server 1.6.2 2 dc1 <all>
node33 172.17.1.3:8301 alive server 1.6.2 2 dc1 <all>
node_51 172.17.2.1:8301 alive server 1.6.2 2 dc1 <all>
node_52 172.17.2.2:8301 alive server 1.6.2 2 dc1 <all>
node_53 172.17.2.3:8301 alive server 1.6.2 2 dc1 <all>
node34 172.17.1.4:8301 alive client 1.6.2 2 dc1 <default>
Присоединение к кластеру выполнено успешно, что завершает объединение контейнера Docker между хостами.
Наконец, разверните один на хосте B.client
Node8 (клиентский узел)
docker run -d --name=node_54 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302/udp \
-p 8302:8302 \
-p 8400:8400 \
-p 8500:8500 \
-p 8600:8600 \
consul agent -retry-join=172.17.1.1 \
-node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node54 -client 0.0.0.0 -ui
Все последние узлы кластера успешно добавлены, и результаты следующие:
node31 172.17.1.1:8301 alive server 1.6.2 2 dc1 <all>
node32 172.17.1.2:8301 alive server 1.6.2 2 dc1 <all>
node33 172.17.1.3:8301 alive server 1.6.2 2 dc1 <all>
node_51 172.17.2.1:8301 alive server 1.6.2 2 dc1 <all>
node_52 172.17.2.2:8301 alive server 1.6.2 2 dc1 <all>
node_53 172.17.2.3:8301 alive server 1.6.2 2 dc1 <all>
node34 172.17.1.4:8301 alive client 1.6.2 2 dc1 <default>
node54 172.17.2.4:8301 alive client 1.6.2 2 dc1 <default>
Выполнить команду состояния узлаdocker exec -t node_31 consul operator raft list-peers
:
node32 ee186aef-5f8a-976b-2a33-b20bf79e7da9 172.17.1.2:8300 follower true 3
node33 d86b6b92-19e6-bb00-9437-f988b6dac4b2 172.17.1.3:8300 follower true 3
node31 0ab60093-bed5-be77-f551-6051da7fe790 172.17.1.1:8300 leader true 3
node_51 cfac3b67-fb47-8726-fa31-158516467792 172.17.2.1:8300 follower true 3
node_53 31679abe-923f-0eb7-9709-1ed09980ca9d 172.17.2.3:8300 follower true 3
node_52 207eeb6d-57f2-c65f-0be6-079c402f6afe 172.17.2.2:8300 follower true 3
Такой содержит 6server
+2client
изconsul
Контейнерный кластер развернут, давайте проверимconsul
изweb
Панель выглядит следующим образом:
Интеграция приложений
версия кластераconsul
Мы готовы к развертыванию, так как же нам интегрироваться с приложением? Нам нужно только интегрировать кластерную версиюconsul
Просто зарегистрируйте клиент.
Сначала добавьте зависимости
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>spring-cloud-starter-consul-cluster</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
Второй шагbootstrap.yml|properties
указано вspring.cloud.consul.host
для нескольких узлов следующим образом:
spring.cloud.consul.host=192.168.23.222:10385,192.168.23.222:10585
Если вы хотите вывести соответствующие журналы регистрации, вы также можете добавить конфигурацию журнала в logback.
<logger name="org.springframework.cloud.consul" level="TRACE"/>
Таким образом, после завершения настройки и успешного запуска мы видим, что регистрация нашего приложения прошла успешно.На следующем рисунке показан результат успешной регистрации, которую я протестировал:
Здесь показано, что мои узлы приложений зарегистрированы на 2 кластера соответственно.client
выше, черезclient
Прокси перенаправляет запрос работоспособномуserver
, тем самым понимаяconsul
высокая доступность.
Суммировать
В этой статье не изучается какая-либо техническая галантерея, это чисто обмен опытом работы, в основном оconsul
Способ развертывания кластера, традиционный режим может бытьHAProxy
Для завершения развёртывания кластера, но недостатки этого способа очевидны, виртуальный ip всё равно может указывать на неисправную ноду, поэтому используемconsul
изclient
+server
режим развертывания кластера черезdocker
Он полностью использует ресурсы компьютера, и для обеспечения высокой доступности кластера требуется всего 2 компьютера.