全部产品
Search
文档中心

Hologres:Pengaturan keseimbangan beban berbasis JDBC

更新时间:Feb 04, 2026

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:image..png

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

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 any menunjukkan bahwa Anda dapat menyambungkan ke Endpoint apa pun dalam URL.

Nilai berikut hanya didukung di Hologres V2.0.10 dan versi yang lebih baru:

  • master: Hanya menyambungkan ke instans primary.

  • slave: Hanya menyambungkan ke instans secondary read-only.

  • preferSlave: Secara preferensial menyambungkan ke instans secondary read-only. Jika koneksi ke instans secondary read-only gagal, maka akan menyambungkan ke instans primary.

JDBC menentukan apakah suatu instans merupakan instans primary atau instans secondary read-only berdasarkan nilai parameter Grand Unified Configuration (GUC) in_hot_standby. Tabel berikut menjelaskan nilai-nilai in_hot_standby:

  • off: Instans tersebut adalah instans primary.

  • on: Instans tersebut adalah instans secondary read-only.

loadBalanceHosts

Menentukan urutan percobaan koneksi ke instans secondary read-only. Nilai yang valid:

  • False (default): Menyambungkan ke instans secondary read-only sesuai urutan yang tercantum dalam URL koneksi.

  • True: Menyambungkan ke instans secondary read-only secara acak.

hostRecheckSeconds

Durasi cache untuk daftar Endpoint yang dapat disambungkan. Nilai default-nya adalah 10s.

Jika ingin mengubah durasi cache, ubah nilai parameter hostRecheckSeconds. Contoh berikut mengubah durasi cache menjadi 30s:

jdbc:postgresql://{ENDPOINT1}:{PORT1},{ENDPOINT2}:{PORT2},{ENDPOINT3}:{PORT3}.../{DBNAME}?targetServerType=any&loadBalanceHosts=true&hostRecheckSeconds=30

Catatan

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.image..png

    • Metrik pemantauan untuk instans hgpostcn-cn-wxxxxxxxx05.image..png