web-dev-qa-db-ja.com

Haproxy mysqlフェイルオーバーロードバランシング

私はmysqlマスターマスターレプリケーションをセットアップしましたが、今ではmysqlサーバーをHaproxyで負荷分散しようとしています。

  • ロードバランサー:192.168.1.5
  • mysql1:192.168.1.7
  • mysql2:192.168.1.8

以下のhaproxy構成は正常に機能しており、ラウンドロビンのような回転ノードです。

# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
    log 127.0.0.1   local0
    log 127.0.0.1   local1 notice
    #log loghost    local0 info
    maxconn 4096
    #chroot /usr/share/haproxy
    chroot /etc/haproxy
    user haproxy
    group haproxy
    pidfile /var/run/haproxy.pid
    daemon
    #debug
    #quiet

defaults
    log global
    #mode   http
    mode    tcp
    #option httplog
    option  dontlognull
    retries 3
    option redispatch
    maxconn 2000
    #contimeout 5000
    contimeout  3600000
    #clitimeout 50000
    clitimeout  3600000
    #srvtimeout 50000
    srvtimeout  3600000

listen mysql_cluster 0.0.0.0:3307
    mode tcp
    balance roundrobin
    option mysql-check user root
    #option httpchk GET /mysqlchk/?port=3306
    option tcpka
    server mysql1 192.168.1.107:3306 
    server mysql2 192.168.1.108:3306

これは私が欲しかったものではありません。

私が欲しいのはActive-Passiveの設定です。同様に、192.168.1.107が存在しない場合は、デフォルトですべてのリクエストを192.168.1.108に送信し、192.168.1.107にフェイルオーバーするように構成します。 backupと記載してこれを行うリンクをいくつか見ましたが、それは私には何も機能しませんでした。

上記の構成の最後の2行を次のように置き換えてみたところ、

server mysql1 192.168.1.107:3306 check port 9200 inter 12000 rise 3 fall 3
server mysql2 192.168.1.108:3306 check port 9200 inter 12000 rise 3 fall 3 backup 

Haproxyの再起動中にエラーメッセージが表示され、それ自体が停止します。

Jan 20 16:18:18 localhost haproxy[523]: proxy mysql_cluster has no server available!
Jan 20 16:18:18 localhost haproxy[523]: proxy mysql_cluster has no server available!

Mysqlの負荷分散でいくつかのhaproxy統計を使用して本番環境で使用するために、誰でもhaproxyの信頼できる動作設定があります。利用可能なノードがない場合にバックアップノードにリダイレクトするように上記で尋ねているアクティブ/パッシブ構成が必要です。これを新しいubuntu本番サーバーに実装します。

どんな助けも大歓迎です!ありがとう!

5
user53864

チェックポート9200を削除すると、バックアップオプションが機能します。あなたは異なる例を混ぜているようです、mysql-checkは標準ポートで動作しますが、別個のチェックスクリプトを実行するポート9200で応答するxinetdプロセスをセットアップするhttpチェックを使用する別の一般的な例があります。

1
JamesRyan

マスターマスターレプリケーションは機能していますが、それでも、MySQL負荷分散にHAProxyを使用することは適切な選択ではないと思います。

HAProxyは素晴らしいですが、TCPレベルのロードバランサーとして動作しているときは、SQL状態の概念を持つことはできません。長時間実行されているSQLトランザクションの動作は不明確でエラーが発生しやすくなります。満足してはいけません。

マスター/マスターセットアップには、単一ノードの書き込み容量があります(すべての書き込みを複製する必要があるため)。したがって、セットアップで拡大しているのは、読み取りと接続です。より一般的で私見のはるかに優れた設定は次のとおりです。

  1. マスターとマスターのペアからいくつかの読み取り専用MySQLスレーブをハングアップさせます。
  2. すべての書き込みをマスターに送信し、ほとんどすべての読み取り(可能な場合)を読み取り専用スレーブの1つに送信するようにアプリケーションコードを変更します。
  3. MySQLへの接続の確立については賢明です。できれば、接続プールからの接続を再利用します。

MySQLプロキシ やその他の接続処理ミドルウェアのようなものも、あなたのケースではうまく機能するかもしれません。

"High Performance MySQL" は、MySQLをスケーリングする方法に関する実用的な提案が掲載された非常に優れた本です。この本を読めば、どのデザインが一般的で、特定の状況で証明されているかがもっとはっきりわかると思います。

4
Jesper M

この設定はまさにあなたが望むことをします:)

global
       log 127.0.0.1 local0
       maxconn 4096
       user haproxy
       group haproxy
       daemon

defaults
       log global
       mode tcp
       option tcplog
       option dontlognull
       retries 3
       option redispatch
       maxconn 2000
       contimeout 4000
       clitimeout 50000
       srvtimeout 30000
       stats enable
       stats scope .

frontend mysql_cluster
       bind 3.3.3.3:3307
       #bind *:3307
       default_backend mysql_cluster

backend mysql_cluster
       mode tcp
       option mysql-check
       balance roundrobin
       server db01_1.1.1.1       1.1.1.1:3306      weight 1        check port 3306
       server db02_2.2.2.2       2.2.2.2:3306      weight 100      check port 3306 backup


listen stats 3.3.3.3:10000
       mode http
       option httpclose
       balance roundrobin
       stats uri /
       stats realm Haproxy\ Statistics
       #stats auth user:pass
2
Sir_Yaro

Haproxyと組み合わせた真のマスターマスターMySQLクラスターの場合は、コーダーシップGaleraまたはpercona XtraDBクラスターを使用してみてください。

1
Luis Gómez