๐ป Programming
MariaDB๋ก AWS Aurora ์ฐ๋์ readOnly ํธ๋์ญ์ ์ด writer ์ชฝ์์ ์คํ๋๋ ํ์ ๋ถ์
์ด์ํ๊ฒฝ์ ์ด๋ฐ์ ๋ฐ ๊ฐ๋ฐ์ด ๊ณ์ ์งํ๋๊ณ ๋ฐ์ดํฐ๋ ์์ด๊ณ ํ๋ค๋ณด๋ ์ ์ ๋ฌด๊ฑฐ์์ง๊ณ ์๋ ์์ค์ dba์ชฝ์์ slow query ๊ด๋ จํ์ฌ ๋ฌธ์๊ฐ ๋ค์ด์๊ณ ํ์ธํ๋ค๋ณด๋ ๋ค๋ฅธ ์ด์๊ฐ ํ์ธ๋์๋ค. readOnly ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ด๋์ ์ฟผ๋ฆฌ์ธ๋ฐ reader์ชฝ์์ ์คํ๋์ด์ผ ํ ์ฟผ๋ฆฌ๊ฐ writer์ชฝ์์๋ ์คํ์ด ๋๊ณ ์๋ ํ์์ด ์ง์๋๊ณ ์์๋ค.
ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ SpringBoot 2.x + MariaDB connector 2.7.x + HikariPool + MyBatis ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑ๋ ์ํ.
compile 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1'
compile 'org.springframework.boot:spring-boot-starter-jdbc'
compile 'org.mariadb.jdbc:mariadb-java-client:2.7.7'
compile 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
db ํด๋ฌ์คํฐ๋ writer 1๊ฐ์ reader 1๊ฐ๋ก ๊ตฌ์ฑ๋์ด์๋ค. ํด๋ฌ์คํฐ ์ฃผ์๋ writer, reader ์ฉ์ผ๋ก ๊ฐ 1๊ฐ์ฉ ๋ ๊ฐ๊ฐ ์๋ค.
- my-cluster.cluster-xxx.ap-northeast-2.rds.amazonaws.com
- my-cluster.cluster-ro-xxx.ap-northeast-2.rds.amazonaws.com
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด writer์ฉ๊ณผ reader์ฉ ์ฃผ์๊ฐ ๋ณ๋๋ก ์๋ค.
- my-cluster-01.xxx.ap-northeast-2.rds.amazonaws.com (writer)
- my-cluster-02.xxx.ap-northeast-2.rds.amazonaws.com (reader)
๊ตต๊ฒ ํ์ํ ํด๋ฌ์คํฐ ์ฃผ์์ ์ค์ DB์ฃผ์์ ์ฐจ์ด๋ ํ์ธํ๊ณ ๋์ด๊ฐ์.
๊ทธ๋ฆฌ๊ณ jdbc url์ ์๋์ ๊ฐ์ด writer ํด๋ฌ์คํฐ ์ฃผ์๋ง ๋ฃ์ด์ ์ฌ์ฉํ๊ณ ์์๋ค. ๋ด๊ฐ ์ด๋ ๊ฒ ์ค์ ํ๊ฑด ์๋์๊ณ ์ด๋ ๊ฒ ํด๋ aurora ์ต์ ์ ์ธ ๊ฒฝ์ฐ ์๋์ผ๋ก reader์ชฝ์ผ๋ก readOnly ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค๊ณ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๋์ ๋ญ ๊ทธ๋ฌ๋ ค๋ ํ๊ณ ์์๋๋ฐ ์ด๋ฐ ์ด์ํ ํ์์ด ํ์ธ๋ ๊ฒ์ด๋ค. ( >,.< )
spring:
datasource:
url: jdbc:mariadb:aurora://my-cluster.cluster-xxx.ap-northeast-2.rds.amazonaws.com
์์ธ์ถ์ ์ ํด๋ณด๊ธฐ ์ํด ์ผ๋จ log4jdbc์ audit ์ค์ ์ ์ข ๋ณ๊ฒฝํ๋ค. @Transactional(readOnly=true) ์ค์ ์ด ์ ๋๋ก ์๋จนํ๋๊ฑด๊ฐ?? ์ถ์ด์ ๋ง์ด๋ค.
logging:
level:
jdbc:
audit: debug
ํ์ธํ์ ๋๋ ์๋์ฒ๋ผ readOnly ์ค์ ์ ์ ์์ ์ผ๋ก ๋๊ณ ์์๋ค.
DEBUG jdbc.audit : 1. Connection.setReadOnly(true) returned com.zaxxer.hikari.pool.ProxyConnection.setReadOnly(ProxyConnection.java:423)
DEBUG jdbc.audit : 1. Connection.getAutoCommit() returned true com.zaxxer.hikari.pool.HikariProxyConnection.getAutoCommit(HikariProxyConnection.java:-1)
DEBUG jdbc.audit : 1. Connection.setAutoCommit(false) returned com.zaxxer.hikari.pool.ProxyConnection.setAutoCommit(ProxyConnection.java:414)
DEBUG jdbc.audit : 1. Connection.getAutoCommit() returned false
๊ทธ๋ผ ์ ์ด๋ด๊น? ๋ค์์ผ๋ก๋ jdbc url์ ์๋์ ๊ฐ์ด log ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ๊ณ ๋ก๊ฑฐ๋ฅผ ์ถ๊ฐํ์ฌ mariaDB ์ชฝ ๋ก๊ทธ๋ฅผ ํ์ธํด๋ณด์๋ค.
spring:
datasource:
url: jdbc:mariadb:aurora://my-cluster.cluster-xxx.ap-northeast-2.rds.amazonaws.com?log=true
<logger name="org.mariadb.jdbc" level="info">
<appender-ref ref="stdout"/>
</logger>
DEBUG 88239 --- [nio-8080-exec-1] org.mariadb.jdbc.MariaDbConnection : conn=817636(M) - set read-only to value true
DEBUG 88239 --- [nio-8080-exec-1] o.m.j.i.protocol.AbstractQueryProtocol : System variable change : autocommit = OFF
{{์ฟผ๋ฆฌ ์คํ}}
DEBUG 88239 --- [nio-8080-exec-1] o.m.j.i.protocol.AbstractQueryProtocol : System variable change : autocommit = ON
DEBUG 88239 --- [nio-8080-exec-1] org.mariadb.jdbc.MariaDbConnection : conn=53856(S) - set read-only to value false
๋ก๊ทธ์์ผ๋ก๋ ๋๋์ฒด ์ค์ ๋ก ์ด๋ ํด๋ฌ์คํฐ ์ฃผ์์์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋์ง ์ ์๊ฐ ์์๋ค.
๊ทธ๋์ ์ด์ํ๊ฒฝ์์ ์ฌ์ฉํ๊ณ ์๋ mariaDB ์ปค๋ฅํฐ์ ๋์ผํ ๋ฒ์ ์ ์์ค์ฝ๋์ ๋ก๊ทธ๋ฅผ ์ฌ๊ธฐ์ ๊ธฐ ์ถ๊ฐํ๋ฉด์ ์ถ์ ์ ์์ํ๊ณ ,
๋ค์๊ณผ ๊ฐ์ ํ์์ ํ์ธํ๋ค.
- writer ํด๋ฌ์คํฐ ์ฃผ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๊ท ์ปค๋ฅ์ ์ ์์ฑ๋๋ค.
- readOnly ์ฟผ๋ฆฌ๊ฐ writer์ชฝ์์ ์คํ๋ ๋ค์ failover ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ฉด์ mariaDB FailoverLoop์์ reader์ชฝ ์ปค๋ฅ์ ์ด ์์ฑ๋์ด pool์ ๋ค์ด๊ฐ๋ค.
- ์ดํ์ readOnly ์ฟผ๋ฆฌ๋ค์ ์ ์์ ์ผ๋ก reader์ชฝ์์ ์คํ๋๋ค.
์ด์ ๊ถ๊ธํ ์ ์ด ์๊ฒผ๋ค.
- ์ปค๋ฅ์ ์ ์์ฑ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์ ๊ท ์ปค๋ฅ์ ์ ์์ฑํ๊ฒ๋๋ฉด reader์ชฝ ์ปค๋ฅ์ ์ ์ฌ๋ผ์ง๋์ง?
- ์ ๊ท ์ปค๋ฅ์ ์์ฑ์ reader host๊ฐ ํฌํจ๋๋๋ก ํ ์ ์์์ง..? (์ด๋ ๊ฒ ํ ์ ์์ผ๋ฉด 1๋ฒ๊ณผ ๊ฐ์ ํ์์ ์์ด์งํ ๋)
- ๊ทธ๋ ๊ฒํ๋ฉด readOnly ์ฟผ๋ฆฌ๊ฐ ํญ์ reader๋ก ๋ค์ด๊ฐ๋์ง?
1๋ฒ ์ผ์ด์ค์ ๊ฒฝ์ฐ maxLifeTime ์ค์ ๊ฐ์ 30์ด๋ก ์ค์ ํด์ ํ ์คํธํด๋ณด์๊ณ , reader์ชฝ ์ปค๋ฅ์ ์ ์ฌ๋ผ์ง๊ฒ๋๋ค. readOnly ์ฟผ๋ฆฌ๊ฐ reader์์ ์คํ๋๋ ค๋ฉด ์์ ๋งํ failover ๊ณผ์ ์ด ๋ค์ ํ์ํ๋ค. ์ฆ, maxLifeTime์ด ์ง๋ ์ปค๋ฅ์ ์ ์๋ก ์์ฑํ๊ฒ ๋ ๊ฒฝ์ฐ failover ํ๋ก์ธ์ค๊ฐ ์คํ๋์ด์ผ reader๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. (์๋ 2๋ฒ ์ผ์ด์ค์ ๋ํ ๋ด์ฉ๊น์ง ํ์ธํ๋ฉด ์๊ฒ ์ง๋ง ์ด๋๊น์ง๋ url ์ค์ ์ ๋ฉ์ธ ํด๋ฌ์คํฐ ์ฃผ์๋ง ๋ฃ์์ ๊ฒฝ์ฐ์ด๋ค.)
2๋ฒ ์ผ์ด์ค์ ๊ฒฝ์ฐ jdbc url ์ค์ ์ reader ํด๋ฌ์คํฐ์ ์ฃผ์๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค. ๊ธฐ์กด ์ค์ ๊ณผ ๋ณ๊ฒฝํ ์ค์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
spring:
datasource:
url: jdbc:mariadb:aurora://my-cluster.cluster-xxx.ap-northeast-2.rds.amazonaws.com
spring:
datasource:
url: jdbc:mariadb:aurora://my-cluster.cluster-xxx.ap-northeast-2.rds.amazonaws.com,my-cluster.cluster-ro-xxx.ap-northeast-2.rds.amazonaws.com
์ด๋ ๊ฒ reader cluster์ ์ฃผ์๊ฐ ์ถ๊ฐ๋ jdbc url์ ์ฌ์ฉํ ๊ฒฝ์ฐ ํญ์ reader ํด๋ฌ์คํฐ์ชฝ์ผ๋ก readOnly ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ํน์๋ผ๋ url ๋ค์ชฝ์ ํ๋ผ๋ฏธํฐ๊ฐ์ ์ฌ์ฉํ๋ค๋ฉด ํ๋ผ๋ฏธํฐ๊ฐ๋ค์ ์ ์ผ ๋ง์ง๋ง์ ํ๋ฒ๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. ์๋ฅผ๋ค์ด ํ๋ผ๋ฏธํฐ๊ฐ์ ์๋์ฒ๋ผ ๋ฃ๊ฒ๋๋ฉด mariaDB ์ปค๋ฅํฐ์์ url ํ์ฑํ ๋ ๋ค ์ชฝ url์ด ์ฌ๋ผ์ง๊ฒ ๋๋ ์ฃผ์!!! ์ฆ, ๋ชจ๋ ํด๋ฌ์คํฐ์ ๋์ผํ ํ๋ผ๋ฏธํฐ๊ฐ์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ !!
url: my-cluster.cluster-xxx.ap-northeast-2.rds.amazonaws.com?log=true,my-cluster.cluster-ro-xxx.ap-northeast-2.rds.amazonaws.com?log=true
๊ทธ๋ฅ ์ผํ ๋ฃ๊ธฐ๋ก๋ ๋ฉ์ธํด๋ฌ์คํฐ ์ฃผ์๋ง ๋ฃ์ด์ฃผ์ jdbc url์ aurora ์ต์ ์ ๋ฃ์ด์ค ๊ฒฝ์ฐ readOnly ํธ๋์ญ์ ์ ์๋์ผ๋ก reader ์ชฝ์ผ๋ก ๋ค์ด๊ฐ๋ค๊ณ ๋ค์์์ผ๋ ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์ ํ์ธํ ๋๋ฒ๊น ์ด์๋ค.
๊ฒฐ๊ตญ ๊ฒฐ๋ก ์ ์ด๋ ๋ค. ํด๋ฌ์คํฐ ์ฃผ์๊ฐ writer, reader๊ฐ ๋ณ๋๋ก ์์ ๊ฒฝ์ฐ (์๋ง AWS aurora๋ฅผ ํด๋ฌ์คํฐ๋งํด์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ค ์ด๋ด ๊ฒ์ด๋ค) ๊ฐ๋ฐ์ ์ ์ฅ์์๋ writer, reader ๋ ํด๋ฌ์คํฐ ์ฃผ์๋ฅผ jdbc url์ ๋ฃ์ด์ฃผ์ด์ผ readOnly ํธ๋์ญ์ ์ด ํญ์ ์ ์์ ์ผ๋ก reader ํด๋ฌ์คํฐ์์ ์คํ๋๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก...mariaDB connector 3.x ๋ฒ์ ์์๋ aurora ์ต์ ์ ์ง์ํ์ง ์๋๋จ๋ค...
'๐ป Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SpringBoot 2.3 -> 2.5 ์ ๊ทธ๋ ์ด๋ ํ๊ธฐ (0) | 2023.12.29 |
---|---|
[AWS/SQS] cloudwatch datapoint ์กฐํํ๊ธฐ (2) | 2022.12.29 |
[AWS] redis-cli ๋ฅผ ์ด์ฉํ elasticache ๋ฐ์ดํฐ ์กฐํ (0) | 2022.05.27 |
[AWS] EC2 ์์ Elasticache(Redis ํด๋ฌ์คํฐ) ์ ์ํ๊ธฐ (0) | 2022.05.26 |
[AWS] SQS์ Lambda๋ฅผ ์ด์ฉํ์ฌ DLQ ์ฒ๋ฆฌํ๊ธฐ (0) | 2022.05.19 |