Couchbase中的跨数据中心复制(XDCR)提供了一种将数据从一个群集复制到另一个群集的简便方法。 这些群集通常设置在地理位置不同的数据中心中。 这样可以进行灾难恢复或使数据离用户更近,以便更快地访问数据。
该博客将显示:
- 使用Docker Swarm设置两个数据中心
- 在Docker Swarm的每个节点上运行Couchbase容器
- 在每个Docker Swarm集群上设置一个Couchbase集群
- 在两个Couchbase群集之间配置单向XDCR
就本博客而言,将使用Docker Machine在本地计算机上设置两个数据中心。
该博客中使用的完整代码可在github.com/arun-gupta/couchbase-xdcr-docker上找到 。
创建领事发现服务
Docker Swarm中的每个节点都需要向发现服务注册。 该博客将为此目的使用Consul。 甚至Consul也将在Docker Machine上运行。
通常,您将运行Consul集群,但为简单起见,在我们的案例中仅启动了一个实例。
创建一个Docker Machine并使用以下脚本启动Consul:
# 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
使用以下值来--swarm-discovery
:
consul://$(docker-machine ip consul-machine):8500/v1/kv/<key>
使用以下脚本,使用Docker Machine创建一个Docker Swarm集群:
# 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)"
该脚本需要通过以下方式调用:
./create-docker-swarm-cluster.sh A
./create-docker-swarm-cluster.sh B
这将创建两个带有一个“主”和两个“工作”的Docker Swarm集群,如下所示:
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
Consul在IP地址为192.168.99.101的Docker Machine上运行。 因此可以在http://192.168.99.101:8500访问Consul UI:
它显示了两个已注册的Docker Swarm集群。
还可以看到每个群集的确切节点列表。 显示了clusterA
中的节点:
显示了clusterB
中的节点:
运行Couchbase容器
使用此Compose文件在Docker Swarm集群的每个节点上运行Couchbase容器。
version: "2"
services:
db:
image: arungupta/couchbase
network_mode: "host"
ports:
- 8091:8091
- 8092:8092
- 8093:8093
- 11210:11210
为第一个集群配置Docker CLI并运行3个容器:
eval "$(docker-machine env --swarm swarm-master-A)"
docker-compose scale db=3
检查正在运行的容器:
> 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 CLI并运行3个容器:
eval "$(docker-machine env --swarm swarm-master-B)"
docker-compose scale db=3
检查正在运行的容器:
> 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集群
使用CLI扩展和重新平衡Couchbase群集说明了如何创建Couchbase节点的群集以及如何使用Couchbase CLI重新平衡现有群集。
使用此脚本在每个Swarm群集上创建Couchbase群集。
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
该脚本需要通过以下方式调用:
./create-couchbase-cluster.sh A
现在,使用以下脚本重新平衡该群集:
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
该脚本的调用方式为:
./rebalance-couchbase-cluster.sh A
集群中任何节点的Couchbase Web控制台将显示输出:
调用此脚本以创建第二个Couchbase集群,如下所示:
./create-couchbase-cluster.sh B
将群集重新平衡为:
./rebalance-couchbase-cluster.sh B
第二个群集中任何节点的Couchbase Web控制台将显示输出:
设置XDCR
跨数据中心复制可以设置为单向,双向或多向。 单向允许从源群集到目标群集复制数据,双向允许双向复制,多向允许在任何方向进行配置。
我们将使用以下脚本创建一个简单的单向复制:
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
该脚本的调用方式为:
./setup-xdcr.sh A B
通过再次执行命令,但是反转源群集和目标群集,可以轻松创建双向复制。
源集群的Couchbase Web控制台将显示:
目标群集的Couchbase Web控制台将显示:
请享用!
该博客显示了如何使用Docker Machine,Docker Swarm和Docker Compose简化复杂的部署。
翻译自: https://www.javacodegeeks.com/2016/05/couchbase-xdcr-using-docker-swarm-machine-compose.html