在 Firebase 實時數據庫中優化性能和擴展數據的最佳方法是將數據拆分到多個實時數據庫實例,也稱為數據庫分片。除了負載平衡和性能優化之外,分片還使您能夠靈活地擴展到超出適用於單個數據庫實例的限制。
何時對數據進行分片
如果您使用實時數據庫並符合以下任一場景,您可能希望將數據分片到多個數據庫:
- 您希望擴展到超過 200,000 個並發連接、每秒 1,000 個寫入操作的限製或單個數據庫實例的任何其他限制。
- 您有多個離散的數據集,並且希望優化性能(例如,為單獨的獨立用戶組提供服務的聊天應用程序)。
- 您希望平衡多個數據庫之間的負載,以提高正常運行時間並降低單個數據庫實例過載的風險。
如何對數據進行分片
要對數據進行分片,請按照以下步驟操作(下面將詳細介紹):
- 根據應用程序的特定需求將數據映射到多個數據庫。
- 創建多個數據庫實例。
- 配置您的應用程序,使其連接到每個數據集所需的實時數據庫實例。
映射您的數據
當您將數據映射到多個數據庫時,請嘗試滿足以下條件:
- 每個查詢僅針對單個數據庫實例運行。實時數據庫不支持跨數據庫實例的查詢。
- 跨數據庫實例不共享或重複數據(或最少共享或重複)。
- 每個應用程序實例在任何給定時刻僅連接到一個數據庫。
在映射數據時,請考慮應用以下策略:
創建“主碎片”
存儲數據在數據庫實例之間存儲方式的映射。這樣,您可以以編程方式查找與連接客戶端相對應的數據庫實例。請記住,這可能比在需要時直接連接到您需要的特定數據庫實例產生更多開銷。
按類別或客戶存儲數據
將數據存儲在孤立的數據庫實例中,並按用戶或數據類型分組。例如,如果您構建一個為多個組織提供服務的聊天應用程序,則可以為每個組織創建一個數據庫實例,並將所有聊天數據存儲在唯一的數據庫實例中。
在這種情況下,組織 A 和組織 B 不共享數據,數據庫中沒有任何重複數據,並且您僅對單個數據庫實例執行查詢。此外,每個組織中的用戶僅在使用聊天應用程序時連接到其組織的數據庫。
然後,您可以提前創建多個數據庫實例,並使用組織的 ID 將團隊映射到其數據庫實例。例如,組織 A 映射到實時數據庫 A。
為應用程序映射數據的方式取決於您的特定用例,但上面概述的條件和策略可以幫助您定義適合您的數據的方法。
創建多個實時數據庫實例
如果您採用Blaze 定價計劃,則可以在同一 Firebase 項目中最多創建 1,000 個數據庫實例。
- 在 Firebase 控制台中,轉到“開發”>“數據庫”部分中的“數據”選項卡。
- 從實時數據庫部分的菜單中選擇創建新數據庫。
- 自定義您的數據庫參考和安全規則,然後單擊“知道了” 。
重複該過程以創建所需數量的數據庫實例。每個數據庫實例都有自己的一組 Firebase 實時數據庫安全規則,因此您可以微調對數據的訪問。
您可以在 Firebase 控制台中或使用實時數據庫管理 REST API創建和管理數據庫實例。
為每個實例編輯和部署實時數據庫安全規則
確保您的實時數據庫安全規則允許對項目中的每個數據庫實例進行適當的訪問。每個數據庫都有自己的一組規則,您可以從 Firebase 控制台編輯和部署這些規則,或使用Firebase CLI 部署目標。
要從 Firebase 控制台編輯和部署規則,請按照以下步驟操作:
- 轉到“開發”>“數據庫”部分中的“規則”選項卡。
- 選擇要編輯的數據庫,然後修改規則。
要從 Firebase CLI 編輯和部署規則,請執行以下步驟:
- 修改數據庫實例的規則文件中的規則(例如
foo.rules.json
)。 - 創建並應用部署目標來關聯使用相同規則文件的數據庫。例如:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
使用部署目標更新
firebase.json
配置文件:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
運行部署命令:
firebase deploy
- 修改數據庫實例的規則文件中的規則(例如
確保您在同一位置一致地編輯和部署規則。從 Firebase CLI 部署規則會覆蓋您在 Firebase 控制台中所做的任何編輯,直接在 Firebase 控制台中編輯規則會覆蓋您最近通過 Firebase CLI 部署的任何更改。
將您的應用程序連接到多個數據庫實例
使用數據庫引用訪問輔助數據庫實例中存儲的數據。您可以通過 URL 或應用程序獲取特定數據庫實例的引用。如果您不指定 URL,您將獲得應用程序默認數據庫實例的引用。
Web modular API
import { initializeApp } from "firebase/app"; import { getDatabase } from "firebase/database"; const app1 = initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 const database1 = getDatabase(app1); // Get a database instance for app2 const database2 = getDatabase(app2);
Web namespaced API
const app1 = firebase.initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = firebase.initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 var database1 = firebase.database(); // Get a database instance for app2 var database2 = firebase.database(app2);
迅速
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()// 通過 URL 獲取輔助數據庫實例 var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];// 通過 URL 獲取輔助數據庫實例 @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] 參考];
Kotlin+KTX
// Get the default database instance for an app val primary = Firebase.database.reference // Get a secondary database instance by URL val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference
Java
// Get the default database instance for an app DatabaseReference primary = FirebaseDatabase.getInstance() .getReference(); // Get a secondary database instance by URL DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com") .getReference();
使用 Firebase CLI 時指定實例
使用--instance
選項指定要將 Firebase CLI 命令應用到的 Firebase 實時數據庫。例如,使用以下命令為名為my-example-shard.firebaseio.com
的數據庫實例運行探查器:
firebase database:profile --instance "my-example-shard"
優化每個數據庫上的連接
如果每個客戶端在會話期間需要連接到多個數據庫,您可以通過僅在必要時連接到每個數據庫實例來減少同時連接到每個數據庫實例的數量。
獲取更多建議
如果您需要更多幫助來跨多個數據庫實例分片數據,請聯繫我們的Slack 頻道或Stack Overflow上的 Firebase 專家。
,在 Firebase 實時數據庫中優化性能和擴展數據的最佳方法是將數據拆分到多個實時數據庫實例,也稱為數據庫分片。除了負載平衡和性能優化之外,分片還使您能夠靈活地擴展到超出適用於單個數據庫實例的限制。
何時對數據進行分片
如果您使用實時數據庫並符合以下任一場景,您可能希望將數據分片到多個數據庫:
- 您希望擴展到超過 200,000 個並發連接、每秒 1,000 個寫入操作的限製或單個數據庫實例的任何其他限制。
- 您有多個離散的數據集,並且希望優化性能(例如,為單獨的獨立用戶組提供服務的聊天應用程序)。
- 您希望平衡多個數據庫之間的負載,以提高正常運行時間並降低單個數據庫實例過載的風險。
如何對數據進行分片
要對數據進行分片,請按照以下步驟操作(下面將詳細介紹):
- 根據應用程序的特定需求將數據映射到多個數據庫。
- 創建多個數據庫實例。
- 配置您的應用程序,使其連接到每個數據集所需的實時數據庫實例。
映射您的數據
當您將數據映射到多個數據庫時,請嘗試滿足以下條件:
- 每個查詢僅針對單個數據庫實例運行。實時數據庫不支持跨數據庫實例的查詢。
- 跨數據庫實例不共享或重複數據(或最少共享或重複)。
- 每個應用程序實例在任何給定時刻僅連接到一個數據庫。
在映射數據時,請考慮應用以下策略:
創建“主碎片”
存儲數據在數據庫實例之間存儲方式的映射。這樣,您可以以編程方式查找與連接客戶端相對應的數據庫實例。請記住,這可能比在需要時直接連接到您需要的特定數據庫實例產生更多開銷。
按類別或客戶存儲數據
將數據存儲在孤立的數據庫實例中,並按用戶或數據類型分組。例如,如果您構建一個為多個組織提供服務的聊天應用程序,則可以為每個組織創建一個數據庫實例,並將所有聊天數據存儲在唯一的數據庫實例中。
在這種情況下,組織 A 和組織 B 不共享數據,數據庫中沒有任何重複數據,並且您僅對單個數據庫實例執行查詢。此外,每個組織中的用戶僅在使用聊天應用程序時連接到其組織的數據庫。
然後,您可以提前創建多個數據庫實例,並使用組織的 ID 將團隊映射到其數據庫實例。例如,組織 A 映射到實時數據庫 A。
為應用程序映射數據的方式取決於您的特定用例,但上面概述的條件和策略可以幫助您定義適合您的數據的方法。
創建多個實時數據庫實例
如果您採用Blaze 定價計劃,則可以在同一 Firebase 項目中最多創建 1,000 個數據庫實例。
- 在 Firebase 控制台中,轉到“開發”>“數據庫”部分中的“數據”選項卡。
- 從實時數據庫部分的菜單中選擇創建新數據庫。
- 自定義您的數據庫參考和安全規則,然後單擊“知道了” 。
重複該過程以創建所需數量的數據庫實例。每個數據庫實例都有自己的一組 Firebase 實時數據庫安全規則,因此您可以微調對數據的訪問。
您可以在 Firebase 控制台中或使用實時數據庫管理 REST API創建和管理數據庫實例。
為每個實例編輯和部署實時數據庫安全規則
確保您的實時數據庫安全規則允許對項目中的每個數據庫實例進行適當的訪問。每個數據庫都有自己的一組規則,您可以從 Firebase 控制台編輯和部署這些規則,或使用Firebase CLI 部署目標。
要從 Firebase 控制台編輯和部署規則,請按照以下步驟操作:
- 轉到“開發”>“數據庫”部分中的“規則”選項卡。
- 選擇要編輯的數據庫,然後修改規則。
要從 Firebase CLI 編輯和部署規則,請執行以下步驟:
- 修改數據庫實例的規則文件中的規則(例如
foo.rules.json
)。 - 創建並應用部署目標來關聯使用相同規則文件的數據庫。例如:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
使用部署目標更新
firebase.json
配置文件:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
運行部署命令:
firebase deploy
- 修改數據庫實例的規則文件中的規則(例如
確保您在同一位置一致地編輯和部署規則。從 Firebase CLI 部署規則會覆蓋您在 Firebase 控制台中所做的任何編輯,直接在 Firebase 控制台中編輯規則會覆蓋您最近通過 Firebase CLI 部署的任何更改。
將您的應用程序連接到多個數據庫實例
使用數據庫引用訪問輔助數據庫實例中存儲的數據。您可以通過 URL 或應用程序獲取特定數據庫實例的引用。如果您不指定 URL,您將獲得應用程序默認數據庫實例的引用。
Web modular API
import { initializeApp } from "firebase/app"; import { getDatabase } from "firebase/database"; const app1 = initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 const database1 = getDatabase(app1); // Get a database instance for app2 const database2 = getDatabase(app2);
Web namespaced API
const app1 = firebase.initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = firebase.initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 var database1 = firebase.database(); // Get a database instance for app2 var database2 = firebase.database(app2);
迅速
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()// 通過 URL 獲取輔助數據庫實例 var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];// 通過 URL 獲取輔助數據庫實例 @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] 參考];
Kotlin+KTX
// Get the default database instance for an app val primary = Firebase.database.reference // Get a secondary database instance by URL val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference
Java
// Get the default database instance for an app DatabaseReference primary = FirebaseDatabase.getInstance() .getReference(); // Get a secondary database instance by URL DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com") .getReference();
使用 Firebase CLI 時指定實例
使用--instance
選項指定要將 Firebase CLI 命令應用到的 Firebase 實時數據庫。例如,使用以下命令為名為my-example-shard.firebaseio.com
的數據庫實例運行探查器:
firebase database:profile --instance "my-example-shard"
優化每個數據庫上的連接
如果每個客戶端在會話期間需要連接到多個數據庫,您可以通過僅在必要時連接到每個數據庫實例來減少同時連接到每個數據庫實例的數量。
獲取更多建議
如果您需要更多幫助來跨多個數據庫實例分片數據,請聯繫我們的Slack 頻道或Stack Overflow上的 Firebase 專家。