O Hologres V2.0 separa os recursos de computação em virtual warehouses independentes para implantações elásticas e de alta disponibilidade. Este guia aborda a criação de warehouses, o carregamento de dados, o acesso de usuários e a alternância de tráfego.
Informações gerais
Os virtual warehouses oferecem isolamento de recursos, elasticidade, separação de leitura/escrita e isolamento de cargas de trabalho. Virtual warehouse architecture.
Pré-requisitos
Somente instâncias Hologres na versão V2.0.4 ou posterior oferecem suporte a virtual warehouses. Se sua instância estiver em uma versão anterior à V2.0.4, consulte Common errors during upgrade preparation ou entre no grupo DingTalk do Hologres para obter suporte. Para mais informações, consulte How do I get more online support?.
Criar um novo virtual warehouse
Este exemplo cria um virtual warehouse chamado read_warehouse_1 para separação de leitura/escrita. O init_warehouse é responsável pelas gravações, enquanto o read_warehouse_1 cuida das consultas.

Criar um banco de dados
-
Faça login no HoloWeb como superusuário e crie um banco de dados chamado
erp_database. Create a database.Na caixa de diálogo Create Database, configure os seguintes parâmetros:
Instance: Selecione a instância de destino.
Database Name: Insira um nome para o banco de dados, por exemplo,
erp_database.Permission Policy: Selecione SPM.
Log On Immediately: Selecione Yes. Ao fazer login em um banco de dados, todas as páginas abertas no banco de dados atual são fechadas. Salve seu trabalho antes de continuar.
Clique em OK para concluir a criação.
-
Conecte-se ao banco de dados e execute o seguinte SQL para importar dados de amostra.
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);
Criar um virtual warehouse
Faça login no console do Hologres e acesse a página de detalhes da instância de destino.
-
No painel de navegação à esquerda, clique em Virtual Warehouse Management para abrir a aba Virtual Warehouse Resource Management.
A página exibe a alocação de recursos reservados e elásticos da instância, além de um botão Add Virtual Warehouse para criar um virtual warehouse.
-
Clique em Create Virtual Warehouse. Na caixa de diálogo, insira um Virtual Warehouse Name e selecione um Virtual Warehouse Resource.
Neste cenário, crie um virtual warehouse chamado
read_warehouse_1.Neste cenário, selecione
32CU (32 Core 128 GB, nós: 2) em Virtual Warehouse Resources e clique em OK para concluir a criação. Clique em OK.
Na página Virtual Warehouse Management, o virtual warehouse foi criado com sucesso quando o status exibido na coluna Status for Running.
Carregar dados no virtual warehouse
Table groups são contêineres de dados no Hologres. Para consultar dados por meio de um virtual warehouse, carregue primeiro os table groups necessários nele.
-
Visualize os table groups no banco de dados atual.
Execute a seguinte instrução SQL:
SELECT tablegroup_name FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;Resultado de exemplo: o resultado da consulta mostra que o nome do Table Group é
erp_database_tg_default.O banco de dados possui um table group.
-
Carregue um table group no virtual warehouse.
Carregue erp_database_tg_default em read_warehouse_1 para que ele possa consultar os dados:
CALL hg_table_group_load_to_warehouse('erp_database.erp_database_tg_default', 'read_warehouse_1', 1); -
Verifique os table groups carregados.
SELECT * FROM hologres.hg_warehouse_table_groups;Resultado de exemplo:

O read_warehouse_1 agora tem o table group erp_database_tg_default carregado.
Definir permissões de usuário
Novos usuários não têm acesso a um virtual warehouse sem permissões explícitas. O exemplo a seguir concede a um usuário RAM chamado ram_test acesso ao read_warehouse_1.
-
Visualize as permissões de virtual warehouse de um usuário.
SELECT * FROM hologres.hg_warehouse_users; -
Consulte o virtual warehouse padrão de um usuário.
SELECT * FROM hologres.hg_user_default_warehouse; -
Adicione um usuário à instância.
Na página Users do HoloWeb, adicione o usuário RAM à instância Hologres. User management.
O usuário RAM adicionado aparece na lista User Account, com o tipo de função padrão definido como Normal. Ajuste as permissões pela opção Modify Role Type na coluna de ações.
-
Conceda ao usuário
ram_testpermissões de consulta no banco de dadoserp_database.Na página Database authorization do HoloWeb, conceda ao usuário
ram_testpermissões de consulta no banco de dados. Grant permissions to a RAM user. -
Conceda ao usuário
ram_testacesso ao virtual warehouse read_warehouse_1.CALL hg_grant_warehouse_access_privilege ('read_warehouse_1', '"p4_2xxxxxxxxxxxxxxx"'); -
Defina read_warehouse_1 como o virtual warehouse padrão para o usuário
ram_test.Para a separação de leitura/escrita, o
ram_testdeve se conectar por meio do read_warehouse_1 em vez do init_warehouse. Defina o warehouse padrão para o usuárioram_test:CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'read_warehouse_1'); -
Verifique o virtual warehouse usado pela conta atual.
Após conectar como
ram_test, confirme o warehouse ativo:SELECT current_warehouse();
Alternar tráfego entre virtual warehouses
Se o read_warehouse_1 apresentar falha, redirecione o tráfego do ram_test de volta para o init_warehouse.

As alternâncias de tráfego entram em vigor na reconexão. Certifique-se de que sua aplicação possui um mecanismo de reconexão.
Use o roteamento automático ao conectar-se ao Hologres. Não especifique um nome de virtual warehouse na string de conexão.
-
Conceda ao usuário
ram_testacesso ao virtual warehouse init_warehouse.Caso o
ram_testainda não tenha acesso ao init_warehouse, conceda permissões aoram_testpara que possa usar os recursos do init_warehouse:CALL hg_grant_warehouse_access_privilege('init_warehouse', '"p4_2xxxxxxxxxxxxxxx"'); -
Defina init_warehouse como o virtual warehouse padrão para o usuário
ram_test.Atribua o init_warehouse como warehouse padrão do
ram_test. Novas conexões passarão a usar o init_warehouse.CALL hg_set_user_default_warehouse('"p4_2xxxxxxxxxxxxxxx"', 'init_warehouse'); -
Encerre as conexões que não estão usando o virtual warehouse padrão.
SELECT hg_kill_non_default_warehouse_connections(); Após reconectar, a nova conexão usará o virtual warehouse padrão.