MariaDB(Mysql) MHA

MariaDB(Mysql) MHA๋ž€?

MHA๋ž€?

Master DB๊ฐ€ ์žฅ์• ๋กœ ์„œ๋น„์Šค๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด, ์ž๋™์œผ๋กœ Failover๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ Slave DB๋ฅผ Master DB๋กœ ์Šน๊ฒฉ์‹œ์ผœ ์„œ๋น„์Šค ๋‹ค์šดํƒ€์ž„์„ ์ตœ์†Œํ™”ํ•˜๋Š” auto failover ์†”๋ฃจ์…˜์ด๋‹ค.


MHA ์„œ๋ฒ„ ๊ธฐ๋ณธ๊ตฌ์„ฑ

MHA Manager, Master, Slave ์„œ๋ฒ„ ์ด 3๊ฐœ๊ฐ€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์ด๋‹ค.

MHA ๊ตฌ์„ฑ

๊ตฌ๋ถ„ ์„ค๋ช…
Manager ๋ชจ๋“  DB์˜ Alive๋ฅผ ์ฒดํฌํ•˜๊ณ  Failover, Master Switch ๋“ฑ์„ ์ฒ˜๋ฆฌ
Master ๋ฐ์ดํ„ฐ์˜ write, read๊ฐ€ ๋ชจ๋‘ ๋ฐœ์ƒ๋˜๋Š” ๋ฉ”์ธ DB
Slave Master์˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ์œ„ํ•ด read_only ๋œ DB


MHA ์˜ ์žฅ์ 

  • ์ตœ์†Œํ•œ์˜ Down Time์œผ๋กœ Master์˜ ์žฅ์•  ์ฒ˜๋ฆฌ ๋ฐ Slave์˜ ์ƒˆ๋กœ์šด Master๋กœ ๋ณ€๊ฒฝ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

  • Master์˜ ์žฅ์• ๋กœ ๊ฐ ๋…ธ๋“œ(Master ๋ฐ Slave)์˜ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
  • ํ˜„์žฌ MySQL ์„œ๋ฒ„์˜ ์„ค์ •์„ ๋ณ€๊ฒฝ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ (MySQL 5.0์ด์ƒ)
  • ์„œ๋ฒ„๋ฅผ ๋งŽ์ด ๋Š˜๋ฆด ํ•„์š”๊ฐ€ ์—†์Œ (MySQL Cluster ๋Œ€๋น„)
  • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์ œ์•ฝ์„ ๋ฐ›์ง€ ์•Š์Œ
  • MySQL ์„ฑ๋Šฅ์— ์ „ํ˜€ ์ œ์•ฝ ์‚ฌํ•ญ์ด ์—†์Œ


MHA์˜ ์žฅ์•  ์ฒดํฌ

MHA Manager๊ฐ€ 3์ดˆ๋งˆ๋‹ค ๋งˆ์Šคํ„ฐ DB๋ฅผ CONNECT / SELECET / INSERT ์ฒดํฌํ•˜๋ฉฐ 3ํšŒ ์‹คํŒจ์‹œ ์žฅ์• ๋กœ ์ธ์‹ํ•˜๊ณ  Failover๋ฅผ ์ˆ˜ํ–‰


MHA์˜ Replication

  • Mysql์—์„œ๋Š” Lossless Replication์„ ์ง€์› ํ•˜๋Š”๋ฐ ์ด๋Š” Master์—์„œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๋˜๋ฉด Slave ์–ด๋”˜๊ฐ€์— ๋ฐ˜๋“œ์‹œ ๋ณ€๊ฒฝ์ด๋ ฅ(relay log)์ด ๋‚จ์•„์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅ
  • MHA์—์„œ๋Š” ์žฅ์•  ๋ฐœ์ƒ์‹œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ณ€๊ฒฝ๋œ Slave๋ฅผ Master DB๋กœ ์Šน๊ฒฉ ์‹œํ‚จ ํ›„ Lossless Replication ๋ฅผ ํ†ตํ•œ relay log๋กœ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰
  • ์žฅ์•  ๋ฐœ์ƒ๋ถ€ํ„ฐ Master DB ์Šน๊ฒฉ, ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ํ†ต์ƒ 10~30์ดˆ


MHA์˜ FailOver

Master DB์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด MHA Manager๋Š” Master์žฅ๋น„์˜ VIP๋ฅผ down์‹œํ‚จ๋‹ค. ์ดํ›„ Replication์„ ์ง„ํ–‰ ํ›„ down ์‹œํ‚จ VIP๋ฅผ Slave์žฅ๋น„์—์„œ ์˜ฌ๋ ค Failover๋ฅผ ์ง„ํ–‰



MHA + Replication ๊ตฌ์„ฑํ•˜๊ธฐ

์šฐ์„  Master, Slave ์„œ๋ฒ„์˜ Replication ๋ถ€ํ„ฐ ๊ตฌ์„ฑํ•œ๋‹ค.

Replication

/etc/hosts

OS ํ™˜๊ฒฝ์€ Ubuntu 18.04 ๋ฒ„์ „์ด๋‹ค.

/etc/hosts ๊ตฌ์„ฑ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

192.168.100.125 mha-manager     # Manager IP
192.168.100.126 server1         # Master IP
192.168.100.127 server2         # Slave IP
192.168.100.128 mha-master-vip  # VIP

hosts ํŒŒ์ผ์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ VIP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•  ๊ฒƒ์ด๋‹ค. VIP์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

VIP(Virtual IP)๋ž€?


๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ์„ค์น˜ (๋งค๋‹ˆ์ €, ์„œ๋ฒ„1, ์„œ๋ฒ„2)

ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด ์ค€๋‹ค.

apt-get install libdbd-mysql-perl
apt-get install libconfig-tiny-perl
apt-get install libparams-validate-perl
apt-get install libparallel-forkmanager-perl
apt-get install liblog-dispatch-perl
apt-get install libtime-hires-perl
apt-get install make
apt-get install libnet-telnet-perl
apt-get install libmodule-install-perl


MariaDB Master / Slave ๊ตฌ์„ฑ

DB ์„ค์น˜ (์„œ๋ฒ„1, ์„œ๋ฒ„2)

MariaDB๋ฅผ ์„ค์น˜ํ•œ๋‹ค

$ apt-get install mariadb-server
$ apt-get install mariadb-client
$ service mysql start

root ํŒจ์Šค์›Œ๋“œ ์„ค์ • ํ›„ ์ ‘์† ํ…Œ์ŠคํŠธ

$ mysql_secure_installation

Enter current password for root (enter for none): enter
Set root password? [Y/n] y
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] n
Reload privilege tables now? [Y/n] y

$ mysql -u root -p
>

์™ธ๋ถ€ ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์„ค์ •๋„ ์ฃผ์„์ฒ˜๋ฆฌ ํ•ด ์ค€๋‹ค. (DB ์„œ๋ฒ„ ์„ค์ • ํŒŒ์ผ์„ ํ•ด๋‹น ๊ฒฝ๋กœ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.)

$ vim /etc/mysql/mariadb.conf.d/50-server.cnf

<before>
bind-address           = 127.0.0.1

<after>
#bind-address           = 127.0.0.1


์œ ์ € ์ƒ์„ฑ (์„œ๋ฒ„1, ์„œ๋ฒ„2)

Replication ์œ ์ € ์ƒ์„ฑ

> create user 'rep'@'%' identified by 'Rep123!';
> grant replication slave on *.* to 'rep';
> flush privileges;

MHA ์œ ์ €๋„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ์ฃผ์ž. ์—ฌ๊ธฐ์„œ, mha ๊ณ„์ •์— ํŠน์ˆ˜๋ฌธ์ž๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

> grant all privileges on *.* to 'mha'@'%' identified by 'Mha123';
> flush privileges;


Replication ํ™˜๊ฒฝ ์„ค์ •

์„ค์ •์„ ์œ„ํ•ด DB ์„œ๋น„์Šค๋ฅผ ์ค‘์ง€ํ•œ๋‹ค. (์„œ๋ฒ„1, ์„œ๋ฒ„2)

$ service mysql stop

DB ์„œ๋ฒ„ ์„ค์ • ํŒŒ์ผ์—์„œ [mariadb] ๋ถ€๋ถ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•œ๋‹ค. (DB ์„œ๋ฒ„ ์„ค์ • ํŒŒ์ผ์„ ํ•ด๋‹น ๊ฒฝ๋กœ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.) (๊ฐ ์„œ๋ฒ„์— ๋งž๋Š” ์„ค์ • ์ž…๋ ฅ)

$ vim /etc/mysql/mariadb.conf.d/50-server.cnf

# ์„œ๋ฒ„1 (Master) ์—์„œ
[mariadb]
server_id=1
log-bin=mysql-bin

# ์„œ๋ฒ„2 (Slave) ์—์„œ
[mariadb]
server_id=2
log-bin=mysql-bin
read_only=1
relay_log_purge=0

๋‹ค์‹œ DB ์„œ๋น„์Šค ์‹คํ–‰ (์„œ๋ฒ„1, ์„œ๋ฒ„2)

$ service mysql start

Master ์„œ๋ฒ„์—์„œ ๋กœ๊ทธํŒŒ์ผ๊ณผ ์œ„์น˜ ํ™•์ธ (์„œ๋ฒ„1)

> show master status\G
*************************** 1. row ***************************
            File: mysql-bin.000001
        Position: 313
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)

Slave ์„œ๋ฒ„์—์„œ Replication ์„ธํŒ… (์„œ๋ฒ„2)

> CHANGE MASTER TO
-> MASTER_HOST='server1',				-- ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์„œ๋ฒ„ host๋ช…
-> MASTER_USER='rep',					-- ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์„œ๋ฒ„ replication ๊ณ„์ • user
-> MASTER_PASSWORD='Rep123!',			-- ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์„œ๋ฒ„ replication ๊ณ„์ • password
-> MASTER_LOG_FILE='mysql-bin.000001',	-- ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์„œ๋ฒ„์˜ logfile(show master status\G ์ฐธ์กฐ)
-> MASTER_LOG_POS=313;					-- ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์„œ๋ฒ„์˜ log ํฌ์ง€์…˜(show master status\G ์ฐธ์กฐ)

> start slave;

> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: server1
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 313
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 537
        Relay_Master_Log_File: mysql-bin.000001
             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: 313
              Relay_Log_Space: 836
              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_SSL_Crl:
           Master_SSL_Crlpath:
                   Using_Gtid: No
                  Gtid_IO_Pos:
      Replicate_Do_Domain_Ids:
  Replicate_Ignore_Domain_Ids:
                Parallel_Mode: conservative
1 row in set (0.00 sec)

show slave status\G์˜ ๊ฒฐ๊ณผ์—์„œ Slave_IO_State, Slave_IO_Running, Slave_SQL_Running์ด ์œ„์™€ ๊ฐ™์€ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค.

์‹ค์ œ Replication์ด ๋™์ž‘ํ•˜๋Š”์ง€ Master ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  Slave ์—๋„ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณธ๋‹ค.



MHA

Replication ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด, MHA๋ฅผ ์„ค์น˜ํ•˜์—ฌ Master, Slave๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง, Failover ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ด ๋ณด์ž.

MHA ํ™˜๊ฒฝ ๊ตฌ์„ฑ

๋””๋ ‰ํ† ๋ฆฌ ๋ฐ ์œ ์ € ์ƒ์„ฑ (๋งค๋‹ˆ์ €, ์„œ๋ฒ„1, ์„œ๋ฒ„2)

MHA ๋งค๋‹ˆ์ €๊ฐ€ ์‚ฌ์šฉํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์œ„์น˜๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ.

$ mkdir /data/mariadb_mha

MHA ์œ ์ €๋„ ์ƒ์„ฑํ•ด ์ค€๋‹ค.

$ useradd -g mysql -d /home/mha -m -s /bin/bash mha
$ passwd mha
$ chown -R mha:mysql /data/mariadb_mha


MHA node ์„ค์น˜ (๋งค๋‹ˆ์ €, ์„œ๋ฒ„1, ์„œ๋ฒ„2)

$ mkdir /data/mariadb_mha/source
$ cd /data/mariadb_mha/source

$ wget http://cliel.com/data/mha4mysql-node-0.57.tar.gz
$ tar -xvzf mha4mysql-node-0.57.tar.gz

$ cd mha4mysql-node-0.57
$ perl Makefile.PL
$ make
$ make install


MHA Manager ์„ค์น˜ (๋งค๋‹ˆ์ €)

$ cd /data/mariadb_mha/source
$ wget http://cliel.com/data/mha4mysql-manager-0.57.tar.gz
$ tar -xvzf mha4mysql-manager-0.57.tar.gz

$ cd mha4mysql-manager-0.57
$ perl Makefile.PL
$ make
$ make install


visudo ์„ค์ • (๋งค๋‹ˆ์ €, ์„œ๋ฒ„1, ์„œ๋ฒ„2)

mha ๊ณ„์ •์ด sudo ๊ถŒํ•œ์— ๋Œ€ํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์„ค์ •์„ ํ•ด์ค€๋‹ค.

$ visudo

# ๋งจ ์•„๋ž˜ ์ถ”๊ฐ€
mha ALL = (ALL) NOPASSWD: ALL


ssh-keygen (๋งค๋‹ˆ์ €, ์„œ๋ฒ„1, ์„œ๋ฒ„2)

๊ฐ ์„œ๋ฒ„์— ssh ํ†ต์‹  ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์—†์ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๊ฐœํ‚ค ์„ค์ •์„ ํ•œ๋‹ค.

# ํ‚ค ์ƒ์„ฑ
$ su - mha
$ ssh-keygen -t rsa
enter
enter
enter

# ํ‚ค ๋ณต์‚ฌ
$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.100.125
$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.100.126
$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.100.127

# ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
$ ssh 192.168.100.125
$ ssh 192.168.100.126
$ ssh 192.168.100.127

# .ssh ๊ถŒํ•œ ์ˆ˜์ •
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_rsa
$ chmod 644 ~/.ssh/id_rsa.pub
$ chmod 644 ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/known_hosts


MHA์—์„œ ์‚ฌ์šฉํ•  config ํŒŒ์ผ ์ƒ์„ฑ (๋งค๋‹ˆ์ €)

๊ฐ ์„ค์ • ๊ฒฝ๋กœ์˜ ์—ญํ• ์€ ๊ฐ ๋ณ€์ˆ˜ ๋ช…์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. manager_log์˜ ๊ฒฝ๋กœ๋ฅผ ํŠนํžˆ ์ž˜ ๊ธฐ์–ตํ•ด ๋‘์ž

$ cp data/mariadb_mha/source/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/mha.cnf
$ vim /etc/mha.cnf

[server default]
user=mha
password=Mha123

ssh_user=mha

repl_user=rep
repl_password=Rep123!

manager_workdir=/data/mariadb_mha/log/masterha
manager_log=/data/mariadb_mha/log/masterha/MHA.log
remote_workdir=/data/mariadb_mha/log/masterha

master_binlog_dir=/var/lib/mysql

[server1]
hostname=192.168.100.126
candidate_master=1

[server2]
hostname=192.168.100.127
candidate_master=1


์„ค์ • ํ™•์ธ (๋งค๋‹ˆ์ €)

ssh ํ†ต์‹  ์ฒดํฌ

$ masterha_check_ssh --conf=/etc/mha.cnf
Thu Jan  5 15:47:58 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Jan  5 15:47:58 2023 - [info] Reading application default configuration from /etc/mha.cnf..
Thu Jan  5 15:47:58 2023 - [info] Reading server configuration from /etc/mha.cnf..
Thu Jan  5 15:47:58 2023 - [info] Starting SSH connection tests..
Thu Jan  5 15:48:00 2023 - [debug]
Thu Jan  5 15:47:59 2023 - [debug]  Connecting via SSH from mha@192.168.100.127(192.168.100.127:22) to mha@192.168.100.126(192.168.100.126:22)..
Thu Jan  5 15:48:00 2023 - [debug]   ok.
Thu Jan  5 15:48:00 2023 - [debug]
Thu Jan  5 15:47:58 2023 - [debug]  Connecting via SSH from mha@192.168.100.126(192.168.100.126:22) to mha@192.168.100.127(192.168.100.127:22)..
Thu Jan  5 15:48:00 2023 - [debug]   ok.
Thu Jan  5 15:48:00 2023 - [info] All SSH connection tests passed successfully.


Replication ์„ค์ • ์ฒดํฌ

$ masterha_check_repl --conf=/etc/mha.cnf
Thu Jan  5 15:49:39 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Jan  5 15:49:39 2023 - [info] Reading application default configuration from /etc/mha.cnf..
Thu Jan  5 15:49:39 2023 - [info] Reading server configuration from /etc/mha.cnf..
Thu Jan  5 15:49:39 2023 - [info] MHA::MasterMonitor version 0.57.
Thu Jan  5 15:49:40 2023 - [info] GTID failover mode = 0
...
Thu Jan  5 15:49:46 2023 - [info] Checking replication health on 192.168.100.127..
Thu Jan  5 15:49:46 2023 - [info]  ok.
Thu Jan  5 15:49:46 2023 - [info] Checking master_ip_failover_script status:
Thu Jan  5 15:49:46 2023 - [info]   /data/mariadb_mha/scripts/master_ip_failover --command=status --ssh_user=mha --orig_master_host=192.168.100.126 --orig_master_ip=192.168.100.126 --orig_master_port=3306
Thu Jan  5 15:49:46 2023 - [info]  OK.
Thu Jan  5 15:49:46 2023 - [warning] shutdown_script is not defined.
Thu Jan  5 15:49:46 2023 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

Replication ์„ค์ • ์ฒดํฌ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ

ํ•„์ž๋Š” masterha_check_repl ์ฒดํฌ ์‹œ์— ์•„๋ž˜ 2๊ฐ€์ง€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ทธ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ •๋ฆฌํ•˜์˜€๋‹ค.

1. MHA NodeUtil.pm ๊ด€๋ จ version ์—๋Ÿฌ

์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

$ masterha_check_repl --conf=/etc/mha.cnf
Tue Dec 27 01:52:44 2022 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Dec 27 01:52:44 2022 - [info] Reading application default configuration from /etc/mha.cnf..
Tue Dec 27 01:52:44 2022 - [info] Reading server configuration from /etc/mha.cnf..
Tue Dec 27 01:52:44 2022 - [info] MHA::MasterMonitor version 0.57.
Tue Dec 27 01:52:45 2022 - [error][/usr/local/share/perl/5.26.1/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. Redundant argument in sprintf at /usr/local/share/perl/5.26.1/MHA/NodeUtil.pm line 184.
Tue Dec 27 01:52:45 2022 - [error][/usr/local/share/perl/5.26.1/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Tue Dec 27 01:52:45 2022 - [info] Got exit code 1 (Not master dead).

NodeUtil.pm ํŒŒ์ผ์—์„œ mysql ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ํŒŒ์‹ฑ์—๋Ÿฌ๊ฐ€ ๋‚œ ๊ฒƒ์ด๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด NodeUtil.pm ํŒŒ์ผ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด ์ค€๋‹ค.

$ vim /usr/local/share/perl/5.26.1/MHA/NodeUtil.pm

<before>
sub parse_mysql_version($) {
  my $str = shift;
  my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );
  return $result;
}


sub parse_mysql_major_version($) {
  my $str = shift;
  my $result = sprintf( '%03d%03d', $str =~ m/(\d+)/g );
  return $result;
}

<after>
sub parse_mysql_version($) {
  my $str = shift;
  ($str) =  $str =~ m/^[^-]*/g;
  my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );
  return $result;
}

sub parse_mysql_major_version($) {
  my $str = shift;
  $str =~ /(\d+)\.(\d+)/;
  my $strmajor = "$1.$2";
  my $result = sprintf( '%03d%03d', $strmajor =~ m/(\d+)/g );
  return $result;
}


2. mysqlbinlog: unknown variable โ€˜default-character-set=utf8mb4โ€™ ์—๋Ÿฌ

์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Tue Dec 27 04:27:16 2022 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Dec 27 04:27:16 2022 - [info] Reading application default configuration from /etc/mha.cnf..
Tue Dec 27 04:27:16 2022 - [info] Reading server configuration from /etc/mha.cnf..
Tue Dec 27 04:27:16 2022 - [info] MHA::MasterMonitor version 0.57.
Tue Dec 27 04:27:17 2022 - [info] GTID failover mode = 0
...
Tue Dec 27 04:27:22 2022 - [info]   Connecting to root@192.168.100.127(192.168.100.127:22)..
mysqlbinlog: unknown variable 'default-character-set=utf8mb4'
mysqlbinlog version command failed with rc 7:0, please verify PATH, LD_LIBRARY_PATH, and client options
 at /usr/local/bin/apply_diff_relay_logs line 493.
Tue Dec 27 04:27:23 2022 - [error][/usr/local/share/perl/5.26.1/MHA/MasterMonitor.pm, ln208] Slaves settings check failed!
Tue Dec 27 04:27:23 2022 - [error][/usr/local/share/perl/5.26.1/MHA/MasterMonitor.pm, ln416] Slave configuration failed.
Tue Dec 27 04:27:23 2022 - [error][/usr/local/share/perl/5.26.1/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/bin/masterha_check_repl line 48.
Tue Dec 27 04:27:23 2022 - [error][/usr/local/share/perl/5.26.1/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Tue Dec 27 04:27:23 2022 - [info] Got exit code 1 (Not master dead).

MySQL 5.5.3 ๋ถ€ํ„ฐ default-character-set ์ด๋ผ๋Š” ์˜ต์…˜์ด ์—†์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

mysqlbinlog ํ”„๋กœ๊ทธ๋žจ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ my.cnf ๋ฅผ ์ฝ๊ฒŒ ๋˜์–ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— default-character-set ์„ค์ •์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค.

$ vim /etc/mysql/my.cnf

[client-server]

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

/etc/mysql/my.cnf ํŒŒ์ผ์„ ๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ๋‘๊ฐ€์ง€ ๊ฒฝ๋กœ์˜ ๋ชจ๋“  conf ํŒŒ์ผ์„ ๋ณด๊ณ  ์žˆ๋‹ค.

๊ทธ์ค‘ default-character-set ์„ค์ •์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 2๊ฐ€์ง€ ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฃผ์„์ฒ˜๋ฆฌ ํ•˜์—ฌ ์ˆ˜์ •ํ•œ๋‹ค.

$ vim /etc/mysql/mariadb.conf.d/50-client.cnf

[client]
# Default is Latin1, if you need UTF-8 set this (also in server section)
# default-character-set = utf8mb4

$ vim /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf

[mysql]
# Default is Latin1, if you need UTF-8 set this (also in server section)
# default-character-set = utf8mb4


MHA ๊ธฐ๋Šฅ ๊ด€๋ จ ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ • (๋งค๋‹ˆ์ €)

MHA Manager ์„ค์น˜ ์‹œ ๊ธฐ๋ณธ ์ œ๊ณต๋œ ์Šคํฌ๋ฆฝํŠธ์—์„œ master_ip_failover, master_ip_online_change ํŒŒ์ผ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค. ์žฅ์• ๊ฐ€ ๊ฐ์ง€ ๋˜๋ฉด master_ip_failover ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ ์‚ฌ์šฉ์ž ์ •์˜ takeover(relocate) ์‹œ master_ip_online_change ์ด ์‚ฌ์šฉ๋œ๋‹ค.

์šฐ์„  2๊ฐ€์ง€ ์Šคํฌ๋ฆฝํŠธ๋“ค์„ ์ž‘์—… ํด๋” ์ƒ์„ฑ ํ›„ ๋ณต์‚ฌํ•œ๋‹ค.

$ mkdir /data/mariadb_mha/scripts
$ cp /data/mariadb_mha/source/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change /data/mariadb_mha/scripts
$ cp /data/mariadb_mha/source/mha4mysql-manager-0.57/samples/scripts/master_ip_failover /data/mariadb_mha/scripts


Master IP <-> Slave IP ๋ณ€๊ฒฝ ์Šคํฌ๋ฆฝํŠธ ์„ค์ •

ํ•ด๋‹น ๋ผ์ธ์˜ ์ฝ”๋“œ๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌ ํ•œ๋‹ค.

$ vim /data/mariadb_mha/scripts/master_ip_online_change

...
149       ## Drop application user so that nobody can connect. Disabling per-session binlog beforeha    nd
150       #$orig_master_handler->disable_log_bin_local();
151       #print current_time_us() . " Drpping app user on the orig master..\n";
152       #FIXME_xxx_drop_app_user($orig_master_handler);

...
244       ## Creating an app user on the new master
245       #print current_time_us() . " Creating app user on the new master..\n";
246       #FIXME_xxx_create_app_user($new_master_handler);
247       #$new_master_handler->enable_log_bin_local();
248       #$new_master_handler->disconnect();
...

Failover ์Šคํฌ๋ฆฝํŠธ ์„ค์ •

ํ•ด๋‹น ๋ผ์ธ์˜ ์ฝ”๋“œ๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌ ํ•œ๋‹ค.

$ vim /data/mariadb_mha/scripts/master_ip_failover

...
 86       ## Creating an app user on the new master
 87       #print "Creating app user on the new master..\n";
 88       #FIXME_xxx_create_user( $new_master_handler->{dbh} );
 89       #$new_master_handler->enable_log_bin_local();
 90       #$new_master_handler->disconnect();
 91
 92       ## Update master ip on the catalog database, etc
 93       #FIXME_xxx;
...


/etc/mha.cnf ์ˆ˜์ •

์œ„์—์„œ ์„ค์ •ํ•œ ๋‘ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ ์„ค์ •์„ ํ•ด์ค€๋‹ค.

master_ip_online_change_script, master_ip_failover_script ์ถ”๊ฐ€

[server default]
user=mha
password=Mha123

ssh_user=mha

repl_user=rep
repl_password=Rep123!

manager_workdir=/data/mariadb_mha/log/masterha
manager_log=/data/mariadb_mha/log/masterha/MHA.log
remote_workdir=/data/mariadb_mha/log/masterha

master_binlog_dir=/var/lib/mysql

master_ip_online_change_script=/data/mariadb_mha/scripts/master_ip_online_change
master_ip_failover_script=/data/mariadb_mha/scripts/master_ip_failover

[server1]
hostname=192.168.100.126
candidate_master=1

[server2]
hostname=192.168.100.127
candidate_master=1

์ด๋กœ์จ MHA ์„ค์ •๊นŒ์ง€ ๋ชจ๋‘ ๋์ด ๋‚ฌ๋‹ค.



VIP ์„ค์ •

์ด๋Œ€๋กœ ์„œ๋น„์Šคํ•ด๋„ ๊ธฐ๋Šฅ์ ์ธ ๋ฌธ์ œ๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋ณด์•ˆ์ ์ธ ๋ฌธ์ œ์™€ ์›ํ™œํ•œ ์„œ๋น„์Šค ์ œ๊ณต์„ ์œ„ํ•˜์—ฌ VIP ์„ค์ •์„ ํ•ด ์ฃผ๋Š”๊ฒƒ์ด ์ข‹๋‹ค. (DNS ๋ฅผ ํ†ตํ•œ ์„œ๋น„์Šค ์ œ๊ณต ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ์ด ๊ธ€์—์„œ๋Š” MHA + VIP๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค.)

VIP ํ™œ์„ฑํ™” / ๋น„ํ™œ์„ฑํ™” (์„œ๋ฒ„1)

ifconfig ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•˜์—ฌ VIP๋ฅผ ํ™œ์„ฑํ™”, ๋น„ํ™œ์„ฑํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

ํ˜„์žฌ ์„œ๋ฒ„1์ด Master ์ƒํƒœ์ด๋‹ˆ, ์„œ๋ฒ„1์— VIP(192.168.100.128)๋ฅผ ํ™œ์„ฑํ™” ์‹œ์ผœ ๋†“์œผ๋ฉด ๋œ๋‹ค.

๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

$ ifconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.126  netmask 255.255.255.0  broadcast 192.168.100.255
        ...

$ ifconfig eno1:0 192.168.100.50 up
$ ifconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.126  netmask 255.255.255.0  broadcast 192.168.100.255
        ...

eno1:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.50  netmask 255.255.255.0  broadcast 192.168.100.255
        ...


VIP ๋ณ€๊ฒฝ ์Šคํฌ๋ฆฝํŠธ (๋งค๋‹ˆ์ €)

Failover๋‚˜ Master Switch๊ฐ€ ๋  ๋•Œ VIP๋„ Master ์„œ๋ฒ„์— ๋งž๊ฒŒ down๋˜๊ณ  up์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. (ํ•„์ž์˜ ๋„คํŠธ์›Œํฌ ๋ช…์€ eno1์ด๋‹ค. ๊ฐ์ž์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜์ž.)

$ vim /data/mariadb_mha/scripts/mha_change_vip.sh

#!/bin/bash

## Fail-Over VIP Change
V_NEW_MASTER=`cat /etc/hosts | grep $1 | awk '{print $2}'`
V_EXIST_VIP_CHK=`ping -c 1 -W 1 mha-master-vip | grep "packet loss" | awk '{print $6}'`
V_VIP_IP=`cat /etc/hosts | grep mha-master-vip | awk '{print $1}'`

if [ $V_EXIST_VIP_CHK = "0%" ]
then
    echo "VIP IS Alive, VIP Relocate $V_NEW_MASTER "
    /usr/bin/ssh -o StrictHostKeyChecking=no mha-master-vip /usr/bin/sudo /sbin/ifconfig eno1:0 down &
    ssh -o StrictHostKeyChecking=no $V_NEW_MASTER /usr/bin/sudo /sbin/ifconfig eno1:0 $V_VIP_IP netmask 255.255.255.0
    ssh -o StrictHostKeyChecking=no $V_NEW_MASTER /usr/sbin/arping -c 5 -D -I eno1 -s $V_VIP_IP $V_VIP_IP
    VIP_NOHUP_PS=`ps -ef| grep "ifconfig eno1:0" | grep ssh | grep -v grep | awk '{print $2}'` && kill -9 $VIP_NOHUP_PS
elif [ $V_EXIST_VIP_CHK = "100%" ]
then
    echo "VIP IS dead, VIP Relocate $V_NEW_MASTER "
    /usr/bin/ssh -o StrictHostKeyChecking=no $V_NEW_MASTER /usr/bin/sudo /sbin/ifconfig eno1:0 $V_VIP_IP netmask 255.255.255.0
    /usr/bin/ssh -o StrictHostKeyChecking=no $V_NEW_MASTER /usr/sbin/arping -c 5 -D -I eno1 -s $V_VIP_IP $V_VIP_IP
fi


VIP ๋ณ€๊ฒฝ ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€ (๋งค๋‹ˆ์ €)

์ƒ์„ฑํ•œ mha_change_vip.sh๋ฅผ master_ip_online_change, master_ip_failover์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

$ vim master_ip_online_change

...
244       ## Creating an app user on the new master
245       #print current_time_us() . " Creating app user on the new master..\n";
246       #FIXME_xxx_create_app_user($new_master_handler);
247       #$new_master_handler->enable_log_bin_local();
248       #$new_master_handler->disconnect();
249
250       ## Update master ip on the catalog database, etc
251
252       # Change vip
253       system("/bin/bash /data/mariadb_mha/scripts/mha_change_vip.sh $new_master_ip");
254
255       $exit_code = 0;
...

$ vim master_ip_failover

...
 86       ## Creating an app user on the new master
 87       #print "Creating app user on the new master..\n";
 88       #FIXME_xxx_create_user( $new_master_handler->{dbh} );
 89       #$new_master_handler->enable_log_bin_local();
 90       #$new_master_handler->disconnect();
 91
 92       ## Update master ip on the catalog database, etc
 93       #FIXME_xxx;
 94
 95       # Change vip
 96       system("/bin/bash /data/mariadb_ha/scripts/mha_change_vip.sh $new_master_ip");
 97
 98       $exit_code = 0;
...


MHA ํ…Œ์ŠคํŠธ (๋งค๋‹ˆ์ €)

๋ชจ๋“  ์„ค์ •์ด ์™„๋ฃŒ ๋˜์—ˆ์œผ๋ฉด ์•„๋ž˜ 2๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณธ๋‹ค.

$ masterha_check_ssh --conf=/etc/mha.cnf
$ masterha_check_repl --conf=/etc/mha.cnf


MHA ๊ตฌ๋™ (๋งค๋‹ˆ์ €)

MHA๊ฐ€ ๋งˆ์Šคํ„ฐ DB ๋ชจ๋‹ˆํ„ฐ๋ง ์ค‘์— ์žฅ์• ๊ฐ€ ๊ฐ์ง€๋˜์–ด failover ๊ฐ€ ๋ฐœ์ƒ ๋œ ์ดํ›„ ์ผ์ • ์‹œ๊ฐ„๋‚ด์— ์žฅ์• ์— ๋Œ€ํ•ด์„œ๋Š” failover ๊ฐ€ ์ง„ํ–‰ ๋˜์ง€ ์•Š๋Š”๋‹ค. failover ๊ฐ€ ํ•œ๋ฒˆ ์ฒ˜๋ฆฌ ๋œ ํ›„ ์ผ์ • ์‹œ๊ฐ„์•ˆ์—๋Š” failover๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋ณธ ๊ฐ’์€ 8์‹œ๊ฐ„์ด๋‹ค. last_failover_minute์œผ๋กœ 8์‹œ๊ฐ„์„ 1๋ถ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ–‰ํ•˜์˜€๋‹ค.

$ masterha_manager --conf=/etc/mha.cnf --last_failover_minute=1 &
$ masterha_check_status --conf=/etc/mha.cnf
mha (pid:8754) is running(0:PING_OK), master:192.168.100.126

status๊ฐ€ ์œ„์™€ ๊ฐ™์ด ๋œฌ๋‹ค๋ฉด ์ž˜ ์‹คํ–‰ ๋œ ๊ฒƒ์ด๋‹ค.

๋กœ๊ทธ๋„ ํ™•์ธํ•ด ๋ณด์ž

$ tail -f /data/mariadb_mha/log/masterha/MHA.log

Leave a comment