0

または顧客の 1 人が、ソリューションの一部として MySQl バックエンドを持っています。

彼らは、クライアントごとに共通のマスターデータベースと特定のスレーブデータベースを持つように構成しました(10以上のスレーブがあります)。これには MySQL プロキシを使用しています。

データベースの挿入/更新がキューに入れられ、スレーブ データベースへの書き込みにかなりの時間がかかるなど、いくつかのパフォーマンスの問題に直面しています。

これを改善する方法を提案できますか?問題がどこにあるかを特定するのに役立つツールはありますか? これはあなたにとって標準的なアプローチのように思えますか (MySQL プロキシを介して制御されるクライアント固有のスレーブを持つ共通のマスター)?

アドバイスをいただければ幸いです。

ありがとう、

アンディ

4

1 に答える 1

0

私は同じ動作をしていましたが、次の問題がありました。
私の更新の 1 つがエラーで終了していました。mysql プロキシ (および rw-splitter.lua 固有) は、接続が別のクライアントによって再利用される可能性があるようにこの状況を処理し、接続をプールに戻します。 . つまり、クライアントがエラーを受け取り、トランザクションをロールバックしようとすると、それはプールから別の接続または新しい接続に渡され、効果がないということです。一方、トランザクションでエラーが発生した失敗した UPDATE プロセスは、トランザクションがタイムアウトによってロールバックされなくなるまでロックされていました (ただし、私の場合、デフォルトでは mysql-proxy は 28800 秒です)。

問題は解決しました。

パッチ:

rw-splitter.lua の次のブロックを検索:

    is_in_transaction = flags.in_trans
    local have_last_insert_id = (res.insert_id and (res.insert_id > 0))

    if not is_in_transaction and
       not is_in_select_calc_found_rows and
       not have_last_insert_id then

そしてそれをに変更します

    if res.query_status == proxy.MYSQLD_PACKET_ERR and is_in_transaction then
         if is_debug then
            print ("(read_query_result) ERROR happened while transaction staying on the same backend")
        end
        return
    end

    is_in_transaction = flags.in_trans
    local have_last_insert_id = (res.insert_id and (res.insert_id > 0))

    if not is_in_transaction and
       not is_in_select_calc_found_rows and
       not have_last_insert_id then
于 2013-04-28T14:39:49.163 に答える