此内容是在 Redis 更名之前撰写的 - Redis Enterprise 现在是我们所有产品的名称。
如今,Redis 应用可以利用几种类型的复制 -
在即将发布的 Redis Enterprise 5.0 版本中,我们将提供一项新的灵活的多主复制技术,专为 WAN 设计。新功能使用 CRDT(无冲突复制数据类型)的魔力,允许主动-主动地理分布式 Redis 部署。CRDT 简化了主动-主动系统的开发,并自动解决冲突写入。结合 Redis 数据类型,CRDT 提供了一种机制,可以轻松地帮助您开发智能处理冲突写入的主动-主动地理分布式系统。
如果您想了解更多有关 Redis CRDT 的信息,请访问“在地理分布式部署中使用 CRDT 弯曲 CAP 定理“
在本演练中,我们将重点关注 CRDT 的实验,但如果您想深入了解 CRDT,请从 这篇文章 开始:Eric Brewer 在最初的 CAP 定理发布 12 年后,解释了 CRDT 如何在这篇精彩的文章中改变 CAP 的平衡。 To get hands on with CRDTs and try them out, you can sign up for the preview program for Redis Enterprise 5.0. Find the instructions here.
我们将设置一个规模缩减的地理分布式部署,并演示主动-主动访问如何在 Redis Enterprise 下工作。以下是四个步骤:
运行 2 个容器。我们将使用每个容器模拟一个 Redis Enterprise 集群。
注意:在运行容器之前,请转到 docker 设置并调整每个容器的 RAM 为 6GB。在某些操作系统下,除非调整每个容器的 RAM,否则您可能无法启动 Redis Enterprise Pack 容器。
docker run -d --cap-add sys_resource -h rp1 --name rp1 -p 8443:8443 -p 8080:8080 -p 12000:12000 redis/redis docker run -d --cap-add sys_resource -h rp2 --name rp2 -p 8444:8443 -p 8081:8080 -p 12001:12000 redis/redis
重要的是要注意 -p 选项:每个容器将其 Web UI 端口 (8443)、REST API 端口 (8080) 和数据库访问端口 (12000) 映射到唯一的主机端口,以确保所有容器都可从运行容器的主机操作系统访问。这将帮助您从主机以及容器本身连接到每个集群。
让我们设置两个集群。
对于集群 1,将浏览器指向主机上的 https://#:8443 以查看 Redise Pack 管理控制台。只需单击页面上的设置按钮即可开始。
注意:根据您的浏览器,您可能会看到证书错误。只需选择继续访问网站即可进入设置屏幕。
在节点配置页面上,选择默认设置并提供集群 **FQDN**:cluster1.local。然后只需单击下一步按钮。
如果您没有许可证密钥,请单击下一步按钮试用产品的试用版。
在下一个屏幕上,使用电子邮件作为登录名和密码设置集群管理员帐户。
您已完成 cluster1.local 的操作。
对集群 2 重复相同的操作。首先,将浏览器指向 https://#:8444。步骤相同,只是这次,将 FQDN 指定为 cluster2.local。
完成之后,我们将拥有两个 Redise Pack 集群,其 FQDN 分别为 cluster1.local 和 cluster2.local。
我们将使用 REST API 创建数据库。以下将创建一个类型为 CRDB(无冲突复制数据库)的 Redis 数据库。CRDB 有一些特殊之处
下面的 REST API 调用在 cluster1.local 上创建一个 CRDB 实例,并在 cluster2.local 上创建一个 CRDB 实例。在每个集群上,CRDB 实例的端点为端口 12000,两个数据库的名称均为“sample-crdb”。
在发出以下调用之前,请填写<admin-email> 和 <admin-password>,您在上述设置过程中指定过。
在数据库选项卡下,选择部署类型设置为地理分布式的 Redis 数据库。
在创建数据库页面上,单击 显示高级选项 链接,并为数据库名称输入 database1 ,为端点端口号输入 12000 。确保将 http://cluster1.local:8080 和 http://cluster2.local:8080 添加到参与的集群列表中。
激活数据库后,您将在每个参与的集群上拥有可以连接到的 CRDB 实例。
创建了 Redis 数据库 (CRDB) 后,您就可以连接到您的数据库了。您可以使用以下方法之一来测试与数据库的连接
请记住,我们有两个 CRDB 实例可用于连接以及并发读写。CRDB 实例使用双向复制来实现全局 CRDB。
使用 redis-cli 连接
redis-cli 是一个简单的命令行工具,用于与 redis 数据库进行交互。在此示例中,我们将使用每个容器下的 redis-cli,使用“docker exec”。 使用“docker exec”将您的上下文切换到 cluster1.local 中节点的 Redise Pack 容器,容器名为 rp1
docker exec -it rp1 bash
运行位于“/opt/redis/bin” 目录下的 redis-cli,连接到端口 12000,并在数据库中存储和检索 key1。
/opt/redis/bin/redis-cli -p 12000 127.0.0.1:12000> set key1 123 OK 127.0.0.1:12000> get key1 "123"
让我们看看写入 key1 是否复制到集群 2。在另一个终端窗口中,使用“docker exec”将您的上下文切换到集群 2 中节点的 Redise Pack 容器。
docker exec -it rp2 bash /opt/redis/bin/redis-cli -p 12000 127.0.0.1:12000> get key1 "123"
您现在拥有一个工作的 CRDB 部署。让我们看看当您对数据进行并发分布式写入时,CRDB 如何简化开发。
这是一个简单的测试。让我们看看 k1 上的 INCR 如何跨 cluster1 和 cluster2 上的 2 个 CRDB 实例进行同步,以确保准确的最终值。 t1 到 t5 代表事件顺序。cluster1.local 下的操作是在 rp1 容器上执行的,cluster2.local 下的操作是在 rp2 容器上执行的。
模拟网络故障: 集群之间的同步速度很快。对于一些高级测试,您还会发现模拟 cluster1 和 cluster2 之间的网络故障,这样您就可以观察到每个数据类型中的 CRDT 如何工作。
在 docker 中模拟网络分区很容易。要创建网络分区,请找到 cluster1 上的 IP 地址。我得到 10.0.0.2
docker exec -it rp1 ifconfig | grep 0.0.0.0 | cut -d":" -f 2 | cut -d" " -f 1
10.0.0.2
要断开 2 个集群 cluster1.local 和 cluster2.local 之间的网络连接,请在 cluster2.local(rp2 容器)上运行以下命令。
docker exec --privileged rp2 iptables -A INPUT --source 10.0.0.2 -j DROP docker exec --privileged rp2 iptables -A OUTPUT --dst 10.0.0.2 -j DROP
此时,cluster1 和 cluster2 无法通过主动-主动复制进行通信。 在某个时刻,您可能需要恢复网络连接。恢复集群之间的网络通信后,CRDB 将自动开始重新同步。以下是如何执行此操作;
docker exec --privileged rp2 iptables -F
以下是另一个可以尝试的示例。这次我们将模拟操作之间的网络故障,以观察问题。在这种情况下,我们将看到 Redis SET 如何与 CRDT 一起使用。我们将创建这个集合并让它跨集群同步。我们将断开网络,并在每个集群中私下向 SET 添加一个新的不同成员。恢复通信后,您将看到 CRDT 如何解决冲突写入并将两个集合合并。
我们只是触及了 Redis 中 CRDT 的表面。您可以注册私有预览以获取有关功能的更多详细信息和文档。只需按照 此处 的说明进行操作。