====== Aurora - AWS Database ======
* [[https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/CHAP_Aurora.html|Amazon RDS 기반 Amazon Aurora - Amazon Relational Database Service]]
===== JDBC =====
* [[https://github.com/awslabs/aws-mysql-jdbc|aws-mysql-jdbc]] : AWS 에서 직접 만들고 있는 JDBC 드라이버.
* [[https://awslabs.github.io/aws-mysql-jdbc/|Amazon Web Services (AWS) JDBC Driver for MySQL]]
* [[https://github.com/awslabs/aws-postgresql-jdbc|awslabs/aws-postgresql-jdbc]]
* [[https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/Aurora.Connecting.html#Aurora.Connecting.AuroraMySQL|Amazon Aurora DB 클러스터에 연결 - Amazon Aurora]]
* [[https://hoing.io/archives/1285|AWS JDBC Driver for Amazon Aurora MySQL | Hoing]]
* [[database:aurora:aurora_mariadb|Aurora MariaDB]]
==== aws-advanced-jdbc-wrapper - Read/Write Cluster ====
* https://github.com/awslabs/aws-advanced-jdbc-wrapper : 다른 JDBC 드라이버를 감싸서 Aurora Cluster read/write split 지원.
* [[https://github.com/awslabs/aws-advanced-jdbc-wrapper/blob/main/docs/Documentation.md|aws-advanced-jdbc-wrapper 문서]]
* [[https://github.com/awslabs/aws-advanced-jdbc-wrapper/blob/main/docs/using-the-jdbc-driver/using-plugins/UsingTheReadWriteSplittingPlugin.md#limitations-when-using-spring-bootframework|Limitations when using Spring Boot/Framework]]
* ''@Transactional(readOnly = true)'' 를 사용하고자 한다면 별도의 커넥션풀을 사용하면 안 되고 wrapper 의 내장 connection pool 만 사용해야한다. 관련해서 문서 잘 읽어봐야함.
The use of read/write splitting with the annotation @Transactional(readOnly = True) is only recommended for configurations using an internal connection pool. Using the annotation with any other configurations will cause a significant performance degradation.
===== 서버 설정 =====
* [[http://hyeonstorage.tistory.com/276|개발이 하고 싶어요 :: 아마존 웹 서비스(AWS) RDS MySQL UTF-8 인코딩 설정]]
* 파라미터 그룹을 통해서 설정한다.
==== log ====
* ''log_output=FILE'', ''slow_query=1''(true), ''long_query_time=1''(1초) 등의 설정을 해서 슬로우 쿼리를 로그로 남긴다.
* RDS Instance Modify 에서 **Log Exports > Slow Query Log**를 로그로 Cloud Watch로 전송한다.
* Clow Watch 에서 RDS 이름으로 검색하면 볼 수 있고 알림도 걸 수 있다.
==== TimeZone ====
* (접속을 클러스터로 하면) Cluster Parameter Group 에서, (접속을 인스턴스 단위로 하면) DB Parameter Group 에서 ''time_zone'' 값을 ''Asia/Seoul''로 변경.
* 적용 후에 접속해서 아래 값들 올바른 지 확인
SELECT @@time_zone; -- Asia/Seoul
SELECT NOW(); -- 현재 한국 시간
===== End Point =====
* [[https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.Overview.html#Aurora.Overview.Endpoints|Overview of Amazon Aurora - Amazon Relational Database Service - EndPoints]]
* Aurora 는 cluster endpoint, readonly endpoint, instance endpoint 를 지원한다. readonly endpoint는 replicas 들 사이에서 load balancing도 해준다.
* Cluster Endpoint는 자체적으로 Read/Write 모두에 대한 정보를 포함하고 있다. [[database:aurora:aurora_mariadb|Aurora MariaDB]] JDBC 드라이버 사용시 Read/Write 분기가 가능하다. Cluster Endpoint로 접속한 경우 Master가 죽으면 자동으로 Slave를 Master로 승격하여 연결해준다.
===== Blocked Transaction =====
* [[https://aws.amazon.com/ko/premiumsupport/knowledge-center/blocked-mysql-query/|Amazon RDS DB 인스턴스에서 차단된 MySQL 쿼리 문제 해결]]
* 커밋되지 않은 트랜잭션으로 인해 다른 트랜잭션들이 block 된 상태.
===== Performance =====
==== max_connections ====
* [[https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.Performance.html|Amazon Aurora MySQL에 대한 성능 및 조정 관리 - Amazon Aurora]] 인스턴스별로 최대 커넥션수가 정해져 있음.
* 강제 적용하려면 cluster parameter 에서 값을 명시적으로 조정할 수 있음.
==== Replica(reader instance) history list length 줄이기 ====
* **READ Only** / Reader Instance 로 접속한 경우 아래와 같이 커넥션 접속시 설정해주면 history length 가 줄어든다.
* Aurora 는 writer/reader 인스턴스가 storage 를 공유하는데, 이 때 reader 쪽의 쿼리로 인해 history list length 가 증가하면 writer 쪽에도 성능 저하 영향을 주게 된다.
* Aurora Replica 가 기본적으로 ''tx_isolation=REPEATABLE_READ'' 인 상태인데, MySQL의 mvcc 모델 특성상 REPEATABLE READ 상태에서 일관된 정보를 제공하려고 트랜잭션이 완료될 때 까지 변경 전 데이터를 저장하고, commit이 될 때까지 데이터를 유지한다. 따라서 long query 가 실행되면 변경전 데이터를 저장하는 기간이 계속 길어져 성능저하를 유발한다.
* [[https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.html#AuroraMySQL.Reference.IsolationLevels|Amazon Aurora MySQL 참조 - Amazon Aurora]]
set session aurora_read_replica_read_committed = ON;
set session transaction isolation level read committed;
* ''aurora_read_replica_read_committed'' 는 connection 초기화 시에 해준다. 테스트 결과 이 설정값은 writer 에 할경우에는 아무런 효과가 발생하지 않으므로 reader/writer 구분없이 해줘도 된다.
* ''set session transaction isolation level read committed''는 Transaction 설정에서 해주면 될 것으로 보인다. 즉, ''readOnly=true'' 인 트랜잭션에 대해서 ''isolationLevel=READ_COMMITTED'' 를 하면 될 것으로 보인다.
===== Aurora for MySQL 8 =====
* [[https://aws.amazon.com/ko/about-aws/whats-new/2021/11/amazon-aurora-mysql-8-0/|Amazon Aurora supports MySQL 8.0]]
* [[https://aws.amazon.com/ko/blogs/database/amazon-aurora-mysql-3-with-mysql-8-0-compatibility-is-now-generally-available/|Amazon Aurora MySQL 3 with MySQL 8.0 compatibility is now generally available | AWS Database Blog]]
* [[https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.MySQL80.html#AuroraMySQL.mysql80-bugs-fixed|Aurora MySQL version 3 compatible with MySQL 8.0 - Amazon Aurora]]
===== 비용 절감 =====
* [[https://aws.amazon.com/ko/blogs/tech/costsaving-sktelecom-awsgraviton-auroraiooptimized/|SK텔레콤의 AWS Graviton과 Aurora I/O-Optimized를 이용한 Amazon Aurora 비용 절감 사례 | AWS 기술 블로그]]
===== 참고 =====
* [[https://blog.stibee.com/mysql%EC%97%90%EC%84%9C-rds-aurora-%EB%A1%9C-%EC%9D%B4%EA%B4%80%ED%95%98%EA%B8%B0-227db1da8fd8|MySQL에서 RDS(Aurora) 로 이관하기]]
* [[https://aws.amazon.com/ko/blogs/korea/best-practices-for-migrating-rds-for-mysql-databases-to-amazon-aurora/|MySQL용 RDS에서 무중단 Amazon Aurora 마이그레이션 따라하기 | Amazon Web Services 한국 블로그]]
* [[https://aws.amazon.com/ko/blogs/korea/planning-and-optimizing-amazon-aurora-with-mysql-compatibility-for-consolidated-workloads/|Amazon Aurora – MySQL에서 DB 부하에 대한 최적화 방법 | Amazon Web Services 한국 블로그]]
* [[https://www.youtube.com/watch?v=duf5uUsW3TM|AWS re:Invent 2016: Deep Dive on Amazon Aurora (DAT303) - YouTube]]
* [[https://woowabros.github.io/experience/2019/12/04/auroraRDS.html|Aurora MySQL를 운영하면서 알면 좋을 것 같은 미세한 팁 - 우아한형제들 기술 블로그]]
* [[https://aws.amazon.com/ko/premiumsupport/knowledge-center/aurora-mysql-db-cluser-read-only-error/|Aurora DB 클러스터 장애 조치 후 읽기 전용 오류 문제 해결]]