ママのスキンケアのお悩みにおすすめアイテム

PHPでフレームワークのCAKEを使ってWebシステムを作っているのですが、どうしてもわからない点があるので、ご教授頂きたく質問させていただきました。

現在Webサーバ2台とDBサーバ1台であるサービスを運営しています。
Webサーバはロードバランサで負荷分散をしています。
画面上でどうしても重たい処理をする必要があり、実行しているのですが、リクエストが10回飛びデータが10個登録されるという不思議な現象が起こっており対応に困っています。
開発用にWebとDBが一緒の開発用サーバもあります。やったことは

1.開発用のサーバで同じデータ、同じ処理を実行
リクエストは1回でデータも1個登録
apacheのアクセルログにも1回アクセスされている

2.運営用のサーバで同じ処理だが、データ量を減らして実行
リクエストは1回でデータも1個登録
apacheのアクセルログにも1回アクセスされている

3.運営用のサーバで同じデータ、同じ処理をIPアドレスを指定して実行
リクエストは1回でデータも1個登録
apacheのアクセルログにも1回アクセスされている

4.運営用のサーバで同じデータ、同じ処理を実行
リクエストは10回でデータも10個登録
apacheのアクセルログにも10回アクセスされている

以上の結果からロードバランサで何かしらのことがされているのかと思い、サーバ会社に問い合わせてみたのですが、「そんなことはない」との回答でした。

他に何をどう調べたらいいのかもわからず、かなり手詰まりなかんじです。
手がかり、確認内容などなんでもいいので、ご教授頂けないでしょうか。
よろしくお願いします。

A 回答 (1件)

とりあえず、クライアント側の通信内容を見てみてはどうでしょう。



リクエストは以下の順で流れます。

ブラウザなどクライアント → ロードバランサ → Apache → PHP

クライアントが 1回リクエストを送って、Apacheに 10回くるなら、
ロードバランサが悪さをしてる可能性が高いです。

クライアントが PCのブラウザなら、
FireFox の LiveHttpHeaders という AddOn で簡単な通信内容がみれます。
他にはWireSharkなどのパケット監視ツールも使えます。

もしブラウザが 10回リクエストを送っているなら、
ロードバランサはたぶん関係ありません。

その場合はブラウザのレスポンスも見ます。

リクエスト1 → レスポンス1 → リクエスト2 → レスポンス2→...
のようにレスポンス取得完了後に、次のリクエストを送っているなら、
サーバー側が再通信させるレスポンスを返しているのではないでしょうか。

リクエスト1 → リクエスト2 → レスポンス1 → レスポンス2→...
のようにレスポンスが完了する前に次のリクエストを送っていれば、
サーバー側は関係なく、クライアント側が連続リクエストしていることになるので、
JavaScriptやブラウザの問題だと思います。

参考になるか分かりませんが、私が以前経験した似たようなケースで、
登録データが多すぎる → 通信に時間がかかりすぎてタイムアウト → クライアントの機能で通信自動リトライ
結果、何度もリクエストしてデータが重複登録される、ということがありました。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
レスポンス情報をみてましたら、リクエスト1 → リクエスト2 → レスポンス1 → レスポンス2のような感じでリクエストが送られているようです。
ブラウザはfirefoxに関係なくIEやChromeでも同様の検証なので、ブラウザは関係ないと思います。
javaScriptでは特に怪しそうな動作はしていないので、何か他に原因があるかと思いますので、もう少し探ってみたいと思います。

お礼日時:2012/12/24 11:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsubmitするとなぜか2度実行する

以下のようなコーディングすると、IE6では2度POST?しているように見えます。Netscape7.1では、1度実行です。なぜ、IE6で2度実行?

<INPUT type="submit" value=" 登録 " onclick="submit();">

function submit() {
document.forms['sisaku'].test.value = "OK";
document.forms['sisaku'].submit();
}

Aベストアンサー

ボタンのタイプをsubmitにすると、押した時点で送信、更にonclickでsubmit();を呼んでるので2度送信してるんじゃないでしょうか?

それと、function名のsubmitは良くないんじゃないでしょうか。もともと、submitというメソッドがあるので。

input type = "button" に変更して、function名を変えたらしっかり動くと思います。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Qテーブルタグの中にdivを含めてはダメ?

テーブルタグの中にdiv要素を入れるとダメなのでしょうか?
何か不都合でもあるのでしょうか?
何かご存知の方がいれば教えていただけませんか?

Aベストアンサー

以下、HTML 4.01での話です。(XHTMLでもほぼ同じだと思います)

tableタグ直下に書けるのは、caption,col,colgroup,head,tfoot,tbodyと定義されています。
特定の条件下でtbodyが省略できますので、実際はtrも書けます。これら以外は書けないことになっています。
tr直下にはth,tdが書けることになっています(それ以外は不可)。

th,tdの下にはブロック要素が書けるので、divも書けます。

このように、テーブル内でth,tdの中以外でdivが使えないのはHTMLの仕様でそう決まっているからです。

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

QFINパケット、RSTパケットが返却される理由?

アパッチのヘルスチェックにて、パケットをみました。
シーケンス番号を追っていきましたが、下記のような
通常ではない動作がありました。

<ケース1>
(1)サーバからのHTTPのGETに対して、クライアントがFIN.ACKパケットを返却する。
(2)サーバがFIN.ACKパケットをクライアントに送る。
(3)クライアントからRSTパケットが返却される。
※RSTパケット内にて、broken tcpとの記載あり

<ケース2>
(1)サーバからのFIN.ACKパケットに対して、クライアントからRST.ACKパケットが返却される。


・質問1
それぞれについて、正常な動作とはおもえないのですが、
異常でしょうか?

・質問2
FIN.ACKパケット又はRSTパケットが返却されるのはどんな場合が想定されるのでしょうか?

・質問3
FIN.ACKパケット→RST.ACKパケットは異常な動作でしょうか?

よろしくお願いします。

Aベストアンサー

おつかれさまです。

質問1
ケース1というのはおかしいですね。
サーバからのHTTPのGETというのはありえません。
GETはクライアントから送信されるものです。
言葉のアヤでGETの応答電文がサーバから送信
されている間にFINがクライアンから来るという
ことであってもおかしくないと思います。

ケース2のRSTパケットについてもおかしくありません。
よくブラウザ上で通信途中(画面が全部表示されない)
で次のページへ移動することなどありますよね。
またサーバもクライアントも、keepaliveという
機能があります。一連のやりとりが終わっても、
次の通信のために一定期間コネクションを保持する
機能です。これは意外とおせっかい機能で時間が
たつと勝手にRSTを発行したりします。

質問2
FINは一連の通信が終わった時です。
上述のkeepaliveの機能も一応決まりがあって、
httpヘッダにカウンドダウンする数字があって
もうこの通信で終わりですよって1まで来たら
FINが発行されます。
またはkeepaliveのtimeout時間が過ぎると
RSTが出ます。
他のケースとしては通信不良で再送リトライ
オーバとなった場合とか、通信不良で通信の
シーケンスが合わなくなった場合とかに
RSTが出ることはあります。

質問3
FIN→RST クライアントがFINを出してコネクションを
開放した後に、FINをサーバが返してきたら、もう
コネクションはないのでサーバ側も開放してねと
RSTを投げるケースはあるでしょうね。

とにかく、
ケース1(1)以外はよくあることです。
クライアント(PCのブラウザだと思いますが...)は
人が操作しているので、ブラウザを×するとか
F5キー押すとか、いろんなことをやるでしょう。
WindowsやIEのそのあたりの動きは結構アバウトな
作りであることは確かですが....

いかがでしょう?

おつかれさまです。

質問1
ケース1というのはおかしいですね。
サーバからのHTTPのGETというのはありえません。
GETはクライアントから送信されるものです。
言葉のアヤでGETの応答電文がサーバから送信
されている間にFINがクライアンから来るという
ことであってもおかしくないと思います。

ケース2のRSTパケットについてもおかしくありません。
よくブラウザ上で通信途中(画面が全部表示されない)
で次のページへ移動することなどありますよね。
またサーバもクライアントも、keepaliveという
機能があり...続きを読む

Q「いずれか」と「いづれか」どっちが正しい!?

教えて下さいっ!
”どちらか”と言う意味の「いずれか」のかな表記として
「いずれか」と「いづれか」のどちらが正しいのでしょう???

私は「いずれか」だと思うんですが、辞書に「いずれか・いづ--。」と書いてあり、???になってしまいました。
どちらでもいいってことでしょうか?

Aベストアンサー

「いずれか」が正しいです.
「いづれ」は「いずれ」の歴史的かな遣いですので,昔は「いづれ」が使われていましたが,現代では「いずれ」で統一することになっていますので,「いずれ」が正しいです.

QOracleで流したSQLのログを取得できますか?

ASP+Oracle9iで作られたシステムがあります。
Oracleの設定などは前任者がしており、まともな引継ぎを受けないまま私が維持運用員となりました。
現在DBからあるレコードが消えてしまい(最初から作られてない可能性もあり)、顧客からクレームがついています。
状況から考えて怪しいプログラムを調査したのですが、原因不明でした。
そこで、Oracleの方で今まで流れたSQLをログとして保存していれば手がかりがつかめるのではないかと思い、情報を探しているのですが見つからないので教えて頂きたいのです。
私はOracleの知識(管理面について)が殆どなく、Oracleを使うことはできるが、Oracleの設定がどういう状況になっているか調べることもできず、資料もありません。

1.そもそもOracleにSQLをログとして保存する機能があるのか?
2.あるとすれば、保存機能が有効になっているか、保存したファイルがどこにあるかをどこで確認できるか?

以上の点についてご存知の方、どうぞ回答よろしくお願いします。

Aベストアンサー

OracleのSQL実行痕跡は以下に示すものの中にあります。
ただし、それぞれの設定レベル、保存方法によって、参照できる範囲は変わります。

1.オンラインREDOログとアーカイブログ
  オンラインREDOログはすべてのOracleデータベースに存在します。
  ですが、そのREDOログのサイズとシステムのアクセス量によって保存期間は変化します。アーカイブログ設定しておけば、古いREDOログはアーカイブとして吐き出されます。
  これらは#1の方がおっしゃったLOGMINERで実行済みSQLを調査することができます。
  アーカイブログモードになっているかどうかは、下記で確認できます。
   SQL> select log_mode from v$database;

  また、どのアーカイブログファイルを調査するかは下記を参照すれば良いと思います。
   SQL> select name,to_char(completion_time, 'yyyy/mm/dd hh24:mi') adate from v$archived_log;

2.フラッシュバック問い合わせ
  これは初期化パラメータUNDO_MANAGEMENTがAUTOに設定されており、かつUNDO_RETENTIONが保存期間として適切に設定されている場合のみ使用できます。
  やっていることは、UNDO表領域(旧RBS用表領域)の中に残っている実行履歴を参照しています。したがって、データベース設計時にフラッシュバック問い合わせを前提としていない限り、使える可能性は低いです。

3.その他
  監査を実行していれば、実行SQLを取得できる可能性があります。
  ただし、監査レベルなどを理解しておかないと、すべてのSQLが取得されていない可能性がありますので、難しいかもしれません。

OracleのSQL実行痕跡は以下に示すものの中にあります。
ただし、それぞれの設定レベル、保存方法によって、参照できる範囲は変わります。

1.オンラインREDOログとアーカイブログ
  オンラインREDOログはすべてのOracleデータベースに存在します。
  ですが、そのREDOログのサイズとシステムのアクセス量によって保存期間は変化します。アーカイブログ設定しておけば、古いREDOログはアーカイブとして吐き出されます。
  これらは#1の方がおっしゃったLOGMINERで実行済みSQLを調査することができま...続きを読む

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。


人気Q&Aランキング