5.4. Ansible を使用した双方向ミラーリングの設定

この手順では、ceph-ansible を使用して双方向のレプリケーションを設定し、イメージを site-asite-b と呼ばれる 2 つのクラスター間でミラーリングできるようにします。以下の例では、data はミラーリングされるイメージが含まれるプールの名前です。

注記

双方向ミラーリングでは、どちらのクラスターにおいても、同じイメージへの同時書き込みはできません。イメージは一方のクラスターでプロモートされ、他方のクラスターではデモートされます。ステータスに応じて、それらは一方向または反対方向でミラリングされます。

前提条件

  • Red Hat Ceph Storage クラスターを実行する 2 つ。
  • 各クラスターにクライアントノードがある。
  • 同じ名前のプールが両方のクラスターに存在する。
  • ジャーナルベースのミラーリングでは、プール内のイメージで排他的ロックとジャーナリングを有効にする必要があります。

手順

  1. イメージの元のクラスターで、イメージの排他的ロックおよびジャーナリング機能を有効にします。

    1. 新規イメージの場合は、--image-feature オプションを使用します。

      構文

      rbd create IMAGE_NAME --size MEGABYTES --pool POOL_NAME --image-feature FEATURE[,FEATURE]

      [root@rbd-client ~]# rbd create image1 --size 1024 --pool data --image-feature exclusive-lock,journaling

    2. 既存のイメージ の場合は、rbd feature enable コマンドを使用します。

      構文

      rbd feature enable POOL_NAME/IMAGE_NAME FEATURE_NAME

      [root@rbd-client ~]# rbd feature enable data/image1 exclusive-lock,journaling

    3. デフォルトですべての新規イメージの排他的ロックおよびジャーナリングを有効にするには、以下の設定を Ceph 設定ファイルに追加します。

      rbd_default_features = 125
  2. site-a クラスターで、以下の手順を実行します。

    1. モニターノードで、rbd-mirror デーモンがクラスターへの接続に使用するユーザーを作成します。この例では、site-a ユーザーを作成し、そのキーを site-a.client.site-a.keyring という名前のファイルに出力します。Ceph 設定ファイルは /etc/ceph/site-a.conf です。

      構文

      ceph auth get-or-create client.PRIMARY_CLUSTER_NAME mon 'profile rbd' osd 'profile rbd pool=data' -o /etc/ceph/PRIMARY_CLUSTER_NAME.client.USER_NAME.keyring -c /etc/ceph/PRIMARY_CLUSTER_NAME.conf

      [root@mon ~]# ceph auth get-or-create client.site-a mon 'profile rbd' osd 'profile rbd pool=data' -o /etc/ceph/site-a.client.site-a.keyring -c /etc/ceph/site-a.conf

    2. キーリングは site-b クラスターにコピーします。rbd-daemon が実行される site-b クラスターのクライアントノードにファイルをコピーします。このファイルを /etc/ceph/site-a.client.site-a.keyring に保存します。

      構文

      scp /etc/ceph/PRIMARY_CLUSTER_NAME.client.USER_NAME.keyring root@SECONDARY_CLIENT_NODE_NAME:/etc/ceph/PRIMARY_CLUSTER_NAME.client.USER_NAME.keyring

      [root@mon ~]# scp /etc/ceph/site-a.client.site-a.keyring root@client.site-b:/etc/ceph/site-a.client.site-a.keyring

    3. Ceph 設定ファイルをモニターノードから site-b モニターノードおよびクライアントノードにコピーします。この例の Ceph 設定ファイルは /etc/ceph/site-a.conf です。

      構文

      scp /etc/ceph/PRIMARY_CLUSTER_NAME.conf root@SECONDARY_MONITOR_NODE_NAME:/etc/ceph/PRIMARY_CLUSTER_NAME.conf
      scp /etc/ceph/PRIMARY_CLUSTER_NAME.conf user@SECONDARY_CLIENT_NODE_NAME:/etc/ceph/PRIMARY_CLUSTER_NAME.conf

      [root@mon ~]# scp /etc/ceph/site-a.conf root@mon.site-b:/etc/ceph/site-a.conf
      [root@mon ~]# scp /etc/ceph/site-a.conf user@client.site-b:/etc/ceph/site-a.conf

  3. site-b クラスターで、以下の手順を実行します。

    1. site-a から site-b へのミラーリングを設定します。Ansible 管理ノードで、rbdmirrors グループを Ansible インベントリーファイル (通常は /usr/share/ceph-ansible/hosts) に追加します
    2. [rbdmirrors] グループの下に、rbd-mirror デーモンが実行される site-b クライアントノードの名前を追加します。このデーモンは、イメージの変更を site-a から site-b にプルします。

      [rbdmirrors]
      client.site-b

    3. /usr/share/ceph-ansible ディレクトリーに移動します。

      [root@admin ~]$ cd /usr/share/ceph-ansible
    4. group_vars/rbdmirrors.yml.sample から group_vars/rbdmirrors.yml にコピーして、新しい rbdmirrors.yml ファイルを作成します。

      [root@admin ceph-ansible]# cp group_vars/rbdmirrors.yml.sample group_vars/rbdmirrors.yml
    5. group_vars/rbdmirrors.yml ファイルを開いて編集します。
    6. ceph_rbd_mirror_configuretrue に設定し、ceph_rbd_mirror_pool をイメージをミラーリングするプールに設定します。この例では、data はプールの名前です。

      ceph_rbd_mirror_configure: true
      ceph_rbd_mirror_pool: "data"
    7. デフォルトでは、ceph-ansible はプール内の全イメージをミラーリングするプールモードを使用してミラーリングを設定します。ミラーリングが明示的に有効になっているイメージのみがミラーリングされるイメージモードを有効にします。イメージモードを有効にするには、ceph_rbd_mirror_modeimage に設定します。

      ceph_rbd_mirror_mode: image
    8. group_vars/rbdmirrors.yml ファイルに rbd-mirror のクラスターの名前を設定します。以下の例では、他のクラスターは site-a です。

      ceph_rbd_mirror_remote_cluster: "site-a"
    9. Ansible 管理ノードで、group_vars/rbdmirrors.yml ファイルの ceph_rbd_mirror_remote_user を使用してキーのユーザー名を設定します。キーの作成時に使用した同じ名前を使用します。この例では、ユーザーの名前は client.site-a です。

      ceph_rbd_mirror_remote_user: "client.site-a"
    10. ansible ユーザーとして、Ansible Playbook を実行します。

      • ベアメタルデプロイメント

        [user@admin ceph-ansible]$ ansible-playbook site.yml --limit rbdmirrors -i hosts
      • コンテナーデプロイメント

        [user@admin ceph-ansible]$ ansible-playbook site-container.yml --limit rbdmirrors -i hosts
  4. ミラーリングのステータスを確認します。site-b クラスターで、Ceph Monitor ノードから以下のコマンドを実行します。

    ジャーナルベースのミラーリング

    [root@mon ~]# rbd mirror image status data/image1
    image1:
      global_id:   7d486c3f-d5a1-4bee-ae53-6c4f1e0c8eac
      state:       up+replaying 1
      description: replaying, master_position=[object_number=3, tag_tid=1, entry_tid=3], mirror_position=[object_number=3, tag_tid=1, entry_tid=3], entries_behind_master=0
      last_update: 2021-04-22 13:19:27

    スナップショットベースのミラーリング

    [root@mon ~]# rbd mirror image status data/image1
    image1:
      global_id:   06acc9e6-a63d-4aa1-bd0d-4f3a79b0ae33
      state:       up+replaying 1
      description: replaying, {"bytes_per_second":0.0,"bytes_per_snapshot":0.0,"local_snapshot_timestamp":1642689843,"remote_snapshot_timestamp":1642689843,"replay_state":"idle"}
      service:     admin on ceph-rbd2-vasi-43-5hwia4-node2
      last_update: 2022-01-20 12:41:57
    1 1
    イメージが up+replaying の場合には、ミラーリングが正常に機能します。
    注記

    サイト間の接続によって、ミラーリングでイメージの同期に時間がかかる場合があります。

  5. site-b クラスターで、以下の手順を実行します。手順は上記とほぼ同じです。

    1. モニターノードで、rbd-mirror デーモンがクラスターへの接続に使用するユーザーを作成します。この例では、site-b ユーザーを作成し、そのキーを site-b.client.site-b.keyring という名前のファイルに出力します。Ceph 設定ファイルは /etc/ceph/site-b.conf です。

      構文

      ceph auth get-or-create client.SECONDARY_CLUSTER_NAME mon 'profile rbd' osd 'profile rbd pool=data' -o /etc/ceph/SECONDARY_CLUSTER_NAME.client.USER_NAME.keyring -c /etc/ceph/SECONDARY_CLUSTER_NAME.conf

      [root@mon ~]# ceph auth get-or-create client.site-b mon 'profile rbd' osd 'profile rbd pool=data' -o /etc/ceph/site-b.client.site-b.keyring -c /etc/ceph/site-b.conf

    2. キーリングを site-a クラスターにコピーします。rbd-daemon が実行される site-a クラスターのクライアントノードにファイルをコピーします。ファイルを /etc/ceph/site-b.client.site-b.keyring に保存します。

      構文

      scp /etc/ceph/SECONDARY_CLUSTER_NAME.client.USER_NAME.keyring root@PRIMARY_CLIENT_NODE_NAME:/etc/ceph/SECONDARY_CLUSTER_NAME.client.USER_NAME.keyring

      [root@mon ~]# scp /etc/ceph/site-b.client.site-b.keyring root@client.site-a:/etc/ceph/site-b.client.site-b.keyring

    3. Ceph 設定ファイルをモニターノードから site-a モニターノードおよびクライアントノードにコピーします。この例の Ceph 設定ファイルは /etc/ceph/site-b.conf です。

      構文

      scp /etc/ceph/SECONDARY_CLUSTER_NAME.conf root@PRIMARY_MONITOR_NODE_NAME:/etc/ceph/SECONDARY_CLUSTER_NAME.conf
      scp /etc/ceph/SECONDARY_CLUSTER_NAME.conf user@PRIMARY_CLIENT_NODE_NAME:/etc/ceph/SECONDARY_CLUSTER_NAME.conf

      [root@mon ~]# scp /etc/ceph/site-b.conf root@mon.site-a:/etc/ceph/site-b.conf
      [root@mon ~]# scp /etc/ceph/site-b.conf user@client.site-a:/etc/ceph/site-b.conf

  6. site-a クラスターで、以下の手順を実行します。

    1. site-b から site-a へのミラーリングを設定します。Ansible 管理ノードで、rbdmirrors グループを Ansible インベントリーファイル (通常は /usr/share/ceph-ansible/hosts) に追加します
    2. [rbdmirrors] グループの下に、rbd-mirror デーモンが実行される site-a クライアントノードの名前を追加します。このデーモンは、イメージの変更を site-b から site-a にプルします。

      [rbdmirrors]
      client.site-a

    3. /usr/share/ceph-ansible ディレクトリーに移動します。

      [root@admin ~]# cd /usr/share/ceph-ansible
    4. group_vars/rbdmirrors.yml.sample から group_vars/rbdmirrors.yml にコピーして、新しい rbdmirrors.yml ファイルを作成します。

      [root@admin ceph-ansible]# cp group_vars/rbdmirrors.yml.sample group_vars/rbdmirrors.yml
    5. group_vars/rbdmirrors.yml ファイルを開いて編集します。
    6. ceph_rbd_mirror_configuretrue に設定し、ceph_rbd_mirror_pool をイメージをミラーリングするプールに設定します。この例では、data はプールの名前です。

      ceph_rbd_mirror_configure: true
      ceph_rbd_mirror_pool: "data"
    7. オプション: デフォルトでは、ceph-ansible はプール内の全イメージをミラーリングするプールモードを使用してミラーリングを設定します。ミラーリングが明示的に有効になっているイメージのみがミラーリングされるイメージモードを有効にします。イメージモードを有効にするには、ceph_rbd_mirror_modeimage に設定します。

      ceph_rbd_mirror_mode: image
    8. Ansible 管理ノードで、group_vars/rbdmirrors.yml ファイルに rbd-mirror クラスターの名前を設定します。例に従い、その他のクラスターの名前は site-b とします。

      ceph_rbd_mirror_remote_cluster: "site-b"
    9. Ansible 管理ノードで、group_vars/rbdmirrors.yml ファイルの ceph_rbd_mirror_remote_user を使用してキーのユーザー名を設定します。この例では、ユーザーの名前は client.site-b です。

      ceph_rbd_mirror_remote_user: "client.site-b"
    10. 管理ノードで Ansible ユーザーとして、Ansible Playbook を実行します。

      • ベアメタルデプロイメント

        [user@admin ceph-ansible]$ ansible-playbook site.yml --limit rbdmirrors -i hosts
      • コンテナーデプロイメント

        [user@admin ceph-ansible]$ ansible-playbook site-container.yml --limit rbdmirrors -i hosts
  7. site-a クラスターと site-b クラスターの両方で、必要なイメージのミラーリングを明示的に有効にします。

    構文

    ジャーナルベースのミラーリング

    rbd mirror image enable POOL/IMAGE

    スナップショットベースのミラーリング

    rbd mirror image enable POOL/IMAGE snapshot

    [root@mon ~]# rbd mirror image enable data/image1
    [root@mon ~]# rbd mirror image enable data/image1 snapshot

    注記

    新規イメージをピアクラスターにミラーリングする場合は常にこの手順を繰り返します。

  8. ミラーリングのステータスを確認します。site-a クラスターのクライアントノードから以下のコマンドを実行します。

    ジャーナルベースのミラーリング

    [root@mon ~]# rbd mirror image status data/image1
    image1:
      global_id:   08027096-d267-47f8-b52e-59de1353a034
      state:       up+stopped 1
      description: local image is primary
      last_update: 2021-04-16 15:45:31

    スナップショットベースのミラーリング

    [root@mon ~]# rbd mirror image status data/image1
    image1:
      global_id:   47fd1aae-5f19-4193-a5df-562b5c644ea7
      state:       up+stopped 1
      description: local image is primary
      service:     admin on ceph-rbd1-vasi-43-5hwia4-node2
      last_update: 2022-01-20 12:42:54
      peer_sites:
        name: rbd-mirror.site-b
        state: up+replaying
        description: replaying, {"bytes_per_second":0.0,"bytes_per_snapshot":0.0,"local_snapshot_timestamp":1642693094,"remote_snapshot_timestamp":1642693094,"replay_state":"idle"}
        last_update: 2022-01-20 12:42:59
      snapshots:
        5 .mirror.primary.47fd1aae-5f19-4193-a5df-562b5c644ea7.dda146c6-5f21-4e75-ba93-660f6e57e301 (peer_uuids:[bfd09289-c9c9-40c8-b2d3-ead9b6a99a45])
    1 1
    イメージは up+stopped 状態である必要があります。ここでは、uprbd-mirror デーモンが実行中で、stopped は、イメージが別のクラスターからのレプリケーション先ではないことを意味します。これは、イメージがこのクラスターのプライマリーであるためです。