12/8のJuly Tech Festa 2019での登壇資料です。
Cloud Native開発者のためのDatabase with KubernetesJuly Tech Festa 2019 , 12/8Takahiro, Kobayashi( @tzkb)
View Slide
2最近やっていること• Cloud Native Days Tokyo 2019“Cloud Native Storageが拓くDatabase on Kubernetesの未来”• PGConf.Asia 2019“Building PostgreSQL as a Servicewith Kubernetes”+ =∞
31. 突撃!お宅のデータベース2. Managed Serviceで出来ること/出来ないこと3. ここまで出来る Database with Kubernetes4. Kubernetesはプラットフォームへアジェンダ#JTF2019 #JTF2019_A
4突撃!お宅のデータベース1
5昔々あるところに、LBAPAPAP• 古きよきLB-AP-DBのWebシステムがありました。• VMかもしれないし、ベアメタルかも。• 機器は老朽化、アーキテークチャも陳腐化。• ある日、偉い人は言いました。「これからはクラウド」
6Lift & Shift だ!• 担当者は不眠不休でがんばりました。• クラウド上へシステムを移行。• アプリケーションをコンテナ化、Kubernetesにデプロイ。• データベースはManagedServiceを使った。良くありますよね?(むしろ頑張ったほう)APAPAP
7使ってるDBはどこに? @PostgreSQLアンカンファレンスオンプレクラウド(Managed)コンテナ91184151
8なぜManagedなデータベースを使うのか(建前)• RDSは素晴らしい。• ベストプラクティスでしょ?• 構築もらっくらく。• 運用もほぼ自動。(本音)• インストールとか面倒。• 開発が本業。DBAいない。• ストレージもわからない。• おれたちは雰囲気でDBやってる。DB
9今日のゴール ~ Managed Service以外の選択肢を ~ アプリケーションはコンテナ化して、Kubernetesも使う/使おうとしている、Cloud Native開発者の方に。 データベースの選択肢もいろいろあります。 Managed Serviceが唯一解ではありません。 DBのコンテナ化、という手もあります。 Kubernetes の力を借りてみましょう。
10今日話さないこと Kubernetesの一般的な概念。(一部、Statefulな機能の紹介はあります。) Kubernetesクラスタの構築・管理方法。(K8sクラスタは構築済みを前提とします。異論はあると思います。) PostgreSQL以外のデータベースでの事例。(ちょっとは話すかも知れません。)
11Managed Serviceで出来ること/出来ないこと2
12RDSで出来ること電源、ラックサーバ管理OSインストールOSパッチDBインストールDBパッチバックアップ/リストアHAスケールアプリケーション電源、ラックサーバ管理OSインストールOSパッチDBインストールDBパッチバックアップ/リストアHAスケールアプリケーションオンプレミス Amazon RDSユーザによる管理 による管理
13RDSで出来ないこと(制限されること)制限事項(例) 具体的な例バージョン選択 現在の最新は11.5(12はBeta)リソース上限 r5.24xl(96vCPU、768GBメモリ)、ストレージは最大64TBリソース下限 t3.mic(2vCPU、1GBメモリ)一部パラメータが変更不可 full_page_writesなど一部のパラメータは変更できないExtensionが限られる pg_hint_planなど一部はインストール可、全てではない。OSログインできない ssh接続によるOSログインはできない。• オンプレミスでの構築の場合は、そもそもManagedは使えない。
14それ、Database with Kubernetesでも出来ますよ?電源、ラックサーバ管理OSインストールOSパッチDBインストールDBパッチバックアップ/リストアHAスケールアプリケーションDatabase w/K8sクラスタによる管理バージョン選択 任意のバージョンを選べるリソース上限 Nodeのキャパシティ次第リソース下限 CPUはmill core単位で指定可パラメータ 全て変更可能Extension 全て導入可能OSログイン 可能(任意のユーザ作成も可)
15ちょっと視点を変えて• ManagedなDBは確かに便利だが、全工程で最適ではない。特徴 • 開発者向け• 1人で1DBが理想• リリース確認用• ユーザ/内部テスト• 本番サービス用Managed向き?• No.• 1人1インスタンスは辛い• Yes.• インスタンスが増えていくことも。• Yes.• Managedのサービスレベル次第Development Test/Staging Production
16DevelopmentではAPAPAPAP1人1DBあると捗る。詰め込んでお安く。可用性は諦めるデータ保護は開発者で。温かみのある手動デプロイ。
17Test/Stagingでは連結テスト ユーザ確認環境をきちんと分ける。可用性は最低限レベルで必要。データ保護、バックアップも。データのCloneも便利。統制の利いたCI/CD。APAPAPAP APAPAPAP
18Productionでは• ワークロード毎に求められる要件は変わってくる。梅 竹 松RDS(Multi-AZ)RDS(Readレプリカ)AuroraSpanner• 最低限の可用性。• AZ超えて、データを保護。• スケールはしない。• 3重以上のデータ保護。• Readのみスケールが可能。• 構成管理は複雑に。• 3重以上のデータ保護。• Writeヘビーなワークロードでもスケール。• データ設計が特殊に。例
19ここまでできるDatabase with Kubernetes3
20For Development• オンデマンドなインスタンス作成をKubernetesで実現。apiVersion: v1kind: Podmetadata:name: postgres-tzkbspec:containers:- name: postgres12-1image: postgres:12.1resources:requests:cpu: 500mmemory: 512Milimits:cpu: 1000mmemory: 1024MivolumeMounts:- name: pg-volmountPath: /var/lib/postgresql/data
21(解説)Development向けの超シンプルPostgreSQLapiVersion: v1kind: Podmetadata:name: postgres-tzkbspec:containers:- name: postgres12-1image: postgres:12.1resources:requests:cpu: 500mmemory: 512Milimits:cpu: 1000mmemory: 1024MivolumeMounts:- name: pg-volmountPath: /var/lib/postgresql/dataports:- containerPort: 5432volumes:- name: pg-volemptyDir: {}柔軟なバージョン選択リソース上限/下限の設定ローカルディスクの一時利用より詳細に知りたい方は「Production Ready Kubernetesに必要な15のこと」https://speakerdeck.com/govargo/production-ready-kubernetes-15-rulesコンテナ(Pod)を停止するとデータが消える。
22Development->Test/Stagingの課題 単純にコンテナをNodeに詰め込んだだけ。• 1ノードならDockerレベルのことをやっているだけ。 Kubernetesのデータ永続化の仕組みを使っていない。• StatefulSetやPersistentVolumeという仕組みがある。 ローカルディスクのキャパシティ管理が難しい。• ローカルディスクの空きはPodデプロイ時に考慮されない。
23(参考)TopoLVMとはtopolvmlvmd/dev/hoge1 /dev/hoge2 /dev/hoge3• サイボウズが開発した、LVMベースのCSIプラグイン。• ローカルボリュームのキャパシティ管理に関する問題を解決する。【特徴】• LVMによるボリューム管理。• サイズやフォーマットなどを作成時に指定可能。• 動的プロビジョニングに対応。• ノードの空き容量に応じたスケジューリング。https://github.com/cybozu-go/topolvm
24For Test/StagingKubernetesの仕組みを使って、正しく作る。• StatefulSet(sts)– 安定的なストレージ利用、一意なホスト名などデータベースでの利用に向いている。• Persistent Volume(PV)– PV/PVC/StorageClassを用いて、データを永続化。– データ保護の面ではクラウド・ストレージを使うのが最も簡単。APAPAP連結テスト ユーザ確認PVAPAPAPPVCPVCPVCPVCPVPVPV
25Test/Stagingをオンプレで構築するなら ~既存機器の利用~APクラウド・ストレージの変わりに、既設ハードウェアをそのまま使えるケースがある。• 下記の製品は自社ストレージをコンテナ・Kubernetesから利用可能とする仕組みを提供。– NetApp Trident– Pure Storage PSO既設のストレージPVC
26Test/Staging->Productionの課題 可用性が十分でない。• StatefulSetのデプロイ対象Nodeを複数に出来ていない。• そのため、Auto-Healingが効かない。• EBSを使った場合、AZ障害で利用継続できない。 シングルインスタンスでスケーラビリティがない。• データベースのスケールアウトに必要な、Readレプリカなどの仕組みが考慮されていない。
27For Production• DB with Kubernetesで何処までカバーできるかの見極めが必要。梅 竹 松可用性データ保護運用性拡張性いずれも高2重化(Multi-AZ) 3重化以上なし Readレプリカ Wrire分散Operatorによる自動化DBAによる運用
28For Production(梅モデル)~OSS版~kube-fencingAZ-a AZ-b 【特徴】• SDSを用いたAZ跨ぎのリアルタイムなデータ冗長化。– LINSTOR/DRBDとは、LinuxのHA構成では昔からあるネットワークRAIDをSDS化したもの。• kube-fencingによる自動フェイルオーバ。• はシングルインスタンスでシンプルで管理も容易。
29Fencingとは?kube-fencing• Kubernetesに本来向かない、共有ディスク型HAに必要な仕組み。• K8sではNW分断などでsplitbrainとなることを防ぐため、自動FOをしない。• kube-fencingは管理ポート・クラウドAPI等を使って、Nodeの電源を強制断。• リソースが解放され、待機系でDBが起動される。
30For Production(梅モデル)~プロプライエタリ版~kube-fencingAZ-a AZ-b 【特徴】• NetAppがAWS等で提供する、Cloud Volume ONTAPを使ってAZを超えてデータの冗長化が可能。• HPE Cloud Volumesも同じ用途で利用可能と思われる。• その他の特徴はOSS SDSのものと同じ。
31For Production(竹モデル)kubedb-operator-0 -1 -2postgres snapshotdormantdabasesS3等にスナップショットの保存が可能AZ-a AZ-b AZ-c 【特徴】• KubeDB というOSSで、Streaming Replication。• 1台のMaster、複数のSlaveで構成され、Readクエリは分散可能。• 面倒な初期構築やリカバリをKubeDB Operatorが管理。• バックアップなどもK8sから実行可能、DBAの負荷が軽減される。
32For Production:Zalandoのケース• PGConf.Asiaで発表された on Kubernetesの例。Productionとして大規模に展開。
33For Producion(松モデル)
34For Production(松モデル)? Writeヘビーなワークロードをこなせる分散DBは、そもそも非常に難しい。 例えば、以下のようなソリューションがあるが、いずれも現時点でKubernetes上に実装するのは簡単でない。• Oracle Exadata• Amazon Aurora• Google Cloud Spanner• Azure Database for PostgreSQL – Hyperscale(Citus)
35(参考)アプリケーション・パーティショニングAP AP AP0• サービス単位だけでなく、アクセスするデータ範囲でも、分割してデプロイする。• DBレイヤで特別な技術(シャーディング等)を採用せず、構成がシンプルに。• 但し、サービス成長でリバランスが発生すると大変。
36Kubernetesはプラットフォームへ4
37Database with Kubernetesの現実• Productionで難しいケースがあることは事実。梅 竹 松RDS(Multi-AZ)RDS(Readレプリカ)AuroraSpannerManaged• SDSでAZを超えてデータ冗長化。• 共有ディスク型HAを模した可用性。w/ K8s• Replicationで冗長化、Readはスケール。• Operatorで自動化、運用効率化。王道かつ現実解
38For Producion(松モデル)も実現する可能性が!• with K8sな が開発されている。tablet3tablet2tablet1tablet4tablet2tablet1tablet4tablet3tablet1tablet4tablet3tablet1DistrbutedTxn MgrDistrbutedTxn MgrDistrbutedTxn MgrDistrbutedTxn Mgrsyscatalog syscatalog syscatalog【特徴】• Spannerに似た分散DBでWriteヘビーに強い。• PostgreSQLのSQLエンジンと分散ストレージとしてのDocDBで構成される。• データはShardingかつ冗長化される。
39(参考)MySQLでの分散DB(Sharding)の運用例VTtabletVTtabletVTtabletVTgate• MySQLでのwith Kubernetesといえば、Vitessが著名。• Youtubeで利用されている実績がある。• CNCFでもIncubatingからGraduatedになり、成熟化したと認められている。• 何十億ユーザの大規模データベースを実用レベルで動かすなら、ここまで必要。APAPAP
40(参考)Shardingとは• ノード間でデータを分割して保持、一つのDBのように見せる。• コーディネータが処理を振り分け、負荷を分散する。• ReadもWriteも分散できる。• データ冗長化は基本的に含まない。合わせて実装することもある。• トランザクション実装が難しい。• 可用性よりも拡張性を高める際に使われる構成。コーディネータ
41Kubernetesはデータベース・プラットフォームへShardingRDB on 分散KVS• Vitessがメジャーな事例。• Hyperscale(Citus)も同様。• 多数のインスタンス管理はKubernetesの得意ワザであり、相性は良い。• Spannerなどが典型。• プラットフォームとしてのKubernetesでSQLエンジンと分散KVSを、大規模に展開・管理できる可能性がある。• 2種の分散DBのプラットフォームとして、Kubernetesに注目。
42(再掲)今日のゴール ~ Managed Service以外の選択肢を ~ アプリケーションはコンテナ化して、Kubernetesも使う/使おうとしている、Cloud Native開発者の方に。 データベースの選択肢はいろいろあります。 Managed Serviceが唯一解ではありません。 DBのコンテナ化、という手もあります。 Kubernetes の力を借りてみましょう。with K8sも選択肢になり得る時代です。Kubernetesでアプリだけ、は勿体ないですよ。
43Questions?@tzkb@tzkoba