[완료] mysql replication 부하 분산

시월의 이미지

안녕하세요.

지금 mysql dual-replication 을 구축은 완료 했어요.

궁금한건.. replication 이 부하 분산을 해준다고 들었어요.

로드 벨런싱이라고 하나요???

이리 저리 검색해도 답이 안나와서 올립니다. ㅠㅠ (아님 제가 검색을 잘 못하는 거일지도..)

여튼!! replication 만 구축을 하면 자동으로 부하 분산을 할 줄 알았거든요.

하지만 CPU 사용율을 보니 Master 가 50% 가 넘어갔는데에도 slave CPU는 0% 더라구요..;;;

100% 사용율을 만들어도 마찬가지더라구요;;;

따로 명령어를 넣어줘야 하나요??

mysql 버전은 5.0.18 이구요.
OS 는 윈도우 XP 입니다.

시월의 이미지

아시는 분 아무도 없는 건가요?? ㅠㅠ

시월의 이미지

mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State:
                Master_Host: 192.168.0.22
                Master_User: reply
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: replication.000001
        Read_Master_Log_Pos: 482108
             Relay_Log_File: relay.000002
              Relay_Log_Pos: 482247
      Relay_Master_Log_File: replication.000001
           Slave_IO_Running: No
          Slave_SQL_Running: No
            Replicate_Do_DB: mantis
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 482108
            Relay_Log_Space: 482247
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: NULL
1 row in set (0.00 sec)

이렇게 정보가 표시가 되더라구요.
아무래도 아래 부분이 좀 마음에 걸리네요.

           Slave_IO_Running: No
          Slave_SQL_Running: No

아래는 로그에요.......

[Note] Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log 'd:\PHP_Setup_for_IIS\MySQL\log\relay.000001' position: 4
 
[Note] D:\PHP_Setup_for_IIS\MySQL\bin\mysqld-max-nt.exe: ready for connections.
Version: '5.0.18-nt-max-log'  socket: ''  port: 3306  MySQL Community Edition (GPL)
 
[ERROR] Slave I/O thread: error connecting to master 'reply@192.168.0.22:3306': Error: 'Can't connect to MySQL server on '192.168.0.22' (10061)'  errno: 2003  retry-time: 60  retries: 86400
 
[Note] Slave I/O thread: connected to master 'reply@192.168.0.22:3306',  replication started in log 'FIRST' at position 4
mirr의 이미지

로드벨런싱을 해주는게 아닙니다.
단지 말 그대로 마스터 디비를 기본으로 동일하게 복제해 주는 것을 말하죠..

부하분산을 위한 리플리케이션이라면 Write/Read 의 분산을 꾀할 수 있는데요,
마스터 디비에선 Wrtie를 주로 시키고, 밑에 Read 용 슬레이브 디비를
n 대 두고선, 접속하는 클라이언트에서 나뉘어 접속이 가능하도록
소스수정을 해줘야 합니다.

즉 기록하는 작업이면 마스터 디비로 접속해서 쿼리를 날리도록 하고,
단지 셀렉트 하는 것이면 슬레이브 디비로 날리도록 하는겁니다.

그리고 일단 슬레이브와 마스터간 리플리케이션이 완전히 구성되지
않은 상황입니다.
마스터에 슬레이브의 리플리케이션 서버의 접근설정도 해줘야하고,
슬레이브에서 마스터의 정보도 입력해 주는등, 매뉴얼 보시면
잘 나와있습니다....
--------------------------------------------
내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

시월의 이미지

메뉴얼이라 하시면 mysql 사이트에 있는 메뉴얼을 말씀하시는 거죠???

훔.. 그리고 답변을 보니...

Master <-> Slave 양방향 동시에 접속이 가능 해야 한다고 말하신것 같은데
제가 이해한게 맞는건지... ㅠㅠ

그럼 제가 구성한 Dual-replication 이면 양방향으로 서로 통신이 될턴데;;;

현재 마스터에 기록이 wrtie 이벤트가 발생이 되면 Slave의 DB에 전송이 되
더라구요..

리플리케이션은 구성이 된것 같아요...

show slave status\G

로 확인해 보면 아래처럼 나오거든요.

[Master (server-id=1)]
Slave_IO_Running : Ye
Slave_SQL_Running : Yes

[Slave (server-id=2)]
Slave_IO_Running : No
Slave_SQL_Running : Yes
시월의 이미지

replication 을 설정하다보니 어쩌다가 성공하게 되긴했는데요;;;

[Master (server-id=1)]
Slave_IO_Running : Yes
Slave_SQL_Running : Yes

[Slave (server-id=2)]
Slave_IO_Running : Yes
Slave_SQL_Running : Yes

Master (server-id = 1) 서버 쪽 DB 를 연결하여
CPU 100%로 만들어 동작해 보았지만 마찬가지더라구요..
또 다른 Master (server-id = 2) 는 CPU 0% ㅠㅠ
급 좌절 모드입니다.. ㅠㅠ

naver 블로그며 google 검색이며 다 해보았지만
replication 으로 부하 분산을 할 수 있다고만 나와있고
어떻게 하는건지는 나와있질 않네요.. ㅠㅠ

게다가 4.0 부터는 로드밸런싱 기능이 추가 된다고 나와있더라구요
현재 5.0 버전을 쓰고 있는데 replication 에 로드밸런싱이
추가 안되었다는건가요???

brucewang의 이미지

좋은 내용 얻어 갑니다...

한가지 질문입니다.............. 정말 잘 몰라서요

예를들어 어떤 웹서비스 업체의 concurrent유저의 수가 많고 그 송수신 데이터 량이 클 경우 데이터 서버들을 웹서버들(물론 LB아래에 물려 있는) 에 큰 대역폭으로 1:1 매칭(혹은 아예 동일 머신으로)시키고 각 OS별 Data replication서비스를 사용해서 각 데이터 저장공간의 동기화를 맞추어 해결했던 것 같습니다. 이것은 단순히 서비스 설정과 network configuration으로 소스 수정없이 가능한 것인데요,

DB의 경우도 위와같이 내부에 DB접속을 위한 LB 아래에 여러 DB서버를 붙여 replica해 둬서 (혹은 내부 DB서버들의 ip resolution을 담당할 DNS서버 설정-round robin- 등으로), 소스코드 수정이 불필요하도록 할 수 없나요?

물론, write전용 main을 두는것에는 큰 의의가 있다고 생각합니다만
그것 말고도 직접 큰 서비스를 운용해 보시면서 아마도 소스 수정이 불가피한 경우가 있었기때문에 말씀하신것 같은데요... 경험담을 좀 들려주실수 있으신지요?

-------------------------------------------------
$yes 4 8 15 16 23 42

-------------------------------------------------
$yes 4 8 15 16 23 42

mirr의 이미지

위에 단 댓글의 경우는 mysql의 리플리케이션 기능으로만 부하분산의
효과를 얻으려는 경우에 대해서 일반적으로 설명 해 놓은 것이구요,

Quote:
DB의 경우도 위와같이 내부에 DB접속을 위한 LB 아래에 여러 DB서버를 붙여 replica해 둬서 (혹은 내부 DB서버들의 ip resolution을 담당할 DNS서버 설정-round robin- 등으로), 소스코드 수정이 불필요하도록 할 수 없나요?

이렇게 말씀하신 것은 mysql-cluster 기능을 로드밸런서와 함께 사용하면
뜻하신대로 완벽한 부하 분산이 가능합니다.
매뉴얼에서 나오듯 리플리케이션은 어차피 리드, 라이트를 나누어야
가능 합니다. 양방향 리플리케이션도 구현은 가능하지만,
권장하지 않는 이유는 매뉴얼에 잘 보시면 나와있습니다..
아마 리플리케이션부분의 qna 부분 보시면 왜 그런지 정확히 설명해 줍니다.

생각하신대로 구현하기 위해선 LB와 mysql-cluster가 혼합되면 HA한
로드벨런스드 데이타베이스를 구축 할 수 있을 겁니다.
혹은 제가 직접 사용해보진 않고 테스트하려다 중단했던 것으로는
미들웨어식의 sqlrelay라는 것을 사용하면 가능할지도 모르겠습니다만...

아참 제가 리플리케이션으로 부하분산을 했던 경우는 클러스터링을
적용하기 위한 데이타베이스 버젼 맞추기 (마이그레이션 등)에 대한 소요
비용이 훨씬 크다고 판단되어질때였고, 애초에 사장이 개념이 없어서 이해를 못했기때문에
서버팜식으로라도 부하분산을 이뤄내야했기때문에..또한 write 쿼리보다
read쿼리가 상대적으로 많은 서비스였기 때문에 I/O를 분산시키기위해서
구현 및 관리가 비교적 간단한 replication으로 구현했던 것입니다.

게다가 LB 장비를 살만한 돈도 지원 안됬었다는게 가장 큰 문제였죠 ㅋㅋ

--------------------------------------

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

brucewang의 이미지

그렇군요, 좋은 말씀 감사합니다.

-------------------------------------------------
$yes 4 8 15 16 23 42

-------------------------------------------------
$yes 4 8 15 16 23 42

시월의 이미지

답변이 안달리네요.. ㅠㅠ

김정균의 이미지

위에서 답이 나왔는데, 제대로 이해를 하지 못하시는 것 같습니다.

일단, replication 자체는 load ballancing 기능이 없습니다. 즉, connection 관리는 replication 앞단에서 해 주어야 한다는 의미입니다. 그렇기 때문에 master 에 부하를 주어 보았자 당연히 repliaction 자체에서 관리기능이 없기 때문에 master만 부하를 입게 됩니다.

보통 replication 으로 부하분산을 할 경우, master 는 프로그램단에서 입력만 하도록 하고, slave 서버들을 LB(load ballacer)를 이용하여 적당하게 부하를 분산하여 read only db로 사용하는 개념을 사용합니다.

mysql cluster는 제가 사용을 해 보지 않아 connection 관리를 하는 부분이 있는지는 잘 모르겠군요.

일단, 님께서 하시는 작업은 부하분산과 관련이 없는 작업입니다. :-) replication 으로 부하분산 시스템을 구축할 수는 있지만 replication 만으로 되지는 않는다는 의미입니다.

시월의 이미지

그런 의미였군요? ㅠㅠ

하아.. 제가 했던 작업이 상관 없는 짓이 었다니.. ㅠㅠ

검색을 하다보면 클러스터 라는 것을 자주 보았는데 이건 윈도우는 적용이 된다고
안적혀 있더라구요..

현재 윈도우 서버이기 때문에 가능한 replication 으로 처리할 수 있지 않을까 했는데..
게다가 찾아보면 mysql 4.0 부터는 로드밸런싱 기능이 추가 된다고 쓰여있고..

답변 감사합니다.

다른걸 또 알아봐야겠네요 ^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.