잠시만 기다려 주세요

     '대통령을 욕하는 것은 민주사회에서 주권을 가진 시민의 당연한 권리입니다. 대통령을 욕하는 것으로 주권자가 스트레스를 해소할 수 있다면 저는 기쁜 마음으로 들을 수 있습니다. - 노무현 -'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (25)  |  여러가지 팁 (1111)  |  추천 및 재미 (165)  |  자료실 (25)  |  
시사, 이슈, 칼럼, 평론, 비평 (948)  |  끄적거림 (144)  |  문예 창작 (719)  |  바람 따라 (75)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    여러가지 팁

golang - golang 에서 postgresql + pgx + pgbouncer 사용하기... 기존 설정 그대로 유지하면서 성능 향상 됩니다. pgbouncer 사용, 설명...
이 름 : 바다아이   |   조회수 : 277         짧은 주소 : https://www.bada-ie.com/su/?9-keE-vaZX4S
일단 pgbouncer 를 설치하시고요....  설치 되었다는 가정을 하겠습니다.
설치하고 설정하는 것은 간단합니다.
설정 파일은 /etc/pgbouncer/ 에 있습니다. 

apt install pgbouncer
systemctl enable pgbouncer
systemctl start pgbouncer

그럼 pgbouncer 가 뭐냐!!!..
쉽게 말해..  postgresql 에 직접 접속하면 안정성은 좋은데 속도와 동접에 불안해 집니다.
근데 이놈을 쓰면 자원 낭비 하는 것을 막고 더 효율적으로 관리해 주고
연결을 원활하게 해준다고 간단히 이해하시면 됩니다. 중간에서 접속을 관리해 주는 아이입니다.

속도가 좋아지고 같은 서버 환경인데도 많은 동접에서 잘 버티게 해 줍니다. ^^;

golang --> pgbouncer --> postgresql 이렇게 접근이 됩니다.  중간에서 컨트롤을 하죠...


아래는 PgBouncer를 TLS 없이 (sslmode=disable) 
Golang database/sql로 안전하게 연결하는 예제 코드입니다.

Golang 예제 코드 (pgx + database/sql 사용)

package main

import (
    "database/sql"
    "fmt"
    // _ "github.com/lib/pq" 기존에 쓰던 이놈은 일단 주석처리..!!!
    _ "github.com/jackc/pgx/v5/stdlib" // pgx를 database/sql에서 사용하기 위한 import
)

func main() {
    //  연결 문자열 — sslmode=disable 로 TLS 완전히 비활성화
    dsn := "postgres://username:password@127.0.0.1:6432/dbname?sslmode=disable"

    db, err := sql.Open("pgx", dsn)
    if err != nil {
        panic(fmt.Sprintf("DB open error: %v", err))
    }
    defer db.Close()

    // 연결 테스트
    if err := db.Ping(); err != nil {
        panic(fmt.Sprintf("DB ping error: %v", err))
    }

    fmt.Println("Successfully connected to PgBouncer (no TLS)")

    // 간단한 쿼리 예시
    var now string
    if err := db.QueryRow("SELECT NOW()").Scan(&now); err != nil {
        panic(fmt.Sprintf("Query error: %v", err))
    }
    fmt.Println("DB time:", now)
}

/etc/pgbouncer/pgbouncer.ini 에 유저 패스워드를 쓰기 싫으면
/etc/pgbouncer/userlist.txt 에 아래처럼 따로 모아서 넣으셔도 됩니다. 

"admin" "adminpass" 
"appuser" "appsecret"

PgBouncer 설정 예시 (/etc/pgbouncer/pgbouncer.ini)
쓰는  dbname 이 여러개면 밑으로 여러개 쓰시면 됩니다.

[databases]
dbname = host=127.0.0.1 port=5432 dbname=dbname user=username password=password
dbname2 = host=127.0.0.1 port=5432 dbname=dbname2 user=username password=password

[pgbouncer]
# listen_addr = 0.0.0.0
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt

# Pool 모드 — session / transaction 중 선택..  오류나면 session 으로 변경...
pool_mode = transaction

# TLS 완전 비활성화
client_tls_sslmode = disable
server_tls_sslmode = disable
client_tls_protocols = all
server_tls_protocols = all

logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid


PgBouncer 재시작 후 확인:

sudo systemctl restart pgbouncer
psql -h 127.0.0.1 -p 6432 -U username -d dbname


위가 성공하면 Go 코드도 반드시 정상 연결됩니다. 아닐 수도 -.-;

아마도 처음에는 헷갈릴 수 있어요..
하다보면 알게 됩니다... 

pgbouncer 는  포트가 6432 이고..  postgresql 포트는 5432 입니다. 두개 다 방화벽에서 포트 오픈 하시고요..
저도 사실 확실히 개념이 잡히지 않아서 알아보는 중인데 어쨌든 속도는 좀더 빨라지는 거 맞습니다.
이론적으론 cpu, 메모리 사용량이 2배 가까이 좋아진다고 하네요.... 사용 드라이버를 바꾸고  pgbouncer 를 추가했을 뿐인데요.. ^^'
저는 서버 자원이 많지 않은 상황인데 기존에는 잘 퍼져서 힘들었는데 pgbouncer 적용하고는 이제는 잘 안 퍼지네요 ^^;

p.s
남들이 하는 것은 해야 하나 봅니다.  ^^;
pgbouncer 가 이제 postgresql 표준 풀러네요.. 
저는 안 쓰고 귀찮아서 구닥다리 직접 접속으로 버티다 한번 적용해 봤는데 너무 좋네요... 
이래서 사람은 배워야 하는 겁니다. ㅋㅋ... 이 단순한 것을 왜 안 썼지?? ㅋㅋ

아마도 현업에서 벗어나 취미로 하다보니 대량 접속 부분을 잊고 살았던 것 같네요...
mariadb 만 쓰다 postgresql 로 와서 취미로 하다보니 대량 접속을 겪을 일이 없었던 것 같네요.. -.-;.....


참고 :

postgresql 접속은 아래 세가지 방식으로 사용하실 수 있습니다.
1번이 기존 방식이고요..
2번이 기존 것은 그대로 두고 드라이버만 변경해서 사용하는 것...
3번은 기존 소스를 전부 고쳐야 해서 손이 많이 갑니다. 그러나 이게 제일 좋죠..

아마도 중형 정도는 2번 정도로 타협을 보고 기존 소스는 그대로 놓아두겠죠.
대형으로 가거나 동접이 많아지면 3번을 고려해 보셔야 합니다.
근데 그러려면 소스 언제 다 고치냐 ㅋㅋ -.-;

1.  기존 database/sql + lib/pq --> 가장 단순, 낮은 성능
2. database/sql + pgx/stdlib --> 호환성 유지 + 성능 일부 개선
3. pgxpool + PgBouncer --> 고성능, 안정성, 확장성 최고

여기에 + pgbouncer 를 달면 천하무적 되는 겁니다.

| |





      1 page / 38 page
번 호 카테고리 제 목 이름 조회수
1111 컴퓨터/핸드폰 freet .. ... .. 바다아이 91
1110 리눅스 데스크탑 debian stable + backports .... 바다아이 99
1109 리눅스 데스크탑 user@1000, xdg-document-portal ... .... 바다아이 143
1108 컴퓨터/핸드폰 ...  바다아이 130
1107 리눅스 데스크탑 xfce4 ... ... screensaver 바다아이 138
1106 리눅스 서버 ... . . . 바다아이 176
1105 리눅스 데스크탑 yay, pacman ...  lock .... ... 바다아이 193
1104 리눅스 서버 proxysql 3.0.x ....   .... 바다아이 260
1103 리눅스 서버 mariadb + proxysql 3.0.x .... mariadb proxysql pooler ... 바다아이 239
1102 golang golang mariadb, mysql pooler proxysql ..!!! mariadb , .. 바다아이 248
1101 golang golnag ...  Go ... go get ... 바다아이 226
현재글 golang golang postgresql + pgx + pgbouncer ... . pgbouncer , ... 바다아이 278
1099 리눅스 데스크탑 surfshark ..  archlinux surfshark error.... 바다아이 278
1098 음식관련 , ... 1 . .. ... -.-; 바다아이 366
1097 리눅스 데스크탑 .... 바다아이 472
1096 건강/운동 관련 ... ... ....!!! .. ..!!.. ... 바다아이 484
1095 golang golang ... 바다아이 831
1094 컴퓨터/핸드폰 0ad .... c ... 0ad occupy 바다아이 799
1093 리눅스 서버 apt ... ... apt 바다아이 929
1092 리눅스 데스크탑 6.14 ... experimental .. !! !!! .. 바다아이 922
1091 리눅스 데스크탑 testing, sid, backports surfshark vpn , ...  바다아이 979
1090 mariadb, mysql mariadb ... ??? maintained.... . 바다아이 864
1089 리눅스 데스크탑 libreoffice hwp ... libreoffice-h2orestart hwp ... 바다아이 1167
1088 javascript/jquery .... 바다아이 898
1087 리눅스 데스크탑 .... wine install 바다아이 906
1086 리눅스 데스크탑 surfshark vpn .... ..... 바다아이 945
1085 리눅스 서버 , smartctl, hdd ssd 바다아이 964
1084 리눅스 서버 , .... arch kernel compile.... 바다아이 976
1083 리눅스 서버 [Vim, Vi] 바다아이 889
1082 리눅스 서버 ... 바다아이 1099
| |









Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb + PgBouncer + ProxySQL]
서버위치 : 오라클 클라우드 춘천  실행시간 : 0.03627
to webmaster... gogo sea. gogo sea.