Pivotal Knowledge Base

フォローする

HAWQのプライマリセグメントポートを変える方法

環境

製品 バージョン
HAWQ 1.3.x

目的

ユーザがHAWQを再インストールせずに、セグメントのリスンポートを変更したいものとする。本記事に、当該手順を記載する。  

動機

デフォルトでは、セグメントポートの範囲は40,000で始まり、サーバ上にセグメントをインストールする度に、割り当てるポート番号が1つずつ増加する。ポートの範囲が広がっていくと、既存のアプリケーションまたは今後インストールするアプリケーションのポートと重複してしまう可能性がある。

手順

本記事の例では、ポート範囲が40,000ではなく42,000で始めるように設定する。

  1. データベースを停止する。
    gpstop -af
  2. 「-m」のオプションを使いマスタオンリーモードで開始する。
    gpstart -am
  3. ユーティリティモードでマスタに接続する。
    PGOPTIONS='-c gp_session_role=utility' psql
  4. データベースのコマンドラインで、テーブルgp_segment_configurationのバックアップを作成する。
    gpadmin=# copy ( select * from gp_segment_configuration ) to '/home/gpadmin/gp_segment_configuration.backup';
  5. テーブルgp_segment_configurationを変更するにはallow_system_table_modsgucを有効にする必要がある。
    gpadmin=# set allow_system_table_mods = 'dml';
  6. テーブルgp_segment_configurationでプライマリセグメントのポート範囲を変更する。以下のクエリは本記事における特定のケースにのみ有効である。他の状況でこの変更はより複雑になることもあり、以下の例はガイドラインとしてのみ適用可能である。また、以下のクエリを実行する前に影響を充分把握する必要がある。
  7. 変更前と変更後を比較するためにテーブルgp_segment_configurationの内容を確認する。
    gpadmin=# select * from gp_segment_configuration
    gpadmin-# ;
     dbid | content | role | preferred_role | mode | status | port  |    hostname    |    address     | replication_port | san_mounts
    ------+---------+------+----------------+------+--------+-------+----------------+----------------+------------------+------------
        1 |      -1 | p    | p              | s    | u      |  5432 | hdm1.phd.local | hdm1.phd.local |                  |
        2 |       0 | p    | p              | s    | u      | 40000 | hdw1.phd.local | hdw1.phd.local |                  |
        4 |       2 | p    | p              | s    | u      | 40000 | hdw2.phd.local | hdw2.phd.local |                  |
        6 |       4 | p    | p              | s    | u      | 40000 | hdw3.phd.local | hdw3.phd.local |                  |
        3 |       1 | p    | p              | s    | u      | 40001 | hdw1.phd.local | hdw1.phd.local |                  |
        5 |       3 | p    | p              | s    | u      | 40001 | hdw2.phd.local | hdw2.phd.local |                  |
        7 |       5 | p    | p              | s    | u      | 40001 | hdw3.phd.local | hdw3.phd.local |                  |
  8. 新規にトランザクションを開始し、カスタムクエリでテーブルgp_segment_configurationを更新する。以下具体例を示す。なお、「-1」はマスタインスタンスのcontent IDのため、更新対象から除外している。
    gpadmin=# BEGIN;
    gpadmin=# update gp_segment_configuration set port = (port + 2000) where content != -1;
  9. トランザクションをコミットする前に変更を確認する。
    gpadmin=# select * from gp_segment_configuration                                                                                                                                                                                                                                                         ;
     dbid | content | role | preferred_role | mode | status | port  |    hostname    |    address     | replication_port | san_mounts
    ------+---------+------+----------------+------+--------+-------+----------------+----------------+------------------+------------
        1 |      -1 | p    | p              | s    | u      |  5432 | hdm1.phd.local | hdm1.phd.local |                  |
        2 |       0 | p    | p              | s    | u      | 42000 | hdw1.phd.local | hdw1.phd.local |                  |
        4 |       2 | p    | p              | s    | u      | 42000 | hdw2.phd.local | hdw2.phd.local |                  |
        6 |       4 | p    | p              | s    | u      | 42000 | hdw3.phd.local | hdw3.phd.local |                  |
        3 |       1 | p    | p              | s    | u      | 42001 | hdw1.phd.local | hdw1.phd.local |                  |
        5 |       3 | p    | p              | s    | u      | 42001 | hdw2.phd.local | hdw2.phd.local |                  |
        7 |       5 | p    | p              | s    | u      | 42001 | hdw3.phd.local | hdw3.phd.local |                  |
  10. 変更を確認しコミットする。
    gpadmin=# commit;
  11. テーブルgp_segment_configurationにあるポート番号と一致するように、すべてのセグメントデータディレクトリのpostgresql.confを更新する。以下のクエリにてセグメントデータディレクトリを出力することができる。
    gpadmin=# select conf.hostname, ent.fselocation from gp_segment_configuration conf JOIN pg_filespace_entry ent ON ent.fsedbid = conf.dbid where ent.fselocation not like 'hdfs%' and conf.content != -1 order by 1;
        hostname    |        fselocation
    ----------------+---------------------------
     hdw1.phd.local | /data/hawq/primary/gpseg0
     hdw1.phd.local | /data/hawq/primary/gpseg1
     hdw2.phd.local | /data/hawq/primary/gpseg2
     hdw2.phd.local | /data/hawq/primary/gpseg3
     hdw3.phd.local | /data/hawq/primary/gpseg5
     hdw3.phd.local | /data/hawq/primary/gpseg4
    (6 rows)
  12. 以下、hdw1上のgpseg0に対して、/data/hawq/primary/gpseg0/postgresql.confを編集し、ポートフラグを変更する例を示す。
     
     cp /data/hawq/primary/gpseg0/postgresql.conf  /data/hawq/primary/gpseg0/postgresql.`date +%m%d%y.backup
     
     修正前:
     port=40000 ##port = 5432                                # sets the database listener port for
     
     修正後:
     port=42000 ##port = 5432                                # sets the database listener port for
  13. すべてのセグメントに対するポート番号の変更を実施する。
  14. マスタインスタンスを停止する。
    gpstop -am
  15. データベースを起動し使用を再開する。
    gpstart -a

復元手順

  1. データベースを停止する。
    gpstop -af
  2. マスタオンリーモードで開始する。
    gpstart -am
  3. ユーティリティモードでデータベースに接続する。
    PGOPTIONS='-c gp_session_role=utility' psql
  4. DML編集を有効にする。
    gpadmin=# set allow_system_table_mods = 'dml';
  5. 念のため、テーブルgp_segment_configurationのバックアップを実施する。
    gpadmin=# copy ( select * from gp_segment_configuration ) to '/home/gpadmin/gp_segment_configuration.4200.backup';
  6. トランザクションを開始し、テーブルgp_segment_configurationの全ての行を削除する。
    BEGIN;
    gpadmin=# delete from gp_segment_configuration;
  7. バックアップからテーブルデータをロードする。
    copy gp_segment_configuration from '/home/gpadmin/gp_segment_configuration.backup';
  8. コミットする前に確認する。
    gpadmin=# select * from gp_segment_configuration
    gpadmin-# ;
     dbid | content | role | preferred_role | mode | status | port  |    hostname    |    address     | replication_port | san_mounts
    ------+---------+------+----------------+------+--------+-------+----------------+----------------+------------------+------------
        1 |      -1 | p    | p              | s    | u      |  5432 | hdm1.phd.local | hdm1.phd.local |                  |
        2 |       0 | p    | p              | s    | u      | 40000 | hdw1.phd.local | hdw1.phd.local |                  |
        4 |       2 | p    | p              | s    | u      | 40000 | hdw2.phd.local | hdw2.phd.local |                  |
        6 |       4 | p    | p              | s    | u      | 40000 | hdw3.phd.local | hdw3.phd.local |                  |
        3 |       1 | p    | p              | s    | u      | 40001 | hdw1.phd.local | hdw1.phd.local |                  |
        5 |       3 | p    | p              | s    | u      | 40001 | hdw2.phd.local | hdw2.phd.local |                  |
        7 |       5 | p    | p              | s    | u      | 40001 | hdw3.phd.local | hdw3.phd.local |                  |
  9. トランザクションのコミットを行う。
    gpadmin = commit;
  10. すべてのセグメントでpostgresql.confのポート設定が元に戻ったことを確認する。
  11. データベースを停止し、再起動する。
    gpstop -am
    gpstart -a

 

コメント

Powered by Zendesk