여러 서버에 접속하는 클라이언트 프로그램 구조.

sangheon의 이미지

8 개의 서버에 접속해서 DB 정보를 전송하고, 그 결과값을 받아서 다시 DB에 저장하는 프로그램을 개발하려고 합니다.

여러가지 방법을 고민하다가, 아래와 같은 구조를 생각했는데 예상되는 문제점 또는 더 좋은 구조가 있으면 조언부탁드립니다.

DB <---> 1개의 DB 쓰레드(읽기, 쓰기) <---> 읽기/쓰기버퍼(공유메모리) <---> 8개의 쓰레드(1 쓰레드 / 1 서버) <---> 8개의 서버

8개의 접속을 각각 DB 접속을 둬서 처리하지 못하는 이유는 하나의 DB 테이블을 이용하기 때문에 동시에 여러 쓰레드가 하나의 Row에 접근하는 문제를 방지하기 위해서입니다.

이 부분이 제일 고민스러운 부분인데, DB 접속 쓰레드를 하나로 만드는 것 외에 뾰족한 방법이 생각나지 않더군요. 처리 시간 때문에 Lock을 하는 것도 고민스럽구요.

조언 미리 감사드립니다.

sunyzero의 이미지

8개의 쓰레드가 모두 다 데이터를 받아야만 원하는 DB에 한개의 튜플을 삽입할 수 있는것이라고 이해했는데.. 맞나요?

맞다면 8개의 쓰레드가 특정 메모리 영역에 구조체나 공간을 채움에 있어서 마지막으로 채운 녀석이 삽입하는 1개의 쓰레드에게 시그널을 날려주면 되겠군요. 그 전에는 wait 하고 있다가 시그널 받으면 해당 위치에서 데이터 받아다가 삽입하면 되지 않을까요? 즉,

1. 8개의 쓰레드는 각각 데이터를 받아올때 자신이 마지막인지 확인한다. 마지막이라면 시그널 날림
2. 시그널을 받았다면 worker 는 튜플을 DB에 삽입하고 wait...

========================================
* The truth will set you free.

sangheon의 이미지

sunyzero wrote:
8개의 쓰레드가 모두 다 데이터를 받아야만 원하는 DB에 한개의 튜플을 삽입할 수 있는것이라고 이해했는데.. 맞나요?

좀 더 자세히 질문을 올렸어야 했는데 죄송합니다.

가령 DB에 다음과 같은 데이터가 있다면

1 AAA
2 BBB
3 CCC
4 DDD

AAA 를 한 서버로 전송하면, 그 결과 값이 돌아옵니다. 그러면, AAA 뒤에
그 결과값을 덧붙여주지요.

만약에 AAA를 1번 쓰레드가 1번 서버로 전송했으면, 다른 녀석들은 AAA를 처리해서는 안됩니다. 그래서, 한 레코드에 동시 접근해서는 안됩니다.

lock을 걸까 고민도 해봤습니다만 속도 문제 때문에 lock을 쓰는건 최후의 방법으로 생각하고 있습니다.

혹시 누군가 AAA를 SELECT로 가져가면, 다른 쓰레드가 자동으로 SELECT 했을 때 AAA를 빼고 BBB 부터 가져가게 할 수 있을까요?

--

Minimalist Programmer

dansepo의 이미지

bookworm wrote:

1 AAA
2 BBB
3 CCC
4 DDD

각 쓰레드가 매번 Select할 필요가 없다면..

select한 결과(위의 리스트)를 화일(?)로 저장하고 각 쓰레드에서 라인포인터로 처리하심은....

작은 도움이라도 되셨길....

세포분열중......

mach의 이미지

스케쥴링에서 흔히 쓸수있는 테크닉은 Queue를 사용하는 것입니다.
큐를 사용하여 분배를 수행하고, 트랜잭션을 처리하도록 하면 될듯합니다.
물론 일반 큐는 아니고, 로드밸런싱비스무리하게 하는 좀더 진보된 큐라고
봐야겠지요?
그리고, 큐에 대한 접근은 동기화가 이뤄져야 할테고요.
다시 말씀드리면 애초에 님께서 구상한것이 옳다고 생각합니다.
단지, 공유메모리 말고, 다른 IPC방법으로 동기화를 구현할 수 있을 것으로
생각합니다. 성능에 다소 차이는 있겠지만, 확장성 유지보수 생각하면 성능
손실은 미미할것같네요.
-----------
비슷한 사례인지 모르겠지만, 다음과 같은 경우가 있었습니다.
다수개 문서를 입력받아, 이를 다수사용자의 등록키워드로
비교연산해서 사용자에게 메일전송하는 프로그램이었습니다.
음...... 표현을 쉽게하기 위해 작업수행 쓰레드(thread)별로 보면
1) 문서수신기(다수쓰레드)
-문서수신기는 문서를 수신하여 유닉한 이름을 가지는 파일로 작성
-작업큐에 삽입, 엔트리에 상태정보를 초기상태로 세팅
- 큐의 동시성제어 세마포 signal
2) 비교연산기(다수쓰레드 대기중)
- 큐의 동시성제어 세마포 wait
-비교연산기들은 작업큐에서(상태정보가 초기상태인 것중 첫번째것) 키를 받고(분배완료), 엔트리에 상태정보를 진행중으로 변경
-이를 토대로 DB에서 정보 select
- 비교연산기들은 select로 페치된 한개의 row정보를 토대로 작업수행
- 작업종료시 엔트리의 상태정보를 처리완료로 변경
*상태정보는 중간에 각종 장애,다운등의 사유로 미처리된 자료처리를 위함
3) 데이터베이스
4) 메일송신기(다수쓰레드)
5) 리턴메일처리 및 피드백 반영
저는 1-2와 3-4사이에 큐를 구현했습니다.
이때, 큐로 사용한것은 메모리 데이터베이스(공짜 골라서.. :oops: )였고,(물론 구지 메모리데이터베이스까지는 필요하지 않다고 생각합니다.
왜냐하면 하드리얼타임이 요구되는 것은 아니었기 때문이지요.)
multiple producer - multiple consumer모델로 카운팅 세마포를
사용하였습니다.
결론적으로, 의도했던대로 돌기는 했습니다.
조그마한 보탬이라도 되었길.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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