לקוח Cassandra Go ל-Spanner מקשר בין אפליקציות שנכתבו עבור מסד הנתונים של Apache Cassandra לבין Spanner. הלקוח פועל עם Spanner Omni באותו אופן שבו הוא פועל עם Spanner.
מכיוון ש-Spanner תומך באופן מובנה בפרוטוקול Cassandra v4 wire, הלקוח הזה מאפשר לאפליקציות Go שמשתמשות במנהל ההתקנים gocql, או לאפליקציות ולכלים שאינם Go כמו cqlsh, להתחבר למסד נתונים של Spanner.
הלקוח הזה פועל כפרוקסי TCP מקומי. הוא מיירט את הבייטים של פרוטוקול Cassandra הגולמי שנשלחים על ידי כלי דרייבר או לקוח. לאחר מכן, הוא עוטף את הבייטים האלה ואת המטא-נתונים הדרושים בהודעות gRPC כדי לתקשר עם Spanner Omni. הלקוח מתרגם את התגובות מ-Spanner Omni בחזרה לפורמט של Cassandra wire ושולח אותן בחזרה לדרייבר או לכלי המקוריים.
במאמר הזה מוסבר איך לשלב את הלקוח עם Spanner Omni באחת מהשיטות הבאות:
תלות בתהליך: משתמשים בשיטה הזו באפליקציות Go שכבר משתמשות במנהל ההתקנים
gocql. הגישה הזו מטמיעה את הלקוח בתהליך הבקשה שלכם כדי לבצע שינויים מינימליים בקוד.Sidecar proxy: משתמשים בשיטה הזו באפליקציות שאינן Go או כשמשתמשים בכלים חיצוניים של Cassandra, כמו
cqlsh. בגישה הזו, הלקוח פועל כתהליך עצמאי.
מידע נוסף על אופן הפעולה של Apache Cassandra עם Spanner זמין במאמר בנושא ממשק Cassandra.
מתי כדאי להשתמש בלקוח Spanner Cassandra Go
הלקוח הזה שימושי בתרחישים הבאים:
שימוש ב-Spanner עם מינימום שינויים בקוד. אתם רוצים להשתמש ב-Spanner כקצה העורפי של אפליקציית Go, אבל אתם מעדיפים להמשיך להשתמש ב-API המוכר של
gocqlכדי לגשת לנתונים.שימוש בכלים של Cassandra שאינם של Go. רוצים להתחבר ל-Spanner באמצעות כלים סטנדרטיים של Cassandra כמו
cqlshאו אפליקציות שנכתבו בשפות אחרות שמשתמשות במנהלי התקנים של Cassandra.
שימוש בלקוח כתלות בתהליך
אפליקציות Go מתחברות ל-Spanner Omni על ידי שילוב של לקוח Spanner Cassandra Go כתלות בתוך התהליך. בגישה הזו, לוגיקת ה-proxy מוטמעת ישירות באפליקציה, וכך מפשטת את ארכיטקטורת הפריסה כי לא צריך תהליך נפרד. ההגדרה הזו גם מספקת ביצועים אופטימליים כי היא מונעת צעד נוסף ברשת וסריאליזציה ודסריאליזציה נוספות של הנתונים.
כדי להשתמש בלקוח כתלות בתהליך:
מייבאים את חבילת Spanner באפליקציית Go:
import spanner "github.com/googleapis/go-spanner-cassandra/cassandra/gocql"משנים את קוד יצירת האשכול. במקום להשתמש ב-
gocql.NewCluster, משתמשים ב-spanner.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.SpannerEndpoint = "ENDPOINT" opts.InstanceType = spanner.Omni opts.UsePlainText = true cluster := spanner.NewCluster(opts) // ... }TLS
בדוגמה הבאה מוצג איך ליצור חיבור TLS ל-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.SpannerEndpoint = "ENDPOINT" opts.InstanceType = spanner.Omni opts.CaCertificate = "PATH_TO_CA_CRT" cluster := spanner.NewCluster(opts) // ... }mTLS
בדוגמה הבאה מוצג איך ליצור חיבור mTLS ל-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.SpannerEndpoint = "ENDPOINT" opts.InstanceType = spanner.Omni opts.CaCertificate = "PATH_TO_CA_CRT" opts.ClientCertificate = "PATH_TO_CLIENT_CERT" opts.ClientKey = "PATH_TO_CLIENT_KEY" cluster := spanner.NewCluster(opts) // ... }מחליפים את מה שכתוב בשדות הבאים:
DATABASE_ID: המזהה של מסד הנתונים של Spanner Omni, לדוגמה,test-db.
ENDPOINT: נקודת הקצה של מופע Spanner Omni, לדוגמה,localhost:15000.PATH_TO_CA_CRT: הנתיב לקובץ אישור ה-CA.
PATH_TO_CLIENT_CERT: הנתיב לקובץ אישור הלקוח.
PATH_TO_CLIENT_KEY: הנתיב לקובץ מפתח הלקוח.
פריסת הלקוח כקובץ עזר חיצוני
פריסת לקוח Spanner Cassandra Go כפרוקסי sidecar היא אפשרות יעילה לאפליקציות ולכלים שאינם Go, כמו cqlsh, להתחבר ל-Spanner Omni באמצעות דרייברים סטנדרטיים של Cassandra. בשיטה הזו, הלקוח מופעל כשרת proxy עצמאי של TCP שמיירט את תעבורת הנתונים של פרוטוקול Cassandra וממיר אותה ל-gRPC לצורך תקשורת עם Spanner Omni.
ההגדרה הזו שימושית כשצריך להשתמש בכלים חיצוניים של Cassandra או כשרוצים להימנע משינויים ישירים בקוד של האפליקציה.
אפשר להריץ את ה-proxy של ה-sidecar בדרכים הבאות:
הרצה מקומית באמצעות הפקודה run של Go
הפעלת פרוקסי מסוג sidecar כתהליך מקומי מקוד המקור שימושית בסביבות פיתוח ובדיקה שבהן רוצים לבצע איטרציות מהירות באפליקציה ובהגדרות הפרוקסי.
משכפלים את המאגר:
git clone https://github.com/googleapis/go-spanner-cassandra.gitעוברים לספריית המאגר:
cd go-spanner-cassandraמריצים את הפקודה
cassandra_launcher.goעם הדגל-dbהנדרש ועם הדגלים הספציפיים הבאים של Spanner Omni:טקסט פשוט
כדי להריץ את הפקודה עם תקשורת בטקסט רגיל, מריצים את הפקודה הבאה:
go run cassandra_launcher.go -db DATABASE_ID -endpoint ENDPOINT -instanceType OMNI -usePlainTextTLS
כדי להריץ עם חיבור TLS, מריצים את הפקודה הבאה:
go run cassandra_launcher.go -db DATABASE_ID -endpoint ENDPOINT -instanceType OMNI -caCertificate PATH_TO_CA_CRTmTLS
כדי להריץ עם חיבור mTLS, מריצים את הפקודה הבאה:
go run cassandra_launcher.go -db DATABASE_ID -endpoint ENDPOINT -instanceType OMNI -caCertificate PATH_TO_CA_CRT -clientCertificate PATH_TO_CLIENT_CERT -clientKey PATH_TO_CLIENT_KEY
הרצה עם קובץ אימג' של Docker שנבנה מראש
אנחנו ממליצים להריץ את ה-proxy של ה-sidecar כאפליקציה בקונטיינר באמצעות תמונת Docker מוכנה מראש לסביבות ייצור, כי היא מספקת סביבת זמן ריצה עקבית ומבודדת.
שולפים את התמונה ממאגר הרישום הרשמי:
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 -instanceType OMNI -usePlainTextTLS
כדי להריץ עם חיבור TLS, מריצים את הפקודה הבאה:
docker run -d -p 9042:9042 gcr.io/cloud-spanner-adapter/cassandra-adapter -db DATABASE_ID -endpoint ENDPOINT -instanceType OMNI -caCertificate PATH_TO_CA_CRTmTLS
כדי להריץ עם חיבור mTLS, מריצים את הפקודה הבאה:
docker run -d -p 9042:9042 gcr.io/cloud-spanner-adapter/cassandra-adapter -db DATABASE_ID -endpoint ENDPOINT -instanceType OMNI -caCertificate PATH_TO_CA_CRT -clientCertificate PATH_TO_CLIENT_CERT -clientKey PATH_TO_CLIENT_KEY