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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

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

PHP

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

サーバ

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

Q&A

解決済

2回答

2064閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

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

サーバ

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

0グッド

1クリップ

投稿2015/08/04 09:45

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

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

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

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

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

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

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

データをポストする良い方法があればお教えください。
どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答2

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 10:39

terushu

総合スコア358

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

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

退会済みユーザー

退会済みユーザー

2015/08/04 10:42

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

2015/08/04 10:53

セキュリティの面でいえば、ますBASIC認証のIDとパスワードを割り出す必要があり、さらに送る際のhash計算方法を割り出す必要があります。 なので、それほど心配される事はないと思います。 むしろ、公開フォルダに注意する方が必要です。 よくある悪い例は、 --/htdocs/run.php --/htdocs/data/hoge.csv みたいな設置をしてしまい、run.phpから読み書きしているhoge.csvが丸見えになってしまっている、といったようなケースです。 冗談みたいな話ですが、未だにこういう置き方をしているサイトは多いと推測されています。
退会済みユーザー

退会済みユーザー

2015/08/04 11:20

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

0

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

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

1台目はユーザーが利用するサーバー

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

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

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

投稿2015/08/04 10:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/08/04 10:30

早速のアドバイスありがとうございます。 >ユーザーがアスセスするサーバーは1台なのだから、「負荷とアクセス数を分散する」ことは不可能。 2〜3台目はひたすら外部サービスにアクセスしているのです。説明不足ですみません…。 >処理中に元データに変更があったときに整合性が取れません。要件次第でそれをよしとするかどうかはサービスの質の問題だから許容できるかもしれませんが。 はい、整合性が取れなくて大丈夫です。 >それなら初めからVPSを2台にして、MySQLをレプリケーションにするとか、他に方法はあるはずです。 自分で環境を構築したりセキュリティやバックアップなどできるスキルがないのでVPSは無理だと考えています。 いずれは利用したいと思いますが、現段階ではスケジュールが間に合わないので見送りたいと思っています。 ですので外部サーバーからポストする良い方法があればと思って質問させていただきました。 どうぞよろしくお願い致します。
退会済みユーザー

退会済みユーザー

2015/08/04 10:44 編集

であれば、1台目(A)のサーバーにデータを受けるためのAPIを設置して、POSTの値を受け取ってINSERT処理をする。 言語はサーバーサード言語ならなんでもOKですね。 単純にPOSTされた値を受け取るのはセキュリティ的にアウトだと思うので、認証トークンを発行して照合した上でデータを受け付けすればいいのではないでしょうかね… 1. (B)からID、PWを(A)に送信 2. (A)は照合して認証トークンを発行、自身に保存 3. (B)は受けた認証トークンと計算結果を(A)にポスト 4. (A)は認証トークンを評価し、問題なければデータをINSERT     登録の成否を(B)に通知し、認証トークンを無効にする。 こんな感じじゃないですかね…
退会済みユーザー

退会済みユーザー

2015/08/04 11:22

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

退会済みユーザー

2015/08/04 11:44 編集

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

退会済みユーザー

2015/08/04 14:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問