
HAProxy를 사용하여 3개의 물리적 노드에 테스트 클러스터인 Maria Galera Cluster를 설정하고 있습니다. 작동하지만 해결할 수 없는 초보자 오류를 범했습니다. 누군가가 전문가의 눈을 돌려 나를 도와주길 바랍니다.
3개의 물리적 노드(Node1: 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~에노드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
.
추가적으로 (여기까지 했다면 이미 이 작업을 수행했을 것입니다):
- 각 호스트에 IP 주소가 있는지 확인하십시오
10.1.1.113
(keepalived를 사용하는 경우 /32로 더미 인터페이스를 통해). - 설정
net.ipv4.conf.default.rp_filter = 2
하다/etc/sysctl.conf
- 설정
net.ipv4.conf.default.accept_source_route = 0
하다/etc/sysctl.conf
이는 MySQL이 모든 인터페이스에서 LISTEN을 허용하고, 패킷이 사용되지 않은 인터페이스에서 MySQL이 응답하도록 허용합니다.
node1(10.1.1.120)의 네트워크 인터페이스는 10.1.1.120에 해당하는 인터페이스에서 "10.1.1.13"으로 패킷을 가져옵니다. 일반적으로 이것은 "그건 나에게 적합하지 않습니다"라고 말하면서 삭제됩니다. 이는 TCP/IP 모델의 "인터넷" 계층에서 발생합니다.
그러나 위의 조항 2와 3은 "그냥 받아들이십시오. 우리를 위한 것일 수도 있습니다"라고 말한 다음 MySQL(TCP/IP 모델의 "응용 프로그램" 계층)로 전달됩니다. MySQL은 우리가 모든 주소에 바인딩되어 있으며 그 중 하나가 10.1.1.113(프로비전 1)임을 확인하고 이를 처리합니다.