こんにちは、Red Hat でストレージを中心にクラウドインフラを生業にしている宇都宮です。
さてみなさん、「ちょっとしたオブジェクトストレージが作りたいなあ」なーんて思ったことはありませんか?オブジェクトストレージを扱うアプリケーションを開発してる方とか。OpenShiftみたいなCloud Nativeなプラットフォームを作ってる方とか。バケットの事を考えると眠れなくなるほどオブジェクトストレージが好きで伝説の樹の下で…ゴニョゴニョ
え?本家のS3を使うから大丈夫?確かにそれは一つの答えです。ですが安いとは言えお金がかかるし、インターネットを超えるからスループットやレスポンスは落ちるし、できればオンプレがいいなあ、みたいな。
"ちょっとしたファイルストレージ" ならサクッとNFSサーバーを建てれば当面解決できるんですけどね。オブジェクトストレージはそういうのがあまり無いんですよね。かと言って割としっかりオブジェクトストレージを作ろうとするとそれなりにリソースの準備が要るのでハードルが高い。ここはNFSサーバー並みのお手軽さが望ましい。
そういうわけで、前置きが長くなりましたが今回はNFSサーバー並みにお手軽に作るオブジェクトストレージを紹介します。Ceph Nanoです。
Ceph Nanoとはなんぞ
Ceph Nanoとは、その名の通りオープンソースSDSのCephを元にした超小型オブジェクトストレージを実現するソフトウェアです。githubで公開されていて誰でも入手して使えます。
元の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が製品としてリリースしているものではないので、サポートは受けられません。
というわけで、今回はここまで。