在過去的七年里,我一直在使用分布式系統(tǒng)、平臺和數(shù)據(jù)庫。早在2015年,許多架構師就開始使用分布式數(shù)據(jù)庫擴展單個機器或服務器的邊界。他們選擇這樣的數(shù)據(jù)庫是因為它的水平可伸縮性,盡管它的性能依然只能與傳統(tǒng)的單服務器數(shù)據(jù)庫相媲美。
現(xiàn)在,隨著云原生應用程序和無服務器架構的興起,分布式數(shù)據(jù)庫需要做的不僅僅是提供橫向可伸縮性。架構師需要在主要云區(qū)中斷期間能夠保持可用的數(shù)據(jù)庫,支持混合云部署,并為接近客戶和最終用戶的數(shù)據(jù)提供服務。這就是地域分布數(shù)據(jù)庫發(fā)揮作用的地方。
作為一名Java開發(fā)人員,我有兩個問題:
1. 我應該投入多少精力為云原生地域分布數(shù)據(jù)庫創(chuàng)建應用程序?
2. 這只是對我現(xiàn)有應用程序的快速重構還是徹底重新設計/重寫?
工作量因用例而異。但即便如此,在構建一個簡單的應用程序時,你也可以從“入門”體驗中學到很多東西。在這篇文章中,我將分享使用YugabyteDB作為地域分布數(shù)據(jù)庫創(chuàng)建Java應用程序時的主要見解。你可以在GitHub上找到完整的源代碼。現(xiàn)在讓我們開始吧!
數(shù)據(jù)庫部署
YugabyteDB提供完全托管的云版本,支持AWS和GCE,類似于其他云原生數(shù)據(jù)庫。作為開發(fā)人員,這對我來說意義重大。我只想運行一個實例,以使我可以專注于應用程序邏輯。
最后,我花了幾分鐘在AWS上啟動一個免費實例,并將連接信息復制到我的應用程序。正如預期的那樣,體驗是順利而快捷的。在編寫一行代碼之前,我必須下載、安裝和配置數(shù)據(jù)庫的日子已經(jīng)一去不復返了。
數(shù)據(jù)庫連接
作為一名后端開發(fā)人員,我很感激有一個原生使用SQL的數(shù)據(jù)庫。這縮短了學習曲線,讓我可以重用現(xiàn)有的邏輯。盡管我使用Spring Data或Micronaut,我仍然編寫和執(zhí)行直接的SQL查詢。
只要YugabyteDB使用Postgres方言,我想我的簡單Java應用程序就可以通過一個很好的老JDBC接口連接到正在運行的數(shù)據(jù)庫實例。使用Yugabyteb,你可以選擇標準PostgreSQL JDBC驅動程序或帶有一些性能優(yōu)勢的原生Yugabyte JDBC驅動程序。我選擇了后者。
幾分鐘后,我把筆記本電腦的IP地址添加到Yugabyte Cloud的IP允許列表中。我還編譯和啟動了示例應用程序,并成功地連接到云實例。JDBC連接邏輯與MySQL、Postgres和其他關系數(shù)據(jù)庫要求我遵循的邏輯沒有什么不同。這是一個非常好的跡象。
YBClusterAwareDataSource ds = new YBClusterAwareDataSource();
ds.setUrl("jdbc:yugabytedb://" + settings.getProperty("host") + ":"
+ settings.getProperty("port") + "/yugabyte");
ds.setUser(settings.getProperty("dbUser"));
ds.setPassword(settings.getProperty("dbPassword"));
// Additional SSL-specific settings. See the source code for details.
Connection conn = ds.getConnection();
更好的是,雖然我的測試使用了一個免費的單節(jié)點實例,但是,就算我的數(shù)據(jù)庫中有60個節(jié)點跨越幾個大洲,連接邏輯仍然保持不變。對于應用程序開發(fā)人員來說,YugabyteDB是一個單一的邏輯實例,所有與數(shù)據(jù)分區(qū)、節(jié)點間通信和分布式查詢執(zhí)行相關的復雜性都是在幕后透明地進行。
基本CRUD操作
建立連接邏輯后,我介紹幾個方法,通過JDBC連接,創(chuàng)建示例表然后查詢和更新其記錄。這意味著我的簡單Java應用程序必須盡可能初級。因此,我選擇了一個非常基本的用例:兩個帳戶之間的資金轉移。
示例表是用標準的CREATE TABLE命令創(chuàng)建:
Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
"(" +
"id int PRIMARY KEY," +
"name varchar," +
"age int," +
"country varchar," +
"balance int" +
")");
并且只填充了兩條記錄(足以評估入門體驗):
stmt.execute("INSERT INTO " + TABLE_NAME + " VALUES" +
"(1, 'Jessica', 28, 'USA', 10000)," +
"(2, 'John', 28, 'Canada', 9000)");
最后,在Postgres或MySQL中查詢和更新類似表的SQL查詢,在我的地域分布數(shù)據(jù)庫中的工作方式是相同的。以下是兩種方法的完整實現(xiàn):第一種方法查詢分布式記錄,第二種方法使用分布式事務一致地更新記錄:
private static void selectAccounts(Connection conn) throws SQLException {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM " + TABLE_NAME);
while (rs.next()) {
System.out.println(String.format("name = %s, age = %s, country = %s, balance = %s",
rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5)));
}
}
private static void transferMoneyBetweenAccounts(Connection conn, int amount) throws SQLException {
Statement stmt = conn.createStatement();
try {
stmt.execute(
"BEGIN TRANSACTION;" +
"UPDATE " + TABLE_NAME + " SET balance = balance - " + amount + "" + " WHERE name = 'Jessica';" +
"UPDATE " + TABLE_NAME + " SET balance = balance + " + amount + "" + " WHERE name = 'John';" +
"COMMIT;"
);
} catch (SQLException e) {
if (e.getErrorCode() == 40001) {
// The operation aborted due to a concurrent transaction trying to modify the same set of rows.
// Consider adding retry logic for production-grade applications.
e.printStackTrace();
} else {
throw e;
}
}
System.out.println();
System.out.println(">>>> Transferred " + amount + " between accounts.");
}
結束語
我很高興地確認,現(xiàn)代地域分布數(shù)據(jù)庫的創(chuàng)建者保護我(應用程序開發(fā)人員)免受與分布式系統(tǒng)相關的大多數(shù)復雜性的影響。我在一分鐘內(nèi)啟動了一個分布式數(shù)據(jù)庫實例,作為單個邏輯實例連接,并通過熟悉的SQL和JDBC接口查詢數(shù)據(jù)庫。我承認,我的簡單Java應用程序遠不是一個包含底層、特定于數(shù)據(jù)庫的優(yōu)化的實際解決方案。然而,入門就像單服務器數(shù)據(jù)庫一樣簡單,這很重要。
你可以在GitHub上找到我的完整應用程序。我鼓勵你嘗試自己運行它。
譯者介紹
楊曉娟,51CTO社區(qū)編輯,西安電子科技大學計算機專業(yè)碩士研究生,資深研發(fā)工程師,信息系統(tǒng)項目管理師,擁有近20年Java開發(fā)經(jīng)驗。分別在NEC、甲骨文、英方從事數(shù)據(jù)存儲、Oracle數(shù)據(jù)庫的數(shù)據(jù)遷移以及同構/異構數(shù)據(jù)庫復制等研發(fā)工作,尤其在數(shù)據(jù)庫、數(shù)據(jù)編碼等方面有深入鉆研和了解。
原文標題:??What Java Developers Need to Know About Geo-Distributed Databases??,作者:Denis Magda