Galera Cluster๋ฅผ ํตํ MariaDB ํด๋ฌ์คํฐ๋ง ๊ตฌ์ฑ (2) Galera Cluster ๋์ ์๋ฆฌ
์ง๋ ๊ธ์์ MariaDB ํด๋ฌ์คํฐ๋ง์ ์ํ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์๋ค.
Galera Cluster๋ฅผ ํตํ MariaDB ์ด์คํ ๊ตฌ์ฑ (1) MariaDB ์ด์คํ ์ข ๋ฅ(Replication, Galera Cluster)
DB ํน์ ์คํ๋ง ๋ถํธ ์๋ฒ์ ๊ฐ์ ์์คํ ์ ๊ตฌ์ฑํ ๋, ๋จ ํ๋์ ์๋ฒ๋ณด๋ค๋ ์ด์คํ ํน์ ๊ทธ ์ด์์ผ๋ก ํ์ฌ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด์คํ์ ๋ชฉ์ ์ ๊ณ ๊ฐ์ฉ์ฑ์ธ๋ฐ, ์ฌํด ๋ฐ์์ด๋ ์
danyoujeong.tistory.com
Replication์ ํตํด Master-Slave ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ Galera Cluster๋ฅผ ํตํด ๋ฉํฐ ๋ง์คํฐ ๋ฐฉ์์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ ๋ํด ๊ฐ๋ ์ ๋๋ฅผ ์์๋ณด์๋๋ฐ, ์ด๋ฒ ๊ธ์์๋ ๊ทธ๋์ ์ค์ ๋ก Galera Cluster ์ด๋ค ๋์ ๋ฐฉ์์ผ๋ก ๋ณต์ ๋ฅผ ์งํํ๋์ง ์์ฑํด๋ณด๊ณ ์ ํ๋ค.
Galera Cluster ๋์ ์๋ฆฌ ์ดํดํ๊ธฐ
โป ํด๋น ๊ทธ๋ฆผ์ Galera Cluster ๋์ ์์๋ฅผ ๊ฐ๋ตํ๊ฒ ๋ํ๋ธ ๊ทธ๋ฆผ์ผ๋ก ์ค์ ์ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์๋ชป๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
โ Galera Cluster์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ(์ฐ๊ธฐ ํธ๋์ญ์ ) ๊ณผ์
1. ํด๋ผ์ด์ธํธ๊ฐ Primary ๋ ธ๋์ ํธ๋์ญ์ ์ ์์ฒญํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ Primary ๋ ธ๋(#1)์ ์ฐ๊ธฐ ํธ๋์ญ์ (ex. INSERT, UPDATE, DELETE)์ ์์ฒญํ๋ค.
Primary ๋ ธ๋๋ ์ด ํธ๋์ญ์ ์ ๋ก์ปฌ(MariaDB ์์ง)์์ ์คํํ๊ณ , ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ Write-Set์ผ๋ก ๋ณํํ์ฌ GCache์ ์ ์ฅํ๋ค. ์ด ๋ Commit์ ํ์ง ์๋๋ค.
2. Write Set์ gcomm์ ํตํด ๋ชจ๋ ๋ ธ๋๋ก ์ ํํ๋ค. (Broadcast)
Galera์ gcomm ๋ ์ด์ด๊ฐ Write Set์ ๋ชจ๋ ๋ ธ๋์ ๋ธ๋ก๋์บ์คํธ ํ๋ค.
์ด ๊ณผ์ ์์ ๋ชจ๋ ๋ ธ๋๋ ๋์ผํ Global Order๋ฅผ ์ ์ฉ ๋ฐ์ ๊ฐ์ ์์๋ก Write Set์ ์์ ํ๋ค.
Write Set์ ์์ ํ ๋ ธ๋๋ Certification Queue์ ๋ฃ๊ณ ํธ๋์ญ์ ์ถฉ๋ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค.
Write-Set์ ์๋์ ๊ฐ์ JSON ํํ๋ก ๋์ด์๋ค. Primary ๋ ธ๋๋ก๋ถํฐ ๋ธ๋ก๋์บ์คํธ๋ฅผ ๋ฐ์์ ๋๋ ์์ง ์ธ์ฆ ๊ณผ์ ์ด ์ด๋ฃจ์ด์ง์ง ์์ certification_Info๋ ๋น์ด์๋ ์ํ์ด๋ค.
{
"GTID": "abc123-456-def789:10", //ํธ๋์ญ์
์๋ณ์ ์ํ ๊ณ ์ ID
"Seq_Num": 15, //ํธ๋์ญ์
์คํ ์์(Global Order)
"Table": "users", //ํ
์ด๋ธ๋ช
"Primary_Key": {"id": 1},
"Row_Data": { //๋ณ๊ฒฝ๋ ํ์ ๋ฐ์ดํฐ
"old": {"balance": 500},
"new": {"balance": 400}
},
"Transaction_Type": "UPDATE",
"Binlog_Events": [ //Binlog ๊ธฐ๋ฐ ๋ณ๊ฒฝ์ฌํญ
{
"Type": "UPDATE",
"Table": "users",
"Set": {"balance": 400},
"Where": {"id": 1}
}
],
"Certification_Info": { //์ถฉ๋๊ฒ์ฌ๊ฒฐ๊ณผ
}
}
3. ๊ฐ ๋ ธ๋(#1, #2, #3)์์ Certification์ ์ํํ๋ค.
๊ฐ ๋ ธ๋๋ ์์ ์ด ๋ฐ์ Write Set์ Certification์ ์งํํ๋ค.
Cetification ๊ณผ์ ์์๋ ์๋์ ๋ด์ฉ์ ํ์ธํ๋ค.
- ์ถฉ๋ ๊ฒ์ฌ (๋ค๋ฅธ ํธ๋์ญ์ ๊ณผ ์ถฉ๋ํ๋์ง ํ์ธ)
- Write Set์ด ํ์ฌ ํธ๋์ญ์ ์์์ ์ผ๊ด์ฑ์ด ์๋์ง ๊ฒ์ฆ
๊ฒฐ๊ณผ๋ ์ธ์ฆ์ ํต๊ณผํ๋ฉด OK, ์ถฉ๋ ๋ฐ์์ WF_ABORT๋ก ์ ์ํ๋ค.
Galera๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฉ์์ง์ ํตํด ์ด Certification ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ๋ ธ๋์ ๊ณต์ ํ๋ฉฐ, ํ ๋ ธ๋๋ผ๋ WF_ABORT์ด๋ฉด ํธ๋์ญ์ ์ ํ๊ธฐํ๋ค.
์ถฉ๋ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ Write Set ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ๋ค.
{
"GTID": "abc123-456-def789:10",
"Seq_Num": 15,
"Table": "users",
"Primary_Key": {"id": 1},
"Row_Data": {
"old": {"balance": 500},
"new": {"balance": 400}
},
"Transaction_Type": "UPDATE",
"Binlog_Events": [
{
"Type": "UPDATE",
"Table": "users",
"Set": {"balance": 400},
"Where": {"id": 1}
}
],
"Certification_Info": {
"Status": "OK",
"Conflict_Check": false
}
}
4. ๊ฐ ๋ ธ๋(#2, #3)๋ Certification์ ํต๊ณผํ Write Set์ Apply Queue์ ์ถ๊ฐํ๋ค.
5. Apply Queue์ ์ ์ฅ๋ Write Set์ ํธ๋์ญ์ ์ ์ ์ฉํ๋ค.
๋ชจ๋ ๋ ธ๋๋ ์์ ์ Apply Queue์ ๋ค์ด์จ Write Set์ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋ค.
8. Commit ์๋ฃ ํ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ๋ฐํํ๋ค.
โญ ๊ฐ ๋ ธ๋์์ Certification ์ค ์ถฉ๋์ ๊ฐ์งํ๋ฉด?
Certification ์ค ์ถฉ๋์ ๊ฐ์งํ๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ ๊น?
์ถฉ๋์ด ๋ฐ์ํ ๋ ธ๋๋ WF_ABORT๋ Write-Set Certification_Info์ ์ถ๊ฐํ๋ค.
{
"GTID": "abc123-456-def789:10",
"Seq_Num": 15,
"Table": "users",
"Primary_Key": {"id": 1},
"Row_Data": {
"old": {"balance": 500},
"new": {"balance": 400}
},
"Transaction_Type": "UPDATE",
"Binlog_Events": [
{
"Type": "UPDATE",
"Table": "users",
"Set": {"balance": 400},
"Where": {"id": 1}
}
],
"Certification_Info": {
"Status": "WF_ABORT",
"Conflict_Check": true
}
}
Galera๋ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ชจ๋ ๋ ธ๋๊ฐ ์ด๋ฅผ ๋ฐ์ํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. Galera์ gcomm ๋ ์ด์ด๋ฅผ ํตํด ํธ๋์ญ์ ์คํจ ์ ๋ณด๊ฐ ๊ณต์ ๋๊ณ ๋ชจ๋ ๋ ธ๋๋ ํด๋น Write Set์ Apply Queue์ ๋ฃ์ง ์๊ณ ํ๊ธฐํ๋ค.
์ด ๋ Primary ๋ ธ๋๋ ํด๋ผ์ด์ธํธ์๊ฒ ํธ๋์ญ์ ์คํจ ์๋ต์ ํ๊ณ ํด๋ผ์ด์ธํธ๋ ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์๋ํ๊ฑฐ๋ ๋กค๋ฐฑ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค.
์ง๊ธ๊น์ง Galera Cluster๊ฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ์ด๋ป๊ฒ Replication์ ์งํํ๋์ง ์์๋ณด์๋ค. ๋ค์ ์๊ฐ๋ถํฐ๋ ์ค์ Galera Cluster๋ฅผ ์ด๋ป๊ฒ ์ ์ฉํ๋์ง ์์๋ณด๊ณ ์ ํ๋ค.