잠시만 기다려 주세요

     '민주당 심판은 아직 끝나지 않았다.'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (24)  |  여러가지 팁 (1106)  |  추천 및 재미 (165)  |  자료실 (25)  |  
시사, 이슈, 칼럼, 평론, 비평 (921)  |  끄적거림 (142)  |  문예 창작 (719)  |  바람 따라 (75)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    golang

golang - golang 에서 postgresql + pgx + pgbouncer 사용하기... 기존 설정 그대로 유지하면서 성능 향상 됩니다. pgbouncer 사용, 설명...
이 름 : 바다아이   |   조회수 : 169         짧은 주소 : 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 / 7 page
번 호 카테고리 제 목 이름 조회수
183 golang golang mariadb, mysql pooler proxysql ..!!! mariadb , .. 바다아이 148
182 golang golnag ...  Go ... go get ... 바다아이 141
현재글 golang golang postgresql + pgx + pgbouncer ... . pgbouncer , ... 바다아이 170
180 golang golang ... 바다아이 711
179 golang golang , ... 바다아이 3261
178 golang golang , map . 바다아이 2603
177 golang Golang (, , data ) , ... 바다아이 3118
176 golang golang sort ... 바다아이 3391
175 golang golang html.EscapeString html.UnescapeString input value ... 바다아이 3350
174 golang golang go.mod go.sum . GOPATH SRC not module, 1.16 . 바다아이 6868
173 golang go 1.16 ... is not in GOROOT.. GOPATH .... . 바다아이 8117
172 golang , String Formatting 바다아이 9357
171 golang rand.Intn , random, , . 바다아이 8875
170 golang golang ... 바다아이 12758
169 golang golang gopath, goroot .. golang 바다아이 9668
168 golang golang ... Force download file example 바다아이 11797
167 golang golang , , cpu, memory, disk 바다아이 12796
166 golang golang , ... GOOS, GOARCH 바다아이 10366
165 golang golang checkbox ... 바다아이 10323
164 golang golang , , http .... 바다아이 10129
163 golang golang nil , nil , nil ... 바다아이 10021
162 golang 2 golang, go , .... golang .... 바다아이 13342
161 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 10753
160 golang golang postgresql mysql, mariadb scan , null .. 바다아이 10839
159 golang golang , iconv 바다아이 13606
158 golang golang quote escape, unquote 바다아이 10998
157 golang golang , http errorLog , , ... 바다아이 11416
156 golang golang interface , 바다아이 10527
155 golang golang struct .... 바다아이 11166
154 golang golang map map , 바다아이 10533
| |









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