HAProxyだが、依然として単一障害点である

HAProxyだが、依然として単一障害点である

私はテスト クラスター (HAProxy を使用した 3 つの物理ノード上の Maria Galera Cluster) を設定しています。動作はしていますが、解決できない初心者エラーを犯してしまったようです。専門家の目で見て、助けてくれる方がいらっしゃれば幸いです。

物理ノードが3つあります。ノード1: 10.1.1.120

ノード2: 10.1.1.121

ノード3: 10.1.1.124

HAProxyを使用して仮想IP 10.1.1.113

稼働中、仮想 IP 経由でクエリを実行すると、次のようになります...

$ mysql -uroot -pPassword -P 3306 -h 10.1.1.113 -e "select @@hostname; show processlist;"
+------------+
| @@hostname |
+------------+
| node2      |
+------------+
+----+-------------+-------------+------+---------+------+--------------------+------------------+----------+
| Id | User        | Host        | db   | Command | Time | State              | Info                 | Progress |
+----+-------------+-------------+------+---------+------+--------------------+------------------+----------+
|  1 | system user |             | NULL | Sleep   |   37 | NULL               | NULL                 |    0.000 |
|  2 | system user |             | NULL | Sleep   |   37 | wsrep aborter idle | NULL             |    0.000 |
| 45 | root        | node1:55877 | NULL | Query   |    0 | init               | show processlist |    0.000 |
+----+-------------+-------------+------+---------+------+--------------------+-

そしてもし私がip aの上ノード1- そこは確かに私の仮想IPアドレスが存在する場所ですが、ホスト名は次のように返されますノード2

node1 をシャットダウン (または eth0 を無効にする) すると、仮想 IP アドレスは別の場所に移動しますが、@@hostname は引き続き node2 に戻ります。

問題は、node2 をシャットダウンし、仮想 IP を使用して mysql を実行しようとすると発生します。

**ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)"**

(この時点で、仮想 IP を使用せずにローカル マシンのいずれかにログインすると機能します)。

したがって、HAProxy 部分は動作しているように見えますが (適切に移動しているため)、MariaDB は独自の処理を実行しようとしており、すべてを Node2 経由でルーティングする必要があると判断しています。

.cnf ファイルにはバインド アドレスがありません。仮想 IP を持ち、同時に 3306 以降のポートを持つマシンでサービスを再起動するときに 3306 との競合を回避するために、SQL サービスにポート 1306 を使用しています。

私の keepalived ファイルは... (これが正しいかどうかはわかりませんが、すべてのノードがマスターに設定されており、優先度はそれぞれ 100、101、102 です。違いはないようです)

global_defs {
  router_id geordi
}
vrrp_script haproxy {
  script "killall -0 haproxy"
  interval 1
  weight 1
}

vrrp_instance 51 {
  virtual_router_id 51
  priority 101
  state MASTER
  interface eth0
  virtual_ipaddress {
    10.1.1.113 dev eth0
  }
  track_script {
    haproxy
  }
}

そして私のhaproxy.cfgは次のようになります:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode    http
    option  dontlognull
    contimeout 5000
    clitimeout 50000
    srvtimeout 50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

listen mysql_proxy 10.1.1.113:3306
        mode tcp 
        balance roundrobin
        option tcpka 
        option httpchk
        option mysql-check user haproxy
        server node1 10.1.1.120:1306 check 
        server node2 10.1.1.121:1306 check 
        server node3 10.1.1.124:1306 check

ご提案がありましたら、ぜひお聞かせください。すべてが機能するところまであと少しですが、まだ完全には機能していません。

答え1

で明示的に設定されbind-address=0.0.0.0ますmy.cnf

さらに (ここまで来たら、おそらくすでに実行しているはずです):

  1. 各ホストに IP アドレスがあることを確認します10.1.1.113(keepalived を使用している場合は、/32 などのダミー インターフェイス経由)。
  2. 始まるnet.ipv4.conf.default.rp_filter = 2/etc/sysctl.conf
  3. 始まるnet.ipv4.conf.default.accept_source_route = 0/etc/sysctl.conf

これにより、MySQL はすべてのインターフェースで LISTEN できるようになり、パケットが対象ではないインターフェースで RESPOND できるようになります。

ノード 1 (10.1.1.120) のネットワーク インターフェイスは、10.1.1.120 に対応するインターフェイスでパケットを「10.1.1.13」として取得します。通常、これは「自分宛ではない」と表示されて破棄されます。これは、TCP/IP モデルの「インターネット」層で発生しています。

ただし、上記の条項 2 と 3 では、「受け入れてください。これは私たちのためになるかもしれません」と述べられており、その後、MySQL (TCP/IP モデルの「アプリケーション」層) に渡されます。MySQL は、私たちがすべてのアドレスにバインドされていることを認識し、そのうちの 1 つが 10.1.1.113 (条項 1) であることを確認し、それを処理します。

関連情報