스토리, 사진, 채용까지.
모두 한 곳에서 탐험하세요

쓱- 둘러보기만 해도 내가 다니는 모습이 상상되는 기업콘텐츠 꿀단지.

스토리

두근두근 첫 출근

취업 스토리

취업 성공하는 이력서와 자기소개서

...
마케팅 카밀라

관광경영학 전공자의 콘텐츠 에디터 취업 자료

15,980원
...
운영 니콜

소비자경제학-법학 졸업생의 교육운영 합격 키트

19,980원
...
운영 테오

영문학과 졸업생의 커뮤니티 매니저 합격 자료 모음

19,980원
...
마케팅 콜린

국어국문학과 졸업생의 콘텐츠 에디터 합격키트

9,980원
테마
스펙쌓기

마감 직전 대외활동

...
마감 O일전 ~ 25.07.20

✅ AI융합 풀스택개발자 국비지원 - 하이미디어아카데미 구로

하이미디어아카데미 구로점
...
마감 O일전 ~ 25.07.20

[고용노동부] 미래내일일경험 AI/마케팅 프로젝트형(기업멘토링, 포트폴리오완성) 참여자 모집 (참여수당 62만원, 팀활동지원금 240만원)

고용노동부
...
마감 O일전 ~ 25.07.20

2025 시립동대문청소년센터 여름방학 청소년동행캠프 보조지도사 모집

동대문청소년센터
...
마감 O일전 ~ 25.07.20

<월간시소 : 취향존중> 시민 모임장 모집!

부평구문화재단
스토리

조직문화 101

(주) 데이터뱅크 분위기 어때요?

(주) 데이터뱅크, 어떤 생각을 할까?

2021. 11. 11. 조회수 587

[AI Grading] Q&A

[AI Grading] Q&A 이주형 · 4 min read Jun 24 TOEFLBANK Writing Test AI Grading: Q&A — I am in charge of managing the overall AI infrastructure for the automatic grading. Hi guys, this is Brian from TOEFLBANK Speaking of AI, I’m sure most of you who have used our service realized at one point that your writing responses are being graded by a machine. Now, some of you might have thought that’s a bit weird, and for some of you who are interested in the field of deep learning might not have found it so surprising. But regardless of where you stand on the topic of AI, the truth of the matter is that ETS is also using some form of automated scoring. That’s right, when you walk into an ETS testing center today to take the TOEFL Exam, your writing and speaking responses are partly graded by a machine. So, for those of you who feel uneasy about this whole “AI is grading my essay” thing, we want to let you know that this is real. However, the way we do it here at TOEFL BANK is relatively new and different — so I’m sure you have questions on how we grade your essays, so I wanted to take this time to answer some questions you sent us about our AI. AI Grading Question #1 — Why use AI for scoring in the first place? Awesome question — now, the key to getting better in writing and speaking, not just in TOEFL, but in language acquisition in general, is repetition. However, if you simply repeat without any feedback or guidance, you are wasting your time. You need someone or, in this case, something, to tell you that you are going in the right direction. Conventionally, that someone is a teacher at your school, or a tutor at your prep school. But think about the last time you had to wait for their feedback. They don’t respond so well during weekends right? What we aim to do in TOEFL BANK is having an AI provide feedback for you so that you can request for grades without having to worry about time or location. I’m in South Korea, and based on our user-data, most of you are not here and we are not even in the same time-zone, but you still use our service right? It’s already working out! Question #2 — How does this work and how is this different? Alright — before I answer this question I’d like to give you a brief overview on how this whole automated scoring thing started. Basically, we’re not the first guys to try this out — BUT, we are the first guys to use deep learning algorithms for automated scoring service — then how is deep learning different? — Previously, everything was about rules. You have 2 spelling errors, 3 spelling errors, and those counts worked as a deduction against your grade. This already sounds like a painful process doesn’t it? Think about how many factors work together interactively to grade your essay. And plus, spelling and grammar are simple surface level features. How is the machine going to understand abstract concepts like logic or context? The answer is, you can’t, and that’s why these rule-based systems fail so miserably in natural language understanding. At TOEFLBANK, we use ZERO rules. Everything is about representation. Your essay is broken down to text tokens. Text tokens are transformed to context based representations that a computer can understand. Next, the computer will look at your essay representation — and a score assigned by a professional human grader, and start associating your essay with the given score. With enough data and training, the machine will be able to grade your essay without the supervision of a human grader. Of course, since it is learning from a human pattern, it also picks up on biases. For example, same grader, scoring on Monday, scoring on Friday, can you guess which day they give higher grades? That’s why while we emphasize adopting new models and algorithms, our main focus is data quality. Without clean data, algorithms are useless. Our human scorers are fully trained and experienced TOEFL professionals, and our AI is properly learning from their scoring pattern. Our AI is learning every single day — which means we are continuing to improve every day. Question #3 — I made corrections on my essay but why has my score not changed? Well, I can assure you if you have done the right corrections, your scores would have gotten better. However, there is a threshold for scores to change. The AI itself is spitting out scores in numbers with decimals. So, when we look at the decimal points, your score might have improved, but when the AI score is being converted to an ETS score, there are some rounding procedures involved — and that’s why you might end up with the same converted score. Then you might ask “if AI scores are more precise than the converted score, why not give the AI score in the first place?” AI grading is fun and everything, but at the end of the day we want you to do well in TOEFL. Let’s not forget why we are doing this in the first place. All scores and grading layouts will follow what you would normally see at the actual TOEFL examination to make sure you are prepared for the real test. Alright, so I hope this post properly answered some of the questions you had about our AI service. If you have any other questions — please feel free to let us know, and we will do our very best to get back to you as soon as possible. Also, as mentioned earlier, our speaking autograder is coming out soon. So once it is out, please try it out. Feedback and repetition are key in achieving your target score. So, good luck, and keep on practicing! Source: https://www.toeflbank.com/ko/blog/TOEFLBANK-Writing-Test-AI-Grading #engineering #ai #tech #toeflbank
2021. 11. 11. 조회수 447

[인터뷰] COO Doran님을 만나다

[인터뷰] 데이터뱅크 COO Doran님을 만나다 이주형 · 3 min read May 27 2021년 4월, 최고운영책임자(COO) 황석인님께서 DATABANK와 함께 하시게 되었습니다. 황석인님과의 인터뷰 시작합니다! 안녕하세요, 본인 소개 부탁드립니다! 데이터뱅크의 COO 황석인입니다. 편하게 Doran으로 불러주세요! IT 산업의 게임과 교육, 웹툰 영역에서 7년 이상의 경력을 가지고 있는 디렉터입니다. 진심으로 좋아하는 영역에 몰입하여 성장하는 경험에서 가장 큰 행복을 느낍니다. LOL 세계 챔피언, Faker를 이겨본 게임 그랜드마스터. 일 년에 80권 넘게 책을 읽는 독서광. 인류의 우주 탐험을 지지하는 공학자이자 일론 머스크의 빅 팬. 지금의 일을 하시기 전에 어떤 전공이나 경험이 있으셨는지 물어도 될까요? 화학과 물리, 지구과학을 좋아했기 때문에 신소재(재료공학)를 전공했고, 체스, 축구, 게임 등 다양한 취미를 깊게 몰입하며 즐겨왔습니다. 그 외 ‘스마트스터디’라는 조직에서 7년 반 이상 일하며 주니어 PM부터 최고 운영 책임자의 역할을 경험했습니다. 지금의 직장과 직무를 선택하신 이유나 계기가 있으신가요? 세상에 어떤 가치를 전달하고 기여하는 제일 좋은 방법은 창업과 사업이라고 생각했습니다. 그 일과 맞닿아있는 직무와 직책은 PM, COO, CEO라고 생각했고, 이 생각을 기반으로 중요한 선택과 의사결정을 하고 있습니다. 담당 업무에서 나만이 가진 강점을 알려주세요. PM 및 COO로서 가져야 할 다양한 소프트 스킬을 밀도 있게 쌓아왔기 때문에, 어떤 일을 하더라도 기본 완성도가 높은 편입니다. 또한 인문학과 공학, 모두에 깊은 관심과 지식을 갖고 있기 때문에 다양한 관점으로 문제를 파악하고 해결하는데 능합니다. 특정 영역에서 A부터 Z까지 달성한 경험을 바탕으로, 새롭게 시도하는 영역에서 굉장히 빠르게 성장합니다. 구직자들이 이것만은 꼭 알아주었으면 좋겠다!하는 점이 있으신가요? 저는 목표가 명확하거나, 혹은 목표를 적극적으로 찾는 사람과 함께 하는 것을 좋아합니다. 제가 무엇을 도와야 하는 지 명확히 알 수 있고, 그 사람에게서도 적극적인 도움을 받을 수 있기 때문입니다. 서로의 목표를 응원하고 돕는 관계를 꿈꾸시는 분이라면, 언제든 만남과 연락을 환영합니다. 우리 회사에 관심을 가진 구직자들에게 한 마디 전하고 싶다면? 어떠한 목표나 꿈이 있고, 그것이 데이터뱅크의 목표와 일치하는 부분이 있다면, 이곳은 하고자 하는 바를 이루기에 충분히 매력적인 곳이라고 생각합니다. 본인의 능력! 스펙!에 대해 더 자랑해 주세요! 연세대학교 신소재공학과 졸업 스마트스터디 팀장 스마트스터디게임즈 COO Game Grand Master 1997, School Chess Champion. 2008, World of Warcraft’s WMO-specific category #1 in the world. 2011, Starcraft2, Diamond League. 2012, LOL, TOP 200 in Korea. 2013, LOL, Team lead of Yonsei university. 2013, LOL, OGN university league. 2017, Overwatch Grand master 2018, PUBG Grand master, TOP 100 in Korea. IQ 140+ 스프레드시트의 달인 글로벌 컨설팅 및 기업 자문(광고 수익화, 모바일 교육 및 게임 시장, 마케팅) Urban Dance Learner (in 1Million Dance Studio)
스펙쌓기

마감 직전 공모전

...
마감 O일전 ~ 25.07.20

제4회 경운대학교 지능형 모빌리티 SW경진대회

경운대학교
...
마감 O일전 ~ 25.07.20

2025 제 33회 대한민국기독교미술대전

한국미술인선교회 / 대한민국기독교미술대전 운영위원회
...
마감 O일전 ~ 25.07.20

2025 가야고분군 멀티미디어 슬로건 공모전

스마트크리에이터
...
마감 O일전 ~ 25.07.21

양성평등 표어 공모전

구리시

오늘의 스택 Slack 팔로우

직군에서 많이 쓰는 툴입니다. 직군 설정하기

Slack 쓰는 팀

Slack 활용기

2019. 05. 09. 조회수 3307

Node 서버로 Slack 메신저 자동화하기

Overview백엔드 업무를 하면 데이터 요청과 CS문의를 자주 받습니다. 날짜만 다를 뿐 같은 유형의 문의가 대부분이죠. 결국 반복적인 업무를 효율적으로 처리할 수 있는 방법을 고민했고, 사내 메신저로 사용하는 Slack의 몇 가지 API를 사용하기로 했습니다.1. 알림봇 만들기비즈니스 로직을 만들다 보면 정해진 시간에 맞춰 작업을 해야 하는 경우가 발생합니다. Slack 메신저에 로그온한 상태에서 스케줄러를 이용해 지정한 시간에 Slack 메세지를 전송해보겠습니다.1)Slack API 유저토큰 받기Slack API에 사용할 해당 계정의 토큰을 받아야 합니다. Slack 가입 절차 및 채널 생성은 생략하겠습니다.https://api.slack.com/custom-integrations/legacy-tokens 접속합니다.Legacy tokens 메뉴에서 아래로 스크롤을 내려 토큰 생성버튼을 누릅니다.계정 패스워드를 입력하여 확인하면 토큰을 생성할 수 있습니다.생성된 토큰을 복사하여 저장합니다.2)Node.js를 이용한 알림봇 구현2-1.Node.js 설치Node.js 다운로드 해당 사이트에서 운영체제 환경에 맞는 파일을 다운받아 설치2-2.프로젝트 생성해당 프로젝트 폴더로 이동 후 명령어 실행$ npm init --yes // package.json 파일 생성2-3.Slack 연동2-3-1. slack-node 모듈 설치$ npm install slack-node --save2-3-2. 유저토큰을 이용하여 해당채널에 메세지 전송const Slack = require('slack-node'); // 슬랙 모듈 사용 apiToken = "발급받은 유저토큰"; const slack = new Slack(apiToken); const send = async(message) => { slack.api('chat.postMessage', { username: 'dev-test', // 슬랙에 표시될 봇이름 text:message, channel:'#general' // 전송될 채널 및 유저 }, function(err, response){ console.log(response); }); } send('메세지 내용'); 지정한 채널에 메시지가 발송됩니다. 하지만 이와 같은 방법은 유저 토큰이 공개 코드에 노출되기 때문에 보안이 취약할 수 있습니다. 유저 토큰이 필요 없어도 해당 채널에 URL을 생성하는 WebHooks API를 이용하여 메시지를 전송해보겠습니다.3) Incoming WebHooks APIWebHooks는 유저 토큰 대신 Webhook URL을 생성해 HTTP 통신으로 Slack 메세지를 전송할 수 있습니다. 다양한 메시지 형식을 지원하고 게시할 사용자 이름 및 아이콘 등을 통합적으로 관리할 수 있는 장점을 가지고 있습니다.3-2. Webhook URL 생성하기Slack 해당채널에서 Add an app 클릭검색필터에 WebHooks 검색Incoming WebHooks 추가채널 선택 후 Incoming WebHooks 생성생성된 Webhook URL 복사하여 저장해당채널에 생성되었는지 확인봇이름 및 아이콘등 기본 설정 변경하여 저장curl 사용 예제$ curl -s -d "payload={'text':'메세지 내용'}" "Webhook URL"Webhook URL 사용 중인 모든 메시지는 통합적으로 기본 설정이 변경된 걸 확인할 수 있습니다.다양한 형식의 메세지를 전송해보겠습니다.const Slack = require('slack-node'); // 슬랙 모듈 사용 const webhookUri = "Webhook URL"; // Webhook URL const slack = new Slack(); slack.setWebhook(webhookUri); const send = async(message) => { slack.webhook({ text:"인터넷 검색 포털 사이트", attachments:[ { fallback:"링크주소: ", pretext:"링크주소: ", color:"#00FFFF", fields:[ { title:"알림", value:"해당링크를 클릭하여 검색해 보세요.", short:false } ] } ] }, function(err, response){ console.log(response); }); } 다양한 형태의 메시지를 전송할 수 있습니다.4) Schedule 연동이제 스케줄러를 이용하여 지정한 시간에 메세지를 전송해보겠습니다.4-1. node-schedule 모듈 설치node-schedule는 Node.js 작업 스케줄러 라이브러리입니다.$ npm install node-schedule --savenode-schedule 코드 작성const schedule = require('node-schedule'); // 스케줄러 모듈 사용 // rule-style 사용 var rule = new schedule.RecurrenceRule(); rule.dayOfWeek = new schedule.Range(3,4); rule.hour = 19; rule.minute = 50; schedule.scheduleJob(rule, function(){ console.log('rule 방식'); }); // cron-style 사용 schedule.scheduleJob('50 19 * * *', function(){ console.log('cron-style 방식'); }); 취향에 맞는 스타일로 사용하면 됩니다.5) 지정 시간에 메세지를 전송하는 알림봇을 작성해보겠습니다.const Slack = require('slack-node'); // 슬랙 모듈 사용 const schedule = require('node-schedule'); // 스케줄러 모듈 사용 const webhookUri = "Webhook URL"; // Webhook URL const slack = new Slack(); slack.setWebhook(webhookUri); const send = async(message) => { slack.webhook({ text:message, attachments:[ { fallback:"구글드라이브: ", pretext:"구글드라이브: ", color:"#00FFFF", fields:[ { title:"[알림]", value:"해당링크로 접속하여 작성해 주세요.", short:false } ] } ] }, function(err, response){ console.log(response); }); } schedule.scheduleJob('5 19 * * *', function(){ send('업무보고 보내셨나요?'); }); 업무보고 시간을 미리 알려주는 알림봇2. 대화봇 만들기업무 문서는 주로 구글 독스와 같은 온라인 문서로 관리하고 있습니다. 하지만 매번 구글 드라이브에서 문서를 찾는 건 정말 귀찮은 일입니다. 번거로운 건 딱 질색입니다. Slack API를 이용해 관련된 키워드를 입력하면 링크 주소를 바로 받을 수 있는 대화봇을 만들어 보겠습니다.1) Slack API Bots 토큰 받기Slack API에 사용될 Bots 토큰을 받아야 합니다.https://{App Name}.slack.com/apps 에 접속합니다.Bots 추가Bots Api 토큰을 복사해 저장합니다.설정한 봇이름으로 Apps 영역에 자동으로 추가됩니다.2) 구글독스 대화봇 코드 작성2-1. botkit 모듈 설치$ npm install botkit --save2-2. 코드 작성const botkit = require('botkit'); // 봇 모듈 사용 const Slack = require('slack-node'); // 슬랙 모듈 사용 const controller = botkit.slackbot({ debug: false, log: true }); const botScope = [ 'direct_message', 'direct_mention', 'mention' ]; controller.hears(['업무보고'], botScope, (bot, message) => { bot.reply(message, '업무보고 링크주소'); }); controller.hears(['가이드', 'guide', '튜토리얼'], botScope, (bot, message) => { bot.reply(message, '가이드 링크주소'); }); controller.hears(['api', '명세서'], botScope, (bot, message) => { bot.reply(message, 'api명세서 링크주소'); }); controller.hears(['일정', '일정관리'], botScope, (bot, message) => { bot.reply(message, '일정관리 링크주소'); }); controller.hears(['비품', '비품정리'], botScope, (bot, message) => { bot.reply(message, '비품관리 링크주소'); }); controller.spawn({ token: '발급받은 봇 토큰' }).startRTM(); 지정한 키워드를 입력하면 해당 링크가 수신 됩니다.3) 데이터문의 대화봇 코드 작성데이터 요청 시 결과 데이터를 보내주는 대화봇을 만들어 보겠습니다. 일단 먼저 데이터문의 전용 Bots을 생성합니다.3-1. Python 연동 요청한 데이터는 Mysql 데이터를 조회해서 전송합니다. 그러면 Mysql 을 연동해야겠죠? Node.js에서도 직접 mysql 연결할 수 있지만, 기존 프로젝트가 Python으로 구현되어 있어 Python을 실행해 필요한 데이터를 추출해보겠습니다.3-2. python-shell 모듈 설치Node.js에서 Python 실행가능하도록 모듈을 설치$ npm install python-shell --save3-3. Mysql Sample Table3-4. 회원테이블에 저장된 가입일시 기준으로 몇일전에 가입한 회원을 추출하여 전송하는 코드 작성해 보겠습니다.const botkit = require('botkit'); // 봇 모듈 사용 const Slack = require('slack-node'); // 슬랙 모듈 사용 const ps = require('python-shell'); // 파이썬 쉘 모듈 사용 // 몇일 전 날짜 구하기 function getDaysAgo(dayNo = 0) { let nowDate = new Date(); let tempDate = nowDate.getTime() - (dayNo * 24 * 60 * 60 * 1000); nowDate.setTime(tempDate); let getYear = nowDate.getFullYear(); let getMonth = nowDate.getMonth() + 1; let getDay = nowDate.getDate(); if (getMonth < 10 xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed> 3-5. Python 코드 작성 # -*- coding: utf-8 -*- import sys import pymysql // mysql 접속 db = pymysql.connect('hostname', user='', passwd='', db='', charset='utf8') cursor_db = db.cursor() exe_query = "SELECT MEMBER_NAME FROM MEMBER_INFO WHERE MEMBER_REGIST_DETE >= '{}' ORDER BY MEMBER_NO ASC ".format(sys.argv[1]) cursor_db.execute(exe_query) all_rows = cursor_db.fetchall() for idx, row in enumerate(all_rows): print(row[0])     지정한 며칠 전에 가입한 회원 이름이 전송됩니다.   로그도 정상적으로 출력됩니다. 3. Node.js 프로세스 관리를 위한 pm2 모듈 설치 Node.js 는 비동기 I/O를 지원하며 단일 스레드로 동작하는 서버입니다. 비동기식 방식이지만 처리하는 Event Loop는 단일 스레드로 이루어져 있어 처리 작업이 오래 걸리면 전체 서버에 영향을 줍니다. 그래서 pm2를 이용해 프로세스별로 상태를 관리해야 합니다. 1) pm2 모듈 설치$ npm install pm2 -g2) 자주사용하는 pm2 명령어 pm2 list -> 실행중인 프로세스 확인pm2 start {node 파일} -> 시작pm2 stop {id or App name} -> 중지pm2 delete {id or App name} -> 삭제pm2 show {id or App name} -> 상세정보pm2 restart {id or App name} -> 재시작pm2 kill -> pm2 종료pm2 logs {id} -> id 앱의 로그 확인 3) pm2 실행화면$ pm2 start bot.js   프로세스별로 앱 이름, 버전, 상태, cpu 및 memory 사용량이 표시됩니다.$ pm2 show 0   해당 프로세스의 상세 정보를 확인할 수 있습니다. Conclusion 지금까지 Node.js 로 유용한 Slack 메신져 API를 알아봤습니다. 반복적인 업무를 하나씩 줄이다 보면 분명 일의 능률을 높아집니다. 하지만 무분별한 자동화는 서버의 부하를 증가시키기 때문에 꼭 필요한지 확인하고 선택하길 바랍니다. 오늘은 여기까지 글곽정섭 과장 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만  
2019. 01. 31. 조회수 3705

리디북스 서비스 장애 복구 후기

지난 8월 26일에는 약 21분간 리디북스 서비스 전체가 중단되는 장애가 있었습니다.사실 서버 스택 일부에만 영향을 주는 장애는 눈에 잘 띄지 않지만 꽤 흔하게 발생하는 일입니다. 기기 1대당 외부적인 요인으로 인한 장애가 평균 2년에 1번 발생한다고 가정하면, 서버가 100대 있을 때는 대략 1주일에 1번꼴로 장애가 발생하는 셈입니다.이런 형태의 장애는 서버 스택의 한 곳에서만 발생하므로, 이중화 혹은 클러스터링을 통해서 극복하곤 합니다. 또한 원인이 명확하므로 해당 기술에 대한 이해도가 높다면 비교적 빠른 시간 내에 복구가 가능합니다.그러나 이번에 리디북스가 경험한 장애는 달랐습니다. 현재 리디북스는 2개의 데이터센터와 클라우드에 인프라가 분산되어 있는데, 이 중에서 1차 데이터센터의 전원 공급에 문제가 생겨 특정 서버 랙에 있는 서버 17대가 동시에 내려간 것입니다. 즉, 소프트웨어나 머신의 물리적인 장애가 아닌, 데이터센터의 장애였습니다. AWS로 비유를 하자면 가용 영역(Availability Zone)의 장애라고 할 수 있겠습니다.원인에 대해이번 장애의 근본적인 원인은 데이터센터가 전원을 정상적으로 공급해주지 못한 것입니다. 물론 데이터센터 혹은 클라우드 서비스(IaaS)는 고객사에게 전원과 네트워크를 안정적으로 제공해주어야 하는 의무가 있습니다.하지만 이들 역시 천재지변이나 사람의 실수에 대한 대비가 100% 완벽할 수는 없습니다. 따라서 이러한 점을 사전에 고려하고 인프라를 설계하지 못한 것이 2차적인 원인입니다.이번 계기를 통해 데이터센터 이중화를 계획하게 되었고, 사용 중인 클라우드 역시 지역(Region) 전체에 장애가 생길 경우에 대한 대비가 되어있지 않아, 이번 계기로 복제 계획(Geo-Replication)을 세우게 되었습니다.구체적인 상황당시 전원이 차단되어 강제 종료된 서버들은 아래와 같습니다.데이터베이스 프록시 x 2메인 리버스 프록시 x 1읽기 분산용 MySQL 슬레이브 x 1서점용 웹 서버 x 3추천 알고리즘 API 서버 x 1알림센터 API 서버 x 2메인 스토리지 서버 x 2출판 플랫폼용 데이터베이스 x 2테스트 및 배치 작업용 서버 x 3그림으로 표현해 보자면, 대략 아래와 같은 상황에서… 아래와 같은 상황이 된 셈입니다.서버 스택의 여러곳에 순간적으로 장애가 발생한 상황공인 IP가 할당된 메인 프록시 서버 중 1대가 내려갔지만, 실제로는 아래와 같이 가상 IP로 구성을 한 상태였기 때문에 대기 중인(stand-by) 프록시가 동작하여 곧 서점에 장애 공지를 띄울 수 있었습니다.[이미지 출처: DigitalOcean™]공지 이후의 움직임우리는 데이터센터의 복구 시점을 명확히 알 수 없어서 신규 구축(provisioning)을 시작함과 동시에, 서버들의 물리적인 위치 이동을 고려하고 있었습니다. 그러나 다행히 10분이 지난 시점에서 전원 문제는 해결되었고, 서버들은 순차적으로 부팅이 완료되었습니다.일부 서버들은 부팅 과정에서 예상치 못한 지연이 발생하기도 하였지만, 모든 서버의 부팅이 완료된 이후에도 서비스는 완전히 정상으로 돌아오지 않았습니다. 당시 우리가 겪었던 문제와 해결책은 아래와 같습니다.A. 읽기 분산용 MariaDB 슬레이브의 복제 지연(replication lag) 문제슬레이브 서버의 부팅이 완료되자 데이터베이스 프록시(HAProxy)는 해당 서버를 정상으로 간주하여 라우팅 대상에 포함하게 되었고, 애플리케이션 서버들은 정상적으로 커넥션을 맺기 시작하였습니다. 하지만 해당 슬레이브는 수십 분간 마스터를 따라잡지 못한 상태였기 때문에 최신 데이터가 보여지지 않는 문제(stale data)가 있었습니다. 우리는 즉시 해당 슬레이브를 제거하였고 지연이 사라진 이후에 다시 서비스에 투입하였습니다.B. 읽기 분산용 슬레이브의 웜업(warm-up) 문제복제 지연은 사라졌지만 서버의 CPU 사용량이 크게 높은 상태가 한동안 유지되었고, 응답속도는 정상적인 슬레이브에 비해서 많이 느렸습니다. 왜냐하면 캐시가 비워진 상태에서 바로 서비스에 투입되어, 캐시 미스가 휘몰아치는 현상(cache stampede)이 발생하였기 때문입니다. 따라서 간단한 쿼리도 평소보다 오래 걸렸고, 그대로 둔다면 커넥션풀이 꽉 차는 현상이 발생할 것으로 예상되었습니다.곧 우리는 HAProxy로 해당 서버의 가중치를 10%로 낮추어 인입되는 쿼리의 양을 조절하였으며 응답속도는 정상 수치로 돌아오게 되었습니다. 이후 스크립트를 작성하여 수동으로 캐시를 채워나감과 동시에 점차 가중치를 높여 처리량을 정상화하였습니다.프로덕션에서 사용하는 서버는 innodb_buffer_pool 이 100G 이상으로 매우 크게 설정되어 있으며, 재시작 시 캐시가 날아가는 현상을 해결하기 위해 innodb_blocking_buffer_pool_restore 옵션을 적용하고 있습니다. 하지만 지금처럼 메모리를 덤프하지 못하고 비정상 종료가 된 상황에서는 해당되지 않았습니다.C. 인메모리 데이터의 보존 문제알림센터는 다양한 프로모션과 개인화된 정보를 전달해주는 공간입니다. 알림센터의 특징은 데이터의 영구 보존(persistency)이 필요하지 않고, 매일 수백만 건의 개인화된 메시지가 기록된다는 것입니다. 이러한 특징은 인-메모리 데이터베이스에 적합하므로 우리는 Redis를 마스터/슬레이브로 구성하여 저장소로 사용하고 있었습니다.어떠한 이유로든 Redis를 재시작해야 할 경우가 생기면, 메모리 상의 데이터가 날아가는 것을 방지하기 위해 주기적으로 스냅샷을 남기고 있습니다만, 이번에는 로그가 마지막까지 기록되지 못한 상태에서 메모리의 데이터가 날아가 버렸습니다.다행히 알림 발송과 관련된 메타정보는 모두 MariaDB에 기록하고 있으므로, 우리는 이를 기반으로 소실된 시점부터의 알림을 순차적으로 재발송할 수 있었습니다. 물론 모든 알림이 신규 상태로 간주되어 아이콘이 잘못 노출되는 문제가 있었지만, 고객님들은 너그럽게 이해해 주신 것 같습니다. 😅그래서 앞으로는?리디북스 DevOps 멤버들은 이번 데이터센터 장애를 통해 현재 인프라의 한계점을 실감하였고, 앞으로의 개선 방향에 대해 고민하게 되었습니다.몇 가지를 정리하면 다음과 같습니다.랙 단위로 장애가 발생할 수 있음을 인지하고 대비하자.같은 기능을 하는 서버를 하나의 랙이나 같은 가용 영역에 두지 말자.2차 데이터센터는 더 이상 옵션이 아닌 필수다.낙뢰나 지진으로 인해 데이터센터에 문제가 생길 수도 있다.긴급하게 프로비저닝이 필요한 상황에 대비하자.문서화가 되어 있더라도 경험이 없다면 동일한 구성에 많은 시간이 소요된다.모든 구성요소들에 대한 Ansible 스크립트를 작성하여두자.캐시 웜업 스크립트도 작성하여 두자.백엔드 구성요소들 간의 불필요한 의존 관계를 끊자.단 한 줄의 코드라도 참조하고 있다면 이는 독립적인 것이 아니다.언제나 서비스 지향적인 설계를 추구하자.Uptime을 관리하자.최대 180일을 기점으로 무조건 리부팅을 하자.재시작 과정에서 다양한 문제와 개선점이 발견될 것이다.커널 패치, 보안 패치를 할 수 있는 것은 덤이다.아래와 같은 긍정적인 면도 발견하였습니다.장애 상황이 실시간으로 Slack 채널을 통해 전파되었음진행 상황에 대해 모두가 동일한 수준으로 이해할 수 있었다.모니터링 연동(integration) 기능 때문에라도, Slack은 유료로 구매할만한 값어치가 충분하다.같은 기능을 하는 서버들이 다른 랙에 많이 분산되어 있었다.인프라가 확장될 때마다 빈 공간에 필요한 서버를 추가했을 뿐이지만, 자연스럽게 물리적인 위치가 분산되는 효과가 있었다.이 외에도 특정 클러스터를 구성하는 노드들을 분산하여 배치시키자.서버별로 오너쉽이 부여되어 있어서 빠르게 복구가 된 점여러 명의 백엔드 개발자들이 병렬적으로 복구를 진행할 수 있었다.마지막으로넷플릭스의 엔지니어들은 무질서한 원숭이(Chaos Monkey)라는 프로그램을 만들어서 운영한다고 합니다. 이 원숭이는 서비스 인스턴스들을 무작위로 중단시키는 역할을 합니다. 다소 황당하게 들리지만, 넷플릭스에는 일부 서비스에 장애가 발생하더라도 나머지 부분은 문제없이 운영되어야 한다는 원칙이 있으므로, 이를 수시로 시뮬레이션하는 과정을 통해 복구 능력을 높여둔다는 것입니다.실제로 이렇게 급진적인 아이디어를 실천할 수 있는 회사는 매우 드물 것입니다. 하지만, 우리는 이번 계기를 통해 무질서한 원숭이의 필요성을 절감하였고, 이로 인해 서버를 주기적으로 리셋하는 정책을 만들게 되었으며 모든 단일 장애점(SPoF)에 대한 대비를 시작하게 되었습니다.장애를 단순히 피해라고만 생각한다면, 서로를 비난하고 책임을 전가하는 상황이 펼쳐질 것입니다. 하지만 고객의 불편함과 맞바꾼 매우 비싼 경험이라고 생각한다면, 보다 튼튼하고 회복탄력적인 시스템을 갖추기 위해 노력하게 될 것입니다. 그러다 보면 언젠가는 데이터센터 전체에 문제가 생겨도 버틸 수 있는 모습으로 진화할 것이라고 생각합니다.#리디북스 #장애복구 #역경돌파 #개발 #개발후기 #개발자 #서버개발 #서버

기업문화 엿볼 때, 더팀스

로그인

/