ダウンタイムなしでYandex。Cloudでデータベースをスケーリングする方法。 3つのホストの例

投稿はYandex.Cloudチームのメンバーによって準備されました:Ivan Vetkasov-建築家、Leonid Klyuyev-編集者


最近、 Yandex.Cloudのアーキテクチャについて話し ました 。 それでは、理論から実践に移りましょう。 自動化されたDBMS制御用のクラウドには、ClickHouseのマネージドサービス、PostgreSQLのマネージドサービス、MongoDBのマネージドサービスのクラウドサービスがいくつかあります。 これらはすべてプラットフォームベースであり、インフラストラクチャの管理ではなく、データストレージのタスクに集中できます。 ただし、クラスター仮想マシンを制御することが重要な場合があります。 たとえば、負荷の増加または減少に応じてスケーリングタスクが発生する場合があります。 通常、このシナリオは実用的な観点から最も時間がかかるものの1つです。 今日は、Yandex.Cloudを使用して複雑なスケーリングタスクを自動化する方法を説明し、クラスターのサイズ変更プロセスでデータベースが引き続き利用できることを確認します。











問題の声明



各サービスのクラスターを作成する場合、ユーザーはクラスターホストの数と、物理データセンターに対応する可用性ゾーン(可用性ゾーン、AZ)を決定できます。 現在、Yandex.Cloudは、ロシアの中央地域にある3つのYandexデータセンターを使用しています。 したがって、推奨される構成は、3つのホストを持つDBMSクラスターです。これは、フェイルセーフで災害に強いアーキテクチャを構築するという原則と最も一致しています。



したがって、DBMSクラスターの負荷がデータベースの能力を超え、コンピューティングリソースを追加するときが来た状況を想像してください。 これは、水平方向(クラスターにホストを追加することによる)と垂直方向(各クラスターマシンにリソースを追加すること)の両方で実行できます。 最も時間がかかり、エラーのリスクがあるため、2番目のオプションを検討してください。 このオプションが面倒なのはなぜですか? 一般的な場合、リソースを追加する手順は次のようになります。ホストの役割を切り替えます。 必要に応じて、DBMSを停止します。 仮想マシンをオフにします。 構成を変更します。 開始します。 DBMSパラメータを変更します。 DBMSを開始します。 蓄積されたデータ変更の同期を待っています。 したがって、3つのホストすべてに対して順番に。 多くのステップ-間違いのリスクが高い。 このプロセスを自動化できます-選択した自動化ソリューションを開始する前にのみテストする必要があります。 通常、テストするのに十分な時間はありませんが、Yandex.Cloudでは、不要なアクションなしで迅速に実行されます。 始めましょう。



準備手順とテストプロセス



準備には、次のものが必要です。









テストシナリオは簡単です:要塞ホストをデータベースクラスターの各ホストに接続する3つのセッションを開き、たとえば1秒の周期でSQLクエリをループで実行します。その後、クラスターをスケーリングし、システムの動作を確認するコマンドを送信します。







真実の瞬間



スケーリングを示すDBMSを選択してください。 PostgreSQLでは、ホストに役割が割り当てられますが、スケーリング時にサービスの透過的な切り替えはまだありません-この機能は計画中です。 たとえば、クラスタを増減する他のメカニズムは、3つのDBMSのすべてでほぼ同じなので、ClickHouseを使用します。







実験オブジェクト-異なる仮想サブネットにある3つのホストで構成されるクラスターを作成しましょう。 これを行うには、次のコマンドを入力します

yc managed-clickhouse cluster create



は、必要な引数をyc managed-clickhouse cluster create



してyc managed-clickhouse cluster create



します。 引数の順序は、「yc --help」の出力のリストに対応しています。 コマンドの本質は簡単です。仮想ネットワーク上にあるtestvpcを使用して、実稼働環境でch-to-resizeクラスターを作成し、名前とパスワード、10ギガバイトのディスク容量、最小クラスs1.nanoを設定します。 このクラスに対応する特性は次のとおりです。1CPU、4 GB RAM。 将来的には、スケーリングのためにs1.microクラスに移行し、CPUとRAMの数が2倍になるようにします。 割り当てることができる他のホストクラスを調べるには、次のコマンドを入力します

yc managed-clickhouse resource-preset list









したがって、クラスターを作成するコマンドは次のようになります。







 yc managed-clickhouse cluster create --name ch-to-resize --environment production --network-name testvpc --host zone-id=ru-central1-a,subnet-id=e9bfnjacigdo9p6j7j2s,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-b,subnet-id=e2l8iamol3b9mrtskb8q,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-c,subnet-id=b0c6qit7u9e8r0egedvj,assign-public-ip=false,type=clickhouse --user name=test,password=test123123 --database name=testdb --clickhouse-disk-size 10 --clickhouse-resource-preset s1.nano --clickhouse-disk-type network-nvme –async
      
      





応答として、クラスターIDとそのホストのホスト名のリストを取得します。







 yc managed-clickhouse cluster list +----------------------+--------------+-----------------------------+--------+---------+ | ID | NAME | CREATED AT | HEALTH | STATUS | +----------------------+--------------+-----------------------------+--------+---------+ | c9q7cr4ji2fe462qej8p | ch-to-resize | 2018-12-10T08:59:09.100272Z | ALIVE | RUNNING | +----------------------+--------------+-----------------------------+--------+---------+ yc managed-clickhouse host list --cluster-id c9q7cr4ji2fe462qej8p +-------------------------------------------+----------------------+---------+---------------+ | NAME | CLUSTER ID | HEALTH | ZONE ID | +-------------------------------------------+----------------------+---------+---------------+ | rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-a | | rc1a-sgxazra54xv6lhni.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-a | | rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-b | | rc1b-j1rtvsuz6t8x6ev2.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-b | | rc1c-emo0f2990povj7ie.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-c | | rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-c | +-------------------------------------------+----------------------+---------+---------------+
      
      





各ホストへの接続を開き、データベースへのクエリを実行しましょう。







 clickhouse-client --host rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 1" clickhouse-client --host rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive!') from system.clusters where replica_num = 2" clickhouse-client --host rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 3"
      
      





最後に、クラスターを増やす要求を送信します。







 yc managed-clickhouse cluster update --id c9q7cr4ji2fe462qej8p --clickhouse-resource-preset s1.micro -–async
      
      





クラスター削減の説明

リソースの量を増やすのではなく、減らしたい場合は、出力を参照して、より小さいクラスを指定する必要があります

yc managed-clickhouse resource-preset list



-たとえば、s1.nano。 同時に、チーム自体の構造は同じままです。







クエリ出力をファイルにリダイレクトしました。 略称リストは次のとおりです。







 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net Mon Dec 10 12:47:35 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:36 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:37 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:38 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:39 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:40 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:47:51 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:02 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:11 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:12 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:13 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:14 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:15 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:16 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:17 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:18 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:19 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:20 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net: Mon Dec 10 12:50:58 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:59 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:00 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:01 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:12 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:23 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:34 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:35 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:36 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:37 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:38 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:39 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:40 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:41 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:42 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:43 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:44 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:45 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:46 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net: Mon Dec 10 12:49:15 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:16 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:17 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:18 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:19 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:30 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:41 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:52 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:56 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:57 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:58 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:59 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:00 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:01 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:03 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:04 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:05 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:06 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:07 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive!
      
      





リストには、クラスターの各ホストがオフになった瞬間(接続タイムアウトが開始されたとき)、ホストがオンになりClickHouseがロードを開始した瞬間(接続が拒否されたとき)、およびホストが戻った瞬間が表示されます。 最も重要なことは、ホストが利用できなかった期間の分離です。 スケーリング中、少なくとも2つのホストがクエリの実行に使用できました。 これはグラフで見ることができます:







画像







結論とベストプラクティス



一見すると、データベースを使用したプロジェクトの開発には、大量のルーチン作業が含まれます。 データベースの保守、つまりバックアップコピーの作成、DBMSの定期的な更新プロセスの確立などを行う必要があります。主にこれらの時間のかかる機能を削除するために、クラウド管理サービスが登場しました。 ただし、実際の実稼働環境では、システムがサービスの観点から管理できるだけでなく、負荷の増減に対応する柔軟性も備えていると便利です。 ユーザーのプロジェクトの作業容量を維持しながら、Yandex.Cloudのデータベースのパフォーマンスを向上させる方法について説明しました。 データベースが正しく構成されている場合、トラフィックが増加すると使用可能なリソースの量が増加し、減少すると(複数の減少)、コストも削減されます。










どのクラウドベースのアプローチ、ツール、またはテクノロジーについて学びたいですか? 次のYandex.Cloudの投稿のコメントでトピックを提案します。








All Articles