Mysql Database Replication အပိုင်း (၂)
By: Myoo Thu
Tags: MySQL, Replication, Devnote

အရင်တစ်ပတ်က mysql replication ကို binary logs နဲ့ လုပ်တာ ပြောခဲ့တာဖြစ်ပါတယ်။ အခုကျွန်တော်ပြောပြပေးမှာက replication ကို GTID နဲ့ လုပ်တဲ့ပိုင်းကို ပြောပြပေးပါမယ်။ GTID ဆိုတာကတော့ Global transaction identifier လို့ခေါ်ပြီး replication setup လုပ်ထားတဲ့ database အကုန်လုံးမှာ unique ဖြစ်တဲ့ ID တစ်ခုဖြစ်ပါတယ်။

GTID = source_id:transaction_id

source_id က master database server ရဲ့ id ဖြစ်ပြီးတော့ transaction id ဆိုတာကတော့ mysql ရဲ့ transaction id ဖြစ်ပါတယ်။ mysql မှာ query တစ်ကြောင်း Run တိုင်း GTID တစ်ကြောင်းထွက်ပါတယ်။ အဲ့ဒီ အိုင်ဒီကိုပဲ replica database တွေက အမြဲတမ်းဖတ်ပြီး replica database တွေမှာ update လုပ်တာဖြစ်ပါတယ်။

GTID replication နဲ့ Binary Logs Replication နဲ့ configuration ကအတူတူပဲဖြစ်ပါတယ်။ GTID replication အတွက် gtid-mode တစ်ခုပဲ ပိုပါတယ်။ enforce-gtid-consistency ဆိုတာကတော့ data consistency level ကိုသတ်မှတ်ပေးဖို့အတွက်ပဲဖြစ်ပါတယ်။

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

expire_logs_days = 10

binlog_format = row

gtid-mode = ON

enforce-gtid-consistency

max_binlog_size = 100M

binlog_do_db = mydb

log-slave-updates

အပေါ်မှာဖော်ပြပေးတာကတော့ GTID replication အတွက် master database msyql config မှာ ထည့်ပေးဖို့ လိုတာတွေပဲဖြစ်ပါတယ်။

sudo service mysql restart

mysql -u root -p create database mydb

ပထမဆုံးအနေနဲ့ master server မှာ

mysql db ထဲဝင်ပြီးတာနဲ့ db တစ်ခု ဆောက်ပါမယ်။

use mydb;

CREATE TABLE users(

id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,

firstname VARCHAR(30) NOT NULL,

lastname VARCHAR(30) NOT NULL,

email VARCHAR(50),

reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

)

ပြီးရင် user table တစ်ခုဆောက်ပါမယ်

mysql -u root -p mydb > mydb.sql

ပြီးရင် db ကို export လုပ်ပါမယ်။

show master status

အပေါ်က command တွေ run ပြီးရင် အောက်ပုံလို result ထွက်ပါတယ်။

အဲ့ဒီမှာ Executed_Gtid_Set ဆိုတာ ကျွန်တော်ပြောခဲ့တဲ့ GTID ဖြစ်ပါတယ်။

Binlog_Do_DB ကတော့ ကျွန်တော်တို့ replication ပြုလုပ်မဲ့ database ပဲဖြစ်ပါတယ်။

ဒါဆို Replica Server တွေဘက် သွားကြည့်ရအောင်ပါ။ အရင်ဆုံး database ထဲဝင်ပါမယ်။

mysql -u root -p

create database mydb;

mysql -u root -p mydb < mydb.sql

ပြီးရင် ဒေတာဘေစ် ဆောက်ပြီး master server က export လုပ်ထားတဲ့ database mydb ကို import လုပ်ပါမယ်။ ပြီးရင် replica server က mysql config ကို ပြင်ပါမယ်။

server-id = 2

relay-log = /var/log/mysql/mysql-relay-bin.log

log_bin = /var/log/mysql/mysql-bin.log

expire_logs_days = 10

max_binlog_size = 100M

binlog_do_db = mydb

read-only = ON

gtid-mode = ON

enforce-gtid-consistency

log-slave-updates

master database server က configuration လိုပဲ GTID replication အတွက် ထပ်ထည့်ပေးဖို့လိုတာက gtid-mode ON ဖို့နဲ့ enforce-gtid-consistency ပဲလိုအပ်တာပါ။

ကျန်တာကတော့ အရင် logs နဲ့ လုပ်တဲ့ config နဲ့ အတူတူပါပဲ။ Replica database တွေအတွက် master database server မှာ user ဆောက်ဖို့ လိုတဲ့အပိုင်းတွေ၊ replica database server ဘက်က master database ကို ချိတ်ပေးရမဲ့အပိုင်းတွေကို အရင်တစ်ပိုင်းမှာ ဖော်ပြပေးထားပါတယ်။ အဲ့ဒီအပိုင်းတွေကတော့ အကုန်အတူတူပါပဲ။

ပြီးရင် slave status run ကြည့်ပါမယ်။

show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: xxx.xxx.xxx.xxx

Master_User: ruser

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000080

Read_Master_Log_Pos: 194

Relay_Log_File: mysql-relay-bin.000024

Relay_Log_Pos: 407

Relay_Master_Log_File: mysql-bin.000080

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 194

Relay_Log_Space: 654

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

Master_UUID: 45f349b7–24f3–11eb-8227–26f70a05f8d6

Master_Info_File: /var/lib/mysql/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set: 45f349b7–24f3–11eb-8227–26f70a05f8d6:1–4

Executed_Gtid_Set: 45f349b7–24f3–11eb-8227–26f70a05f8d6:1–4,

47cd2d0e-b5f9–11ea-ae50-ca4793a4665f:1

Auto_Position: 1

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

Slave status result ကိုကြည့်မယ်ဆိုရင် replication ရဲ့ configuration value တွေကို တွေ့ရပါမယ်။ Slave_IO_Running နဲ့ Slave_SQL_Running yes ဖြစ်နေတာက ကျွန်တော်တို့ Replica server အလုပ်လုပ်နေတဲ့ သဘောပဲဖြစ်ပါတယ်။ အဲ့ဒီအထဲမှာ Retrived_Gtid_Set နဲ့ Executed_Gtid_Set ဟာ master database ရဲ့ GTID ပဲဖြစ်ပါတယ်။ ဒီ အိုင်ဒီတွေက master database မှာ changes ဖြစ်တိုင်း ပြောင်းလဲနေမှာဖြစ်ပါတယ်။ Configuration တွေ setup လုပ်ပြီးပြီဆိုတော့ ကျွန်တော်တို့ရဲ့ Replication setup အလုပ်လုပ် မလုပ် စမ်းကြည့်ကြပါမယ်။

ပထမဆုံး master server မှာ mysql ထဲဝင်ပါမယ်။

mysql -u root -p

use mydb;

select * from users;

Empty set (0.00 sec)

ကျွန်တော်တို့ ပထမဆုံး ဆောက်ထားတဲ့ table ကို ဆွဲထုတ်ကြည့်ရင် ဒေတာတွေ မရှိသေးပါဘူး။ ထည့်မှ မထည့်ရသေးတာကို ဘယ်ရှိအုံးမလဲ။

mysql> insert into users

(firstname,lastname,email)

value (“mg”,”mg”,”mgmg@gmail.com”); select * from users;

အခုဆို users ထဲမှာ insert လုပ်လိုက်တဲ့တစ်ကြောင်းဝင်သွားပါပြီ။

mysql>show master status;

master status မှာ GTID ပြောင်းသွားတာတွေ့ရပါလိမ့်မယ်။

ဒါဆို replica database ဘက်သွားကြည့်ရအောင်ပါ။

mysql> mysql -u root -p

use mydb

select * from users;

Wow Wow !!!! Bravo

ဒီမှာ auto တစ်ကြောင်းဝင်နေပါပြီ။ Slave status တစ်ချက် ကြည့်ကြည့်ရအောင်ပါ။

mysql> show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: xxx.xxx.xxx.xxx

Master_User: ruser

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000080

Read_Master_Log_Pos: 486

Relay_Log_File: mysql-relay-bin.000024

Relay_Log_Pos: 699

Relay_Master_Log_File: mysql-bin.000080

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 486

Relay_Log_Space: 946

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

Master_UUID: 45f349b7–24f3–11eb-8227–26f70a05f8d6

Master_Info_File: /var/lib/mysql/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set: 45f349b7–24f3–11eb-8227–26f70a05f8d6:1–5

Executed_Gtid_Set: 45f349b7–24f3–11eb-8227–26f70a05f8d6:1–5,

47cd2d0e-b5f9–11ea-ae50-ca4793a4665f:1–3

Auto_Position: 1

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

Replication Server မှာတော့ executed_gtid_set မှာ နောက်ဆုံး transaction လုပ်သွားတဲ့ GTID ဖြစ်သွားတာတွေ့ရပါလိမ့်မယ်။

ဒါဆိုရင် ကျွန်တော်တို master database မှာ update လုပ်ကြည့်ရအောင်ပါ။

mysql> update users set firstname = ‘ko’ where id = 1;

msyql>select * from usres;

ဒါဟာ master database မှာ ပြောင်းသွားတဲပုံဖြစ်ပါတယ်။

mysq> select * from users;

အဲ့ဒါဆို replica database မှာ ကြည့်ကြည့်ပါမယ်။ Replication Database မှာလည်း updated ဖြစ်တာတွေ့ရပါလိမ့်မယ်။ ဒါဆိုရင် ကျွန်တော်တို့ လုပ်ခဲ့တဲ့ database replication က အောင်မြင်တယ်လို့ ပြောလို့ရမှာဖြစ်ပါတယ်။ ကျွန်တော်အခုပြောခဲ့တာက replication ကအခြေခံအဆင့်ပဲဖြစ်ပါတယ်။ တကယ်အသုံးပြုမယ်ဆိုရင်တော့ ဒီထက်ပို့ လေ့လာပြီး အသုံးပြုဖို့ လိုပါလိမ့်မယ်။

Mysql Replication ပထမပိုင်းကို အောက်က လင့်မှာ ကြည့်လို့ရပါတယ်။

Mysql Replication အပိုင်း (၁)

https://myo7hu.medium.com/mysql-database-replication-126dbbecd930