320x100

분류 전체보기 435

[NDC 2015] 이 쿼리를 어떻게 짜야 잘 짰다고 소문이 날까?

반복 액세스 피하기 일일 구매로그 데이터 중 아래 통계를 구하자 1. 캐쉬 구매에 성공한 유저 수 2. 인게임 머니로 구매에 성공한 유저 수 3. 쿠폰을 이용하여 구매에 성공한 유저 수 변경 전 SELECT @CASH_COUNT = COUNT(*) FROM 구매로그 WHERE BUY_CODE = @캐쉬구매 AND LOG_DATE >= @어제새벽 AND LOG_DATE = @어제새벽 AND LOG_DATE < @오늘새벽; SELECT @INGAME_COUNT = COUNT(*) FROM 구매로그 WHERE BUY_CODE = @인게임구매 AND LOG..

NDC/DB 2023.01.06

[NDC 2015] <쿠키런> 바쁘고 가난한 개발자를 위한 S3 기반 로그 시스템

쿠키런 로그 __ 매일 200 ~ 400 GB의 JSON 텍스트 형식 __ 비정형 스키마 로그 수집 __ Apache Kafka 사용 __ 분산 메세징 시스템: Publish / Subscribe __ 일별 토픽, 4일치 저장 Kafka의 장점 __ 메시지를 복제해 저장 ____ 노드 장애에 강함 ____ 서버 업데이트 및 재부팅이 상시 가능 __ 단순한 저장소 구조로 오류가 잘 안남 __ 높은 읽기 / 쓰기 대역폭 Kafka 사용시 주의점 __ 메시지 중복은 피할 수 없다 (기록 성공 응답을 못받으면 중복 발생) Logstash -> Kafka __ 컴포넌트를 멈추면 로그가 유실 발생 __ Logstash는 Push 방식, Kafka는 Pull 방식 로그 백업 - Amazon S3 __ 무햔 용량 __..

NDC/Server 2023.01.05

[NDC 2015] 피파온라인3 서버 구조와 85만 동접 포스트 모템

Front-End __ Node.js + Express __ Game Server, Notification Server, Relay Server Back-End __ Redis __ MongoDB Etc __ Munin: 모니터링 __ Jenkins: 빌드 자동화 Game Server Graceful Restart - 서비스에 영향을 주치 않는 서버 재시작 - 스키마 / DB 주소 수정과 커넥션이 연결된 서버는 적용이 불가 - 구현: __ L7 ping 응답을 404 failed로 보냄 __ 1분 동안 대기 (기존 응답이 모두 처리될 때 까지) __ 서버 종료 & 업데이트 & 재시작 __ 재기동이 완료되면 L7 ping 응답을 200 ok로 보내서 살아났음을 알림 서비스 중 문제 해결 사례 MetaDB ..

NDC/Server 2023.01.05

온라인 게임을 지탱하는 기술

▣ 제0장 _ [속성] 온라인 게임 프로그래밍 0.1 [온라인 게임 프로그래밍을 위한] 네트워크 프로그래밍의 기초 ___네트워크 프로그래밍은 필수(!) ___네트워크 프로그래밍, 인터넷 프로그래밍 ___인터넷 프로그래밍의 역사와 사상 ___OSI 참조 모델 _____온라인 게임 시스템과 레이어 _____레이어4는 대부분의 경우 TCP를 사용하고, 레이어3 이하는 직접적인 조정이 필요 없음 _____레이어5 이상은 게임단에서 구현한다 ___소켓 API의 기초 지식 ___온라인 게임과 소켓 API _____커넥션 지향(스트림형), 커넥션리스 지향(데이터그램형) 0.2 [소켓 프로그래밍 입문] 복수의 동시 접속을 처리, 성능을 추구한다 ___통신로의 특정 ___소켓 API의 기본 ___TCP 통신로의 상태 전..

도서/IT 2023.01.05

[NDC 2015] Key-Value Store를 사용한 대용량 게임 통계

어떻게 만드나? API로 15분 단위 경매장 snapshot 가져오기 (JSON, 물품 1개 = 1ROW) [{"auc":1347942360, "item":14344, "owner":"Sanctuary", "bid":2041200}] snapshot마다 아이템 ID 별로 묶어서 정리 - 최소 가격 - 평균 가격 - 중간 가격 - 물품 개수 이렇게 분석한 결과를 처음에는 mongodb에 저장 - JSON 포맷 저장하기에 간편 - 개발 도중 schema 변경 간편 => 하지만 많은 데이터와 최소 유지 비용 증가로 인해 실패 가능하면 NoSQL로 구성 - 수평 확장이 편리 - 키에 여러 Column 추가 가능 Key는 서버, 시간, 아이템 ID로 만들고, Value에 시간대별로 가격 정보를 기록 Key Val..

NDC/ETC 2023.01.03

[NDC 2014] 데이터베이스에서 데드락이란 무엇인가? (사례 포함)

교착 상태란? 서로 다른 둘 이상의 프로세서들이 상대 프로세서가 차지하고 있는 자원을 기다리는 무한 대기 상태 예1) 선착순 이벤트 원인: 변경 쿼리의 조건 구문 차이로 인해 페이지 접근 순서가 문제 단계: Session1 Session2 1단계 BEGIN TRAN UPDATE 이벤트 SET 수량 = 수량 - 1 WHERE 이벤트번호 = 1 2단계 BEGIN TRAN UPDATE 이벤트 SET 사용수량 = 사용수량 + 1 WHERE 계약번호 = 1 3단계 교착상태 개선: 접근 방향을 맞추기 위해 데이터 변경시 조건절을 동일한 기준으로 사용 지급과 사용에 대한 테이블 분리 예2) 조회 구문 변경 원인: 조회 구문에 컬럼을 추가하면서 데이터 페이지 접근이 필요하게 됨 Session1 Session2 1단계 ..

NDC/DB 2022.12.25

mysql에서 ip를 이용한 connect가 실패하는 경우

localhost로 접속할 때는 잘 되지만 외부에서 ip로 접속에 실패하는 경우, 유저를 생성하고 권한을 부여해야 가능하다. 내부용 CREATE USER 'id'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'id'@'localhost'; 외부용 CREATE USER 'id'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'id'@'%'; 메모리에 변경사항 저장하기 FLUSH PRIVILEGES;

DB/MYSQL 2022.12.05

[MariaDB] Commands out of sync; you can't run this command now

현상: C++ 서버에서 특정 쿼리를 실행할 때마다 Commands out of sync; you can't run this command now. 에러가 발생. 한 로직에서 stmt를 여러개 사용하는데, 첫번째 stmt 사용은 문제 없었고 두번째 stmt 사용시마다 에러가 발생. 원인: 기존 첫번째 stmt 사용하던 소스를 복붙하는 과정에서 stmt2를 사용하지 않고 stmt1을 써서 오류 void func() { sql::PreparedStatement* stmt1 = getstmt(Key1); stmt1->setInt(1, 1); stmt1->executeUpdate(); sql::PreparedStatement* stmt2 = getstmt(Key2); stmt1->setInt(1, 1); stmt..

DB/MYSQL 2022.12.02

[MariaDB] commands out of sync. Did you run multiple statements at once?

현상: go와 c++ 서버에서 공통적으로 DB 에러가 발생함 에러는 주로 commands out of sync. + 추가 에러로 발생했는데 go 에서는 Did you run multiple statements at once? 라는 에러가 발생했다. 원인: statement 실행 중 다른 statement를 실행하고 defer로 종료하는 것이 원인으로 추측돼서 내부 defer 내부stmt.Close()를 명시적으로 바꿔줬으나 변화 없었음 해당 에러를 검색한 결과 MariaDB v10에서만 발생하는 문제라는 이야기가 있었으나 구체적인 원인은 보이지 않아서 패스 https://github.com/go-gorm/gorm/issues/3001 최종 확인 결과 서버의 최대 Connection이 기본 값인 151으로..

DB/MYSQL 2022.12.01
320x100