日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

計算組實例快速入門

Hologres V2.0版本推出了全新的彈性高可用實例形態,將計算資源分解為不同的計算組(Virtual Warehouse),更好的服務于高可用部署。本文為您介紹如何使用計算組。

背景信息

在Hologres 1.1版本已經實現了共享存儲的多實例讀寫分離的高可用部署架構,一個主實例可以綁定多個只讀從實例,實例與實例之間共享存儲,但是計算資源是互相隔離的,從而實現讀寫分離高可用部署,詳情請參見主從實例讀寫分離部署(共享存儲)

但是現在的只讀從實例模式,存在以下限制:

  • 多個實例使用獨立的Endpoint,切換流量時,需要更改Endpoint。

  • 只讀從實例和主實例共享一套元數據,無法根據每個只讀從實例的作用單獨設置參數,例如根據查詢高可用的要求,針對每個只讀從實例設置不一樣的Replica(副本)數。

為了解決以上問題,Hologres V2.0版本推出了全新的彈性高可用實例形態,將計算資源分解為不同的計算組(Virtual Warehouse),相較于只讀從實例模式,具備如下優點:

  • 計算組之間共享數據、元數據。

  • 使用一個Endpoint,無需切換Endpoint即可實現流量切換。

計算組架構介紹請參見計算組架構介紹

注意事項

僅Hologres V2.0.4及以上版本支持使用計算組實例,如果您的實例是V2.0.4以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?

使用說明

場景1:創建全新的計算組實例

  • 示意圖

    場景示意圖如下:使用init_warehouse寫入計算組用于寫入數據;使用read_warehouse_1查詢計算組用于服務查詢。

    image..png

  • 操作步驟

    1. 創建數據庫。

      1. Superuser賬號登錄HoloWeb創建名稱為erp_database的數據庫,詳情請參見創建數據庫image.png

      2. 登錄數據庫后,使用如下SQL向其中導入樣例數據。

        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);
    2. 創建計算組。

      1. Superuser賬號登錄HoloWeb,在頂部菜單欄選擇安全中心 > 計算組管理

        您可以在計算組管理頁面查看實例現有的計算組。

        image.png

      2. 計算組管理頁面的右上角,單擊新增計算組

      3. 新增計算組對話框,填寫計算組名稱和選擇計算組資源

        本場景新增名稱為read_warehouse_1的計算組:image.png

      4. 計算組管理頁面可查看計算組狀態,待計算組對應的狀態列為正在運行時,即計算組創建成功。

        image.png

    3. 向計算組加載數據。

      Table Group是Hologres中數據的載體。默認情況下,新創建的計算組無權訪問任何Table Group,所以如果要使用計算組查詢數據,需要先為計算組賦予Table Group的權限。

      1. 查看當前數據庫的Table Group。

        使用如下SQL查看當前數據庫有哪些Table Group:

        SELECT tablegroup_name
        FROM hologres.hg_table_group_properties
        GROUP BY tablegroup_name;

        返回結果示例如下:image..png

        即當前數據庫僅有一個Table Group。

      2. 為計算組加載Table Group。

        由于需要使用read_warehouse_1查詢該數據庫中erp_database_tg_default Table Group的數據,所以需要使用如下SQL為計算組read_warehouse_1加載erp_database_tg_default

        CALL hg_table_group_load_to_warehouse ('erp_database.erp_database_tg_default', 'read_warehouse_1', 1);
      3. 查看計算組加載Table Group的情況。

        select * from hologres.hg_warehouse_table_groups;

        示例返回結果如下:image..png

        read_warehouse_1已經加載了erp_database_tg_default 這個Table Group的數據。

    4. 設置用戶權限。

      默認情況下新建的計算組,非授權用戶不能訪問,當您需要讓其他賬號訪問計算組時需要進行授權。為ram_testRAM用戶授權訪問read_warehouse_1計算組授權示例如下:

      1. 查看用戶擁有計算組的權限信息。

        select * from hologres.hg_warehouse_users;
      2. 查看用戶默認計算組的信息。

        select * from hologres.hg_user_default_warehouse;
      3. 在實例中加入用戶。

        在HoloWeb的用戶管理頁面添加RAM用戶至Hologres實例,詳情請參見用戶管理

        image..png

      4. 賦予ram_test用戶erp_databse數據庫的查詢權限。

        在HoloWeb的DB授權頁面,為ram_test用戶授予數據庫的查詢權限,詳情請參見RAM用戶權限授權快速入門image..png

      5. 為用戶ram_test添加read_warehouse_1計算組的權限。

        CALL hg_grant_warehouse_access_privilege ('read_warehouse_1', 'p4_2xxxxxxxxxxxxxxx');

        參數說明請參見計算組授權管理

      6. read_warehouse_1計算組設置為ram_test用戶的默認計算組。

        由于需要ram_test用戶連接Hologres使用read_warehouse_1的資源,不使用init_warehouse,實現讀寫分離,那么就需要使用如下命令將ram_test的默認計算組設置為read_warehouse_1

        CALL hg_set_user_default_warehouse ('p4_2xxxxxxxxxxxxxxx', 'read_warehouse_1');
      7. 查看當前賬號使用的計算組。

        此時使用ram_test用戶連接實例時,使用如下命令驗證使用的計算組是否為read_warehouse_1

        select current_warehouse();

場景2:計算組流量切換

在場景一的基礎上,如果發現計算組read_warehouse_1有故障,此時需要將賬號ram_test的流量切換到init_warehouse計算組上。

  • 示意圖。image..png

  • 注意事項

    • 由于切換流量需要重新連接才生效,所以需要保證您連接到Hologres的應用具備重連機制。

    • 連接到Hologres時請使用Hologres自動的路由邏輯,切勿在連接字符串中指定使用的計算組名。

  • 操作步驟

    1. 為用戶ram_test添加init_warehouse計算組的權限。

      如果之前未給ram_test添加init_warehouse的權限,需要使用如下命令為用戶ram_test添加init_warehouse計算組的權限,讓ram_test用戶可以使用init_warehouse的資源。

      CALL hg_grant_warehouse_access_privilege ('init_warehouse', 'p4_2xxxxxxxxxxxxxxx');
    2. 將init_warehouse計算組設置為ram_test用戶的默認計算組。

      使用如下命令將ram_test用戶的默認計算組設置為init_warehouse,設置完畢后,用戶和實例建立新連接即會使用計算組init_warehouse的資源。

      CALL hg_set_user_default_warehouse ('p4_2xxxxxxxxxxxxxxx', 'init_warehouse');
    3. 斷開所有用戶非默認計算組的連接。

      SELECT hg_kill_non_default_warehouse_connections(); 
    4. 重新建立連接后,即會使用新配置的默認計算組連接到實例。