Mulai dari V1.3, Hologres memungkinkan Anda mengonfigurasi beberapa instans secondary read-only dalam Java Database Connectivity (JDBC) untuk mengimplementasikan load balancing sederhana. Topik ini menjelaskan cara mengimplementasikan load balancing berbasis JDBC.
Informasi latar belakang
Di Hologres, sebuah instans primary dapat disambungkan ke beberapa instans secondary read-only. Instans-instans tersebut menggunakan penyimpanan bersama, tetapi sumber daya komputasinya terisolasi satu sama lain. Hal ini menyediakan penerapan ketersediaan tinggi (HA) dengan pemisahan baca/tulis. Untuk informasi selengkapnya, lihat Instans primary dan secondary dengan pemisahan baca/tulis (penyimpanan bersama).
Hologres memungkinkan Anda menggunakan JDBC untuk mengonfigurasi beberapa instans secondary read-only guna mengimplementasikan load balancing sederhana, seperti yang ditunjukkan pada gambar berikut:
Anda dapat mengonfigurasi beberapa instans secondary read-only dalam JDBC untuk mencapai hal-hal berikut:
-
Mendistribusikan permintaan kueri secara acak ke instans secondary read-only agar tidak terjadi muatan tinggi pada satu instans saja.
-
Menyambungkan ke instans secondary read-only secara berurutan untuk meningkatkan ketersediaan layanan jika terjadi kegagalan instans. Prosesnya sebagai berikut:
-
Jika koneksi ke instans secondary read-only 1 gagal, JDBC secara otomatis mencoba menyambungkan ke instans secondary read-only 2.
-
Jika koneksi ke instans secondary read-only 1 dan instans secondary read-only 2 gagal, JDBC secara otomatis mencoba menyambungkan ke instans secondary read-only 3.
-
Sistem hanya melaporkan kegagalan koneksi jika koneksi ke ketiga instans tersebut gagal.
-
Mulai dari Hologres V2.0.10, parameter targetServerType mendukung lebih banyak nilai untuk mengakomodasi berbagai skenario load balancing.
Catatan penggunaan
Prasyarat
-
Anda telah membeli beberapa instans secondary read-only Hologres dan menyambungkannya ke instans primary Hologres. Untuk informasi selengkapnya, lihat Konfigurasi instans primary dan secondary yang menggunakan penyimpanan bersama.
-
Anda telah mengunduh driver JDBC PostgreSQL versi 42.3.2 atau yang lebih baru. Untuk informasi selengkapnya, lihat JDBC.
Format perintah
Untuk mengonfigurasi beberapa instans secondary read-only dalam JDBC, pisahkan informasi Endpoint:Port setiap instans dengan koma (,) dalam URL koneksi. Format perintahnya adalah sebagai berikut:
jdbc:postgresql://<Endpoint1>:<Port1>,<Endpoint2>:<Port2>,<Endpoint3>:<Port3>.../<DBNAME>?user=<AccessKey ID>&password=<AccessKey Secret>&targetServerType=any&loadBalanceHosts=<value>[&hostRecheckSeconds=<value>]
Parameter
Parameter | Deskripsi |
Endpoint |
Alamat jaringan instans Hologres. Buka halaman Instance Details di Konsol Hologres untuk mendapatkan alamat jaringan tersebut. |
Port |
Port instans Hologres. Buka halaman Instance Details di Konsol Hologres untuk mendapatkan port tersebut. |
DBNAME |
Nama database yang dibuat di Hologres. |
ID AccessKey |
ID AccessKey Akun Alibaba Cloud Anda. Klik Manajemen AccessKey untuk mendapatkan ID AccessKey. |
Rahasia AccessKey |
Rahasia AccessKey Akun Alibaba Cloud Anda. Klik Manajemen AccessKey untuk mendapatkan Rahasia AccessKey. |
targetServerType |
Menentukan status instans yang diperbolehkan untuk disambungkan. Nilai Nilai berikut hanya didukung di Hologres V2.0.10 dan versi yang lebih baru:
JDBC menentukan apakah suatu instans merupakan instans primary atau instans secondary read-only berdasarkan nilai parameter Grand Unified Configuration (GUC)
|
loadBalanceHosts |
Menentukan urutan percobaan koneksi ke instans secondary read-only. Nilai yang valid:
|
hostRecheckSeconds |
Durasi cache untuk daftar Endpoint yang dapat disambungkan. Nilai default-nya adalah Jika ingin mengubah durasi cache, ubah nilai parameter
|
Untuk informasi selengkapnya tentang konfigurasi JDBC, lihat dokumentasi JDBC.
Contoh
-
Contoh berikut menunjukkan cara mendistribusikan kueri secara acak ke tiga instans secondary read-only. Jika koneksi ke salah satu instans gagal, JDBC secara otomatis mencoba menyambungkan ke instans lainnya.
import java.sql.*; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class hatest { public static void main(String[] args) { // Tetapkan endpoint koneksi instans Hologres. Ini adalah instans secondary read-only 1. String endpoint1 = "hgpostcn-cn-wxxxxxxxx01-cn-shanghai.hologres.aliyuncs.com:80"; // Tetapkan endpoint koneksi instans Hologres. Ini adalah instans secondary read-only 2. String endpoint2 = "hgpostcn-cn-wxxxxxxxx02-cn-shanghai.hologres.aliyuncs.com:80"; // Tetapkan endpoint koneksi instans Hologres. Ini adalah instans secondary read-only 3. String endpoint3 = "hgpostcn-cn-wxxxxxxxx03-cn-shanghai.hologres.aliyuncs.com:80"; // Tetapkan nama database yang akan disambungkan. String dbname = "postgres"; String jdbcUrl = "jdbc:postgresql://" + endpoint1 + "," + endpoint2 + "," + endpoint3 + "/" + dbname; Properties properties = new Properties(); // Tetapkan username untuk koneksi database. properties.setProperty("user", "xxxx"); // Tetapkan password untuk koneksi database. properties.setProperty("password", "xxxx"); // Konfigurasikan targetServerType. Pada contoh ini, diatur ke any, yang berarti permintaan dapat dikirim ke endpoint mana pun. properties.setProperty("targetServerType", "any"); // Konfigurasikan kebijakan LoadBalance. Pada contoh ini, diatur ke true, yang berarti load balancing diaktifkan. properties.setProperty("loadBalanceHosts", "true"); // Konfigurasikan durasi hostRecheckSeconds. Pada contoh ini, diatur ke 10 detik. properties.setProperty("hostRecheckSeconds", "10"); try { Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(jdbcUrl, properties); PreparedStatement preparedStatement = connection.prepareStatement("show hg_frontend_endpoints;" ); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); Map map = new HashMap(); for (int i = 0; i < columnCount; i++) { map.put(rsmd.getColumnName(i + 1).toLowerCase(), resultSet.getObject(i + 1)); } System.out.println(map); } } catch (Exception exception) { exception.printStackTrace(); } } } -
Contoh berikut menunjukkan cara mendistribusikan 100 kueri ke dua instans menggunakan polling.
import java.sql.*; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class hatest { public static void main(String[] args) { int x = 1; while( x <= 100 ){ // Tetapkan endpoint koneksi instans Hologres. Ini adalah instans primary. String endpoint1 = "hgpostcn-cn-wxxxxxxxx04-cn-hangzhou.hologres.aliyuncs.com:80"; // Tetapkan endpoint koneksi instans Hologres. Ini adalah instans secondary read-only. String endpoint2 = "hgpostcn-cn-wxxxxxxxx05-cn-hangzhou.hologres.aliyuncs.com:80"; // Tetapkan nama database yang akan disambungkan. String dbname = "postgres"; String jdbcUrl = "jdbc:postgresql://" + endpoint1 + "," + endpoint2 + "/" + dbname ; Properties properties = new Properties(); // Tetapkan username untuk koneksi database. properties.setProperty("user", "xxx"); // Tetapkan password untuk koneksi database. properties.setProperty("password", "xxx"); // Konfigurasikan targetServerType. Pada contoh ini, diatur ke any, yang berarti permintaan dapat dikirim ke endpoint mana pun. properties.setProperty("targetServerType", "any"); // Konfigurasikan kebijakan LoadBalance. Pada contoh ini, diatur ke true, yang berarti load balancing diaktifkan. properties.setProperty("loadBalanceHosts", "true"); // Konfigurasikan durasi hostRecheckSeconds. Pada contoh ini, diatur ke 10 detik. properties.setProperty("hostRecheckSeconds", "10"); try { Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(jdbcUrl, properties); PreparedStatement preparedStatement = connection.prepareStatement("show hg_frontend_endpoints;" ); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); Map map = new HashMap(); for (int i = 0; i < columnCount; i++) { map.put(rsmd.getColumnName(i + 1).toLowerCase(), resultSet.getObject(i + 1)); } System.out.println(map); } } catch (Exception exception) { exception.printStackTrace(); } x++; } } }Pada titik ini, Anda dapat memantau kedua instans tersebut dan melihat bahwa jumlah koneksi hampir sama untuk keduanya. Untuk informasi selengkapnya tentang cara melihat informasi pemantauan instans, lihat Lihat metrik pemantauan.
-
Metrik pemantauan untuk instans hgpostcn-cn-wxxxxxxxx04.

-
Metrik pemantauan untuk instans hgpostcn-cn-wxxxxxxxx05.

-