如何为双活Redis Enterprise搭建基于Docker的开发环境?

Redis Enterprise这种双活数据库是地域分布式应用程序的理想选择。其架构基于无冲突复制数据类型(CRDT)方面是突破性的学术研究。这种方法与其他双活数据库相比具有许多优点,包括如下:

  1. 为读写操作提供本地延迟

  2. 为简单和复杂的数据类型提供内置的冲突解决方案

  3. 跨区域故障切换

  4. 简化实施了诸多用例,比如积分榜、分布式缓存、共享会话和多用户计费等。

最近我们发布了一篇关于https://redislabs.com/docs/developing-apps-using-active-active-redis-enterprise/ 。为了模拟生产环境,开发人员或测试人员需要一种小型化的开发环境,很容易用Docker来搭建。

Redis Enterprise在Docker hub上以redislabs/redis的形式存在,我们已经在Redis Enterprise说明文档页面和docker hub本身上介绍了如何在Docker上搭建Redis Enterprise的详细逐步说明。

我们在本文中介绍创建基于Docker的Redis Enterprise集群的步骤,这一切通过命令行来完成。下面大体介绍了整个过程(更多详细信息如下):

  1. 安装数据库

    1)创建一个3个节点的Redis Enterprise集群,每个节点在单独的子网上

    2)创建基于CRDT的Redis Enterprise数据库

    3)连接到三个不同的实例

  2. 验证安装的环境

  3. 拆分网络

  4. 恢复连接

  5. 停止Redis Enterprise

在开始之前,确保你已有一个bash shell,并为docker进程分配了足够的内存。你可以进入到Docker -> Preferences -> Advanced来检查内存。

未分类

1. 安装数据库

下列脚本在3节点集群上创建基于CRDT的Redis Enterprise数据库。将其保存在文件中并为其命名,比如“create_3_node_cluster.sh”。然后将模式改成可执行(chmod + x create_3_node_cluster.sh),并运行脚本([path] /create_3_node_cluster.sh)。

#!/bin/bash  
# Delete the bridge networks if they already exist  
docker network rm network1 2>/dev/null  
docker network rm network2 2>/dev/null  
docker network rm network3 2>/dev/null  
# Create new bridge networks  
echo “Creating new subnets…”  
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  
# Start 3 docker containers. Each container is a node in a separate network  
# These commands pull redislabs/redis from the docker hub. Because of the  
# port mapping rules, Redis Enterprise instances are available on ports  
# 12000, 12002, 12004  
echo “”  
echo “Starting Redis Enterprise as Docker containers…”  
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 redislabs/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 redislabs/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 redislabs/redis  
# Connect the networks  
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  
# Sleep while the nodes start. Increase the sleep time if your nodes take  
# longer than 60 seconds to start  
echo “”  
echo “Waiting for the servers to start…”  
sleep 60  
# Create 3 Redis Enterprise clusters – one for each network. You can login to  
# a cluster as https://localhost:8443/ (or 8445, 8447). The user name is  
# [email protected], password is password. Change the user  
echo “”  
echo “Creating clusters”  
docker exec -it rp1 /opt/redislabs/bin/rladmin cluster create name cluster1.local username [email protected] password test  
docker exec -it rp2 /opt/redislabs/bin/rladmin cluster create name cluster2.local username [email protected] password test  
docker exec -it rp3 /opt/redislabs/bin/rladmin cluster create name cluster3.local username [email protected] password test  
# Create the CRDB  
echo “”  
echo “Creating a CRDB”  
docker exec -it rp1 /opt/redislabs/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 

2. 验证安装的环境

在端口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” 

3. 拆分网络

拆分网络可帮助你在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 

4. 恢复连接

你运行脚本“split_netorks.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 

5. 停止Redis Enterprise

完成开发和测试后,只要运行下列脚本,就可以终止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双活数据库环境。若有任何问题,欢迎留言交流。