Hologres V2.0 memperkenalkan tipe instans baru yang elastis dan berdaya tinggi (HA). Model ini memisahkan sumber daya komputasi menjadi unit-unit independen yang disebut gudang virtual untuk mendukung penerapan HA secara lebih baik. Topik ini menjelaskan cara menggunakan gudang virtual.
Informasi latar belakang
Gudang virtual mendukung berbagai skenario, seperti pemisahan baca/tulis, isolasi resource, dan isolasi workload. Kemampuan intinya mencakup isolasi resource dan elastisitas. Untuk informasi selengkapnya tentang arsitektur gudang virtual, lihat Arsitektur Gudang Virtual.
Prasyarat
Hanya instans Hologres versi V2.0.4 atau yang lebih baru yang mendukung gudang virtual. Jika instans Anda menjalankan versi sebelum V2.0.4, lihat Kesalahan Umum Saat Persiapan Upgrade atau bergabunglah dengan grup DingTalk Hologres untuk dukungan. Untuk informasi selengkapnya, lihat Bagaimana Cara Mendapatkan Dukungan Online Tambahan?.
Buat gudang virtual baru
Bagian ini menjelaskan cara membuat gudang virtual baru bernama read_warehouse_1 untuk menerapkan pemisahan baca/tulis. Gudang virtual init_warehouse digunakan untuk menulis data, sedangkan read_warehouse_1 digunakan untuk kueri layanan.

Buat database
Login ke HoloWeb sebagai superuser dan buat database bernama
erp_database. Untuk informasi selengkapnya, lihat Buat Database.
Setelah login ke database, jalankan pernyataan SQL berikut untuk mengimpor data sampel.
DROP FOREIGN TABLE IF EXISTS odps_customer_10g; DROP FOREIGN TABLE IF EXISTS odps_lineitem_10g; DROP FOREIGN TABLE IF EXISTS odps_nation_10g; DROP FOREIGN TABLE IF EXISTS odps_orders_10g; DROP FOREIGN TABLE IF EXISTS odps_part_10g; DROP FOREIGN TABLE IF EXISTS odps_partsupp_10g; DROP FOREIGN TABLE IF EXISTS odps_region_10g; DROP FOREIGN TABLE IF EXISTS odps_supplier_10g; IMPORT FOREIGN SCHEMA "MAXCOMPUTE_PUBLIC_DATA#default" LIMIT to ( odps_customer_10g, odps_lineitem_10g, odps_nation_10g, odps_orders_10g, odps_part_10g, odps_partsupp_10g, odps_region_10g, odps_supplier_10g ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist'error',if_unsupported_type'error'); DROP TABLE IF EXISTS LINEITEM; BEGIN; CREATE TABLE LINEITEM ( L_ORDERKEY BIGINT NOT NULL, L_PARTKEY INT NOT NULL, L_SUPPKEY INT NOT NULL, L_LINENUMBER INT NOT NULL, L_QUANTITY DECIMAL(15,2) NOT NULL, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, L_DISCOUNT DECIMAL(15,2) NOT NULL, L_TAX DECIMAL(15,2) NOT NULL, L_RETURNFLAG TEXT NOT NULL, L_LINESTATUS TEXT NOT NULL, L_SHIPDATE TIMESTAMPTZ NOT NULL, L_COMMITDATE TIMESTAMPTZ NOT NULL, L_RECEIPTDATE TIMESTAMPTZ NOT NULL, L_SHIPINSTRUCT TEXT NOT NULL, L_SHIPMODE TEXT NOT NULL, L_COMMENT TEXT NOT NULL, PRIMARY KEY (L_ORDERKEY,L_LINENUMBER) ); CALL set_table_property('LINEITEM', 'clustering_key', 'L_SHIPDATE,L_ORDERKEY'); CALL set_table_property('LINEITEM', 'segment_key', 'L_SHIPDATE'); CALL set_table_property('LINEITEM', 'distribution_key', 'L_ORDERKEY'); CALL set_table_property('LINEITEM', 'bitmap_columns', 'L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT'); CALL set_table_property('LINEITEM', 'dictionary_encoding_columns', 'L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT'); CALL set_table_property('LINEITEM', 'time_to_live_in_seconds', '31536000'); COMMIT; DROP TABLE IF EXISTS ORDERS; BEGIN; CREATE TABLE ORDERS ( O_ORDERKEY BIGINT NOT NULL PRIMARY KEY, O_CUSTKEY INT NOT NULL, O_ORDERSTATUS TEXT NOT NULL, O_TOTALPRICE DECIMAL(15,2) NOT NULL, O_ORDERDATE timestamptz NOT NULL, O_ORDERPRIORITY TEXT NOT NULL, O_CLERK TEXT NOT NULL, O_SHIPPRIORITY INT NOT NULL, O_COMMENT TEXT NOT NULL ); CALL set_table_property('ORDERS', 'segment_key', 'O_ORDERDATE'); CALL set_table_property('ORDERS', 'distribution_key', 'O_ORDERKEY'); CALL set_table_property('ORDERS', 'bitmap_columns', 'O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT'); CALL set_table_property('ORDERS', 'dictionary_encoding_columns', 'O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_COMMENT'); CALL set_table_property('ORDERS', 'time_to_live_in_seconds', '31536000'); COMMIT; DROP TABLE IF EXISTS PARTSUPP; BEGIN; CREATE TABLE PARTSUPP ( PS_PARTKEY INT NOT NULL, PS_SUPPKEY INT NOT NULL, PS_AVAILQTY INT NOT NULL, PS_SUPPLYCOST DECIMAL(15,2) NOT NULL, PS_COMMENT TEXT NOT NULL, PRIMARY KEY(PS_PARTKEY,PS_SUPPKEY) ); CALL set_table_property('PARTSUPP', 'distribution_key', 'PS_PARTKEY'); CALL set_table_property('PARTSUPP', 'colocate_with', 'LINEITEM'); CALL set_table_property('PARTSUPP', 'bitmap_columns', 'PS_PARTKEY,PS_SUPPKEY,PS_AVAILQTY,PS_COMMENT'); CALL set_table_property('PARTSUPP', 'dictionary_encoding_columns', 'PS_COMMENT'); CALL set_table_property('PARTSUPP', 'time_to_live_in_seconds', '31536000'); COMMIT; DROP TABLE IF EXISTS PART; BEGIN; CREATE TABLE PART ( P_PARTKEY INT NOT NULL PRIMARY KEY, P_NAME TEXT NOT NULL, P_MFGR TEXT NOT NULL, P_BRAND TEXT NOT NULL, P_TYPE TEXT NOT NULL, P_SIZE INT NOT NULL, P_CONTAINER TEXT NOT NULL, P_RETAILPRICE DECIMAL(15,2) NOT NULL, P_COMMENT TEXT NOT NULL ); CALL set_table_property('PART', 'distribution_key', 'P_PARTKEY'); CALL set_table_property('PART', 'bitmap_columns', 'P_PARTKEY,P_SIZE,P_NAME,P_MFGR,P_BRAND,P_TYPE,P_CONTAINER,P_COMMENT'); CALL set_table_property('PART', 'dictionary_encoding_columns', 'P_NAME,P_MFGR,P_BRAND,P_TYPE,P_CONTAINER,P_COMMENT'); CALL set_table_property('PART', 'time_to_live_in_seconds', '31536000'); COMMIT; DROP TABLE IF EXISTS CUSTOMER; BEGIN; CREATE TABLE CUSTOMER ( C_CUSTKEY INT NOT NULL PRIMARY KEY, C_NAME TEXT NOT NULL, C_ADDRESS TEXT NOT NULL, C_NATIONKEY INT NOT NULL, C_PHONE TEXT NOT NULL, C_ACCTBAL DECIMAL(15,2) NOT NULL, C_MKTSEGMENT TEXT NOT NULL, C_COMMENT TEXT NOT NULL ); CALL set_table_property('CUSTOMER', 'distribution_key', 'C_CUSTKEY'); CALL set_table_property('CUSTOMER', 'bitmap_columns', 'C_CUSTKEY,C_NATIONKEY,C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT'); CALL set_table_property('CUSTOMER', 'dictionary_encoding_columns', 'C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT'); CALL set_table_property('CUSTOMER', 'time_to_live_in_seconds', '31536000'); COMMIT; DROP TABLE IF EXISTS SUPPLIER; BEGIN; CREATE TABLE SUPPLIER ( S_SUPPKEY INT NOT NULL PRIMARY KEY, S_NAME TEXT NOT NULL, S_ADDRESS TEXT NOT NULL, S_NATIONKEY INT NOT NULL, S_PHONE TEXT NOT NULL, S_ACCTBAL DECIMAL(15,2) NOT NULL, S_COMMENT TEXT NOT NULL ); CALL set_table_property('SUPPLIER', 'distribution_key', 'S_SUPPKEY'); CALL set_table_property('SUPPLIER', 'bitmap_columns', 'S_SUPPKEY,S_NAME,S_ADDRESS,S_NATIONKEY,S_PHONE,S_COMMENT'); CALL set_table_property('SUPPLIER', 'dictionary_encoding_columns', 'S_NAME,S_ADDRESS,S_PHONE,S_COMMENT'); CALL set_table_property('SUPPLIER', 'time_to_live_in_seconds', '31536000'); COMMIT; DROP TABLE IF EXISTS NATION; BEGIN; CREATE TABLE NATION( N_NATIONKEY INT NOT NULL PRIMARY KEY, N_NAME text NOT NULL, N_REGIONKEY INT NOT NULL, N_COMMENT text NOT NULL ); CALL set_table_property('NATION', 'distribution_key', 'N_NATIONKEY'); CALL set_table_property('NATION', 'bitmap_columns', 'N_NATIONKEY,N_NAME,N_REGIONKEY,N_COMMENT'); CALL set_table_property('NATION', 'dictionary_encoding_columns', 'N_NAME,N_COMMENT'); CALL set_table_property('NATION', 'time_to_live_in_seconds', '31536000'); COMMIT; DROP TABLE IF EXISTS REGION; BEGIN; CREATE TABLE REGION ( R_REGIONKEY INT NOT NULL PRIMARY KEY, R_NAME TEXT NOT NULL, R_COMMENT TEXT ); CALL set_table_property('REGION', 'distribution_key', 'R_REGIONKEY'); CALL set_table_property('REGION', 'bitmap_columns', 'R_REGIONKEY,R_NAME,R_COMMENT'); CALL set_table_property('REGION', 'dictionary_encoding_columns', 'R_NAME,R_COMMENT'); CALL set_table_property('REGION', 'time_to_live_in_seconds', '31536000'); COMMIT; INSERT INTO public.customer SELECT * FROM public.odps_customer_10g ; INSERT INTO public.lineitem SELECT * FROM public.odps_lineitem_10g ; INSERT INTO public.nation SELECT * FROM public.odps_nation_10g ; INSERT INTO public.orders SELECT * FROM public.odps_orders_10g ; INSERT INTO public.part SELECT * FROM public.odps_part_10g ; INSERT INTO public.partsupp SELECT * FROM public.odps_partsupp_10g ; INSERT INTO public.region SELECT * FROM public.odps_region_10g ; INSERT INTO public.supplier SELECT * FROM public.odps_supplier_10g ; vacuum nation; vacuum region; vacuum supplier; vacuum customer; vacuum part; vacuum partsupp; vacuum orders; vacuum lineitem; analyze nation; analyze region; analyze lineitem; analyze orders; analyze customer; analyze part; analyze partsupp; analyze supplier; analyze lineitem (l_orderkey,l_partkey,l_suppkey); analyze orders (o_custkey); analyze partsupp(ps_partkey,ps_suppkey);
Buat gudang virtual
Login ke Konsol Hologres dan buka halaman detail instans target.
Di panel navigasi kiri, klik Virtual Warehouse Management untuk membuka tab Virtual Warehouse Resource Management. Di tab ini, Anda dapat melihat daftar gudang virtual yang sudah ada.

Klik Create Virtual Warehouse. Di kotak dialog, masukkan Virtual Warehouse Name dan pilih Virtual Warehouse Resource.
Dalam skenario ini, buat gudang virtual bernama
read_warehouse_1.
Klik OK.
Di halaman Virtual Warehouse Management, gudang virtual berhasil dibuat jika statusnya di kolom Status adalah Running.

Muat data ke dalam gudang virtual
Kelompok tabel adalah wadah data di Hologres. Untuk menggunakan gudang virtual dalam kueri, Anda harus terlebih dahulu memuat kelompok tabel yang diperlukan ke dalamnya.
Lihat kelompok tabel di database saat ini.
Jalankan pernyataan SQL berikut untuk melihat kelompok tabel di database saat ini:
SELECT tablegroup_name FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;Gambar berikut menunjukkan contoh hasil:

Hal ini menunjukkan bahwa database saat ini hanya memiliki satu kelompok tabel.
Muat kelompok tabel untuk gudang virtual.
Untuk menggunakan read_warehouse_1 dalam mengkueri data di kelompok tabel erp_database_tg_default, jalankan pernyataan SQL berikut untuk memuat erp_database_tg_default ke gudang virtual read_warehouse_1:
CALL hg_table_group_load_to_warehouse('erp_database.erp_database_tg_default', 'read_warehouse_1', 1);Periksa kelompok tabel yang telah dimuat.
SELECT * FROM hologres.hg_warehouse_table_groups;Gambar berikut menunjukkan contoh hasil:

Hasil tersebut menunjukkan bahwa read_warehouse_1 telah memuat kelompok tabel erp_database_tg_default.
Atur izin pengguna
Secara default, pengguna tidak dapat mengakses gudang virtual baru hingga Anda memberikan izin kepada mereka. Contoh berikut menunjukkan cara memberikan akses kepada Pengguna RAM bernama ram_test ke gudang virtual read_warehouse_1.
Lihat izin gudang virtual pengguna.
SELECT * FROM hologres.hg_warehouse_users;Lihat gudang virtual default pengguna.
SELECT * FROM hologres.hg_user_default_warehouse;Tambahkan pengguna ke instans.
Di halaman Users di HoloWeb, tambahkan Pengguna RAM ke instans Hologres. Untuk informasi selengkapnya, lihat Manajemen Pengguna.

Berikan izin kueri kepada pengguna
ram_testpada databaseerp_database.Di halaman Database authorization di HoloWeb, berikan izin kueri pada database kepada pengguna
ram_test. Untuk informasi selengkapnya, lihat Berikan Izin kepada Pengguna RAM.
Berikan akses pengguna
ram_testke gudang virtual read_warehouse_1.CALL hg_grant_warehouse_access_privilege ('read_warehouse_1', '"p4_2xxxxxxxxxxxxxxx"');Untuk penjelasan parameter, lihat Otorisasi Pengguna untuk Menggunakan Gudang Virtual.
Tetapkan read_warehouse_1 sebagai gudang virtual default untuk pengguna
ram_test.Untuk menerapkan pemisahan baca/tulis, pengguna
ram_testharus terhubung ke Hologres menggunakan sumber daya read_warehouse_1 alih-alih init_warehouse. Jalankan perintah berikut untuk menetapkan read_warehouse_1 sebagai gudang virtual default bagi penggunaram_test:CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'read_warehouse_1');Periksa gudang virtual yang digunakan oleh akun saat ini.
Setelah Anda terhubung ke instans sebagai pengguna
ram_test, jalankan perintah berikut untuk memverifikasi bahwa Anda menggunakan gudang virtual read_warehouse_1:SELECT current_warehouse();
Mengalihkan traffic antar gudang virtual
Jika Anda menemukan bahwa gudang virtual baru read_warehouse_1 mengalami gangguan setelah dibuat, Anda harus mengalihkan traffic dari akun ram_test ke gudang virtual init_warehouse.

Pengalihan traffic hanya berlaku setelah Anda terhubung ulang ke instans. Pastikan aplikasi Anda yang terhubung ke Hologres memiliki mekanisme reconnect.
Saat terhubung ke Hologres, gunakan logika routing otomatisnya. Jangan menentukan nama gudang virtual di string koneksi.
Berikan akses pengguna
ram_testke gudang virtual init_warehouse.Jika sebelumnya Anda belum memberikan izin untuk init_warehouse kepada
ram_test, jalankan perintah berikut untuk memberikan izin kepada penggunaram_testatas gudang virtual init_warehouse, sehingga penggunaram_testdapat menggunakan sumber daya init_warehouse.CALL hg_grant_warehouse_access_privilege('init_warehouse', '"p4_2xxxxxxxxxxxxxxx"');Tetapkan init_warehouse sebagai gudang virtual default untuk pengguna
ram_test.Jalankan perintah berikut untuk menetapkan gudang virtual default pengguna
ram_testmenjadi init_warehouse. Koneksi baru dari pengguna tersebut kemudian akan menggunakan gudang virtual init_warehouse.CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'init_warehouse');Hentikan koneksi yang tidak menggunakan gudang virtual default.
SELECT hg_kill_non_default_warehouse_connections();Setelah terhubung ulang, koneksi baru Anda akan menggunakan gudang virtual default.