Ceph Nano、それはお手軽に作るオブジェクトストレージ

こんにちは、Red Hat でストレージを中心にクラウドインフラを生業にしている宇都宮です。

さてみなさん、「ちょっとしたオブジェクトストレージが作りたいなあ」なーんて思ったことはありませんか?オブジェクトストレージを扱うアプリケーションを開発してる方とか。OpenShiftみたいなCloud Nativeなプラットフォームを作ってる方とか。バケットの事を考えると眠れなくなるほどオブジェクトストレージが好きで伝説の樹の下で…ゴニョゴニョ

え?本家のS3を使うから大丈夫?確かにそれは一つの答えです。ですが安いとは言えお金がかかるし、インターネットを超えるからスループットやレスポンスは落ちるし、できればオンプレがいいなあ、みたいな。

"ちょっとしたファイルストレージ" ならサクッとNFSサーバーを建てれば当面解決できるんですけどね。オブジェクトストレージはそういうのがあまり無いんですよね。かと言って割としっかりオブジェクトストレージを作ろうとするとそれなりにリソースの準備が要るのでハードルが高い。ここはNFSサーバー並みのお手軽さが望ましい。

そういうわけで、前置きが長くなりましたが今回はNFSサーバー並みにお手軽に作るオブジェクトストレージを紹介します。Ceph Nanoです。

f:id:ututaq:20190509104828p:plain

Ceph Nanoとはなんぞ

Ceph Nanoとは、その名の通りオープンソースSDSのCephを元にした超小型オブジェクトストレージを実現するソフトウェアです。githubで公開されていて誰でも入手して使えます。

github.com

元のCephはデータの冗長化やシステムの耐障害性を上げるため少なくとも3つ以上のノードでストレージクラスターを組むことが一般的ですが、Ceph Nanoは1つだけです。しかもあなたのPCでも稼働できるほどの激軽さです。Linuxの他に、MacでもOK。

あ、Ceph Nanoは元のCephとは違ってブロックストレージやファイルストレージとしては使えないので注意して下さいね。

さっそくCeph Nanoをインストールしてみよう

基本的には先のgithubのREADMEを読めば分かるんですが、めっちゃ簡単なのでここで追っていきましょう。

0. コンテナの実行環境を用意する

Ceph NanoはCephストレージをコンテナで作るのでコンテナ実行環境を用意します。コンテナの実行環境についてはやいやい声が聞こえてくるところですが、githubのインストール手順にしたがってDockerを用意しましょう。

[utubo@tutsunom ~]$ sudo systemctl start docker
[utubo@tutsunom ~]$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-05-09 13:05:31 JST; 2s ago
     Docs: http://docs.docker.com
 Main PID: 19612 (dockerd-current)
    Tasks: 15 (limit: 8192)
   Memory: 45.7M
   CGroup: /system.slice/docker.service
           └─19612 /usr/bin/dockerd-current --add-runtime oci=/usr/libexec/docker/docker-runc-current --default-runtime=oci --authorization-plugin=rhel-push>
...
[utubo@tutsunom ~]$ docker -v
Docker version 1.13.1, build 1185cfd/1.13.1
1. githubからcnのバイナリをダウンロードする

Ceph Nanoは基本的にcn(ceph nanoの略ね)というバイナリを使っていろいろ操作します。 ここに使うマシン毎にcnのバイナリがあるので、サクッとダウンロードしましょう。 僕マシンはfedora 28なのでLinux amd64を。

[utubo@tutsunom ~]$ curl -L https://github.com/ceph/cn/releases/download/v2.3.0/cn-v2.3.0-linux-amd64 -o cn && chmod +x cn
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   612    0   612    0     0   1026      0 --:--:-- --:--:-- --:--:--  1026
100 12.0M  100 12.0M    0     0   742k      0  0:00:16  0:00:16 --:--:-- 1939k
[utubo@tutsunom ~]$
2. 試しにcnを叩いてみる。
[utubo@tutsunom ~]$ ./cn
Current version: v2.3.0
Latest version: v2.3.0
Ceph Nano - One step S3 in container with Ceph.

                  *(((((((((((((
                (((((((((((((((((((
              ((((((((*     ,(((((((*
             ((((((             ((((((
            *((((,               ,((((/
            ((((,     ((((((/     *((((
            ((((     (((((((((     ((((
            /(((     (((((((((     ((((
             (((.     (((((((     /(((/
              (((                *((((
              .(((              (((((
         ,(((((((*             /(((
          .(((((  ((( (/  //   (((
                 /(((.  /(((((  /(((((
                        .((((/ (/

Usage:
  cn [command]
...

イヤァオ!チビタコのAAがきゃわわ!

あれ、終わり?Dockerは?っていうお客様。トランキーロ。これからです。

3. Cephクラスターを実行する。

cnを使ってCephのコンテナを実行します。最初はイメージをダウンロードする時間が数分かかります。 ってかCephのコンテナイメージってどんなのがあんの?というのもcnを使って調べられます。

[utubo@tutsunom ~]$ ./cn image ls
ceph/daemon:latest-bis
ceph/daemon:latest-bis-nautilus
ceph/daemon:latest-bis-mimic
ceph/daemon:latest-bis-luminous
ceph/daemon:master-11bc88f-mimic-centos-7-aarch64
ceph/daemon:master-11bc88f-luminous-centos-7-aarch64
ceph/daemon:latest-bis-master
ceph/daemon:latest
ceph/daemon:latest-nautilus
ceph/daemon:latest-mimic
ceph/daemon:latest-luminous
ceph/daemon:latest-master
ceph/daemon:master-11bc88f-mimic-centos-7
ceph/daemon:master-11bc88f-luminous-centos-7
ceph/daemon:master-11bc88f-luminous-opensuse-42.3-x86_64
ceph/daemon:master-11bc88f-master-centos-7-x86_64
...

めっちゃ出てくるので↑では省略してますが、dockerhubにあるlatest-*とmaster-*のタグが付いたイメージが列挙される感じです。

多いよもう、どれがいいんだよ。って思いますよね。僕もそう思う。そんな時は、ひとまずこれがいいんじゃない?というのもcnで出てきます。

[utubo@tutsunom ~]$ ./cn image show-aliases
+----------+--------------------------------------------------+
| ALIAS    | IMAGE_NAME                                       |
+----------+--------------------------------------------------+
| luminous | ceph/daemon:latest-luminous                      |
| mimic    | ceph/daemon:latest-mimic                         |
| redhat   | registry.access.redhat.com/rhceph/rhceph-3-rhel7 |
+----------+--------------------------------------------------+

とりあえず3つに絞れた。お、Red Hat Ceph Storageのイメージも出てきますね。せっかくだから、俺はこの赤い扉を選ぶぜ!とばかりにこいつを選んでみましょう。Red Hat Ceph StorageのサブスクリプションがなくてもOKよ!

[utubo@tutsunom ~]$ ./cn cluster start desusama -i redhat
The container image (registry.access.redhat.com/rhceph/rhceph-3-rhel7) is not present, pulling it. 
This operation can take a few minutes.
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
2019/05/10 10:15:45 Running cluster desusama | image registry.access.redhat.com/rhceph/rhceph-3-rhel7 | flavor default {512MB Memory, 1 CPU} ...

Endpoint: http://172.20.10.2:8000
Dashboard: http://172.20.10.2:5000
Access key: 8C072B46WQA5945CB6K9
Secret key: nCt4TNicHXHkkq0uNqpbsMWX6UKCjHfsvPVNYEWX
Working directory: /usr/share/ceph-nano

イヤァオ!

これでS3 compatibleなオブジェクトストレージができました。 ちなみにEndpointやAccess keyなどの情報は、./cn cluster statusでいつでも確認できるので心配なく。

[utubo@tutsunom ~]$ ./cn cluster status desusama

Endpoint: http://172.20.10.2:8000
Dashboard: http://172.20.10.2:5000
Access key: 8C072B46WQA5945CB6K9
Secret key: nCt4TNicHXHkkq0uNqpbsMWX6UKCjHfsvPVNYEWX
Working directory: /usr/share/ceph-nano

ではオブジェクトをPUTしてみよう

S3クライアントは世間にたくさんあるので何を使ってもいいんですが、とりあえず本家のawscliを使ってみます。

さっきのAccess KeyとSecret Keyを使ってaws configureで設定をして適当なバケットを作ってみましょう。

[utubo@tutsunom ~]$ aws configure
AWS Access Key ID [None]: 8C072B46WQA5945CB6K9
AWS Secret Access Key [None]: nCt4TNicHXHkkq0uNqpbsMWX6UKCjHfsvPVNYEWX
Default region name [None]: 
Default output format [None]: json
[utubo@tutsunom ~]$ aws --endpoint-url http://172.20.10.2:8000 s3 mb s3://combat
make_bucket: combat
[utubo@tutsunom ~]$ aws --endpoint-url http://172.20.10.2:8000 s3 ls
2019-05-11 09:56:23 combat

オッケーオッケー。そしたら適当なフォルダをsyncでアップロードします。

[utubo@tutsunom ~]$ ll -p testfiles/
total 240
-rw-r--r-- 1 utubo utubo   3123 Jul 15  2018 INSTALL
-rw-r--r-- 1 utubo utubo  15220 Jul 15  2018 LICENSE
-rw-r--r-- 1 utubo utubo     55 Jul 15  2018 MANIFEST.in
-rw-r--r-- 1 utubo utubo  15759 Jul 15  2018 NEWS
-rw-r--r-- 1 utubo utubo   1802 Jul 15  2018 PKG-INFO
-rw-r--r-- 1 utubo utubo  15194 Jul 15  2018 README.md
drwxr-xr-x 2 utubo utubo   4096 Jul 15  2018 S3/
-rwxr-xr-x 1 utubo utubo 146943 Jul 15  2018 s3cmd
-rw-r--r-- 1 utubo utubo  21151 Jul 15  2018 s3cmd.1
drwxr-xr-x 2 utubo utubo    110 Jul 15  2018 s3cmd.egg-info/
-rw-r--r-- 1 utubo utubo     67 Jul 15  2018 setup.cfg
-rw-r--r-- 1 utubo utubo   3793 Jul 15  2018 setup.py
[utubo@tutsunom ~]$ aws --endpoint-url http://172.20.10.2:8000 s3 sync testfiles/ s3://combat/testfiles
upload: testfiles/S3/AccessLog.py to s3://combat/testfiles/S3/AccessLog.py
upload: testfiles/S3/Crypto.py to s3://combat/testfiles/S3/Crypto.py
upload: testfiles/INSTALL to s3://combat/testfiles/INSTALL          
upload: testfiles/S3/ACL.py to s3://combat/testfiles/S3/ACL.py      
upload: testfiles/S3/ConnMan.py to s3://combat/testfiles/S3/ConnMan.py
upload: testfiles/S3/Custom_httplib27.py to s3://combat/testfiles/S3/Custom_httplib27.py
upload: testfiles/S3/BidirMap.py to s3://combat/testfiles/S3/BidirMap.py
upload: testfiles/S3/CloudFront.py to s3://combat/testfiles/S3/CloudFront.py
upload: testfiles/S3/Config.py to s3://combat/testfiles/S3/Config.py
upload: testfiles/README.md to s3://combat/testfiles/README.md      
upload: testfiles/S3/Custom_httplib3x.py to s3://combat/testfiles/S3/Custom_httplib3x.py
upload: testfiles/S3/HashCache.py to s3://combat/testfiles/S3/HashCache.py
upload: testfiles/S3/Exceptions.py to s3://combat/testfiles/S3/Exceptions.py
upload: testfiles/LICENSE to s3://combat/testfiles/LICENSE          
upload: testfiles/S3/ExitCodes.py to s3://combat/testfiles/S3/ExitCodes.py
upload: testfiles/S3/FileDict.py to s3://combat/testfiles/S3/FileDict.py
upload: testfiles/S3/PkgInfo.py to s3://combat/testfiles/S3/PkgInfo.py
upload: testfiles/S3/MultiPart.py to s3://combat/testfiles/S3/MultiPart.py
upload: testfiles/S3/Progress.py to s3://combat/testfiles/S3/Progress.py
upload: testfiles/S3/FileLists.py to s3://combat/testfiles/S3/FileLists.py
upload: testfiles/S3/__init__.py to s3://combat/testfiles/S3/__init__.py
upload: testfiles/S3/S3Uri.py to s3://combat/testfiles/S3/S3Uri.py  
upload: testfiles/s3cmd.1 to s3://combat/testfiles/s3cmd.1          
upload: testfiles/S3/SortedDict.py to s3://combat/testfiles/S3/SortedDict.py
upload: testfiles/S3/Utils.py to s3://combat/testfiles/S3/Utils.py  
upload: testfiles/s3cmd.egg-info/PKG-INFO to s3://combat/testfiles/s3cmd.egg-info/PKG-INFO
upload: testfiles/s3cmd.egg-info/SOURCES.txt to s3://combat/testfiles/s3cmd.egg-info/SOURCES.txt
upload: testfiles/s3cmd.egg-info/requires.txt to s3://combat/testfiles/s3cmd.egg-info/requires.txt
upload: testfiles/S3/S3.py to s3://combat/testfiles/S3/S3.py       
upload: testfiles/s3cmd to s3://combat/testfiles/s3cmd              
upload: testfiles/s3cmd.egg-info/dependency_links.txt to s3://combat/testfiles/s3cmd.egg-info/dependency_links.txt
upload: testfiles/s3cmd.egg-info/top_level.txt to s3://combat/testfiles/s3cmd.egg-info/top_level.txt
upload: testfiles/setup.cfg to s3://combat/testfiles/setup.cfg      
upload: testfiles/MANIFEST.in to s3://combat/testfiles/MANIFEST.in  
upload: testfiles/NEWS to s3://combat/testfiles/NEWS                
upload: testfiles/PKG-INFO to s3://combat/testfiles/PKG-INFO        
upload: testfiles/setup.py to s3://combat/testfiles/setup.py        
[utubo@tutsunom ~]$ aws --endpoint-url http://172.20.10.2:8000 s3 ls s3://combat
                           PRE testfiles/
[utubo@tutsunom ~]$ aws --endpoint-url http://172.20.10.2:8000 s3 ls s3://combat/testfiles/
                           PRE S3/
                           PRE s3cmd.egg-info/
2019-05-11 10:02:24       3123 INSTALL
2019-05-11 10:02:25      15220 LICENSE
2019-05-11 10:02:25         55 MANIFEST.in
2019-05-11 10:02:25      15759 NEWS
2019-05-11 10:02:25       1802 PKG-INFO
2019-05-11 10:02:24      15194 README.md
2019-05-11 10:02:25     146943 s3cmd
2019-05-11 10:02:25      21151 s3cmd.1
2019-05-11 10:02:25         67 setup.cfg
2019-05-11 10:02:25       3793 setup.py

頼れるね!

ね?簡単だったでしょ?

こんな具合でS3的なオブジェクトストレージを作ることができます。これくらい簡単だったらいっちょやってみっかって気分になりません?そんな気分になった方は是非お気軽に試してみて下さいね!

あ、最後にCeph Nanoの注意点ですが、

  • Ceph Nanoは開発やデモで使う目的で簡易的に作られてるものなので、本番環境では使わないでください。
  • あと、Ceph NanoはRed Hatが製品としてリリースしているものではないので、サポートは受けられません。

というわけで、今回はここまで。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。