Powinniśmy rozważyć zainstalowanie ProxySQL na węzłach klienckich w celu wydajnego zarządzania obciążeniem w całym klastrze bez żadnych zmian w aplikacjach generujących zapytania. Jest to zalecane rozwiązanie wysokiej dostępności dla klastra Percona XtraDB.
Niektóre z popularnych funkcji ProxySQL to:
- Wysoka wydajność
- Efektywne zarządzanie obciążeniem
- Buforowanie zapytań
- Routing zapytań
- Obsługuje przełączanie awaryjne
- Zaawansowana konfiguracja z 0 przestojów
- Proxy warstwy aplikacji
- Między platformami
- Zaawansowana obsługa topologii
- Zapora sieciowa
Specyfikacja środowiska:
192.168.56.115
centów
Wymagania wstępne:
Musimy otworzyć poniższe porty na wszystkich serwerach
firewall-cmd --zone=public --add-service=mysql --permanent firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --zone=public --add-port=4567/tcp --permanent firewall-cmd --zone=public --add-port=4568/tcp --permanent firewall-cmd --zone=public --add-port=4444/tcp --permanent firewall-cmd --zone=public --add-port=4567/udp --permanent
Zezwól na port usługi ProxySQL 6033/tcp (jest to odwrotność domyślnego portu MySQL 3306) w zaporze systemu Linux.
firewall-cmd --permanent --add-port=6033/tcp firewall-cmd --reload
Instalowanie modułu równoważenia obciążenia ProxySQL dla klastra Percona XtraDB w CentOS 7
ProxySQL v2 natywnie obsługuje klaster Percona XtraDB. Aby zainstalować ProxySql, zainstaluj go z repozytorium percona
sudo yum install proxysql2
Aby połączyć się z interfejsem administratora ProxySQL, potrzebujesz klienta MySQL.
yum install Percona-XtraDB-Cluster-client-57
Teraz uruchom usługę proxysql
[[email protected] ~]# systemctl start proxysql.service
Aby sprawdzić port w węźle klastra, użyj poniższego zapytania.
mysql -uroot -p -e "SHOW GLOBAL VARIABLES LIKE 'PORT'";
Teraz połącz się z panelem administracyjnym ProxySQL i skonfiguruj system równoważenia obciążenia.
mysql -u admin -p123 -h 127.0.0.1 -P6032 --prompt='ProxySQL> ' INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'192.168.56.110',3306); INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'192.168.56.113',3306); INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'192.168.56.114',3306); ProxySQL> SELECT * FROM mysql_servers; +--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | hostgroup_id | hostname | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment | +--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | 0 | 192.168.56.110 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | | 0 | 192.168.56.113 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | | 0 | 192.168.56.114 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | +--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ 3 rows in set (0.00 sec)
Konfiguruj monitorowanie węzłów ProxySQL:
Zaloguj się do instancji bazy danych MySQL i wykonaj następujące polecenia, aby utworzyć użytkownika monitorującego z uprawnieniem USAGE
na dowolnym węźle percona:
CREATE USER 'proxysql'@'%' IDENTIFIED BY 'ProxySQL'; GRANT USAGE ON *.* TO 'proxysql'@'%'; mysql> CREATE USER 'proxysql'@'%' IDENTIFIED BY 'ProxySQL'; Query OK, 0 rows affected (0.01 sec) mysql> GRANT USAGE ON *.* TO 'proxysql'@'%'; Query OK, 0 rows affected (0.02 sec) UPDATE global_variables SET variable_value='proxysql' WHERE variable_name='mysql-monitor_username'; UPDATE global_variables SET variable_value='ProxySQL' WHERE variable_name='mysql-monitor_password'; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK; ProxySQL> UPDATE global_variables SET variable_value='proxysql' WHERE variable_name='mysql-monitor_username'; Query OK, 1 row affected (0.01 sec) ProxySQL> UPDATE global_variables SET variable_value='ProxySQL' WHERE variable_name='mysql-monitor_password'; Query OK, 1 row affected (0.00 sec) ProxySQL> LOAD MYSQL VARIABLES TO RUNTIME; Query OK, 0 rows affected (0.00 sec) ProxySQL> SAVE MYSQL VARIABLES TO DISK; Query OK, 136 rows affected (0.01 sec) ProxySQL> LOAD MYSQL SERVERS TO RUNTIME; Query OK, 0 rows affected (0.01 sec)
Tworzenie użytkownika klienta ProxySQL
Provide read/write access to the cluster for ProxySQL, add this user on one of the Percona XtraDB Cluster nodes: CREATE USER 'lbuser'@'192.168.56.115' IDENTIFIED BY 'lbpass'; GRANT ALL ON *.* TO 'lbuser'@'192.168.56.115';
Tworzenie użytkownika klienta ProxySQL:
ProxySQL> INSERT INTO mysql_users (username,password) VALUES ('lbuser','lbpass'); Query OK, 1 row affected (0.00 sec) ProxySQL> LOAD MYSQL USERS TO RUNTIME; Query OK, 0 rows affected (0.00 sec) ProxySQL> SAVE MYSQL USERS TO DISK; Query OK, 0 rows affected (0.02 sec)
potwierdź, że użytkownik został poprawnie skonfigurowany, możesz spróbować się zalogować:
[[email protected] ~]# mysql -u lbuser -plbpass -h 127.0.0.1 -P 6033 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.5.30 (ProxySQL) Copyright (c) 2009-2019 Percona LLC and/or its affiliates Copyright (c) 2000, 2019, 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>
Zobaczmy, z którym węzłem nasz klient będzie się łączył w klastrze.
[[email protected] ~]# mysql -u lbuser -plbpass -h 127.0.0.1 -P 6033 -e "select @@hostname;"; mysql: [Warning] Using a password on the command line interface can be insecure. +----------------------+ | @@hostname | +----------------------+ | percona3.localdomain | +----------------------+
widać, że serwer proxy jest podłączony do percona3
Próbowałem z innej sesji putty, po czym łączy się z percona2:
[[email protected] ~]# mysql -u lbuser -plbpass -h 127.0.0.1 -P 6033 -e "select @@hostname;"; mysql: [Warning] Using a password on the command line interface can be insecure. +----------------------+ | @@hostname | +----------------------+ | percona2.localdomain | +----------------------+
Po kilku sesjach łączy się z percona1:
[[email protected] ~]# mysql -u lbuser -plbpass -h 127.0.0.1 -P 6033 -e "select @@hostname;"; mysql: [Warning] Using a password on the command line interface can be insecure. +----------------------+ | @@hostname | +----------------------+ | percona1.localdomain | +----------------------+
Łączenie z MySQL Workbench:
Poniżej znajduje się konfiguracja mojej sesji w środowisku MySQL:
Próbowałem zobaczyć, który węzeł połączy się z MySQL Workbench
Przełączanie awaryjne:
Teraz sprawdzimy, jak to wykona przełączanie awaryjne
[[email protected] mysql]# service mysql stop Redirecting to /bin/systemctl stop mysql.service ProxySQL> select hostgroup_id,hostname,port,status from runtime_mysql_servers; +--------------+----------------+------+---------+ | hostgroup_id | hostname | port | status | +--------------+----------------+------+---------+ | 0 | 192.168.56.110 | 3306 | ONLINE | | 0 | 192.168.56.114 | 3306 | SHUNNED | | 0 | 192.168.56.113 | 3306 | ONLINE | +--------------+----------------+------+---------+ 3 rows in set (0.01 sec)
Teraz uruchom ponownie mysql na węźle 3 i ponownie sprawdź stan klastra z serwera proxy
[[email protected] mysql]#systemctl start mysql.service ProxySQL> SELECT hostgroup_id hg,count(status) cnt from main.runtime_mysql_servers WHERE status = "ONLINE" GROUP BY hg having cnt ; +----+-----+ | hg | cnt | +----+-----+ | 0 | 3 | +----+-----+ 1 row in set (0.00 sec) ProxySQL> select hostgroup_id,hostname,port,status from runtime_mysql_servers; +--------------+----------------+------+--------+ | hostgroup_id | hostname | port | status | +--------------+----------------+------+--------+ | 0 | 192.168.56.110 | 3306 | ONLINE | | 0 | 192.168.56.114 | 3306 | ONLINE | | 0 | 192.168.56.113 | 3306 | ONLINE | +--------------+----------------+------+--------+ 3 rows in set (0.00 sec)
UWAGA: Jeśli widzisz stan węzła jako USUNIĘTY następnie spróbuj połączyć się wiele razy, aby klient otrzymał najnowszy stan klastra, ponieważ serwery runtime_mysql_servers przechowują najnowszy stan węzła podczas ostatniej próby połączenia.
Testowanie klastra z sysbench:
yum install sysbench
sysbench wymaga poświadczeń użytkownika klienta ProxySQL, które utworzyłeś (lbuser/lbpass) podczas tworzenia użytkownika klienta ProxySQL.
sysbench /usr/share/sysbench/oltp_read_only.lua --threads=4 --mysql-host=127.0.0.1 --mysql-user=lbuser --mysql-password=lbpass --mysql-port=6033 --tables=10 --table-size=10000 prepare sysbench /usr/share/sysbench/oltp_read_only.lua --threads=4 --events=0 --time=300 --mysql-host=27.0.0.1 --mysql-user=lbuser --mysql-password=lbpass --mysql-port=6033 --tables=10 --table-size=10000 --range_selects=off --db-ps-mode=disable --report-interval=1 run
Aby zobaczyć liczbę poleceń uruchamianych w klastrze:
proxysql> SELECT * FROM stats_mysql_commands_counters;