1. DB 서버와 복제 플랫폼을 wsrep API라 할 때 이는 다시
write set관련 기능을 제공하는 Galera Replication Plugin
(추상적인) 상태 변화를 '낚아채' (보다 구체적인) write set에 해석해 놓는 wsrep hook
hook과 기능 공급자를 연결하는 dlopen()으로
구분할 수 있다.
2. wsrep API는 DB 서버의 내용 변화를 상태(state)로서 참조한다고 할 수 있는데, 나중에 확인할 global transaction identifier(GTID) 역시 state를 참조한 기능이다.
3. Galera replication plugin은 다시certification layer/replication layer/group communication framework 층위로 구분할 수 있다.
4. gcomm에서는 virtual synchrony QoS를 사용함에 따라 메세지 전달 혹은 노드들의 state의 공유에 있어 일관성은 제공하지만, temporal synchrony는 보장하지 않는다고 한다.
5.이는 multi-master 환경에서 치명적이라고 하는데 이를 런타임 환경에서 조절하기 위해 (뒤에 설명할) flow control 메커니즘을 도입했다고 한다. 아마 feedback을 무수히 수행해서 노드 간 동기화를 보장하는 것 같다.
6. 통신 관점에서 복제를
메세지의 의미론적 delivery와
멤버들이 제공받는 서비스로
구분할 수 있다는 점이 흥미로웠다.
1. READ-UNCOMMITTED/READ-COMMITTED/REPEATABLE-READ/SERIALIZABLE의 네 단계가 있는데 첫 번째는 (dirty read 현상 등의 이유로) 사실상 격리 수준이라 부르기 어렵고, 마지막은 multi-master 클러스터에서는 권장되나 읽기 수준에서도 공유 잠금을 걸어 성능에 영향이 크다고 한다.
2. 세 번째 REPEATABLE-READ가 다른 트랜잭션의 커밋 여부를 신경쓰지 않고, 적어도 read 수준에서의 정합성을 보장할 수 있어서 합리적으로 보인다. MySQL에서는 이를 기본으로 지원한다고 한다.
1. write-set은 GCache에 저장되는데, 이것의 제 1 목적은 램 상의 write-set footprint를 최소화하는 것이라고 한다.
2. Permanent In-Memory Store/Permanent Ring-Buffer File/On-Demand Page Store 순서로 저장되는 알고리즘에서 ring-buffer style이 주된 저장소인데 footprint 대목과 관련 지어서 생각해보자면, 미리 할당된 메모리를 (head/tail pointer에 의해) 안전하게 사용하는 데 그 목적이 있다고 생각해볼 수 있을 것 같다.
3. Ring-buffer의 특징은 다음과 같다고 한다.
고정된 사이즈에서 시작과 끝을 자유롭게 변경할 수 있다.
Read/write pointer를 이용해서 데이터 입력/출력이 간섭없이 (거의) 동시에 이루어질 수 있다.
4. write-set 캐싱은 memory mapping을 이용하는데 이는 파일을 프로세스의 메모리에 직접 매핑해서 입/출력 함수를 거치지 않고 변수를 사용하는 방법이라고 한다. 그래서 표시 메모리 사용량보다 실제 메모리 사용량이 적을 수 있다고 한다.
1. Dump와 유사하다고 생각한 State Snapshot Transer(SST)은 다시 logical/physical로 구분할 수 있는데, 전자에 해당하는 mysqldump 진행 시 마스터는 read lock이 걸리게 되므로 blocking한 방법이다.
2. logical/physical의 큰 차이는 전자에서는 데이터 이동 전에 수신 서버 초기화가 필요하다는 점인데 DB가 중심이 돼서 수신 서버가 DB 구조 자체를 수용할 수 있도록 마음의 준비를 하는 모양새고, 후자는 데이터 전송 이후에 수신 서버 초기화가 필요하긴 한데 수신/송신 서버 간 설정이 비슷해야 하는 등의 제약이 있다고 한다. 그래도 보다 데이터 중심 관점으로 이해됐다.
3. IST(Incrememtal State Transfer)에서는 donor/joiner의 동일 UUID 여부와 doner의 GCache size가 중요하다. Doner 입장에서 non-blocking한 작업이라고 한다.
(차후 정리 필요)
https://severalnines.com/blog/how-galera-cluster-enables-high-availability-high-traffic-websites/
https://severalnines.com/blog/multiple-data-center-setups-using-galera-cluster-mysql-or-mariadb/
https://severalnines.com/blog/comparing-mariadb-server-mariadb-cluster/
https://severalnines.com/blog/how-set-asynchronous-replication-galera-cluster-standalone-mysql-server-gtid/
https://severalnines.com/blog/avoiding-deadlocks-galera-setting-haproxy-single-node-writes-and-multi-node-reads/
https://severalnines.com/blog/how-avoid-sst-when-adding-new-node-mysql-galera-cluster/
https://severalnines.com/blog/galera-cluster-comparison-codership-vs-percona-vs-mariadb/
https://galeracluster.com/2015/07/geo-distributed-database-clusters-with-galera/
https://mariadb.com/kb/en/using-mariadb-replication-with-mariadb-galera-cluster-using-mariadb-replica/
https://mariadb.com/kb/en/configuring-mariadb-replication-between-two-mariadb-galera-clusters/
https://mariadb.com/kb/en/using-mariadb-replication-with-mariadb-galera-cluster-configuring-mariadb-r/
https://www.youtube.com/watch?v=VSGOnoy_j2k&t=46s
https://www.youtube.com/watch?v=QCVWE_B0qfk&t=215s
https://sightstudio.tistory.com/59
https://en.wikipedia.org/wiki/Circular_buffer
https://galeracluster.com/library/faq.html
https://www.linkedin.com/pulse/two-phase-commit-2pc-umang-agarwal-1f/
https://galeracluster.com/library/galera-documentation.pdf
https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/