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
)
funcmain() {
// 연결 문자열 — 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 stringif 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 를 달면 천하무적 되는 겁니다.
|
|
번 호
카테고리
제 목
이름
조회수
Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb + PgBouncer + ProxySQL]
서버위치 : 오라클 클라우드 춘천 실행시간 : 0.03965 초 to webmaster... gogo sea. gogo sea.