리눅스 RDBMS 벤치환경 개발 히스토리(혼돈의 카오스 주의)
공부 : 벤치마크 환경 만들어보기.
리눅스 컴퓨터 하드에 설치 완료.
백업 / 복구에 필요한 소프트웨어를 세팅 중
mysql(mariadb)가 php와 연동되지 않고 있음
mysqld 설정 필요 (my.cnf 변경)
java.sql.SQLInvalidAuthorizationSpecException: Could not connect: Access denied for user ‘root’@‘121.165.149.142’ (using password: YES) at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:154) at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:118) at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.throwException(ExceptionMapper.java:92) at org.mariadb.jdbc.Driver.connect(Driver.java:111) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:678) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229) at DBManager.main(DBManager.java:16) Caused by: java.sql.SQLException: Could not connect: Access denied for user ‘root’@‘121.165.149.142’ (using password: YES) Current charset is UTF-8. If password has been set using other charset, consider using option ‘passwordCharacterEncoding’ at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.authentication(AbstractConnectProtocol.java:772) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.handleConnectionPhases(AbstractConnectProtocol.java:701) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:406) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1029) at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:483) at org.mariadb.jdbc.Driver.connect(Driver.java:106) … 3 more
Process finished with exit code 0
JDBC 외부 접속이 되지 않고 있다. 원인 파악 중…
원인 : 비밀번호 설정에 문제가 있었다.
로그인 과정에 문제가 있었나 싶어서, 아래 위키를 참고하여 비밀번호를 다르게 바꾸려고 시도하였다. https://zetawiki.com/wiki/MySQL_root_%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C_%EB%B6%84%EC%8B%A4
그러나 로그인 자체가 되지 않아서 db 비밀번호를 초기화시켰다.
service mysql stop # /usr/bin/mysqld_safe —skip-grant-tables & # mysql -uroot mysql MariaDB [mysql]> update user set password=PASSWORD(“새로운비밀번호”) where User=‘root’; MariaDB [mysql]> flush privileges;
service mysql restart
이후 정상적으로 연결이 되었다. 결국 패스워드에 문제가 있었던 것.
(아마 따옴표와 쌍 따옴표에 문제가 있었던 것 같다.) 구글링이 잘 되지 않는 문제는 -> 90% 이상이 오타, 혹은 사소한데서 발생한 오류일 가능성이 높다.
아파치 JDBC 연결을 마리아 db에서 최초 성공
mySQL 기반 DB부터 벤치마크 시작(마리아, mySQL, percona)
ALTER TABLE TB_MEMBER ADD CONSTRAINT TB_MEMBER_TB_CHARACTER_idMember_fk FOREIGN KEY (idMember) REFERENCES TB_CHARACTER (idMember) ON DELETE CASCADE ON UPDATE CASCADE;
Foreign key를 추가해본다. - 추가 완료
문제점 : 캐릭터를 생성할 때, 어떻게 회원 id 값을 캐릭터 테이블에 추가할 것인가
일단 캐릭터 테이블의 회원id 값과, 회원 테이블의 회원 id가 동일 -> 서로 연결됨
캐릭터 테이블에 insert 할 때, 회원 테이블의 회원 id를 어떻게 가져올지가 문제 -> 로그인할 때 세션에 회원 id 저장하기,
테스트할 쿼리 : 업데이트, 셀렉트, 인서트
insert : 아이템 획득
select : 아이템 목록 가져오기
update : 경험치, 골드 획득
벤치마크 프로세스 단수화 하기.
테이블 만들고 -> 테스트 -> 결과 도출.
테스트 조건 : 클라이언트에서 한계(1만 커넥션)
- insert : 아이템 획득
소모품 빨간약을 1~100개, 랜덤한 회원에게 추가시킨다.
INSERT INTO INVENTORY ( idChar, nameChar, nameItem, typeItem, numItem) VALUES ( 777, ’${__RandomString(${__Random(3,8,)},abcdefghijklmnopqrstuvwxyz0123456789,)}’ , ‘빨간약’ , ‘소모품’ , ${__Random(1,100,)} );
- update : 아이템 갯수 업데이트
인벤토리에서 랜덤하게 아이템을 가져와서, 갯수를 업데이트한다.
UPDATE INVENTORY SET numItem = numItem + ${__Random(1,100,)} WHERE idInventory = ${__Random(1,10000,)};
- select : 아이템 목록 가져오기
SELECT * FROM INVENTORY WHERE idChar = ${__Random(1,1000,)};
- 트랜잭션 테스트 : 아이템 거래하기
//아이템 구매 트랜잭션 - 플레이어와 플레이어. 편의상 골드 업데이트는 인벤토리 업데이트로 대체하고,
//아이템 딜리트는 업데이트로 대체한다.
//jmeter 에서는 한 번에 한 쿼리만 보낼 수 있다. 트랜잭션 같은 복합 쿼리는 처리하지 못한다.
//따라서, 일정 갯수의 트랜잭션을 처리하는 시간을 측정하여, 트랜잭션을 벤치마크한다. (100건 / 1000건 / 1만 건에 대한 트랜잭션)
START TRANSACTION;
UPDATE INVENTORY SET numItem = numItem + ${__Random(1,100,)} WHERE idInventory = ${__Random(1,10000,)};
UPDATE INVENTORY SET numItem = numItem + ${__Random(1,100,)} WHERE idInventory = ${__Random(1,10000,)};
UPDATE INVENTORY SET numItem = numItem + ${__Random(1,100,)} WHERE idInventory = ${__Random(1,10000,)};
INSERT INTO INVENTORY ( nameChar, nameItem, typeItem, numItem) VALUES ( ’${__RandomString(${__Random(3,8,)},abcdefghijklmnopqrstuvwxyz0123456789,)}’ , ‘빨간약’ , ‘소모품’ , ${__Random(1,100,)} );
COMMIT;
- 혼합 테스트
insert : update : select : transaction = 75 : 10 : 10 : 5
update : 경험치 획득 및 레벨업, 아이템 획득, 골드 획득, 아이템 거래, 업적 달성
100, 10, 20, 1, 5 -> 136
insert : 아이템 획득, 아이템 거래, 회원가입, 캐릭터 생성, 업적 달성
10, 1, 1, 2, 5 -> 19
select : 캐릭터 정보(아이템, 레벨, 업적), 로그인, 맵 로딩, 몬스터 스폰
10, 1, 5, 5 -> 21
transaction : 아이템 거래, 결제
10
가중치 비율 : 136 : 19 : 21 : 10 -> 6: 2: 2(계산하기 편하게 간소화) -> 3:1:1
기타 delete : 아이템 거래, 아이템 폐기, 캐릭터 삭제, 회원 탈퇴 등
POSTGRESQL
CANNOT TEST TRX because takes too long to test it
테이블 :