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

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

ただいまの
回答率

90.61%

  • PHP

    19876questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    5701questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • サーバ

    757questions

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

他のサーバーからMySQLにデータをポストする方法

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 865
退会済みユーザー

退会済みユーザー

レンタルサーバーを2~3台借りてWebサービスを運用しようと思っています。
1台目はユーザーが利用するサーバー、2~3台目はひたすらデータを計算したり更新したりするサーバーです。

データは数百万件あり、毎日このデータを計算によって更新し続けます。
そのため2~3台目のサーバーを更新用のサーバーにしようと思っています。
動作はPHP+MySQLです。

この2~3台目で更新したデータを1台目のMySQLにポストしようと思っています。

そこで質問なのですが、2~3台目のサーバーから1台目のMySQLにデータをポストする方法はどのような手法があるのでしょうか?また推奨方法はありますか?

データは数百万件ありますが、一気に全データをポストするのではなく、なるべく小分けにしながらポストすることを考えています。ある複数のデータの計算と更新が終わったらポスト、次のデータの計算と更新が終わったらポスト…というような感じです。

条件として、1台目のサーバーのMySQLは外部から接続はできません。そのためPHPなどを使ってポストしたデータを受け取ってINSERTする、などの方法が考えられますが、そのような方法でよいのでしょうか。
また、自前でAPIなどは用意できないです。なるべく手軽にできてセキュリティ的に問題ない方法をお教え頂きたいと思います。

ちなみに複数台のレンタルサーバー(共用)を借りるのは、負荷とアクセス数を分散するためです。
1台の専用サーバーを借りて運用も考えていますが、お値段がかなり高いので安めの共用サーバーを複数借りたほうがコストパフォーマンスがいいと思ったからです。

データをポストする良い方法があればお教えください。
どうぞよろしくお願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

そのためPHPなどを使ってポストしたデータを受け取ってINSERTする、などの方法が考えられます

はいかいいえで答えますと、これが一番シンプルです。

自前でAPIなどは用意できないです

との事ですが、それほど難しいものではないです。

完全に1台目以降のサーバーからしかアクセスがないのであれば、BASIC認証をかけるだけで良い気がします。
コード内容としては、POSTされたデータを決まったルールでDBに書き込むだけで良いでしょう。
念のため、POSTデータにはhash値をつけて、正当性を検証するのが良いと思います。

例)http://hoge.com/post?data=hogehoge&hash=xxxxxxxxxx(これはGETデータ例となりますが)
$hash = sha1($data . 'hogehogehoge');

受け側で、sha1($_GET['data'] . 'hogehogehoge') == $_GET['hash']ならば正当なデータとなる。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/04 19:42

    ありがとうございます。

    そのような方法で良いのですね…。
    かなり単純なのでセキュリティ的にちょっと怖い気もしますが…。

    キャンセル

  • 2015/08/04 19:53

    セキュリティの面でいえば、ますBASIC認証のIDとパスワードを割り出す必要があり、さらに送る際のhash計算方法を割り出す必要があります。
    なので、それほど心配される事はないと思います。

    むしろ、公開フォルダに注意する方が必要です。
    よくある悪い例は、

    --/htdocs/run.php
    --/htdocs/data/hoge.csv

    みたいな設置をしてしまい、run.phpから読み書きしているhoge.csvが丸見えになってしまっている、といったようなケースです。
    冗談みたいな話ですが、未だにこういう置き方をしているサイトは多いと推測されています。

    キャンセル

  • 2015/08/04 20:20

    再度のアドバイス、ありがとうございます。
    はい、データは公開フォルダより上位フォルダに格納しています。
    BASIC認証とhash算出で大丈夫なのですね。
    この方法でしたら手軽なのでぜひ利用したいと思います。

    キャンセル

0

要件としては、要件自体でかなり矛盾が…

まず共用サーバーを複数連携するということ自体、http や ftp による通信を行わざるを得ない。とナルト、DNS やネットワークによる通信によりタイムラグが生じる。

1台目はユーザーが利用するサーバー
ユーザーがアスセスするサーバーは1台なのだから、「負荷とアクセス数を分散する」ことは不可能。

2、3台目のサーバーが処理するデータのデータの元は1台目にあるものと思いますが…
処理のために1台目のMySQLに問い合わせ→処理→MySQLにポストとなると、通信が2度発生する。処理中に元データに変更があったときに整合性が取れません。要件次第でそれをよしとするかどうかはサービスの質の問題だから許容できるかもしれませんが。

それなら初めからVPSを2台にして、MySQLをレプリケーションにするとか、他に方法はあるはずです。
安いところなら2台でも月2000円くらいですよね。


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/04 19:30

    早速のアドバイスありがとうございます。

    >ユーザーがアスセスするサーバーは1台なのだから、「負荷とアクセス数を分散する」ことは不可能。

    2〜3台目はひたすら外部サービスにアクセスしているのです。説明不足ですみません…。

    >処理中に元データに変更があったときに整合性が取れません。要件次第でそれをよしとするかどうかはサービスの質の問題だから許容できるかもしれませんが。

    はい、整合性が取れなくて大丈夫です。

    >それなら初めからVPSを2台にして、MySQLをレプリケーションにするとか、他に方法はあるはずです。

    自分で環境を構築したりセキュリティやバックアップなどできるスキルがないのでVPSは無理だと考えています。
    いずれは利用したいと思いますが、現段階ではスケジュールが間に合わないので見送りたいと思っています。

    ですので外部サーバーからポストする良い方法があればと思って質問させていただきました。

    どうぞよろしくお願い致します。

    キャンセル

  • 2015/08/04 19:42 編集

    であれば、1台目(A)のサーバーにデータを受けるためのAPIを設置して、POSTの値を受け取ってINSERT処理をする。

    言語はサーバーサード言語ならなんでもOKですね。

    単純にPOSTされた値を受け取るのはセキュリティ的にアウトだと思うので、認証トークンを発行して照合した上でデータを受け付けすればいいのではないでしょうかね…

    1. (B)からID、PWを(A)に送信
    2. (A)は照合して認証トークンを発行、自身に保存
    3. (B)は受けた認証トークンと計算結果を(A)にポスト
    4. (A)は認証トークンを評価し、問題なければデータをINSERT
        登録の成否を(B)に通知し、認証トークンを無効にする。

    こんな感じじゃないですかね…

    キャンセル

  • 2015/08/04 20:22

    再度のアドバイスありがとうございます。
    そうですね、単に値を受け取るのはまずいのでそこが心配でした。
    認証トークンの参照方法は参考になります。
    とても助かりました!

    キャンセル

  • 2015/08/04 20:42 編集

    GETでの通信はできればやめた方がいいです。
    文字列の長さに制限があるのと、通信を中継したサーバーのアクセスログに全部内容が書かれてしまいます。あまりにも簡単に内容が読み取られます。利用するサーバーは共用サーバーということですから、そのサーバーへのアクセス権限がある人はたくさんいますよね…
    ちゃんと管理されているサーバーであっても、セロディ攻撃など権限を突破できる脆弱性があったりするとアウトですからね。

    キャンセル

  • 2015/08/04 23:43

    ありがとうございます。POSTでの通信が良いということですね。
    そのようにしたいと思います。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19876questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    5701questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • サーバ

    757questions

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