質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

パフォーマンス

コード効率の向上や計算に関する質問には、このタグを使ってください。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

3回答

1521閲覧

DBサーバーの負荷軽減・システム構成についての質問です。

tmcafe

総合スコア18

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

パフォーマンス

コード効率の向上や計算に関する質問には、このタグを使ってください。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

1クリップ

投稿2018/12/13 03:03

前提・実現したいこと

システム構成・運用に関する質問でございます。

ただいまシステム上に登録したサイトから収集した情報を集計するツールを構築・運用しております。
そこでは、同じ処理を行う複数のサーバーを並列で起動して情報収集し、DBに常時書き込みをおこなっているのですが、CPU使用率が高くなり(常時80%近く)、対策しなければと考えております。

システム構成はシンプルで以下のようになっております。

イメージ説明

処理手順

処理手順は単純で、以下です。

  1. 各EC2インスタンス上でクローラを起動し情報取得。データ加工。
  2. 各EC2インスタンス上からRDSにデータを書き込み。
  3. 各EC2インスタンス上で、上記を繰り返す。

説明

EC2インスタンスは、30台〜40台ほど(今後もっと増える)

一つの手としてRDS(MySQL)のスペックを上げるというのも、もちろんあると思うのですが、
いずれそれでも限界が来るように思うのと、単純な構成のためまだ工夫の余地があるのではないかと思い質問させて頂きました。

こういった中規模なシステム構築の経験がないもので、ご経験者がいらっしゃいましたらご教示頂けますと幸いです。

※他にも必要な情報がございましたら、おっしゃって頂ければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

RDSのリードレプリカを作成し、読み込みと書き込みを分けてはどうでしょうか。
GCPなどの他のクラウドでも、モデルを上げるか・リードレプリカの作成で対応することが多いかなと思われます。
https://aws.amazon.com/jp/rds/details/read-replicas/

投稿2018/12/13 05:59

gitya107

総合スコア706

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmcafe

2018/12/13 11:24

ご回答ありがとうございます! RDSのリードレプリカですね。調べてみます!!
guest

0

MySQLにおいては、サーバをクラスタ化して負荷分散する方式が考えられます。
「MySQL クラスタ」で検索すれば該当情報を見つけることができます。
ただし、公式のドキュメントを見てみる限りでは、SQLクエリの負荷は分散できそうですが、裏で各ノードのデータを同期しているようで、ディスクI/O観点からいうと単純に負荷軽減とはいかなそうです。

検証環境を構築、負荷試験を行って問題ないようであれば導入を考えてみては如何でしょうか。

投稿2018/12/13 05:16

over

総合スコア4309

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmcafe

2018/12/13 11:27

ご回答ありがとうございます! クラスタリングによって書き込み対象を複数に分散し、読み取りの方は各ノードから同期・統合されたmaster?を参照するということでしょうか?もしくはMongoDBのShardingみたいな形になるのですかね? いずれにせよご教示頂いた内容で調べてみたいと思います!!
guest

0

ベストアンサー

Insertのパフォーマンスのみを上げる方法として、
・インデックスを貼らない
・DBに直書きせずメモリ上にある程度ため込んでから書き込む
・MySQLであればInnoDBではなくMyISAMにする
・MySQLではなくMongoDBにする
・Amazon Kinesisを使ってみる

ちなみにEC2のインスタンス数に上限がありますのでご注意ください。
すでに30台以上使っているようなので緩和申請をされていると思いますが、
どこまで許容してくれるかはAmazon次第です。

投稿2018/12/13 05:12

tabuu

総合スコア2449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmcafe

2018/12/13 11:35

複数のご提案ありがとうございます! とても勉強になります。 インデックスを貼らないのは読み取りのパフォーマンスを考えると厳しいです。 MyISAMは詳細を理解できていないのですが、どれくらいパフォーマンスに貢献するのかよくわかりませんでしたのでもう少し調べてみたいと思います。MongoDBは移行の手間を考えるとすぐには難しいです。 Amazon Kinesis は全然知らないので勉強してみたいと思います。 1点「DBに直書きせずメモリ上にある程度ため込んでから書き込む」について詳しくお伺いできたら嬉しいのですが、書き込みの際にオンメモリのストア(Redisみたいなの)に溜め込んで、定期実行で一気に書き込む形でしょうか?もしくは実行処理上の話でしょうか?
tabuu

2018/12/14 04:36

Multiple Insertのことでした。複数のEC2から少しずつinsertするのであれば司令塔が一括でまとめてinsertする方がパフォーマンスが向上すると思います。
tmcafe

2018/12/14 07:46

追加でご教示頂きありがとうございます。 Multiple Insert ですね! 確かに、insert query をforループで回している箇所があったので、そこから改善して行こうと思います。 あと、クエリを実行するタイミングを一つにまとめて、コネクションを維持する時間を少なくしたほうがいいということですかね? 調査して試してみたいと思います! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問