Статьи

Couchbase XDCR с использованием Docker Swarm, Machine and Compose

Cross Datacenter Replication (XDCR) в Couchbase обеспечивает простой способ репликации данных из одного кластера в другой. Кластеры обычно устанавливаются в географически разнородных центрах обработки данных. Это позволяет выполнять аварийное восстановление или приближать данные к пользователям для более быстрого доступа к данным.

Этот блог покажет:

  • Настройте два датацентра с помощью Docker Swarm
  • Запустите контейнеры Couchbase на каждом узле Docker Swarm.
  • Настройте кластер Couchbase на каждом кластере Docker Swarm
  • Настройте одностороннюю XDCR между двумя кластерами Couchbase

Для целей этого блога два центра обработки данных будут настроены на локальном компьютере с использованием Docker Machine.

роя-XDCR-couchbase-обзор

Полный код, используемый в этом блоге, доступен по адресу: github.com/arun-gupta/couchbase-xdcr-docker .

Создать Консул Дискавери Сервис

Каждый узел в Docker Swarm должен быть зарегистрирован в службе обнаружения . Этот блог будет использовать Консул для этой цели. И даже Консул будет работать на Docker Machine.

Как правило, вы запускаете кластер Консул, но для простоты в нашем случае запускается один экземпляр.

Создайте Docker Machine и запустите Consul, используя этот скрипт :

01
02
03
04
05
06
07
08
09
10
11
# Docker Machine for Consul
docker-machine \
   create \
   -d virtualbox \
   consul-machine
  
# Start Consul
docker $(docker-machine config consul-machine) run -d --restart=always \
         -p "8500:8500" \
         -h "consul" \
         progrium/consul -server -bootstrap

Создать Docker Swarm кластер

Docker Swarm позволяет рассматривать несколько хостов Docker как единое целое. Это позволяет вашим мультиконтейнерным приложениям легко запускаться на нескольких хостах. Docker Swarm обслуживает тот же Remote API, что и отдельный хост. Это позволяет вашим существующим инструментам ориентироваться на один хост или кластер хостов.

Оба кластера Docker Swarm будут зарегистрированы в одной службе обнаружения. Это достигается с помощью следующего значения для --swarm-discovery :

1
consul://$(docker-machine ip consul-machine):8500/v1/kv/<key>

Создайте кластер Docker Swarm, используя Docker Machine, используя этот скрипт :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Docker Swarm master
docker-machine \
  create \
  -d virtualbox \
  --swarm \
  --swarm-master \
  --swarm-discovery="consul://$(docker-machine ip consul-machine):8500/v1/kv/cluster$1" \
  --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500/v1/kv/cluster$1" \
  --engine-opt="cluster-advertise=eth1:2376" \
  swarm-master-$1
  
# Docker Swarm node-01
docker-machine \
  create \
  -d virtualbox \
  --swarm \
  --swarm-discovery="consul://$(docker-machine ip consul-machine):8500/v1/kv/cluster$1" \
  --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500/v1/kv/cluster$1" \
  --engine-opt="cluster-advertise=eth1:2376" \
  swarm-node-$1-01
  
# Docker Swarm node-02
docker-machine \
  create \
  -d virtualbox \
  --swarm \
  --swarm-discovery="consul://$(docker-machine ip consul-machine):8500/v1/kv/cluster$1" \
  --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500/v1/kv/cluster$1" \
  --engine-opt="cluster-advertise=eth1:2376" \
  swarm-node-$1-02
  
# Configure to use Docker Swarm cluster
eval "$(docker-machine env --swarm swarm-master-$1)"

Сценарий должен быть вызван как:

1
2
./create-docker-swarm-cluster.sh A
./create-docker-swarm-cluster.sh B

Это создаст два кластера Docker Swarm с одним «master» и двумя «worker», как показано ниже:

1
2
3
4
5
6
7
8
9
NAME              ACTIVE   DRIVER       STATE     URL                         SWARM                     DOCKER    ERRORS
consul-machine    -        virtualbox   Running   tcp://192.168.99.101:2376                             v1.11.1  
default           *        virtualbox   Running   tcp://192.168.99.100:2376                             v1.11.1  
swarm-master-A    -        virtualbox   Running   tcp://192.168.99.102:2376   swarm-master-A (master)   v1.11.1  
swarm-master-B    -        virtualbox   Running   tcp://192.168.99.105:2376   swarm-master-B (master)   v1.11.1  
swarm-node-A-01   -        virtualbox   Running   tcp://192.168.99.103:2376   swarm-master-A            v1.11.1  
swarm-node-A-02   -        virtualbox   Running   tcp://192.168.99.104:2376   swarm-master-A            v1.11.1  
swarm-node-B-01   -        virtualbox   Running   tcp://192.168.99.106:2376   swarm-master-B            v1.11.1  
swarm-node-B-02   -        virtualbox   Running   tcp://192.168.99.107:2376   swarm-master-B            v1.11.1

Консул работает на Docker Machine с IP-адресом 192.168.99.101. И, таким образом, пользовательский интерфейс Консула доступен по адресу http://192.168.99.101:8500:

роя-XDCR-couchbase-1024x543

Он показывает два кластера Docker Swarm, которые были зарегистрированы.

Точный список узлов для каждого кластера также можно увидеть. Узлы в clusterA показаны:

роя-XDCR-консулом clusterA-1024x466

Узлы в clusterB показаны:

роя-XDCR-консулом clusterB-1024x459

Запустить контейнеры Couchbase

Запустите контейнер Couchbase на каждом узле кластера Docker Swarm, используя этот файл Compose .

01
02
03
04
05
06
07
08
09
10
version: "2"
services:
  db:
    image: arungupta/couchbase
    network_mode: "host"
    ports:
      - 8091:8091
      - 8092:8092
      - 8093:8093
      - 11210:11210

Настройте интерфейс командной строки Docker для первого кластера и запустите 3 контейнера:

1
2
eval "$(docker-machine env --swarm swarm-master-A)"
docker-compose scale db=3

Проверьте работающие контейнеры:

1
2
3
4
5
> docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES
3ec0f15aaee0        arungupta/couchbase   "/entrypoint.sh /opt/"   3 hours ago         Up 3 hours                              swarm-master-A/couchbasexdcrdocker_db_3
07af2ac53539        arungupta/couchbase   "/entrypoint.sh /opt/"   3 hours ago         Up 3 hours                              swarm-node-A-02/couchbasexdcrdocker_db_2
c94878f543fd        arungupta/couchbase   "/entrypoint.sh /opt/"   3 hours ago         Up 3 hours                              swarm-node-A-01/couchbasexdcrdocker_db_1

Настройте интерфейс командной строки Docker для второго кластера и запустите 3 контейнера:

1
2
eval "$(docker-machine env --swarm swarm-master-B)"
docker-compose scale db=3

Проверьте работающие контейнеры:

1
2
3
4
5
6
> eval "$(docker-machine env --swarm swarm-master-B)"
> docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES
3e3a45480939        arungupta/couchbase   "/entrypoint.sh /opt/"   3 hours ago         Up 3 hours                              swarm-master-B/couchbasexdcrdocker_db_3
1f31f23e337d        arungupta/couchbase   "/entrypoint.sh /opt/"   3 hours ago         Up 3 hours                              swarm-node-B-01/couchbasexdcrdocker_db_1
1feab04c494c        arungupta/couchbase   "/entrypoint.sh /opt/"   3 hours ago         Up 3 hours                              swarm-node-B-02/couchbasexdcrdocker_db_2

Создать / Ребалансировать кластер Couchbase

Масштабирование и ребалансировка кластера Couchbase с использованием CLI объясняет, как создать кластер узлов Couchbase и перебалансировать существующий кластер с помощью CLI Couchbase .

Создайте кластер Couchbase на каждом кластере Swarm, используя этот скрипт .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
export COUCHBASE_CLI=/Users/arungupta/tools/Couchbase-Server-4.0.app/Contents/Resources/couchbase-core/bin/couchbase-cli
for node in 01 02
do
    $COUCHBASE_CLI \
        server-add \
        --cluster=$(docker-machine ip swarm-master-$1):8091 \
        --user Administrator \
        --password password \
        --server-add=$(docker-machine ip swarm-node-$1-$node) \
        --server-add-username=Administrator \
        --server-add-password=password
done
  
$COUCHBASE_CLI \
    setting-cluster \
    --cluster=$(docker-machine ip swarm-master-$1):8091 \
    --user Administrator \
    --password password \
    --cluster-name=cluster$1

Сценарий должен быть вызван как:

1
./create-couchbase-cluster.sh A

А теперь перебалансируем этот кластер, используя этот скрипт:

1
2
3
4
5
6
7
8
export COUCHBASE_CLI=/Users/arungupta/tools/Couchbase-Server-4.0.app/Contents/Resources/couchbase-core/bin/couchbase-cli
$COUCHBASE_CLI \
rebalance \
--cluster=$(docker-machine ip swarm-master-$1):8091 \
--user Administrator \
--password password \
--server-add-username=Administrator \
--server-add-password=password

Этот скрипт вызывается как:

1
./rebalance-couchbase-cluster.sh A

Couchbase Web Console для любого узла в кластере покажет вывод:

роя-XDCR-couchbase-clusterA-1024x435

Запустите этот скрипт, чтобы создать второй кластер Couchbase:

1
./create-couchbase-cluster.sh B

Перебалансировать этот кластер как:

1
./rebalance-couchbase-cluster.sh B

Couchbase Web Console для любого узла во втором кластере покажет вывод:

роя-XDCR-couchbase-clusterB-1024x430

Настройка XDCR

Перекрестная репликация в центре обработки данных может быть однонаправленной, двунаправленной или разнонаправленной. Однонаправленный позволяет реплицировать данные из исходного кластера в целевой кластер, двунаправленный позволяет репликацию в обоих направлениях, разнонаправленный позволяет настраивать в любом направлении.

Мы создадим простую однонаправленную репликацию, используя этот скрипт :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
export COUCHBASE_CLI=/Users/arungupta/tools/Couchbase-Server-4.0.app/Contents/Resources/couchbase-core/bin/couchbase-cli
$COUCHBASE_CLI \
    xdcr-setup \
    --cluster=$(docker-machine ip swarm-master-$1):8091 \
    --user Administrator \
    --password password \
    --create \
    --xdcr-cluster-name=cluster$1 \
    --xdcr-hostname=$(docker-machine ip swarm-master-$2):8091 \
    --xdcr-username=Administrator \
    --xdcr-password=password \
    --xdcr-demand-encryption=0
  
$COUCHBASE_CLI \
    xdcr-replicate \
    --cluster $(docker-machine ip swarm-master-$1):8091 \
    --xdcr-cluster-name=cluster$1 \
    --user Administrator \
    --password password \
    --create \
    --xdcr-from-bucket=travel-sample \
    --xdcr-to-bucket=travel-sample

Этот скрипт вызывается как:

1
./setup-xdcr.sh A B

Двунаправленную репликацию можно легко создать, выполнив команды снова, но поменяв местами исходный и целевой кластеры.

Couchbase Web Console для исходного кластера покажет:

роя-XDCR-couchbase-clusterA-XDCR-1024x441

Couchbase Web Console для целевого кластера покажет:

роя-XDCR-couchbase-clusterB-XDCR-1024x413

Наслаждайтесь!

В этом блоге показано, как можно упростить сложные развертывания с помощью Docker Machine, Docker Swarm и Docker Compose.