안녕하세요. 스티비팀 서버 개발자 이학진 입니다. 저희는 최근 서비스에서 사용 중이던 MySQL DB를 RDS로 이관하는 작업을 진행하였습니다. 무엇 때문에 이관을 결정하게 되었는지와 어떻게 이관을 진행하였는지에 대해 글을 써보도록 하겠습니다.


배경

stibee.com은 작년 11월에 정식 오픈한 새내기 이메일마케팅 서비스 입니다. 사실 오픈 초기부터 얼마전까지만 해도 AWS EC2의 m4.large 인스턴스 하나로 운영되던 서비스였습니다.(사실 웹+API 서버 1대, 메일발송 서버 1대) 그리고 이 싱글 인스턴스에 무려 6개의 서버, MySQL 1개, Kafka™ 1개, Redis 1개가 돌고 있었습니다. 그럼에도 불구하고 CPU 사용률은 20%를 넘지 않았습니다.

 

하지만 최근 사용자도 점점 늘어났고, 네이버에서 메일 수신정책을 변경하면서 메일발송 서버에 대한 요청이 급증했습니다.

 

스티비에서 네이버로 대량메일을 발송했을 때 해당 메일의 본문 링크를 자동검사하는 것을 발견했는데요, 따라서 네이버로부터 비정상적으로 많은 요청이 들어오고 있었습니다. (어떤 기준으로 이런 검사를 하는 것인지 정확한 정책은 아직 모릅니다. 담당자분 이 글을 보신다면 연락주세요. 친하게 지냈으면 합니다 )

 

이내 곧 이메일을 마구 쏘아대던 스티비 서버는 네이버의 분노를 감당하지 못했습니다. (사실 네이버의 요청은 무난하게 처리하였으나, 요청 후 발생되는 이벤트 후처리에 DB를 과하게 사용하여…) 결국 CPU가 비명을 질렀습니다. 

 

일단 네이버의 IP를 달고오는 패킷을 drop함으로써 문제를 해결하였지만, 이로 인해 이제 "우리도 때가 왔다!'라는 판단을 하게 되었습니다.

 

그리하여 앞으로 대박날 스티비를 대비하여 스케일아웃이 가능하도록 각각의 서비스를 분리하는 작업을 진행하게 되었습니다. (사실 지금도 조금씩 떼어내고 있습니다. )


준비

앞서 RDS로 이관한다고 말씀드렸는데요. RDS는 AWS에서 제공하는 관계형 데이터베이스 서비스(링크)입니다. RDS로 이용 가능한 DB는 Amazon Aurora, PostgreSQL, MySQL, MariaDB, Oracle, Microsoft SQL Server 등이 있습니다.

 

이 중 저희는 아마존에서 MySQL과 호환되며 최대 5배까지 성능을 낼 수 있다는 Aurora DB를 사용하기로 결정하였습니다. (결정권자=1인=저)

 

AWS의 모든 서비스가 그러하듯이 RDS를 생성하는 방법은 매우 간단합니다. RDS 콘솔로 진입하신 뒤, 메인 대쉬보드의 “Launch a DB Instance” 를 클릭면 됩니다.



그러면 아래와 같이 사용 가능한 DB 목록들이 나타나는데 이중 기본값인 Aurora DB를 선택하고 “Select” 버튼을 누르시면 됩니다.


 


그리고 회사의 자금사정(?)에 따라 인스턴스 타입을 결정하시면 됩니다.


인스턴스 타입의 선택은 서비스의 특성에 따라 다르므로, 다양한 성능 테스트를 해보시기 바랍니다. 저희는 당시 EC2 인스턴스에서 DB가 같이 돌고 있었던 지라, EC2와 비슷한 사양이되 그 중 제일 저렴한 사양인 r3.large를 골랐습니다.


사양 선택에 있어 너무 고심할 필요는 없습니다. AWS에서는 클릭 한번으로 언제든 사양을 변경할 수 있으니까요~


사양을 변경하기 위해서는 인스턴스의 재부팅이 필요하므로 실서비스에 물리기 전에 결정하시길 권장합니다.



여기서 한 가지 주의할 점, Aurora DB는 기본적으로 클러스터로 구성됩니다. 클러스터란 쉽게 말해 여러 Aurora DB들을 하나로 묶어서 마치 하나의 DB처럼 사용 가능하게 해주는 역할을 합니다. (이로 인한 부하 분산, Fail-Over, 고가용성 등의 장점이 있습니다.)


앞서 저희는 하나의 인스턴스를 런칭 시키고자 하였으나, 설정페이지의 “Multi-AZ Deployment”의 기본설정을 보시면 “Create Replica In Difference Zone”으로 되어 있습니다. 이는 동일한 인스턴스를 다른 AZ에 추가적으로 둠으로써 고가용성을 보장하고 부하분산을 통해 성능향상을 해주겠다는 아마존 형님의 배려이십니다. (하지만 돈은 두배? ^^) 그래서 스티비는 “No”... (나중에 추가 할 수 있습니다.)


그 다음엔 DB Instance를 식별할 수 있게 이름을 부여하고 Root 역할을 할 Master Username과 패스워드를 설정해 줍니다. 그리고 “Next Step”


자! 이제 마지막 설정 페이지 입니다. 모든 옵션에 대해서 언급하고 넘어가기에는 설명이 너무 길어지니, 이것 정도는 알아야 한다는 옵션에 대해서만 간략히 설명하도록 하겠습니다.

  • VPC Security Group(s): DB Instance의 인/아웃바운드 트래픽 규칙을 정할 수 있습니다. 여기에서는 이미 생성된 Security Group을 사용할지, 아니면 새로 생성할 지를 정할 수 있으며, 선택된 Security Group의 세부 설정은 EC2 콘솔 페이지의 Security Group에서 할 수 있습니다.
  • Auto Minor Version Upgrade: Aurora DB의 마이너 패치가 나왔을 때, 자동으로 업그레이드를 할지 여부입니다. Yes로 하면 두세 달에 한번 업그레이드가 된다고 합니다. 주의하실 점은 업그레이드 시점에 DB는 사용 불가…(꺅!)
  • Maintenance Window: 자동으로 마이너 업그레이드를 한다면, 사용자의 이용이 가장 적은 시간대로 패치 시간을 적용할 수 있습니다.


모든 설정을 마치고 “Launch DB Instance”를 클릭하면 잠시 후 Aurora DB가 뙇!!하고 모습을 드러내시니, 이로써 이관에 대한 기본적인 준비를 마쳤습니다.

런칭된 오호라(?) DB

 

이관

AWS는 이관 방법에 대해 많은 정보를 문서로 제공합니다.

MySQL DB 인스턴스에서 데이터 가져오기 및 내보내기(링크)


운영 중인 DB를 중단하지 않고 RDS로 이관하는 방법도 있지만 이는 이관 후 데이터의 정합성을 검증해야하고 운영 DB의 부하발생 등의 이유로 해당 방법은 사용하지 않았습니다. 비록 점검 공지를 띄우고 이관 종료까지 서비스를 사용할 수 없지만 엔지니어에게 부담없는 방법을 택했습니다.

먼저 대략적인 이관 시간을 파악하고 스티비 활성 사용자가 가장 적은 시간대를 선택하여 이관을 진행하였습니다.


이관 절차는 아래와 같았습니다.

1. 자정(0시)을 기점으로 점검 페이지 교체

2. DB를 사용하는 모든 서비스 종료

3. MySQLdump를 이용한 DB백업

4. 백업된 DB 파일을 EC2로 복사

5. EC2에서 MySQL 명령어로 RDS 접속

6. source 명령어를 통한 백업파일 import

7. 명령어 실행 종료 후, 서비스 구동 및 점검 페이지 교체


이관을 진행함에 있어 EC2를 사용하는 이유는 다운타임을 최소화 하기 위해서 입니다. EC2와 RDS를 같은 VPC 내에 위치 시킴으로써 네트워크 속도가 가장 빠르기 때문입니다. (혹여나 그렇지 않을 경우 RDS가 속해 있는 VPC에 EC2를 생성해 주시기 바랍니다.)


아래는 3번부터 사용된 명령어 입니다.

DB 덤프 뜨기

$ mysqldump -u db_user -p --databases db_name --single-transaction --compress --order-by-primary > backup.sql


#필요에 따라서 압축

$ tar -zcvf backup.tar.gz backup.sql 


#EC2로 덤프 파일 복사

$ scp -r -i <key pair>.pem backup.sql.gz ec2-user@<EC2 DNS>:/<target_directory>/backup.sql.gz

#덤프 파일 복사는 편하신 방법으로 진행하시면 됩니다.

#MySQL 서버가 EC2에서 돌고 있었다면 생략


#EC2에서 RDS mysql 접속

$ mysql -h <host_name> -P 3306 -u <db_master_user> -p

#host_name은 RDS 콘솔 페이지에서 확인 할 수 있는 Cluster Endpoint 입니다.


#DB 및 User 생성

$ create database db_user;

$ grant all privileges on db_user.* to 'db_user'@'localhost' identified by 'db_password' with grant option;

$ grant all privileges on db_user.* to 'db_user'@'%' identified by 'db_password' with grant option;

$ flush privileges;


#이관 시작

$ source path/backup.sql



여기까지가 제가 진행한 이관절차의 끝 입니다. 그런데 과연 이렇게 간단하게 끝났을까요? 물론 아닙니다. 문제점 한두 개 정도는 나와줘야 제맛 아니겠습니까? (사실 악 악 하면서 심장이 쫄깃해졌습니다.)

 

문제 발생 및 해결

사실 지금까지 기술한 내용들은 AWS의 기술 문서에 매우 자세히 나와있어서 RDS를 사용하고자 하신 분들은 굳이 이 글을 읽지 않으셔도 무방하셨을 거 같습니다. 하지만 저 문서들을 보고 진행했음에도 불구하고 문제가 발생하더군요. 저희 서비스만의 문제였는지 모르겠지만 발생된 문제와 해결법을 공유해 보도록 하겠습니다.


1) Timezone

토종 한국 서비스라 Timezone이 한국 표준시였습니다. 그런데 기본 옵션으로 RDS 인스턴스를 생성하시면 국제 표준시로 설정이 되어 시간값이 다르게 나왔습니다.

DB Cluster Parameter Group의 time_zone 값을 Asia/Seoul로 변경한다.
기본 옵션값은 변경되지 않으므로 새로 생성한 뒤 변경하고, 인스턴스에 적용한다.


2) Import 중 ‘MySQL server has gone away’ 에러

MySQL의 옵션중 클라이언트가 한번에 전송 할 수 있는 패킷량의 제한이 있습니다. 이관 테이블 중 Long Text 타입의 컬럼이 있었고 해당 컬럼의 데이터를 옮기지 못해 발생된 에러 입니다. (이와 같은 이유로 아마존 기술 문서에 기술된 dump와 동시에 import하는 방식을 사용했을 때도 최대 1GB 밖에 전송할 수 없었습니다.)

DB Parameter Group의 max_allowed_packet의 값을 늘린다.
기본 옵션값은 변경되지 않으므로 새로 생성한 뒤 변경하고, 인스턴스에 적용한다.


3) 이모지 적용 안됨 

스티비는 메일 제목과 본문에 이모지 사용을 적극 권장하고 있습니다. 하지만 이관 후 작성된 메일의 이모지가 깨지는 현상이 발생 되었습니다. 이미 아시는 분들은 딱하고 감이 오시겠지만 네, CharacterSet 문제입니다. 그리고 이모지는 utf8mb4에서 지원됩니다.

DB Cluster Parameter Group의 character 옵션들을 바꾼다.
character_set_client = utf8mb4
character_set_connection = utf8mb4
character_set_database = utf8mb4
character_set_filesystem = utf8mb4
character_set_results = utf8mb4
character_set_server = utf8mb4
collation_connection = utf8mb4_unicode_ci


여기까지 스티비의 이관기를 마칩니다. 감사합니다.



Posted by slowalk

11월 10일, 스티비(Stibee)는 베타 테스트를 종료하고 정식버전을 출시했습니다. 새로운 스티비 디자인은 기존 디자인과 어떻게 다를까요?




기존에는 빈 페이지, 발송 완료 등 이미지가 필요한 부분에 이모지와 노란 꿀벌 로고를 활용했는데요, 스티비 정식버전에서는 기존의 노란색에서 벗어나 컬러와 이미지를 변경했습니다. 이를 가장 잘 볼 수 있는 페이지가 바로 empty-state, 즉 사용자가 가입한 이후 아직 서비스에서 요구하는 정보를 입력하지 않은 ‘빈 페이지’입니다. 이 페이지는 사용자가 가입한 후에 어떤 행동을 해야하는지를 안내하는 것이 주 목적입니다. 안내에 따라 사용자가 정보를 등록하면 더 이상 만날 수 없지만, 짧게 접하는 시간과 반대로 사용자의 이어지는 행동을 어떻게 유도할지 많이 고민해야 하는 페이지입니다.


empty-state에 사용하는 일러스트는 정보가 없음을 나타내는 이미지로, 서로 비슷한 맥락으로 페이지를 설명합니다. 하지만 요구하는 정보가 각각 달라 가장 직관적으로 사용자 행동을 유도하기 위해 많은 것을 덜어냈습니다.

그럼, 최종으로 선택된 시안과 탈락된 시안은 어떤 차이가 있을까요? (귀여움 주의)


스티비에 가입하면 가장 먼저 할 일은 ‘주소록 등록하기’입니다. 최종 확정된 왼쪽 시안은 사람의 실루엣과 인덱스로 주소록의 형태를 좀 더 명확하게 보여줍니다.  




주소록을 업로드 했다면 그 다음은 ‘이메일 작성하기’입니다. 최종 선택된 시안은 이메일 콘텐츠 일러스트를 활용한 시안입니다. 오른쪽에 있는 시안은 ‘벌통이 비어있으니 이메일로 벌통을 채워주길 바라’는 뜻으로 만든 일러스트입니다. 벌통 시안은 이렇게 설명하지 않으면 어떤 뜻을 가진 이미지인지 알 수 없는 것이 가장 큰 단점이라, 최종 시안으로 선택될 수 없었습니다.  



다음은 주소록 세부 항목 중, 수신거부한 수신자 목록 페이지의 empty-state 일러스트입니다. 사람, 리스트 이미지를 활용해 봤지만 수신거부한 수신자 목록 페이지 외에도 다양한 목록이 비어있을 때 활용하기 좋아 왼쪽 일러스트를 최종 시안으로 선택했습니다.




주소록에서 사용자를 검색할때 정보가 없는 경우에도 ‘정보 없음’을 일러스트로 보여줍니다. 최종 선택된 시안은 직관적인 이미지로 ‘폴더’와 ‘돋보기’를 사용했습니다. 반면 탈락된 오른쪽 시안은 아무것도 없는 벌집을 돌아다니는 벌 이미지로 이미지를 만들었습니다.



지금 소개한 이미지는 지금 스티비 곳곳에 숨어 있습니다. 완전히 새로워진 스티비. 지금 바로 스티비를 나타내는 다양한 일러스트를 만나보세요!








작성: 조은지


Posted by slowalk

이메일마케팅은 적은 비용으로 높은 효과를 얻을 수 있습니다. 비용이 낮은만큼 접근하기도 쉽지만, 관련된 법과 규정을 숙지하지 않으면 피해를 볼 수 있습니다.

정보통신망법에서는 영리목적의 광고성 정보를 전송하는 이메일이 지켜야하는 의무사항을 규정하고 있습니다. 제목에는 “(광고)”를 붙여야 한다는 등이 그 예입니다. 놓치기 쉬운 내용이 있으니 꼼꼼히 살펴볼 필요가 있습니다.

수신자의 명시적인 동의를 받아야 합니다

서비스에 가입하거나 앱을 설치하는 것만으로는 수신동의를 했다고 볼 수 없기 때문에 가입 또는 설치 과정에서 광고성 정보에 대한 수신동의를 별도로 받아야 합니다.

단 직접적인 거래 관계를 통해 연락처를 수집한 경우에는 수신동의를 받지 않아도 됩니다. 어떤 제품이나 서비스를 거래하기 위해 만난 고객에게 명함을 받았다면 수신동의 없이 그 제품이나 서비스에 대한 광고성 정보를 전송할 수 있습니다.

제목이 시작되는 부분에 “(광고)”를 표시해야 합니다

수신자의 필터링을 회파하기 위한 목적으로 빈칸, 부호 문자 등을 사용하거나 표시하는 방법을 조작하면 안됩니다. 예를 들어 (광/고), (광 고), (광.고), (“광고”), [광고]와 같이 변칙 표기하거나 특수문자를 사용하지 않아야 합니다. “(광고)지만”, (광고)인듯 광고 아닌” 등처럼 “(광고)” 뒤에 다른 말을 이어붙이는 것은 가능합니다. 스티비도 제목에 항상 “(광고)”를 붙이고 있습니다.

본문에 전송자의 명칭, 이메일 주소, 전화번호 및 주소를 표시해야 합니다

수신자가 내용을 정확히 확인할 수 있도록 해야하며 글자 크기나 색상을 조정하여 내용을 확인할 수 없게 하면 안됩니다. 이 정보는 국문과 영문으로 제공해야 합니다. 일반적으로 이런 정보는 이메일 본문의 하단에 추가합니다.

수신거부에 대한 안내문을 본문에 명시하고 즉시 수신거부를 할 수 있는 기술적 조치를 해야 합니다

수신자가 수신거부를 할 수 있다는 사실을 본문에 명시하고 로그인이나 다른 정보 입력없이 수신거부를 할 수 있는 간편한 방법을 제공해야 합니다. 이 역시 글자 크기나 색상을 조정하여 내용을 확인할 수 없게 하면 안 되고, 국문과 영문으로 제공해야 합니다.

KISA 불법스팸대응센터의 광고전송가이드에서 위의 4가지 준수사항에 대한 구체적인 방법과 예시를 확인할 수 있습니다. 정보통신방법에 대한 자세한 내용은 불법 스팸 방지를 위한 정보통신망법 안내서에서 확인할 수 있습니다.


작성자: 스티비 기획 임호열




당신의 이메일마케팅을 변화시키는 이야기, 스티비 뉴스레터를 구독하세요.




Posted by slowalk

마케팅 , 디자인 에이전시가 

만들 있습니다. 

슬로워크는 디자인 에이전시입니다. 프린트 디자인, 디자인, 브랜드 디자인, 인포그래픽 디자인 등을 지난 10 왔습니다. 최근 디자인 에이전시들이 다른 분야의 회사에 인수되거나 스타트업에 투자하거나 자체 브랜드 제품을 개발하는 시장 변화에 대응하기 위해 다양한 시도를 하고 있습니다.


디자인 툴의 발전은 디자인 에이전시에게 직접적인 위협입니다. 디자이너가 없어도 어느 정도의 퀄리티를 보장해 줍니다. 점점 기능이 개선되고 가격이 저렴해지며, 가성비 측면에서 디자인 에이전시보다 뛰어난 경쟁력을 가지게 것입니다. 디자인 에이전시가 새로운 툴과 경쟁하기 어렵다면, 스스로의 경험을 활용하는 방법이 있습니다. <스티비> 이런 맥락에서 시작된 슬로워크의 새로운 시도입니다.


<스티비> 이메일 뉴스레터 발송 서비스입니다. 많은 마케팅 조직들이 뉴스레터를 제작할 외부 업체에 의뢰합니다. 기존의 뉴스레터 발송 서비스가 있긴 하지만 디자인 완성도가 떨어지거나 사용이 불편하여 결국 전문가의 도움이 필요했습니다. 슬로워크도 수많은 뉴스레터 디자인 프로젝트를 수주해왔고, 과정에서 고객의 어려움을 이해하게 되었습니다.


<스티비> 디자인 에이전시가 하던 역할 자체를 서비스로 만들어 제공합니다. 슬로워크는 이러한 시도를 다른 영역으로도 확장해 나갈 계획입니다. 뉴스레터 디자인 외에도 디자인 에이전시의 경험을 바탕으로 경쟁력 있는 도구를 만들 있는 분야는 많이 남아 있습니다.


이메일은 죽지 않았습니다

도구가 문제일 뿐입니다. 

이메일은 가장 보편적인 온라인 커뮤니케이션 수단입니다. 이메일을 하나의 서비스라고 가정한다면 MAU( 달에 이상 사용하는 사람) 한국에서 1,600 명에 이릅니다. 페이스북 한국 MAU 비슷한 수준입니다. 해외에서는 스마트폰의 보급으로 이메일 사용률이 늘어나고 있기도 합니다. 버즈피드 이메일을 매우 중요한 마케팅 채널로 사용하고 있으며, 미국의 뉴스레터 발송 서비스 메일침프 1년에 350 명이 새로 가입하고, 이메일 발송량이 전년 대비 2 증가했습니다. 하지만 한국에서 이메일은 여전히 천덕꾸러기 신세입니다. 많이 사용하지만, 그만큼 많은 스트레스를 유발합니다. 슬로워크는 이것을 시대에 맞지 않는 뉴스레터 발송 서비스 때문이라고 판단했습니다. 



그래서 모바일에 맞는 이메일 뉴스레터 발송 서비스 <스티비> 만들었습니다. <스티비> 사용하면 누구나 쉽게 모바일에 최적화된 뉴스레터를 제작할 있습니다. 복잡한 발송 과정을 최소화하고 단계별 도움말을 제공해서 수신자가 뉴스레터 내용 자체에 집중하게 만듭니다. <스티비> 사용하면 뉴스레터의 오픈율과 클릭률을 높여 마케팅 효과를 극대화할 있습니다. 



<스티비> 이메일마케팅의 

끝판왕을 꿈꿉니다. 

지난 4월부터 직접 뉴스레터를 발행하기 시작했습니다. 모바일 시대에 맞는 이메일이 무엇인지 연구했습니다. 마케팅 효과를 극대화하려면 제목을 어떻게 작성해야 하는지, 발신자 이름을 가지고 A/B 테스트를 어떻게 설계해야 하는지 고민했습니다. 결과를 매주 뉴스레터로 발행했고, 어느새 1,600명에 이르는 구독자가 생겼습니다. 뉴스레터 발송 서비스를 만든다면 무엇보다 스스로의 뉴스레터를 제대로 제작하고 발송할 있어야 된다고 생각했습니다. 그것이 스티비 뉴스레터이며, 연구 결과가 <스티비> 서비스 곳곳에 녹아 있습니다. 


지금의 <스티비> 누구나 쉽게 모바일에 최적화된 뉴스레터를 제작할 있는 서비스입니다. 코딩 지식 없이 클릭 만으로 완성도 높은 뉴스레터를 작성할 있습니다. 텍스트 버튼 크기를 미리 지정해 가독성을 높이고 클릭률을 높일 있으며, 로고 이미지 색상을 추출해 본문에 바로 적용하는 콘텐츠 편집이 용이합니다. URL 입력 만으로 외부 콘텐츠를 본문에 붙여넣을 수도 있습니다.  


가까운 미래에는 사용자별 데이터에 근거한 가이드를 제공해서 이메일마케팅의 성과 개선을 보장하도록 발전시킬 계획입니다. 궁극적으로는 이메일마케팅의 끝판왕이 것입니다. 그간 누구도 시도하지 않았던 엄청난 기능들을 준비하고 있습니다. 



하나의 이메일에는 하나의 메시지

<스티비>에서 마음껏 보내세요. 

지난 9월부터 세이브더칠드런코리아, 서울시 청년허브, 서울시NPO지원센터, 은행권청년창업재단 디캠프(D.CAMP), ()쏘카, ()스포카, ()가든하다, ()한국모금가협회, ()녹색교통운동 다양한 규모의 스타트업, 공공기관, 비영리단체와 함께 클로즈 베타 서비스를 진행하며 기능을 개선하고 완성도를 높였습니다. 


하나의 이메일에는 하나의 메시지라는 스티비의 철학에 따라 이메일을 간결하고 효율적으로 보낼 있도록 정액제로 과금합니다. 횟수에 상관없이 필요한 이메일을 목적에 맞춰 발송할 있습니다. 2016 3 31일까지는 누구에게나 무료로 제공하며, 스타트업, 비영리단체, 사회적기업은 기간 이후에도 무료로 서비스를 이용할 있습니다. 

지금 바로 무료 베타서비스에 가입하세요. 스티비의 꿈에 동참하세요. 





Posted by slowalk