잠시만 기다려 주세요

     '민주당이 분열되어야 정치개혁이 시작된다.'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (27)  |  여러가지 팁 (1126)  |  추천 및 재미 (166)  |  자료실 (25)  |  
시사, 이슈, 칼럼, 평론, 비평 (1056)  |  끄적거림 (160)  |  문예 창작 (736)  |  바람 따라 (75)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    golang

golang - golang 에서 postgresql + pgx + pgbouncer 사용하기... 기존 설정 그대로 유지하면서 성능 향상 됩니다. pgbouncer 사용, 설명...
이 름 : 바다아이   |   조회수 : 1638         짧은 주소 : 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
번 호 카테고리 제 목 이름 조회수
184 golang golang postgresql 접속시 콘솔과 실제 golang 프로그램에서 postgresql 접속 시간이 안 맞을 때..timezone 문제.. 바다아이 1456
183 golang golang mariadb, mysql 접속 pooler proxysql 에 관한 설명..!!! mariadb 접속 개선, 연결 속도 증가 설정.. 바다아이 1612
182 golang golnag 받아온 의존 패키지 및 등등...  Go 언어에서 패키지를 업데이트... go get 업데이트... 바다아이 1528
현재글 golang golang 에서 postgresql + pgx + pgbouncer 사용하기... 기존 설정 그대로 유지하면서 성능 향상 됩니다. pgbouncer 사용, 설명... 바다아이 1639
180 golang golang 문자열 함수 예제... 바다아이 2439
179 golang golang 숫자인지 아닌지 확인하기, 체크하기... 바다아이 5283
178 golang golang 배열 삭제, map 삭제. 바다아이 4254
177 golang Golang 문자열 변환 방법(문자열, 숫자, 등 data 파싱방법) 타입 변환, 형 변환... 바다아이 5206
176 golang golang sort 정렬하기... 바다아이 5313
175 golang golang html.EscapeString html.UnescapeString input value 따옴표 안에 따옴표... 특수문자 치환 바다아이 5090
174 golang golang go.mod go.sum 모듈 관련 문제. GOPATH SRC not module, 1.16 로컬 패키지 사용 문제. 바다아이 8991
173 golang go 1.16 컴파일 에러... is not in GOROOT.. 컴파일시 GOPATH 찾지 못하는 문제.... 패키지 모듈 문제. 바다아이 10303
172 golang 문자열 포맷, String Formatting 바다아이 11425
171 golang rand.Intn 랜덤값 구하기, random, 랜덤 난수 발생하기, 알파벳 난수발생. 바다아이 10998
170 golang golang 을 사용하는 회사들 리스트... 바다아이 15239
169 golang golang gopath, goroot 경로 설정하기.. golang 설치하기 바다아이 11797
168 golang golang 파일 다운로드 예제... Force download file example 바다아이 13936
167 golang golang 현재 하드웨어 및 사용현황 구하기, 하드웨어 모니터링, cpu, memory, disk 사용률 보기 바다아이 15107
166 golang golang 원하는 형태로, 여러 종류로 크로스 컴파일 하기... GOOS, GOARCH 바다아이 12426
165 golang golang 체크박스 checkbox 배열 폼 처리... 다중 체크박스 바다아이 12530
164 golang golang 핸들함수, 라우터, http 웹서버 예제.... 바다아이 12322
163 golang golang 에서 nil 을 할당할 수 있는 경우, nil 을 사용할 수 있는 타입, nil 을 사용... 바다아이 12196
162 golang 2년 가까이 golang, go 언어를 사용해본 소감, 후기.... golang 찬양.... 추천 바다아이 15541
161 golang golang 에서 postgresql, mysql, mariadb 다중쿼리 에러날 때... ` Grave (그레이브) 문제 될 때.. 쿼리문 에러.. 바다아이 12856
160 golang golang 으로 postgresql 이나 mysql, mariadb 접속해서 데이터 가져올 때 scan 시 빈값, null 값이 오면 에러나는 문제.. 바다아이 12820
159 golang golang 간편하게 문자 인코딩 변환, iconv 바다아이 15667
158 golang golang quote escape, unquote 바다아이 13020
157 golang golang 웹서버, http errorLog 에러로그 남기기, 저장하기, 기록하기... 바다아이 13489
156 golang golang 인터페이스 interface 예제, 설명 바다아이 12674
155 golang golang 구조체 struct 포인터 개념 정리.... 바다아이 13243
| |







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