iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
生成式 AI

從系統設計切入,探索 GenAI 在企業中的實踐系列 第 20

[Day20] CDC 實戰-Docker Compose 本地測試到 AWS 雲端部署

  • 分享至 

  • xImage
  •  

以下參考課程 LLM Twin: Building Your Production-Ready AI Replica 撰寫

在前幾篇文章中,我們探討了如何透過 Change Data Capture (CDC) 實踐 RAG 中爬蟲資料庫與向量資料庫的同步,並介紹如何利用 MongoDB 和 RabbitMQ 實現一個完整的 CDC 系統,目前系統流程如下:

  • 前置處理:爬蟲工具從多個平台(如 Medium、Substack、LinkedIn 和 GitHub)獲取內容。
  • MongoDB:用於存儲爬取的內容,配置為複製集以提高可用性。
  • CDC 腳本:運行在 AWS Fargate 上,使用 MongoDB 的變更流功能 (watch()) 捕捉數據變更。
  • RabbitMQ:作為消息代理,接收來自 CDC 進程的變更消息並分發。
  • 後續處理:包括數據前處理和向量存儲,實現 RAG 的資料同步。

今天,我們將進一步深入,介紹如何通過 Docker-compose 在本地開發環境中進行測試,最終部署到雲端,以及可以透過哪些雲端工具擴展我們的服務。

使用 Docker-Compose 設置本地開發環境

在本地環境中,我們將使用 Docker-Compose 來同時運行 MongoDB 複製集和 RabbitMQ 消息代理,以便開發和測試,而無需在本機安裝和配置複雜的服務。

MongoDB 複製集配置

docker-compose.yml 中,我們設置了三個 MongoDB 實例來組成複製集,並配置了每個實例的容器名稱、端口和實例的健康檢查:


services:
  mongo1:
    image: mongo:5
    container_name: mongo1
    command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "30001"]
    volumes:
      - ./data/mongo-1:/data/db
    ports:
      - 30001:30001
    healthcheck:
      test: test $$(echo "rs.initiate({_id:'my-replica-set',members:[{_id:0,host:\"mongo1:30001\"},{_id:1,host:\"mongo2:30002\"},{_id:2,host:\"mongo3:30003\"}]}).ok || rs.status().ok" | mongo --port 30001 --quiet) -eq 1
      interval: 10s
      start_period: 30s

  mongo2:
    # Similar configuration as mongo1, but with port 30002

  mongo3:
    # Similar configuration as mongo1, but with port 30003
    
  mq:
    # introduce in the next part

這樣的設置確保了 MongoDB 複製集能夠在容器啟動時自動初始化,並進行健康檢查來保證系統的穩定性。使用複製集的好處包括:

  • 高可用性:如果主節點出現故障,從節點可以自動接管,確保服務不中斷。
  • 數據冗餘:多個節點保存相同的數據,降低資料遺失的風險。
  • 讀寫分離:可以將讀操作分散到從節點,提高系統整體性能。

RabbitMQ 消息代理設置

我們繼續寫完 docker-compose.yml,在 RabbitMQ 的設置上,我們使用 rabbitmq:3-management-alpine 映像,並開啟管理插件來方便我們查看隊列狀態和消息流動。

services:
  # 上述 mongoDB 的配置,此處省略
  mq:
    image: rabbitmq:3-management-alpine
    container_name: scrabble_mq
    ports:
      - "5673:5672"
      - "15673:15672"
    volumes:
      - ~/rabbitmq/data/:/var/lib/rabbitmq/
      - ~/rabbitmq/log/:/var/log/rabbitmq
    restart: always

這樣的設置將 RabbitMQ 的管理界面暴露在 15673 端口上,方便通過瀏覽器進行管理。在這裡回顧 RabbitMQ 的的主要功用:

  • 解耦:將消息的生產者和消費者分離,增加系統的靈活性。
  • 異步處理:允許消息的生產和消費以不同的速率進行,提高系統吞吐量。
  • 峰值處理:在高峰期可以緩存消息,避免系統過載。

本地環境測試:啟動 CDC 系統

為了簡化測試和開發過程,我們創建一個 .Makefile

這個 Makefile 包含了啟動系統、運行 CDC 和測試的命令,大大簡化了我們的操作流程。以下是 Makefile 的內容:

local-start: # Build and start mongodb and mq.
	docker-compose -f docker-compose.yml up --build -d

local-start-cdc: # Start CDC system
	python cdc.py

local-test-cdc: # Test CDC system by inserting data to mongodb
	python test_cdc.py

這個 Makefile 定義了三個主要任務,每個任務都有特定的用途:

  • local-start: 構建並啟動 MongoDB 和 RabbitMQ 服務。
  • local-start-cdc: 啟動 CDC 系統。
  • local-test-cdc: 通過向 MongoDB 插入資料來測試 CDC 系統。

1. 啟動 MongoDB 和 RabbitMQ 服務

首先,我們使用以下命令來啟動 MongoDB 和 RabbitMQ 容器:

make local-start

這個命令會根據 docker-compose.yml 文件啟動所有服務,接著可以使用前幾天介紹的 docker ps 檢查服務狀態,確保所有容器都正常運作。

2. 啟動 CDC 監控系統

接著,我們使用以下命令來啟動 CDC 系統,開始監控 MongoDB 中的數據變更:

make local-start-cdc

這個命令會執行 cdc.py 腳本,該腳本會監控 MongoDB 的數據變更,並將變更格式化後發送至 RabbitMQ。

3. 插入測試數據

最後,我們使用測試腳本在 mongoDB 中插入資料,以觸發 CDC 系統:

make local-test-cdc

這將執行 test_cdc.py 腳本,插入測試資料到 MongoDB,並觀察 CDC 系統是否正確捕捉到變更並將其發布到 RabbitMQ。

當 CDC 系統捕捉到變更時,您會在日誌中看到如下輸出:

2024-04-05 04:43:51,510 - INFO - Change detected and serialized: {"name": "LLM TWIN", "type": "test", "entry_id": "660f5757b3153bbb219fd901"}
2024-04-05 04:43:51,534 - INFO - Data published to RabbitMQ.

部署到雲端:CDC 系統雲端運行

在將本地 CDC 系統遷移到雲端環境時,我們需要充分利用雲服務提供的優勢,以實現系統的高可擴展性、可用性和可維護性。以下是基於 AWS 服務的系統架構概覽和關鍵組件選擇:

主要系統架構與核心服務

系統層 功能描述 核心工具 優勢
內容抓取層 運行爬蟲和處理器腳本 AWS Lambda 無伺服器、按需擴展、成本效益高
數據存儲層 存儲爬取的內容 Amazon DocumentDB 完全托管、MongoDB 兼容、高可用性
變更捕獲層 運行 CDC 腳本 AWS Fargate 容器化部署、自動擴展、資源隔離
消息代理層 處理消息傳遞 Amazon MQ 托管 RabbitMQ 服務、高可用性、易於集成
處理和分析層 進行後續的數據處理和分析 AWS Lambda 事件驅動、無伺服器、彈性擴展

輔助功能與支援服務

輔助功能 工具 用途
負載均衡和流量管理 Amazon ELB (Elastic Load Balancing) 分配流量、提高可用性
自動擴展 AWS Auto Scaling 自動調整資源以應對負載變化
監控和日誌 Amazon CloudWatch 性能監控、日誌管理、警報設置
安全和訪問控制 AWS IAM, VPC, Security Groups 身份驗證、授權、網絡隔離
CI/CD GitHub Actions, AWS CodePipeline 自動化測試、構建和部署流程
基礎設施即代碼(IaC) AWS CloudFormation 或 Terraform 自動化和版本控制基礎設施配置
緩存 Amazon ElastiCache 提高數據訪問速度、減輕數據庫負載
實時數據處理 Amazon Kinesis 處理大規模實時數據流
成本管理 AWS Cost Explorer, AWS Budgets 成本分析、預算設置、優化支出
分佈式追蹤 AWS X-Ray 診斷性能問題、分析服務依賴

ref.


上一篇
[Day19] CDC 實戰-MongoDB 變更流與 RabbitMQ 消息代理
下一篇
[Day21] 結構化資料前處理:Pydantic 管理資料狀態
系列文
從系統設計切入,探索 GenAI 在企業中的實踐25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言