로드 밸런싱 질문

하하의 이미지

클라이언트 -- 로그 밸렁싱 서버 -- 게임서버1, 게임서버n

위와 같은 구조 중 로드 밸렁싱 서버의

역활로는 그냥 클라이언트의 컨넥션만 받고 게임서버로 accept 된

socket을 넘겨 실제 통신은 클라이언트 게임서버간에만 이루어 지도

록 되있고 이 로그 밸런싱 서버가 여러개의 게임서버 중 적당한(접속자가 적

은) 서버를 선택해 socket을 넘겨줍니다.

이때.....

적당한 서버를 선택하는 기준이 접속자 수라 할때

로드 밸런싱 서버는 개개의 게임 서버에 접속된 사용자 수를 알고 있어

해당 게임 서버를 선택 하기 적당한 알고리즘이 어떤것이 있을까요?

생각엔.....

그냥 각각 게임 서버의 접속자 수를 알고 있어 for , if를 통해

가장 적은 사용자를 가진 게임 서버를 선택 한다면 문제 없을 듯 하지만....

이것 말고 .. 다른 자료 구조를 사용해서 만들수 있는 방법은 무엇이 있을까요?

하하의 이미지

음..

생각이 바이너리 트리로 해당 서버에 대한 접속자

수를 구성해서 ....

접속자 수에 따라 가장 적은 수가 가장 왼쪽에 위치

하도록 할 생각 입니다.

ㅋ.... 가능할지.. 좀더 생각좀 ..

“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”

sozu의 이미지

하하 wrote:
음..

생각이 바이너리 트리로 해당 서버에 대한 접속자

수를 구성해서 ....

접속자 수에 따라 가장 적은 수가 가장 왼쪽에 위치

하도록 할 생각 입니다.

ㅋ.... 가능할지.. 좀더 생각좀 ..

그럼 Heap Tree 가 더 좋지 않을까요. 8)

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

utcman의 이미지

n이 작다면 알고리즘이 간단한 편이 버그나 유지보수 면에서 좋을수도 있습니다.
게임서버라면 많아야 몇십 정도일텐데 굳이 복잡한 알고리즘을 적용할 필요는 없겠죠.

성능면에서도 작은 크기의 n에 대해서는 오히려 간단한 알고리즘이 우월할 수 있습니다. ( 리눅스 커널에서도 내부적인 자료구조를 관리하는데 16정도를 경계로 list와 AVL tree를 구별해 사용하는 것으로 알고 있습니다. )

저라면 64이하의 n에 대해서는 loop를 돌려 최소값을 찾는 쪽을 택하겠네요. ^^;

ssehoony의 이미지

로드밸런싱 해주는 서버가 웹서버와 같은 접속이 단발적으로 아주 빈번하게 이루어 질때는 트리나 해싱 같은걸 이용하는게 의미가 있을 듯 하지만, 로그인 요청도 빈번하지 않고, 로드밸런싱 대상 서버가 몇백대가 아니라면 그냥 배열 잡고 전체 루프 돌아도 성능상에 크게 문제가 없을 듯 하네요.

부하의 기준은 cpu 사용율로 잡으셔도 될 것 같고 사용자 수로 하셔도 될 상황같네요.
프로세스가 한 서버에 여러개 뜨는 거라면 system load 를 이용하셔도 될 듯 하고요.

하지만, 각 서버간에 사용자들이 서로 공유되는 것이 아니고 기존 여타 mmorpg 서버처럼 해당 서버에 접속한 사람들 끼리만 공유되는거라면 사용자 선택에 맞기는 것이 좋을 듯 하네요.
1번 서버에 친구가 있어서 1번 서버로 (좀 버벅이더라도) 접속하려는데, 자동으로 1번 아닌 다른 서버에 접속 되버리면 그 것 또한 낭패라는 생각이 드네요.

chadr의 이미지

각 게임 서버에서 일정 주기로 디비에 로드밸런싱 데이터를 저장합니다..

그리고 로드밸런싱 서버에서는 그 데이터를 디비에서 읽어와, 가장 부하가 적은 서버를 선택하는식으로...

이렇게 하면 별다른 알고리즘도 필요 없이 간단하게 구현 가능하겠군요..

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

LispM의 이미지

가장 간단한 방법은 서버 갯수 크기의 circular 큐를 그냥 돌면서 할당하는 것입니다.

http://lisp.or.kr http://lisp.kldp.org - 한국 리습 사용자 모임

운형의 이미지

어떤 것을 기준으로 벨런싱할 지, 이게 더 중요하지 않을까 싶네요.
예를 들어 cpu 사용률에 근거해, 벨런싱을 할 것인지, 네트웍 부하에 근거를 둘 것인지 등등.

어느 서버에게 클라이언트를 할당 할 것이지는 이미 정해 진것이라고 생각되는데요(물론 생각하기 나름이지만)
리얼 서버쪽에 에이전트를 심을것이고(물론 아닐수도 있지만.. -_-)
그러면 주기적인 보고를 받던 요청에의한 보고를 받던 벨런서는 리얼서버의 상태를 체크할 것이고,
이때, 정해진 기준에 의해 부하가 가장적은 리얼서버를 알 수 있을 거고,
그럼 문제는 해결되는 듯...

Do you think that's the air you are breathing now?

leilei의 이미지

전 그냥 LVS 같은걸 이용합니다...

그나저나..

Quote:
로그 밸런싱 서버가 여러개의 게임서버 중 적당한(접속자가 적은) 서버를 선택해 socket을 넘겨줍니다.

어떻게 넘겨주는걸까요? 어떤 프로세스에서 소켓을 다른 머신의 프로세스로 넘겨 줄려면 어떻게 해야 하나요?

liongo의 이미지

사용중인 소켓을 다른 머신으로 넘겨주는게 가능한가요..?

TCP/IP 프로토콜에서 지원하지 않는이상 힘들것같습니다만...

LVS같은경우는 중간에 Virtual IP를 머신하나가 잡고.. 그녀석이

관리 하는거 아닌가요 ㅡㅡ?

p.s 제가 아는 클러스터링 프로그램도..

약 5년전 -_-;; 클러스터링 프로그램 2000마논짜리.. 도.. LVS + 알파기능

이더군요 ㅡㅡa 지금생각하면 100마논만 쥐어줘도 비슷한 환경구축하는건데

' 형식이 내용을 규정한다. '

하하의 이미지

Quote:

사용중인 소켓을 다른 머신으로 넘겨주는게 가능한가요..?

저는 sendmsg , recvmsg를 통해 같은 머신 다른

프로세스간 넘겨주고 있습니다.

... 스티븐슨 Unix network programming책 13.6

을 보시면 위 함수를 통해 다른 머신간에도 넘겨 줄수 있

다고 합니다. ㅋ

“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”

leilei의 이미지

하하 wrote:
Quote:

사용중인 소켓을 다른 머신으로 넘겨주는게 가능한가요..?

저는 sendmsg , recvmsg를 통해 같은 머신 다른

프로세스간 넘겨주고 있습니다.

... 스티븐슨 Unix network programming책 13.6

을 보시면 위 함수를 통해 다른 머신간에도 넘겨 줄수 있

다고 합니다. ㅋ

UNP에 내용이 더 있을지는 모르겠니만.. 하하님 말씀만으론
소켓이 아니라 받은 데이타를 넘겨 주는걸 말씀하시는듯 합니다.

같은 머신 내에서 소컷을 넘기는건 본적이 있지만
다른 머신에까지는 역시나 이해가.. :oops:

또 같은 머신 내에서의 로드밸런싱이 의미가 있을까요??

leilei의 이미지

liongo wrote:

약 5년전 -_-;; 클러스터링 프로그램 2000마논짜리.. 도.. LVS + 알파기능

이더군요 ㅡㅡa 지금생각하면 100마논만 쥐어줘도 비슷한 환경구축하는건데

:D

세월이 좋아진거겠지요.. :wink:

하하의 이미지

정정 합니다.

Quote:

... 스티븐슨 Unix network programming책 13.6

을 보시면 위 함수를 통해 다른 머신간에도 넘겨 줄수 있

다고 합니다. ㅋ

엄밀히 그런 언급은 없었습니다. send , recv

descriptor란 말을 보고 제가 넘겨 짚었습니다.

이번 계기를 통해 실수 안기를.. ㅋ

“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”

lovemyin의 이미지

우선 다른 머신간에 소켓을 넘겨주는것은 불가능하고요...
이제 본론으로 들어가서
우선 위에서 말씀하신거와 같이 어떤것을 가장 중요하다고 생각하며 발란싱을 맞출것인가 기준을 정해야 합니다.
로드발란싱을 하는 방법은 수없이 많습니다. 님이 사용자수를 생각하시고 그 사용자에서 맞게 무엇을 기준으로 로드발란싱을 할것인지 정하세요
구현하는건 자기 생각에 맞춰 구현하기만 하면 되는거 아닌가요???
돈이 많은 회사라면 L4 스위치 사셔도 무관할듯...^^

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

댓글 달기

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