如何為雙活Redis Enterprise搭建基于Docker的開發(fā)環(huán)境?
譯文【51CTO.com快譯】Redis Enterprise這種雙活數(shù)據(jù)庫是地域分布式應(yīng)用程序的理想選擇。其架構(gòu)基于無沖突復(fù)制數(shù)據(jù)類型(CRDT)方面是突破性的學(xué)術(shù)研究。這種方法與其他雙活數(shù)據(jù)庫相比具有許多優(yōu)點(diǎn),包括如下:
1. 為讀寫操作提供本地延遲
2. 為簡(jiǎn)單和復(fù)雜的數(shù)據(jù)類型提供內(nèi)置的沖突解決方案
3. 跨區(qū)域故障切換
4. 簡(jiǎn)化實(shí)施了諸多用例,比如積分榜、分布式緩存、共享會(huì)話和多用戶計(jì)費(fèi)等。
最近我們發(fā)布了一篇關(guān)于如何使用雙活Redis Enterprise來開發(fā)應(yīng)用程序的教程。為了模擬生產(chǎn)環(huán)境,開發(fā)人員或測(cè)試人員需要一種小型化的開發(fā)環(huán)境,很容易用Docker來搭建。
Redis Enterprise在Docker hub上以redislabs/redis的形式存在,我們已經(jīng)在Redis Enterprise說明文檔頁面和docker hub本身上介紹了如何在Docker上搭建Redis Enterprise的詳細(xì)逐步說明。
我們?cè)诒疚闹薪榻B創(chuàng)建基于Docker的Redis Enterprise集群的步驟,這一切通過命令行來完成。下面大體介紹了整個(gè)過程(更多詳細(xì)信息如下):
1. 安裝數(shù)據(jù)庫
1)創(chuàng)建一個(gè)3個(gè)節(jié)點(diǎn)的Redis Enterprise集群,每個(gè)節(jié)點(diǎn)在單獨(dú)的子網(wǎng)上
2)創(chuàng)建基于CRDT的Redis Enterprise數(shù)據(jù)庫
3)連接到三個(gè)不同的實(shí)例
2. 驗(yàn)證安裝的環(huán)境
3. 拆分網(wǎng)絡(luò)
4. 恢復(fù)連接
5. 停止Redis Enterprise
在開始之前,確保你已有一個(gè)bash shell,并為docker進(jìn)程分配了足夠的內(nèi)存。你可以進(jìn)入到Docker -> Preferences -> Advanced來檢查內(nèi)存。
圖1:Docker內(nèi)存***項(xiàng)高級(jí)選項(xiàng)卡
1. 安裝數(shù)據(jù)庫
下列腳本在3節(jié)點(diǎn)集群上創(chuàng)建基于CRDT的Redis Enterprise數(shù)據(jù)庫。將其保存在文件中并為其命名,比如“create_3_node_cluster.sh”。然后將模式改成可執(zhí)行(chmod + x create_3_node_cluster.sh),并運(yùn)行腳本([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
- # r@r.com, password is password. Change the user
- echo “”
- echo “Creating clusters”
- docker exec -it rp1 /opt/redislabs/bin/rladmin cluster create name cluster1.local username r@r.com password test
- docker exec -it rp2 /opt/redislabs/bin/rladmin cluster create name cluster2.local username r@r.com password test
- docker exec -it rp3 /opt/redislabs/bin/rladmin cluster create name cluster3.local username r@r.com 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,username=r@r.com,password=test –instance fqdn=cluster2.local,username=r@r.com,password=test –instance fqdn=cluster3.local,username=r@r.com,password=test
2. 驗(yàn)證安裝的環(huán)境
在端口12000、12002和12004上運(yùn)行redis-cli,驗(yàn)證你可以連接到所有三個(gè)Redis Enterprise端口。如果你將應(yīng)用程序連接到Redis Enterprise,需要應(yīng)用程序的三個(gè)實(shí)例連接到三個(gè)不同的端口。比如:
- $ redis-cli -p 12000
- 127.0.0.1:12000> incr counter
- (integer) 1
- 127.0.0.1:12000> get counter
- “1”
3. 拆分網(wǎng)絡(luò)
拆分網(wǎng)絡(luò)可幫助你在Redis Enterprise副本之間引入“網(wǎng)絡(luò)分區(qū)”。你在設(shè)計(jì)應(yīng)用程序時(shí),必須設(shè)計(jì)成副本斷開連接后可以順暢運(yùn)行。該腳本幫助你隔離三個(gè)副本。將該腳本保存在文件“split_networks.sh”中,并在運(yùn)行之前更改模式,讓它成為可執(zhí)行(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. 恢復(fù)連接
你運(yùn)行腳本“split_netorks.sh”后,本地副本會(huì)停止與其他副本共享數(shù)據(jù)庫更新?;謴?fù)連接將讓它們能夠交換所有更新,并獲得同樣的最終狀態(tài),這歸功于Redis Enterprise提供了很強(qiáng)的最終一致性。下列腳本恢復(fù)副本之間的網(wǎng)絡(luò)連接。將這保存在文件“restore_networks.sh”中,并更改模式讓它成為可執(zhí)行(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
完成開發(fā)和測(cè)試后,只要運(yùn)行下列腳本,就可以終止Redis Enterprise的所有三個(gè)節(jié)點(diǎn)。將該文件保存在文件中,并將文件命名為“stop.sh”,更改模式,讓它成為可執(zhí)行(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
就是這樣。完成了上述步驟后,現(xiàn)在你有了自己的基于Docker的Redis Enterprise雙活數(shù)據(jù)庫環(huán)境。若有任何問題,歡迎留言交流。
原文標(biāo)題:How to Set Up a Docker-based Development Environment for Active-Active Redis Enterprise,作者:Roshan Kumar
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】