Virtual IP 가 두 대의 서버에 모두 설정되면

ukits의 이미지

Web 및 DB 서버 2대(DB1, DB2)를 heartbeat로 이중화 구성을 하고 VIP를 설정하였습니다.
DB는 GTID를 이용해 MySQL master-master replication 으로 설정하였습니다.

처음에 ifcfg-eth0:0 설정을 2대 모두에 설정을 하고 재부팅을 하니, ifconfig, ip addr show로 확인했을 때 당연한 거겠지만 양쪽 모두 VIP를 물고 있는 것으로 나타났습니다.
이 부분에 대해서 이해를 못한 상태로 Web 접속을 해보니까 log가 첫번째 DB1 서버에만 쌓이길래 크게 무리 없을 것으로 판단하여 정상 서비스 가동을 하였습니다.

그런데, 가동 후 여러 Web/DB 클라이언트들이 붙게 되니, VIP로 들어오는 연결이 DB1으로 모두 붙지 않고, DB2로 붙는 클라이언트들이 생겼습니다.

결과적으로 DB1 로 접근해 INSERT 한 primary key와 DB2 으로 접근해 INSERT 한 primary key가 충돌이 일어나 replication이 깨져버렸습니다.
이 부분도 이해가 되지 않는 것이, 평상시에 두 서버로 INSERT 했을 때 primary key 가 중복이 발생하지 않는 것을 확인했는데, VIP와 연관되어서는 중복값이 발생했다는 것입니다.

지금은 DB2 서버에서 ifcfg-eth0:0 설정을 제거하였습니다. 네트워크를 끊었다 붙이니 DB1 만 VIP를 가져가는 것으로 확인이 되었습니다. DB1 장애 시 heartbeat가 DB2 서버에 VIP를 할당하는 것도 확인하였습니다.

DB도 backup-dump 로 replication을 재가동 하였지만 아직 의문점이 있습니다.

1. 동일 네트워크 안에 Virtual IP가 동시에 여러 대에 부여되면 (제가 경험한 것 처럼) 연결이 분산되는 효과가 있는지요?

2. heartbeat를 이용한 이중화 구성에서 ifcfg-eth0:0 설정을 첫째 노드(제 경우에는 DB1)에만 해주는 것이 올바른 설정인가요?

3. 이중화를 위해 GTID를 이용한 MySQL master-master replication이 나쁘지 않은 선택인가요?

감사합니다.

ymir의 이미지

vip 를 여러 대에 설정하면 그냥 ip 충돌 나고 정상적으로 서비스가 안 되죠.
하나의 ip 에 서로 다른 mac 이 돌아다니는데 제대로 될 리가요..

active-backup 구성으로 둬서.. active 만 vip 를 가져다가 서비스하고..
문제가 생기면 active 의 vip 를 제거하고, backup 에 vip 를 구성해서 active 로 전환되도록 해야 합니다.

MySQL 을 dual master replication 으로 잡으면 서로 active-backup 으로 전환하더라도..
vip 만 자동으로 넘어가게 해두면, DB 는 별도의 설정 변경이나 조작 없이 replication 이 되는 장점이 있기 때문에 쓰는 건데..
동시에 active-active 로 가면 말씀하신 대로 primary key 가 충돌하게 됩니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

ukits의 이미지

말씀 감사합니다.

IP 부분은 현재 DB1 노드에만 초기 설정을 두고, DB2는 heartbeat가 할당하도록 해놓았습니다.

기존에 제 잘못된 설정으로 mysql이 active-active 상태가 되었다고 알려주셨는데, heartbeat로 VIP 구성을 하면서 특별히 mysql에는 active 상태와 관련해서 설정해준 것이 없는 상태인데요.

VIP가 아닌 실제 IP로 DB1 mysql 에 연결해서 INSERT 동작 후, 역시 실제 IP로 DB2 mysql에 연결해서 INSERT 동작을 하더라도 key가 충돌하지 않는 것을 확인했었습니다.

VIP가 양쪽에 모두 물려있는 잘못된 상황에서 mysql 스스로 둘 다 active라고 인식할만한 부분이 있을까요?

uki the Sniper

ymir의 이미지

active-standby (또는 active-backup) 는 HA 를 구성하는 서버를 부르는 말입니다. 그 서버가 DB 던 방화벽, 라우터든 뭐가 있던 상관 없구요.
여기서 vip 를 가져간 서버가 active 상태가 되었다고 얘기를 합니다.
나머지는 standby 로 대기하고 있다가 active 서버가 죽거나 문제가 생기면 자동으로 vip 를 가져와서 active 상태로 전환하는 거고..
이 때에 active 서버에 있던 최신 업데이트를 계속 이어받아 서비스 하기 위해 DB 같은 걸 동기화 하는거죠.

양쪽에 차례로 insert 를 할 때, 일단 replication 된 이후라면 key 가 충돌 안 나겠지만..
replication 이 일어나기 전에 동시에 insert 를 하면 같은 primary key 가 생성되고..
replication 될 때 이미 key 가 있으니 에러가 날 겁니다.

그래서 dual-master replication 을 하더라도, active 상태의 서버에 있는 db 에만 쓰기 가능하게 하고 (active master)..
standby 쪽의 db 는 read only 로 바꿔서(passive master) 동시에 쓰지 못하게 하는게 좀 더 안전합니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.