2ノードでの rbd-mirror設定

ceph を2台 (1ノード1クラスタ) にインストールし、その間で rbd mirror を設定してみている。

環境はAWS上のCentOS7.5 AMI (ami-3185744e) を t2.medium で起動し、 disk は / に 8GB, /dev/xvdb として 8GB を割り当てている。

1ノードへのceph インストール

以下の設定で、1ノード上のceph でも HEALTH OK になることを確認できた。
※ デフォルト設定だと、同じクラスタ内に3ノード必要だったため、1ノードで動かしたい場合、ceph.conf に2行追記する必要があった。

hostname=$(hostname | awk -F. '{print $1}')
yum -y install epel-release

cat << EOM > /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOM

yum install -y ceph-deploy
mv -i /etc/yum.repos.d/ceph.repo /tmp

mkdir /root/my-cluster
cd /root/my-cluster/

ceph-deploy new ${hostname}

## 以下の2行を追記
echo 'osd_crush_chooseleaf_type = 0' >> ceph.conf
echo 'osd_pool_default_size = 1' >> ceph.conf


ceph-deploy install ${hostname}
ceph-deploy mon create-initial
ceph-deploy admin ${hostname}
ceph-deploy mgr create ${hostname}
ceph-deploy osd create --data /dev/xvdb ${hostname}

作成後、以下のように pool / image の作成を行い、block device として使用できることを確認している。
※ rbd-mirror の設定を続けて行う場合、mirror 先のクラスタにも、pool1 の作成 (# ceph osd pool create pool1 8) を実施しておく

ceph status
ceph osd pool create pool1 8
rbd pool init pool1
rbd create image1 --size 4096 --image-feature layering -p pool1
rbd map image1 --name client.admin -p pool1
ls -lhtr /dev/rbd/pool1/image1
mkfs -t xfs /dev/rbd/pool1/image1
mount /dev/rbd/pool1/image1 /mnt

rbd-mirror の設定

pool の作成が終わった後、rbd-mirror の設定を行う。

実際にミラーを行う rbd-mirror デーモンは、データ元の ceph クラスタに ceph クライアントとして接続するため、事前にデータ元クラスタでのkeyring作成と、mirror先クラスタからの疎通確認を行う必要がある。

上記のインストール手順だと データ元、 mirror 先ともに、ceph クラスタ名が 'ceph' となっており、mirror 時に別クラスタの指定が出来なくなってしまうため、事前にクラスタ名指定用のファイルを変更しておく。

各ノードで
/etc/sysconfig/ceph
CLUSTER=cluster1
-
CLUSTER=cluster2
を追記
※ cluster1 がデータ元、cluster2 を mirror 先とする


次に、以下のコマンドにより、cluster1 アクセス用の keyring (id: replusr1) を作成する。

※ データ元ノード上で実施
cd /etc/ceph
ln -s ceph.conf cluster1.conf
ln -s ceph.client.admin.keyring cluster1.client.admin.keyring
※ --cluster cluster1 の cli 指定を動作させるために必要

ceph auth get-or-create client.replusr1 mon 'profile rbd' osd 'profile rbd pool=pool1' -o /etc/ceph/cluster1.client.replusr1.keyring --cluster cluster1

ファイルが出来たら以下の2ファイルを、mirror 先ノードの /etc/ceph 以下に、scp 等でコピーする。

/etc/ceph/cluster1.conf
/etc/ceph/cluster1.client.replusr1.keyring

この段階で、mirror先のノードで以下を発行し、データ元のcephクラスタにアクセス出来ることを確認しておく。

※ mirror 先のノードで実施
ceph --id replusr1 --cluster cluster1 -s

また、後で、rbd-mirror デーモン起動時に使用するので、mirror 先のノードでも、cluster2 用の設定ファイルを作成しておく。

※ mirror 先のノード上で実施
cd /etc/ceph
ln -s ceph.conf cluster2.conf
ln -s ceph.client.admin.keyring cluster2.client.admin.keyring

ceph auth get-or-create client.replusr2 mon 'profile rbd' osd 'profile rbd pool=pool1' -o /etc/ceph/cluster2.client.replusr2.keyring --cluster cluster2

この後、実際にmirrorを始めるために、mirror を有効化する pool に対して以下を発行する。

※ データ元のノードで実施
# rbd feature enable pool1/image1 exclusive-lock
# rbd feature enable pool1/image1 journaling
※ 両方のノードで実施
# rbd mirror pool enable pool1 pool

最後に、mirror 先のノードにて、rbd-mirror デーモンの起動と、pool への peer 設定を実施する。

※ mirror 先のノードで実施
yum -y install rbd-mirror
systemctl enable ceph-rbd-mirror.target
systemctl enable ceph-rbd-mirror@replusr2
systemctl start ceph-rbd-mirror@replusr2

# rbd --cluster cluster2 mirror pool peer add pool1 client.replusr1@cluster1
# rbd --cluster cluster2 mirror pool info pool1
Mode: pool
Peers: 
  UUID                                 NAME     CLIENT          
  f383c009-2adf-419b-9f57-03030287fb8e cluster1 client.replusr1

# rbd mirror image status pool1/image1
image1:
  global_id:   ce71a13a-2a1d-4e5f-beb6-d95ca8e6558a
  state:       up+replaying
  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: 2019-02-09 11:09:40

この状態で、以下のように、pool に image を追加すると、数秒後に mirror 先にも追加されるようになるはずである。

# rbd create image2 --size 4096 --image-feature layering,exclusive-lock,journaling -p pool1


※ 反映までの時間を計測した結果、約2秒後に反映された
[root@ip-172-31-12-196 ceph]# date; rbd create image2 --size 4096 --image-feature layering,exclusive-lock,journaling -p pool1
Sat Feb  9 12:30:20 UTC 2019
[root@ip-172-31-12-196 ceph]# 

[root@ip-172-31-7-146 ~]# while true; do date; rbd -p pool1 ls; sleep 0.5; done
(snip)
Sat Feb  9 12:30:19 UTC 2019
image1
Sat Feb  9 12:30:19 UTC 2019
image1
Sat Feb  9 12:30:20 UTC 2019
image1
Sat Feb  9 12:30:20 UTC 2019
image1
Sat Feb  9 12:30:21 UTC 2019
image1
Sat Feb  9 12:30:21 UTC 2019
image1
Sat Feb  9 12:30:22 UTC 2019
image1
image2
Sat Feb  9 12:30:23 UTC 2019
image1
image2