Spanner 的 Cassandra Go 用戶端可將為 Apache Cassandra 資料庫編寫的應用程式連線至 Spanner。用戶端與 Spanner Omni 的運作方式,與 Spanner 相同。由於 Spanner 原生支援 Cassandra v4 網路通訊協定,因此這個用戶端可讓使用 gocql 驅動程式的 Go 應用程式,或 cqlsh 等非 Go 應用程式和工具,連線至 Spanner 資料庫。
這個用戶端會做為本機 TCP Proxy。攔截驅動程式或用戶端工具傳送的原始 Cassandra 通訊協定位元組。接著,它會將這些位元組和必要的中繼資料包裝成 gRPC 訊息,與 Spanner Omni 通訊。用戶端會將 Spanner Omni 的回應翻譯回 Cassandra 連線格式,並傳送回原始驅動程式或工具。
本文說明如何使用下列其中一種方法,將用戶端與 Spanner Omni 整合:
程序內依附元件:如果 Go 應用程式已使用
gocql驅動程式,請使用這個方法。這種方法會在應用程式程序中嵌入用戶端,因此程式碼修改幅度最小。Sidecar Proxy:如果應用程式不是以 Go 語言編寫,或是使用
cqlsh等外部 Cassandra 工具,請使用這個方法。這種做法會將用戶端做為獨立程序執行。
如要進一步瞭解 Apache Cassandra 如何與 Spanner 搭配運作,請參閱 Cassandra 介面。
使用 Spanner Cassandra Go 用戶端的時機
這個用戶端適用於下列情境:
以最少的重構作業使用 Spanner。您想將 Spanner 做為 Go 應用程式的後端,但偏好繼續使用熟悉的
gocqlAPI 存取資料。使用非 Go 的 Cassandra 工具。您想使用標準 Cassandra 工具 (例如
cqlsh) 連線至 Spanner,或是使用以其他語言編寫的應用程式 (這些應用程式使用 Cassandra 驅動程式)。
將用戶端做為程序內依附元件使用
Go 應用程式會整合 Spanner Cassandra Go 用戶端,做為程序內依附元件,藉此連線至 Spanner Omni。這種做法會將 Proxy 邏輯直接嵌入應用程式,因此不必使用個別程序,可簡化部署架構。此外,這項設定可避免額外的網路躍點,以及額外的資料序列化和還原序列化,進而提供最佳效能。
如要將用戶端做為程序內依附元件使用,請執行下列操作:
在 Go 應用程式中匯入 Spanner 套件:
import spanner "github.com/googleapis/go-spanner-cassandra/cassandra/gocql"修改叢集建立程式碼。請使用
spanner.NewCluster而非gocql.NewCluster,並提供下列 Spanner Omni 專屬選項:純文字通訊
以下範例說明如何建立與 Spanner Omni 的純文字連線:
func main() { opts := &spanner.Options{ // Required: Specify the Spanner database URI DatabaseUri: "DATABASE_ID", } // Optional: Configure Spanner Omni cluster settings as needed opts.ExperimentalHost = true opts.UsePlainText = true cluster := spanner.NewCluster(opts) // ... }TLS 連線
以下範例說明如何建立與 Spanner Omni 的 TLS 連線:
func main() { opts := &spanner.Options{ // Required: Specify the Spanner database URI DatabaseUri: "DATABASE_ID", } // Optional: Configure Spanner Omni cluster settings as needed opts.ExperimentalHost = true opts.CaCertificate = "PATH_TO_CA_CRT" cluster := spanner.NewCluster(opts) // ... }mTLS 連線
以下範例說明如何建立與 Spanner Omni 的 mTLS 連線:
func main() { opts := &spanner.Options{ // Required: Specify the Spanner database URI DatabaseUri: "DATABASE_ID", } // Optional: Configure Spanner Omni cluster settings as needed opts.ExperimentalHost = true opts.CaCertificate = "PATH_TO_CA_CRT" opts.ClientCertificate = "PATH_TO_CLIENT_CERT" opts.ClientKey = "PATH_TO_CLIENT_KEY" cluster := spanner.NewCluster(opts) // ... }
將用戶端部署為 Sidecar Proxy
將 Spanner Cassandra Go 用戶端部署為 Sidecar Proxy,是適用於非 Go 應用程式和工具 (例如 cqlsh) 的有效選項,可使用標準 Cassandra 驅動程式連線至 Spanner Omni。這個方法會將用戶端做為獨立的 TCP Proxy 執行,攔截 Cassandra 網路通訊協定流量,並將其轉換為 gRPC,以便與 Spanner Omni 通訊。
如果您需要使用外部 Cassandra 工具,或避免直接修改應用程式的程式碼,這項設定就非常實用。
您可以透過下列方式執行 Sidecar Proxy:
使用 Go run 指令在本機執行
從原始碼以本機程序形式執行 Sidecar Proxy,有助於開發和測試環境,您可以在這些環境中快速疊代應用程式和 Proxy 設定。
複製存放區:
git clone https://github.com/googleapis/go-spanner-cassandra.git切換至存放區目錄:
cd go-spanner-cassandra使用必要
-db旗標和下列 Spanner Omni 專屬旗標執行cassandra_launcher.go。將-db的值替換為 Spanner Omni 資料庫名稱:
- 如要進行純文字通訊,請執行下列指令:
go run cassandra_launcher.go -db DATABASE_ID -endpoint ENDPOINT -experimentalHost -usePlainText
- 如為 TLS 連線,請執行下列指令:
go run cassandra_launcher.go -db DATABASE_ID -endpoint ENDPOINT -experimentalHost -caCertificate PATH_TO_CA_CRT
- 如要建立 mTLS 連線,請執行下列指令:
go run cassandra_launcher.go -db DATABASE_ID -endpoint ENDPOINT -experimentalHost -caCertificate PATH_TO_CA_CRT -clientCertificate PATH_TO_CLIENT_CERT -clientKey PATH_TO_CLIENT_KEY
使用預先建構的 Docker 映像檔執行
建議您使用預建的 Docker 映像檔,以容器化應用程式的形式執行 Sidecar Proxy,因為這樣可提供一致且獨立的執行階段環境。
從官方登錄檔存放區提取映像檔:
docker pull gcr.io/cloud-spanner-adapter/cassandra-adapter使用必要旗標執行映像檔:
純文字通訊
如要進行純文字通訊,請執行下列指令:
docker run -d -p 9042:9042 gcr.io/cloud-spanner-adapter/cassandra-adapter -db DATABASE_ID -endpoint ENDPOINT -experimentalHost -usePlainTextTLS 連線
如為 TLS 連線,請執行下列指令:
docker run -d -p 9042:9042 gcr.io/cloud-spanner-adapter/cassandra-adapter -db DATABASE_ID -endpoint ENDPOINT -experimentalHost -caCertificate PATH_TO_CA_CRTmTLS 連線
如為 mTLS 連線,請執行下列指令:
docker run -d -p 9042:9042 gcr.io/cloud-spanner-adapter/cassandra-adapter -db DATABASE_ID -endpoint ENDPOINT -experimentalHost -caCertificate PATH_TO_CA_CRT -clientCertificate PATH_TO_CLIENT_CERT -clientKey PATH_TO_CLIENT_KEY