MySQL Cluster Kurulum Adımları

Bu yazımızda 3 node lu bir MySQL Cluster kurulumu yapacağız.

1.İlk olarak RedHat 7.9 versiyonunda 5 tane sunucumuz hazır olmalıdır.

Aşağıda görüldüğü üzere MySQL Cluster da ki sunucular gösterilmiştir. (Sistemininiz yoğunluğuna göre sunucu özellikleri arttırılabilir.)

Sunucular (Linux 7.9) Önerilen Özellikler
node1 (ana sunucu) Min 4 CPU Cores, 8 GB RAM, RAID10 veya RAID 0+1
node2 (ikinci veri deposu) Min 4 CPU Cores, 8 GB RAM, RAID10 veya RAID 0+1
node3 (üçüncü veri deposu) Min 4 CPU Cores, 8 GB RAM, RAID10 veya RAID 0+1
Router x2  (yönlendirme) Minimum Seviyede Kaynak

Kurulum işlemleri ardından Cluster Nodeları arası şifresiz geçiş düzenlenmeli ve MySQL Cluster için port izinleri aşağıdaki gibi olmalıdır.

Source Destination Port
 

DBA Team

(MySQL Administaror Port)

MySqlServerNB (xx.x.xx.xx)

MySqlServerN1 (xx.x.xx.xx)

MySqlServerN2 (xx.x.xx.xx)

MySqlServerN3 (xx.x.xx.xx)

 

22, 3306,33060

Application Server MySQL Router 6446,6447,6448,6449 (ÇİFT YÖNLÜ)
MySQL Roter (xx.x.xx.xx) CLUSTER (N1,M2,N3) 3306,33060,33061 (ÇİFT YÖNLÜ)
CLUSTER (N1,M2,N3) CLUSTER (N1,M2,N3) 3306,33060,33061 (ÇİFT YÖNLÜ)

Resim 1: Port’s

 

2.Sunucu kurulumları yapıldıktan sonra bütün nodelarda;

Cluster daki Hostname ve IP ler nodeların hepsinde /etc/hosts a eklenmeli,

Firewall ve selinux disable edilmelidir.

 

3. Node 1-2-3 üzerinde mysql-shell, mysql-community-server, mysql-community-release paketleri yüklenir. (Sunucularımızın internete açık olması yada ilgili rpm lerin manuel kurulumu yapılmalıdır.)

İlgili paketleri yüklemeden önce “yum update“ çalıştırmamız daha sağlıklı olacaktır.

# yum install mysql-community-server

# yum install mysql-shell

# yum localinstall https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm

# rpm -Uvh mysql57-community-release-el7-11.noarch.rpm

Repository link: https://dev.mysql.com/downloads/repo/yum/

 

4. MySQL servisini başlatma, default root şifresi öğrenme ve root şifresi set etme.

 

  • MySQL servisini başlatmak için;
# service mysqld start

 

  • Root şifresi öğrenilir.
#grep ‘A temporary password’ /var/log/mysqld.log |tail -1

2021-02-23T12:54:25.967635Z 1 [Note] A temporary password is generated for root@localhost:     Z:puddek*2GH

 

  • MySQL shell’ine giriş yukarıdaki random gelen şifre ile giriş test edilir.
            # mysql -h localhost -u root -p

 

  • Random gelen root şifresi set edilir.
mysql> SET sql_log_bin = OFF;

Query OK, 0 rows affected (0.00 sec)

mysql> SET PASSWORD = ‘Mysqloracle0!’;

Query OK, 0 rows affected (0.02 sec)

mysql> SET sql_log_bin = ON;

Query OK, 0 rows affected (0.00 sec)

 

5. Resolve Ip bütün notlarda kontrol edilir.

# resolveip node1.mysqlcluster

Warning: resolveip is deprecated and will be removed in a future version.

IP address of node1.mysqlcluster is xxx.xxx.x.xx

 

6. Cluster için Konfigürasyon İşlemlerine Başlanır.

İlk olarak bütün node lar üzerinde cluster olacak nodeların bilgisini tanımlıyoruz.

  • Aşağıdaki komutların Cluster Node larının olacağı sunucular (N1,N2,N3) üzerinde çalıştırılır.
mysqlsh root@localhost — shell store-credential “clAdmin@node1.mysqlcluster:3306” “P@ssw0rd”

mysqlsh root@localhost — shell store-credential “clAdmin@node2.mysqlcluster:3306” “P@ssw0rd”

mysqlsh root@localhost — shell store-credential “clAdmin@node3.mysqlcluster:3306” “P@ssw0rd”

 

  • Cluster Node larında aşağıdaki komut çalıştırılır. Bu komut ROOT user’I ile Cluster’I daha rahat bir şekilde yönetebilmemizi sağlayacaktır.
mysqlsh root@localhost — shell store-credential “root@localhost:3306” “P@ssw0rd”

 

  • Bir sonraki komutumuz ise Cluster kurulumu için gereken temel yapılandırmaları başlatacaktır ve Node 1 üzerinde çalıştırılır.
# mysqlsh — dba configure-instance { –port=3306 –host=localhost –user=root } –clusterAdmin=icAdmin –clusterAdminPassword=P@ssw0rd –mycnfPath=/etc/my.cnf –restart=true –interactive=true

 

Komutu çalıştırdıktan sonra alacağımız çıktılar aşağıdaki gibidir.

Please provide the password for ‘root@localhost:3306’: *************

Save password for ‘root@localhost:3306’? [Y]es/[N]o/Ne[v]er (default No): y

Configuring local MySQL instance listening at port 3306 for use in an InnoDB cluster…

 

This instance reports its own address as localhost.localdomain:3306

Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.

Assuming full account name ‘clAdmin’@’%’ for clAdmin

 

NOTE: Some configuration options need to be fixed:

+———————————-+—————+—————-+————————————————–+

| Variable                              | Current Value | Required Value | Note                                             |

+———————————-+—————+—————-+————————————————–+

| binlog_checksum              | CRC32         | NONE        | Update the server variable and the config file   |

| binlog_format                    | <not set>     | ROW            | Update the config file                           |

| enforce_gtid_consistency| OFF           | ON             | Update the config file and restart the server    |

| gtid_mode                           | OFF           | ON             | Update the config file and restart the server    |

| log_bin                                | <not set>     | <no value>     | Update the config file                           |

| log_bin                                | OFF           | ON             | Update read-only variable and restart the server |

| log_slave_updates            | OFF           | ON             | Update the config file and restart the server    |

| master_info_repository   | FILE          | TABLE          | Update the config file and restart the server    |

| relay_log_info_repository| FILE          | TABLE          | Update the config file and restart the server    |

| server_id                        | 0             | <unique ID>    | Update the config file and restart the server    |

| transaction_write_set_extraction | OFF           | XXHASH64       | Update the config file and restart the server    |

+———————————-+—————+—————-+————————————————–+

 

Some variables need to be changed, but cannot be done dynamically on the server: an option file is required.

Do you want to perform the required configuration changes? [y/n]: y

 

Cluster admin user ‘clAdmin’@’%’ created.

Configuring instance…

The instance ‘localhost.localdomain:3306’ was configured to be used in an InnoDB cluster.

NOTE: MySQL server needs to be restarted for configuration changes to take effect.

 

  • MYSQLD restart edilir.
# systemctl restart mysqld

 

  • Cluster’ın birinci nodunda create-cluster komutumuzu çalıştırıyoruz.
# mysqlsh clAdmin@node1.mysqlcluster:3306 — dba create-cluster InnoDB_Cluster57 –multiPrimary=false –memberWeight=100

 

 

  • ve 3. Node ları Cluster’a eklemek üzerinde aşağıdaki komutlar sırasıyla Node 1 üzerinde çalıştırılır.
Node 2 için;

# mysqlsh clAdmin@node1.mysqlcluster:3306 — cluster add-instance node2.mysqlcluster:3306 –memberWeight=60

 

Komutunu çalıştırdıktan sonra aşağıdaki seçenekte Clone ile ekleme işlemine devam ediyoruz.

 

Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone):

Validating instance configuration at node2.mysqltest.com:3306…

 

Node 3 için;

# mysqlsh clAdmin@node1.mysqlcluster:3306 — cluster add-instance node3.mysqlcluster:3306 –memberWeight=80 –recoveryMethod=incremental

 

  • Node larımızı ekledikten sonra Cluster durumumuzu kontrol edebiliriz.

Shell üzerinden kontrol için;

mysqlsh clAdmin@node1.mysqlcluster:3306 — cluster status

 

{

“clusterName”: “InnoDB_Cluster57”,

“defaultReplicaSet”: {

“name”: “default”,

“primary”: “node1.mysqlcluster:3306”,

“ssl”: “REQUIRED”,

“status”: “OK”,

“statusText”: “Cluster is ONLINE and can tolerate up to ONE failure.”,

“topology”: {

“node1.mysqlcluster:3306”: {

“address”: “node1.mysqlcluster:3306”,

“mode”: “R/W”,

“readReplicas”: {},

“role”: “HA”,

“status”: “ONLINE”,

“version”: “5.7.33”

},

“node2.mysqlcluster:3306”: {

“address”: “node2.mysqlcluster:3306”,

“mode”: “R/O”,

“readReplicas”: {},

“role”: “HA”,

“status”: “ONLINE”,

“version”: “5.7.33”

},

“node3.mysqlcluster:3306”: {

“address”: “node3.mysqlcluster:3306”,

“mode”: “R/O”,

“readReplicas”: {},

“role”: “HA”,

“status”: “ONLINE”,

“version”: “5.7.33”

}

},

“topologyMode”: “Single-Primary”

},

“groupInformationSourceMember”: “node1.mysqlcluster:3306”

}

 

MySQL e bağlanıp kontrol etmek için;

mysql -h localhost -u root -p

mysql>  select * from performance_schema.replication_group_members;

+—————————+————————————–+——————–+————-+————–+———+

| CHANNEL_NAME                 | MEMBER_ID           | MEB_HOST                | MEB_PORT | MEB_STATE |

+—————————+————————————–+——————–+————-+————–+———+

| group_replication_applier | xxxxxxxxxxxxxxxxx | node3.mysqlcluster |        3306      | ONLINE         |

| group_replication_applier | xxxxxxxxxxxxxxxxx | node1.mysqlcluster |        3306      | ONLINE         |

| group_replication_applier | xxxxxxxxxxxxxxxxx | node2.mysqlcluster |        3306      | ONLINE         |

+—————————+————————————–+——————–+————-+————–+———+

 

  • Bütün Cluster konfigürasyonu parametrelerini my.conf dosyasına yazabilmek aşağıdaki komut bütün Node lar üzerinde çalıştırılır.
mysqlsh –interactive –execute=”dba.configureLocalInstance(‘localhost:3306′, {mycnfPath:’/etc/my.cnf’})”

 

Komut çıktısı aşağıdaki gibidir.

MySQL Shell 8.0.23

 

Copyright (c) 2016, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates.

Other names may be trademarks of their respective owners.

 

Type ‘\help’ or ‘\?’ for help; ‘\quit’ to exit.

The instance ‘node3.mysqlcluster:3306’ belongs to an InnoDB cluster.

Persisting the cluster settings…

The instance ‘node3.mysqlcluster:3306’ was configured for use in an InnoDB cluster.

 

The instance cluster settings were successfully persisted.

 

 

7. MySQL Router High Availability with Keepalived Konfigürasyon Adımları.

MySQL Router, yük dengeleme ve yük devretme gibi ek fayda sağlamak için MySQL Cluster bileşenleri arasında yer almaktadır. Ek olarak istemci isteklerinin belirli sunuculara yönlendirilmesini yönetir ve Master Node’un herhangi bir failover olması sonrasında otomatik olarak replika node lar dan herhangi biri Primary olmasını sağlamaktadır.

  • MySQL Router sunucuları üzerine “mysql-router-community” bileşeni yüklenmelidir.
yum install mysql-router-community

Manuel indirmek için, https://dev.mysql.com/downloads/router/

 

  • MySQL üzerine daha önce yüklenmiş olan router bileşeni bootstrap kullanılarak  her 2 sunucu üzerinde MySQL Router konfigürasyon işlemleri yapılır.
# mysqlrouter –bootstrap cluAdmin@MySqlServerRouter:3306 –user=mysqlrouter –force

#systemctl enable mysqlrouter

Komut çalıştırıldıktan sonra çıktımız aşağıdaki gibidir.

Please enter MySQL password for clAdmin:

# Bootstrapping system MySQL Router instance…

– Creating account(s) (only those that are needed, if any)

– Verifying account (using it to run SQL queries that would be run by Router)

– Storing account in keyring

– Adjusting permissions of generated files

– Creating configuration /etc/mysqlrouter/mysqlrouter.conf

Existing configuration backed up to ‘/etc/mysqlrouter/mysqlrouter.conf.bak’

# MySQL Router configured for the InnoDB Cluster ‘InnoDB_Cluster57’

After this MySQL Router has been started with the generated configuration

$ /etc/init.d/mysqlrouter restart

or

$ systemctl start mysqlrouter

or

$ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf

the cluster ‘InnoDB_Cluster57’ can be reached by connecting to:

## MySQL Classic protocol

– Read/Write Connections: localhost:6446

– Read/Only Connections:  localhost:6447

## MySQL X protocol

– Read/Write Connections: localhost:64460

– Read/Only Connections:  localhost:64470

 

Cluster ‘a bağlantı sağlamak için ilgili user’lara Read/Write Port olan 6446 ve Read Only Port olan 6447  connection bilgileri verilerek Shell,PgAdmin vs. benzeri araçlar ile test edebilirsiniz.

  • Keepalive için ise aşağıdaki adımlar gerçekleştirilir. VIP oluşturmak için public ıp “ifconfig” ile öğrenilir. (interface & 168.56.111)
Node 1 için;

#  yum -y install keepalived

Orjinal keepalived konfigürasyon dosyası yedeklenir.

# mv /etc/keepalived/ keepalived.conf      /etc/keepalived/ keepalived.conf.back

# vi /etc/keepalived/ keepalived.conf  dosyası içerisine aşağıdaki satırlar eklenir.

vrrp_script chk_mysqlrouter {
script “/bin/killall -0 /usr/bin/mysqlrouter” # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
fall 2
}

vrrp_instance VI_1 {
state MASTER
interface enp0s3
virtual_router_id 50
priority 102
advert_int 1
virtual_ipaddress {
192.168.56.111
}
track_script {
chk_mysqlrouter
}
}

 

Node 2 için;

#  yum -y install keepalived

Orjinal keepalived konfigürasyon dosyası yedeklenir.

# mv /etc/keepalived/ keepalived.conf      /etc/keepalived/ keepalived.conf.back

# vi /etc/keepalived/ keepalived.conf  dosyası içerisine aşağıdaki satırlar eklenir.

script chk_mysqlrouter {
script “/bin/killall -0 /usr/bin/mysqlrouter” # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
fall 2
}

vrrp_instance VI_2 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 101
advert_int 1
virtual_ipaddress {
192.168.56.111
}
track_script {
chk_mysqlrouter
}
}

 

Her 2 Router sunucusunda restart işlemi gerçekleştirilir.

# systemctl start keepalived (on both servers)
# systemctl enable keepalived
# systemctl status keepalived
# ip addr show

 

HA Keepalive ‘ı test etmek istersek.  Node 1 üzerinde çalıştıracağımız komut Primary olan node’u saniye de 1 göstermektedir. Bu komutun çıktısındaki primary ortama bağlanıp sunucuya shutdown verip primary ortamın değiştiğini görebilirsiniz.

 

while [ 1 ] do
sleep 1
mysql -h 192.168.56.111 -P 6447 -uinnodbcluster -pStrong_Password1! \
-e “select @@hostname;”
done

8. MySQL InnoDB Cluster Testleri

 

  • Read/Write ve Read Only kullanıcı testleri.
User Create edilir.

 

mysql> CREATE USER testuser@’192.168.1.%’ IDENTIFIED BY ‘xxxxxxxx’;

mysql> GRANT ALL ON *.* TO testuser@’192.168.1.%‘;

 

Read/Write SQL Bağlantısı

 

$ mysql –user=testuser –password –host=localhost –port=6446 –protocol=tcp

 

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 54

Server version: 5.7.21-enterprise-commercial-advanced-log MySQL Enterprise Server – Advanced Edition (Commercial)

 

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> SELECT @@hostname;

+————+

| @@hostname |

+————+

| gr101      |

+————+

1 row in set (0.01 sec)

 

mysql> CREATE SCHEMA db1;

Query OK, 1 row affected (0.00 sec)

 

mysql> CREATE TABLE db1.t1 (id int unsigned NOT NULL PRIMARY KEY);

Query OK, 0 rows affected (0.08 sec)

 

mysql> INSERT INTO db1.t1 VALUES (1);

Query OK, 1 row affected (0.01 sec)

 

 

Read Only SQL Bağlantısı

 

shell$ mysql –user=testuser –password –host=localhost –port=6447 –protocol=tcp

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 22

Server version: 5.7.21-enterprise-commercial-advanced-log MySQL Enterprise Server – Advanced Edition (Commercial)

 

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

 

mysql> SELECT @@hostname;

+————+

| @@hostname |

+————+

| gr102      |

+————+

1 row in set (0.00 sec)

 

mysql> INSERT INTO db1.t1 VALUES (2);

ERROR 1290 (HY000): The MySQL server is running with the –read-only option so it cannot execute this statement

 

mysql> SELECT * FROM db1.t1;

+—-+

| id |

+—-+

|  1 |

+—-+

1 row in set (0.00 sec)