Trong Phần I của bài viết này, "Tại sao nên di chuyển cơ sở dữ liệu Dynomite sang Redis Enterprise Active-Active?", chúng tôi đã so sánh kiến trúc và tính năng của Dynomite và Redis Enterprise. Chúng tôi đã chỉ ra cách Redis Enterprise giúp bạn phân phối địa lý Redis Enterprise theo cách giàu tính năng, dễ quản lý, và không lo xung đột giữa các ghi đồng thời.
Phần II sẽ mô tả các tùy chọn di chuyển để chuyển từ Dynomite sang Redis Enterprise.
Lưu ý: từ đây về sau, phiên bản tự quản lý của Redis Enterprise sẽ được gọi là "Redis Enterprise Software" và phiên bản được quản lý sẽ được ghi chú là "Redis Enterprise Cloud" hoặc "Cloud subscription".
Di chuyển cơ sở dữ liệu Dynomite của bạn
Hãy thực tế và xem cách chạy hai loại di chuyển:
- Di chuyển bằng tính năng Import/Export của Redis Enterprise
- Di chuyển bằng tính năng ReplicaOf của Redis Enterprise, còn gọi là Active-Passive
Để minh họa, giả sử chúng ta có một cụm Dynomite trải rộng hai trung tâm dữ liệu: dc-a và dc-b. Mỗi trung tâm dữ liệu có một rack, và mỗi rack gồm hai nút, tập dữ liệu được phân phối giữa chúng.
Nếu nhớ mô tả kiến trúc Dynomite, mỗi rack Dynomite chứa toàn bộ tập dữ liệu.
Do đó, chúng ta có thể giới hạn phạm vi di chuyển, dù là Import/Export hay Active-Passive, chỉ trong một rack duy nhất trong thiết lập Dynomite.
Chọn rack-1-dc-a và giả sử IP của hai nút là:
- a1: 10.0.0.1
- a2: 10.0.0.2
Để rõ ràng, đây là cấu hình yaml cho thiết lập Dynomite:
#a1
dyn_o_mite:
datacenter: dc-a
dyn_listen: 10.0.0.1:7379
dyn_port: 7379
dyn_seed_provider: simple_provider
dyn_seeds:
- 10.0.0.3:7379:rack1:dc-a:4294967294
- 10.0.0.4:7379:rack1:dc-b:4294967294
- 10.0.0.2:7379:rack1:dc-b:2147483647
listen: 0.0.0.0:8379
rack: rack1
servers:
- 127.0.0.1:6379:1
timeout: 150000
tokens: 2147483647
secure_server_option: datacenter
pem_key_file: /root/dynomite/conf/dynomite.pem
data_store: 0
stats_listen: 127.0.0.1:22222
read_consistency : DC_QUORUM
write_consistency : DC_QUORUM
#a2
dyn_o_mite:
datacenter: dc-a
dyn_listen: 10.0.0.3:7379
dyn_port: 7379
dyn_seed_provider: simple_provider
dyn_seeds:
- 10.0.0.1:7379:rack1:dc-a:2147483647
- 10.0.0.4:7379:rack1:dc-b:4294967294
- 10.0.0.2:7379:rack1:dc-b:2147483647
listen: 0.0.0.0:8379
rack: rack1
servers:
- 127.0.0.1:6379:1
timeout: 150000
tokens: 4294967294
secure_server_option: datacenter
pem_key_file: /root/dynomite/conf/dynomite.pem
data_store: 0
stats_listen: 127.0.0.1:22222
read_consistency : DC_QUORUM
write_consistency : DC_QUORUM
#b1
dyn_o_mite:
datacenter: dc-b
dyn_listen: 10.0.0.2:7379
dyn_port: 7379
dyn_seed_provider: simple_provider
dyn_seeds:
- 10.0.0.4:7379:rack1:dc-b:4294967294
- 10.0.0.1:7379:rack1:dc-a:4294967294
- 10.0.0.3:7379:rack1:dc-a:2147483647
listen: 0.0.0.0:8379
rack: rack1
servers:
- 127.0.0.1:6379:1
timeout: 150000
tokens: 2147483647
secure_server_option: datacenter
pem_key_file: /root/dynomite/conf/dynomite.pem
data_store: 0
stats_listen: 127.0.0.1:22222
read_consistency : DC_QUORUM
write_consistency : DC_QUORUM
#b2
dyn_o_mite:
datacenter: dc-b
dyn_listen: 10.0.0.4:7379
dyn_port: 7379
dyn_seed_provider: simple_provider
dyn_seeds:
- 10.0.0.2:7379:rack1:dc-b:2147483647
- 10.0.0.1:7379:rack1:dc-a:4294967294
- 10.0.0.3:7379:rack1:dc-a:2147483647
listen: 0.0.0.0:8379
rack: rack1
servers:
- 127.0.0.1:6379:1
timeout: 150000
tokens: 4294967294
secure_server_option: datacenter
pem_key_file: /root/dynomite/conf/dynomite.pem
data_store: 0
stats_listen: 127.0.0.1:22222
read_consistency : DC_QUORUM
write_consistency : DC_QUORUM
Một số quan sát về cấu hình và thiết lập dùng cho hướng dẫn này:
- Bốn VM GCP chạy Ubuntu 18.04.
- VM nằm trong cùng VPC trải nhiều region.
- Mở cổng 7379 và 7380, Dynomite dùng các cổng này để replication dữ liệu – "dyn_port" trong yaml.
- Redis OSS chạy trên mỗi nút cổng 6379 – xem "servers" trong yaml.
- Dynomite lắng nghe request client trên cổng 8379 (ví dụ redis-cli -h 10.0.0.1 -p 8379) – xem "listen" trong yaml.
Bây giờ chúng ta hiểu thiết lập và đã quyết định rack nào dùng cho di chuyển, hãy tạo cơ sở dữ liệu Redis Enterprise.
Tạo cơ sở dữ liệu Redis Enterprise Active-Active
Vì mục đích bài viết không phải giải thích cách thiết lập cụm hay tạo database, vui lòng tham khảo tài liệu dưới đây để chạy database Active-Active:
- Cụm Redis Enterprise Software
- Cloud subscription
- Tạo database Software
- Tạo Active-Active Database Software
- Tạo database Cloud
Để test hai kịch bản di chuyển, tôi đã tạo database Active-Active trải hai cụm Redis Enterprise Software – một ở Châu Âu và một ở Mỹ. Mỗi cụm gồm ba VM chạy Ubuntu 18.04. Biết rằng nếu tạo database không có Active-Active, các bước di chuyển sẽ giống nhau, trừ khi có chỉ định khác trong bài này.
Hãy tiến hành loại di chuyển đầu tiên.
Di chuyển bằng tính năng Import/Export
Redis OSS cung cấp tùy chọn persistence gọi là Redis Database Backup Files (RDB), thực hiện snapshot tại thời điểm của tập dữ liệu, theo khoảng thời gian chỉ định hoặc khi kích hoạt bằng lệnh SAVE hoặc BGSAVE.
Các snapshot này lưu trong file .rdb, gọi tắt là file RDB. Chúng ta sẽ export chúng ra khỏi server Dynomite và import vào database Redis Enterprise. Với giải pháp này, lưu ý rằng di chuyển delta không thể thực hiện và việc import có thể mất thời gian, tùy thuộc vào kích thước dữ liệu.
QUAN TRỌNG: Có sự khác biệt lớn giữa database Redis Enterprise không phân phối địa lý và database Active-Active:
- Database không phân phối địa lý: Khi import file RDB, toàn bộ nội dung database hiện tại sẽ bị xóa.
- Database Active-Active: Bạn có thể import file RDB và merge vào dataset hiện có. Điều này có nghĩa là bạn có thể bắt đầu gửi traffic ghi vào database Active-Active trước và trong quá trình import. Chú ý – nếu bạn ghi key vào database Active-Active đã tồn tại trong Dynomite, import sau đó có thể ghi đè giá trị mới bằng giá trị cũ! Cần lập kế hoạch cẩn thận.
Cách di chuyển dữ liệu từ Dynomite sang Redis Enterprise với file RDB:
- Dừng traffic trên database Dynomite và, nếu đã lập kế hoạch cẩn thận và dùng database Active-Active, cutover sang database Redis Enterprise.
- Export dữ liệu từng nút (a1 và a2 trong trường hợp này) thành file RDB.
- Upload file RDB đến vị trí truy cập được từ cụm Redis Enterprise (ví dụ: Google Cloud Storage bucket, AWS S3 bucket, FTP server, v.v.)
- Import file RDB vào database Redis Enterprise.
- Cutover sang database Redis Enterprise.
Hãy xem chi tiết các bước trên.
Tùy chọn: Chỉnh sửa file cấu hình Redis OSS trên mỗi nút
Các instance Redis OSS chạy trên nút Dynomite có file cấu hình mặc định tại /etc/redis nếu cài bằng "apt-get", hoặc trong thư mục Redis nếu tự build. File này gọi là "redis.conf".
Mở file với trình soạn thảo yêu thích và tìm directive "dbfilename". Đổi tên file trên mỗi nút, ví dụ:
- "dump1.rdb" trên node1
- "dump2.rdb" trên node2
Điều này đảm bảo khi export file RDB ra lưu trữ bên ngoài, chúng không trùng tên. Bạn có thể bỏ qua bước này và đổi tên sau khi snapshot nếu thích.
Tùy chọn, bạn cũng có thể:
- Thay đổi thư mục lưu file RDB với directive "dir".
- Thay đổi khoảng thời gian snapshot hoặc tắt snapshot tự động. Trong hướng dẫn này, chúng ta dùng lệnh SAVE của Redis để kích hoạt snapshot, đảm bảo dump toàn bộ dataset sau khi dừng traffic.
Lưu ý sau khi chỉnh sửa file cấu hình Redis OSS, cần restart Redis OSS server để thay đổi có hiệu lực.
Dump dữ liệu
Bây giờ dừng traffic đến database Dynomite qua cổng 8379. Lại nói, nếu import vào database Active-Active và đã lập kế hoạch cẩn thận để không rủi ro ghi đè ngẫu nhiên trong import, bạn có thể cutover traffic sang database Active-Active.
Khởi chạy redis-cli. Đừng dùng cổng 8379, cổng lắng nghe của Dynomite. Thay vào đó dùng cổng 6379. Vì chúng ta cần kết nối đến instance Redis OSS chạy trên nút chứ không phải cụm Dynomite, không hỗ trợ lệnh SAVE. Bạn có thể chạy redis-cli không cần đối số.
Trên mỗi nút, chạy lệnh DBSIZE. Bạn sẽ nhận được số key lưu trữ trên mỗi instance Redis OSS. Tổng số phải bằng số key trong database Dynomite.
#a1 127.0.0.1:6379> dbsize (integer) 1323 #a2 127.0.0.1:6379> dbsize (integer) 1371
Chạy lệnh SAVE và kiểm tra file RDB đã được tạo trong /var/lib/redis – hoặc thư mục bạn chỉ định.
Export hai file dump ra lưu trữ bên ngoài
Chúng ta sẵn sàng export hai file RDB ra lưu trữ bên ngoài.
Trong hướng dẫn này, tôi export file lên Google Cloud Storage, nhưng bạn cũng dùng các tùy chọn lưu trữ bên ngoài khác như FTP Server, giải pháp lưu trữ của Cloud Provider khác, hoặc ổ đĩa ngoài truy cập được từ cụm Redis Enterprise. Thêm thông tin về các tùy chọn:
- Redis Enterprise Software
- Redis Enterprise Cloud
Trong Google Cloud, tôi đã tạo:
- Service account với JSON key.
- Cloud storage bucket với quyền Storage Legacy Object Reader cho service account.
Bây giờ với mỗi nút, chạy lệnh sau:
gsutil cp path_to_dump_file gs://your_bucket
Chúng ta thấy hai file RDB trong bucket Google Cloud:
Chúng ta sẵn sàng import chúng vào database Active-Active.
Import file dump vào database Redis Enterprise
Đăng nhập Redis Enterprise UI và chọn database Active-Active. Nếu như hướng dẫn này, bạn tạo database Active-Active trải nhiều cụm, bạn có thể kết nối UI qua bất kỳ cụm nào. Ở đây chúng ta dùng cụm Châu Âu (EU).
Nếu dùng Cloud Active-Active database, chỉ cần kết nối Cloud UI và chọn database.
Điều hướng đến trang cấu hình database và nhấp nút Import. Chọn Storage Type phù hợp. Trong trường hợp này là Google Cloud Storage.
Bây giờ thêm đường dẫn Cloud Storage của hai file RDB:
- /helene-test/dump1.rdb
- /helene-test/dump2.rdb
Cũng cần thêm thông tin:
- client ID
- client email
- private key ID
- private key
Thông tin này có trong file JSON key tải về khi tạo key cho Google Cloud Service Account.
Lưu ý private key trong file JSON có định dạng kỳ lạ; có dấu ngoặc kép và xuống dòng. Để format nhanh cho Redis Enterprise UI chấp nhận, khởi chạy python interpreter và in ra:
print(WHOLE_COPIED_KEY)
Bây giờ chúng ta có cấu hình import sau:
Nhấp Import và chờ hoàn tất, thời gian phụ thuộc vào kích thước database.
Kiểm tra database và cutover
Với redis-cli, kết nối đến endpoint database Redis Enterprise. Thử đọc một số key và chạy DBSIZE để kiểm tra tổng số key đúng.
redis-12000.internal.helene-eu-cluster.demo.redislabs.com:12000> dbsize (integer) 2694
Đừng quên kiểm tra Active-Active Geo-Duplication! Kết nối đến endpoint database của cụm khác, ở đây là cụm Mỹ, và kiểm tra số key.
Di chuyển đã hoàn tất. Bạn có thể cutover traffic sang database nếu chưa làm.
Di chuyển bằng tính năng ReplicaOf
Bây giờ hãy chạy di chuyển liên tục.
Tính năng 'ReplicaOf' của Redis Enterprise (cũng gọi là Active-Passive trong Redis Cloud UI) cho phép replicate dữ liệu liên tục giữa hai database Redis. Ưu điểm chính là replicate delta sau khi đồng bộ hóa ban đầu xong, nghĩa là gần như không downtime phía ứng dụng.
Các bước:
- Thiết lập link ReplicaOf giữa database Dynomite và Active-Active
- Chờ đồng bộ hóa ban đầu hoàn tất
- Dừng traffic trên database Dynomite
- Chờ delta được replicate
- Xóa link ReplicaOf giữa hai database
- Cutover sang database Active-Active
ReplicaOf dùng theo cách Active-Passive. Nghĩa là target được coi là passive, và cần dung nạp để target được re-sync hoàn toàn (flush target database + sync từ source database).
Trước khi bắt đầu di chuyển, thảo luận một chút về bảo mật.
Cấu hình bảo mật cho Redis OSS trong thiết lập Dynomite
Thứ nhất, cần thêm inbound rule cho custom TCP cổng 6379 cho network chứa rack Dynomite.
Thứ hai, file cấu hình Redis OSS trên cả hai nút Dynomite cần cập nhật. Mặc định Redis chỉ lắng nghe trên loopback IPv4 và IPv6 (nếu có). Nghĩa là Redis OSS chỉ chấp nhận kết nối client từ cùng host. Cần cập nhật directive "bind" của Redis OSS để lắng nghe kết nối từ host cụm Redis Enterprise.
Có hai cách làm:
- Cho Redis OSS chỉ lắng nghe kết nối từ máy trong VPC peered – khuyến nghị, an toàn hơn
- Cho phép Redis OSS truy cập từ mọi host – không an toàn, đặc biệt Dynomite không hỗ trợ mật khẩu database
Hãy thảo luận chi tiết hai tùy chọn.
Tùy chọn 1 – Với VPC Peering
Tùy chọn đầu tiên là peer VPC chứa rack Dynomite với VPC chứa cụm Redis Enterprise. Lưu ý, nếu như chúng ta, bạn tạo database Active-Active, nó có thể ở bất kỳ cụm nào. Như trước, dùng cụm Châu Âu (EU) để demo.
Sau khi peer network, chỉ cần chỉnh directive "bind" trong redis.conf: Thêm private IP máy Dynomite sau địa chỉ loopback mặc định.
Làm tương tự cho tất cả nút trong rack và xong! Đừng quên restart instance Redis OSS.
Tùy chọn 2 – Không VPC Peering
Nếu không thể hoặc không muốn peer network, cập nhật file cấu hình Redis OSS như sau, trên mỗi nút:
- Comment directive "bind", sẽ expose Redis OSS instance cho mọi người trên internet
- Đặt "protected-mode" thành "no", để client từ host khác kết nối được Redis ngay cả khi không cấu hình authentication, cũng không liệt kê interface cụ thể qua "bind".
QUAN TRỌNG: Bước cuối cùng bắt buộc vì Dynomite không hỗ trợ lệnh AUTH của Redis OSS, ngăn cản đặt mật khẩu database. Do đó, nếu không dùng firewall kiểm soát ai kết nối đến cổng sử dụng, bất kỳ ai đều có thể kết nối instance Redis OSS và truy cập/thay đổi/xóa dữ liệu. Chỉ mở cổng 6379 cho host cụm Redis Enterprise.
Nếu thực sự muốn dùng mật khẩu, bạn có thể. Nhưng sẽ không thể chạy di chuyển liên tục, vì cần:
- Dừng traffic đến database Dynomite
- Chỉnh directive "requirepass" đặt mật khẩu. Từ thời điểm này, không thể gửi traffic ghi đến Dynomite qua cổng 8379 vì cần lệnh AUTH
- Thực hiện di chuyển ReplicaOf như mô tả dưới
- Cutover traffic sang database Redis Enterprise
Một cân nhắc bảo mật nữa và chúng ta sẵn sàng bắt đầu di chuyển!
Tùy chọn – Bật TLS
Để ngăn truy cập trái phép dữ liệu, Redis Enterprise hỗ trợ giao thức TLS.
Nếu dùng Redis Enterprise Software, có thể cấu hình riêng cho ReplicaOf. Nếu dùng Redis Enterprise Cloud, bật TLS chung.
Thiết lập link ReplicaOf giữa các database
Trong Redis Enterprise UI, điều hướng đến trang cấu hình database Active-Active và nhấp Edit.
Có tùy chọn bật Active-Passive/ReplicaOf. Khi bật, có thể thêm source theo format:
redis://:@IP:port
Lưu ý:
- ReplicaOf cho phép tối đa 32 source. Nghĩa là nếu dataset phân phối trên hơn 32 nút trong rack Dynomite, không dùng được tùy chọn này
- Nếu dùng VPC Peering, dùng private IP máy
- Nếu không dùng VPC Peering:
- Dùng public IP máy
- Nếu đặt mật khẩu database (và chạy di chuyển một lần), mật khẩu cung cấp như: redis://:password@IP:port.
Trong trường hợp chúng ta, với VPC Peering, source trông như sau:
Bắt đầu di chuyển
Bây giờ thực hiện các bước:
- Nhấp Update trong Redis Enterprise UI
- Chờ đồng bộ hóa ban đầu kết thúc
- Dừng traffic đến database Dynomite
- Chờ delta đồng bộ
- Update database Active-Active lại để tắt ReplicaOf
- Bắt đầu traffic trên database Active-Active
Kiểm tra dữ liệu
Như trước, kết nối database với redis-cli và kiểm tra dữ liệu đã di chuyển. Kiểm tra Active-Active Geo-Duplication bằng cách kết nối đến cụm khác/endpoint local khác.
Kết luận
Redis đã được bình chọn là database được developer yêu thích nhất nhiều năm. Nếu bạn dùng Dynomite, có lẽ vì bạn cũng yêu thích Redis. Tại Redis, nhà của cả Redis OSS và Redis Enterprise, chúng tôi giúp tổ chức bạn phân phối địa lý Redis dễ quản lý hơn, đồng thời giữ chuẩn học thuật cao nhất cho giải quyết xung đột.