将 Redis Enterprise 作为 Active-Active 数据库 非常适合地理分布式应用。其架构基于关于无冲突复制数据类型 (CRDT) 的突破性学术研究。这种方法比其他 Active-Active 数据库具有许多优势,包括
最近,我们发布了一篇关于如何使用 Active-Active Redis Enterprise 开发应用的教程。 为了模拟生产环境设置,开发者或测试人员需要一个微型化的开发环境——这使用 Docker 很容易创建。
Redis Enterprise 在 Docker Hub 上以 redis/redis 的形式提供,我们已经在 Redis Enterprise 的文档页面和 Docker Hub 上分享了关于如何在 Docker 上设置 Redis Enterprise 的详细分步说明。
在这篇博客中,我们将带您了解通过命令行创建基于 Docker 的 Redis Enterprise 集群的步骤。以下是该过程的高级概述(更多详情见下文)
在开始之前,请确保您已准备好 bash shell,并为 Docker 进程分配了足够的内存。您可以通过 Docker -> Preferences -> Advanced 来检查内存设置。
以下脚本在一个 3 节点集群上创建一个基于 CRDT 的 Redis Enterprise 数据库。将其保存到一个文件中并命名,例如“create_3_node_cluster.sh”。然后将其模式更改为可执行(chmod +x create_3_node_cluster.sh),并运行脚本([path]/create_3_node_cluster.sh)。
#!/bin/bash
# 如果桥接网络已存在,则删除它们
docker network rm network1 2>/dev/null
docker network rm network2 2>/dev/null
docker network rm network3 2>/dev/null
# 创建新的桥接网络
echo “正在创建新的子网…”
docker network create network1 –subnet=172.18.0.0/16 –gateway=172.18.0.1
docker network create network2 –subnet=172.19.0.0/16 –gateway=172.19.0.1
docker network create network3 –subnet=172.20.0.0/16 –gateway=172.20.0.1
# 启动 3 个 docker 容器。每个容器都是一个独立网络中的一个节点
# 这些命令从 docker hub 拉取 redis/redis。由于端口映射规则,Redis Enterprise 实例可通过端口
# 访问
# 12000, 12002, 12004
echo “”
echo “正在以 Docker 容器形式启动 Redis Enterprise…”
docker run -d –cap-add sys_resource -h rp1 –name rp1 -p 8443:8443 -p 9443:9443 -p 12000:12000 –network=network1 –ip=172.18.0.2 redis/redis
docker run -d –cap-add sys_resource -h rp2 –name rp2 -p 8445:8443 -p 9445:9443 -p 12002:12000 –network=network2 –ip=172.19.0.2 redis/redis
docker run -d –cap-add sys_resource -h rp3 –name rp3 -p 8447:8443 -p 9447:9443 -p 12004:12000 –network=network3 –ip=172.20.0.2 redis/redis
# 连接网络
docker network connect network2 rp1
docker network connect network3 rp1
docker network connect network1 rp2
docker network connect network3 rp2
docker network connect network1 rp3
docker network connect network2 rp3
# 等待节点启动。如果您的节点启动时间超过 60 秒,请增加等待时间
#
echo “”
echo “正在等待服务器启动…”
sleep 60
# 创建 3 个 Redis Enterprise 集群 - 每个网络一个。您可以登录到
# 集群,例如 https://localhost:8443/(或 8445、8447)。用户名为
# [email protected],密码是 password。更改用户
echo “”
echo “正在创建集群”
docker exec -it rp1 /opt/redis/bin/rladmin cluster create name cluster1.local username [email protected] password test
docker exec -it rp2 /opt/redis/bin/rladmin cluster create name cluster2.local username [email protected] password test
docker exec -it rp3 /opt/redis/bin/rladmin cluster create name cluster3.local username [email protected] password test
# 创建 CRDB
echo “”
echo “正在创建 CRDB”
docker exec -it rp1 /opt/redis/bin/crdb-cli crdb create –name mycrdb –memory-size 512mb –port 12000 –replication false –shards-count 1 –instance fqdn=cluster1.local,[email protected],password=test –instance fqdn=cluster2.local,[email protected],password=test –instance fqdn=cluster3.local,[email protected],password=test
在端口 12000、12002 和 12004 上运行 redis-cli,以验证您是否可以连接到所有三个 Redis Enterprise 节点。如果您的应用程序连接到 Redis Enterprise,您将需要应用程序的三个实例连接到这三个不同的端口。例如
$ redis-cli -p 12000
127.0.0.1:12000> incr counter
(integer) 1
127.0.0.1:12000> get counter
“1”
拆分网络有助于在 Redis Enterprise 副本之间引入“网络分区”。在设计应用程序时,您必须将其设计为在副本断开连接时仍能无缝工作。此脚本可帮助您隔离这三个副本。将此脚本保存到文件“split_networks.sh”中,并在运行之前更改其模式使其可执行(chmod +x split_networks.sh)。
#!/bin/bash
docker network disconnect network2 rp1
docker network disconnect network3 rp1
docker network disconnect network1 rp2
docker network disconnect network3 rp2
docker network disconnect network1 rp3
docker network disconnect network2 rp3
当您运行脚本“split_networks.sh”时,本地副本将停止与其对等节点共享数据库更新。恢复连接将使它们能够交换所有更新并达到相同的最终状态,这得益于 Redis Enterprise 提供的强大最终一致性。下面的脚本将恢复副本之间的网络连接。将其保存到文件“restore_networks.sh”中,并更改其模式使其可执行(chmod +x restore_networks.sh)。
#!/bin/bash
docker network connect network2 rp1
docker network connect network3 rp1
docker network connect network1 rp2
docker network connect network3 rp2
docker network connect network1 rp3
docker network connect network2 rp3
完成开发和测试后,您可以通过运行以下脚本来停止所有三个 Redis Enterprise 节点。将脚本保存到文件中,命名为“stop.sh”,并更改其模式使其可执行(chmod +x stop.sh)。
#!/bin/bash
docker stop rp1 rp2 rp3
docker rm rp1 rp2 rp3
docker network rm network1
docker network rm network2
docker network rm network3
就是这样。以此为起点,您现在拥有了自己的基于 Docker 的 Redis Enterprise Active-Active 设置。如果您有任何问题,请随时通过电子邮件联系我们:[email protected]。
如果您想开始使用云中的 Redis Enterprise,可以在此处免费注册。