sitelink1 https://blog.naver.com/pass4u/220027954372 
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

단일 DB를 연결하는 Connection Pool이외에도 여러 개의 데이터 베이스를 연결하는 Conneciton Pool의 개념인 poolCluster를 제공한다. 

이 poolCluster는 동시에 여러 개의 ConnectionPool을 포함하는 일종의 집합이다. 여러 개의 mysql node를 묶어서 클러스터 구성을 할 수 있는 환경이 없어서, https://github.com/felixge/node-mysql 에 나와있는 예제를 인용하였다.

 

// create

var poolCluster = mysql.createPoolCluster();

 

poolCluster.add(config); // anonymous group

poolCluster.add('MASTER', {

    host : 'localhost',

    user : 'master',

    password : '1234',

    database : 'master_db',

    port : '3306'

});

poolCluster.add('SLAVE1'{

    host : 'localhost',

    user : 'slave1',

    password : '1234',

    database : 'slave1_db',

    port : '3306'

});

poolCluster.add('SLAVE2'{

    host : 'localhost',

    user : 'slave2',

    password : '1234',

    database : 'slave2_db',

    port : '3306'

});

 

// Target Group : ALL(anonymous, MASTER, SLAVE1-2), Selector : round-robin(default)

poolCluster.getConnection(function (err, connection) {});

 

// Target Group : MASTER, Selector : round-robin

poolCluster.getConnection('MASTER'function (err, connection) {});

 

// Target Group : SLAVE1-2, Selector : order

// If can't connect to SLAVE1, return SLAVE2. (remove SLAVE1 in the cluster)

poolCluster.on('remove'function (nodeId) {

  console.log('REMOVED NODE : ' + nodeId); // nodeId = SLAVE1

});

 

poolCluster.getConnection('SLAVE*''ORDER'function (err, connection) {});

 

// of namespace : of(pattern, selector)

poolCluster.of('*').getConnection(function (err, connection) {});

 

var pool = poolCluster.of('SLAVE*''RANDOM');

pool.getConnection(function (err, connection) {});

pool.getConnection(function (err, connection) {});

 

// destroy

poolCluster.end();

 

이 코드는 “master- 2개의 slave 복제 구조”로 되어 있는 mysql 에 각 DB에 3개의 connection pool을 연결하여 pool cluster로 묶은 예제이다. 

poolCluster에서 connection 을 가지고 오는 것은poolCluster.getConnection(“풀이름”) 을 사용하면 되는데, 위의 SLAVE*와 같이 ‘*’를 사용할 수 있다.  

이 경우에는 어떤 정책으로 Pool을 가지고 올지를 정해야 하는데, 3 가지 정책을 지원한다.

 

RR : Connection을 해당 이름의 풀들에서 번갈아 가면서 한번씩 리턴한다.

ORDER : Connection을 무조건 첫번째 풀에서부터 리턴하는데, 장애가 났을 경우에만 다음 풀의Connection을 순차적으로 리턴한다.

            이 경우에는 HA 구성등에 유리하게 사용할 수 있다.

RANDOM : 순서 없이 무작위로 아무 풀에서나 connection을 리턴한다.

 

이 외에도 살펴보면, Store Procedure 수행이나, Streaming, Pipe와 같은 기능들도 제공한다. 

그러나 아직까지 엔터프라이즈 자바에 비해서는 분산 트렌젝션 관리 능력이나 배치 처리등은 부족한 것이 사실이고, 오픈되어 있는 모듈도 아직 성숙도가 기존의 JDBC/MySQL 모듈에 비해서 높지 않다. 

예를 들어서, connection이 끊어지지 않게 주기적으로 Keep alive query를 보내는 기능등. 

일반적인 B2C 애플리케이션에서는 충분히 사용가능 하지만, 고가용을 요구하거나 데이타 분실이나 은행과 같은 높은 수준의 트렌젝션 보장이 필요한 곳에는 적절하지 않다. (물론 그런곳에는 mysql을 사용하지도 않겠지만)

 

 

 

좀 더 응용해 보자면

아래와 같이 PoolCluster 를 이용한 쿼리 함수를 export하여 모듈로 만들어 사용할 수 있다

 

var mysql = require('mysql');

var poolCluster = mysql.createPoolCluster();

// poolCluster 이용한 DB연결

 

poolCluster.add('MASTER', {

    host: 'localhost',

    user: 'root',

    password: '1234',

    database: 'test',

    port: '3306'

});

 

function executeQuery(sql, values, callback) {

    console.log("executeQuery sql : " + sql);

    console.log("executeQuery whereto : " + values);

    poolCluster.getConnection("MASTER", function (err, connection) {

        if (err) {

            console.log(JSON.stringify(err));

            connection.release();

            callback(err, null);

        } else {

            connection.query(sql, values, function (err, rows) {

                connection.release();

                if (!err) {

                    callback(null, {

                        rows: rows

                    });

                }

            });

        }

    });

}

 

function end() {

    poolCluster.end();

}

 

module.exports.executeQuery = executeQuery;

module.exports.end = end;

 
 
 

 

 

 

번호 제목 글쓴이 날짜 조회 수
56 node js + 아두이노 연동 제어 실험 file 황제낙엽 2017.01.02 3038
» 여러 개의 데이터 베이스 연결을 동시에 관리하는 PoolCluster 황제낙엽 2021.01.16 2206
54 빠르게 훝어 보는 node.js - #4 웹개발 프레임웍 Express 1/2 file 황제낙엽 2016.08.03 1012
53 Node.js란? 황제낙엽 2012.11.15 765
52 Node.js 에서 Bulk INSERT 를 하는 방법 (multi insert) 황제낙엽 2021.02.02 666
51 RESTful API 황제낙엽 2020.07.13 528
50 [connection과 pool-03] mysql.createPool 과 connection.query 황제낙엽 2021.01.27 384
49 mysql, mysql2 모듈 버전 비교 황제낙엽 2021.01.31 269
48 express 4.16부터는 body-parser를 내장한다 황제낙엽 2020.12.06 268
47 빠르게 훝어보는 node.js - #1node.js 소개 및 내부구조 file 황제낙엽 2016.08.03 267
46 express-sse 모듈과 EventEmitter 황제낙엽 2020.09.20 265
45 Node.js , NPM 관련 명령어 정리 황제낙엽 2020.09.10 141
44 [Deprecated] request / request 황제낙엽 2020.08.26 123
43 빠르게 훝어 보는 node.js - #3 Event,Module,NPM file 황제낙엽 2016.08.03 122
42 node js 학습 링크 목록 황제낙엽 2017.01.05 118
41 빠르게 훝어 보는 node.js - #5 웹개발 프레임웍 Express 2/2 file 황제낙엽 2016.08.03 105
40 nodemon 설치 및 활용 file 황제낙엽 2020.08.16 102
39 urlencode : request params의 한글 처리 황제낙엽 2020.12.06 99
38 google oauth 인증 (구글 로그인) file 황제낙엽 2020.11.12 84
37 빠르게 훝어 보는 node.js - #6 MongoDB 연동 (mongo-native) file 황제낙엽 2016.08.03 82