DB connection Failed 와 DB server down 에 대응하기
728x90
사건의 발단
db 를 주기적으로 조회해서 data 를 socket 으로 뿌려주는 서버가 db 와의 연결이 끊어지면서 에러를 내뱉으면서 서버가 죽어버렸습니다.
db 를 연결할때 Client로 연결 했던 문제도 있었고 연결이 끊겼을때 라던지 서버가 죽었을때 아무런 조치를 취하지 않았던 것이 문제였습니다.
recursive connection
import dotenv from 'dotenv';
import pg from 'pg';
import { logger } from '../logger/logger.js';
dotenv.config();
const pgConfig = {
user: process.env.DB_USER_NAME,
host: process.env.DB_HOST,
database: process.env.DB_NAME,
password: process.env.DB_USER_PASSWORD,
port: +process.env.DB_PORT,
ssl: { rejectUnauthorized: false },
};
let pool;
export function connect() {
pool = new pg.Pool(pgConfig);
pool.on('error', (error) => {
logger.error('Failed to connect db ' + error);
setTimeout(() => {}, 3000);
connect();
});
return pool.connect();
}
connect();
export function connectionCheck() {
pool.query('SELECT NOW()', (err, result) => {
if (err) {
logger.error('Error database connection', err.stack);
connect();
return null;
} else {
logger.info('Connect db status check: OK time: ' + result.rows[0].now);
return null;
}
});
}
export default pool;
기존 코드를 수정했습니다. 연결이 실패하면 pool.on 에서 error 를 catch하여 3초 후 다시 자기자신을 호출합니다.
connectionCheck 를 만들어 주기적으로 db 와의 연결 상태를 체크합니다.
하지만 Server 가 죽으면 이마저도 무의미합니다.
Docker로 항상 재시작하기
Dockerfile
FROM node:alpine
WORKDIR /usr/src/app
COPY ./package.json ./
EXPOSE 3060
RUN npm i -g npm &&\
npm install &&\
npm i -g pm2 node-gyp
COPY . .
CMD ["pm2-docker", "app.js"]
docker build & start
docker build -t restart_test .
docker run --restart=always -d -p 3060:3060 restart_test
restart=always 옵션으로 docker daemon이 계속해서 이 image를 run하게 만듭니다.
728x90
'Javascript > js - node.js' 카테고리의 다른 글
npm install 종속성 error 해결하기 (0) | 2021.05.19 |
---|