Mysql
 sql >> база данни >  >> RDS >> Mysql

Балансиране на натоварването с ProxySQL за Percona XtraDB Cluster

Трябва да помислим за инсталиране на ProxySQL на клиентски възли за ефективно управление на натоварването в клъстера без никакви промени в приложенията, които генерират заявки. Това е препоръчителното решение с висока достъпност за Percona XtraDB Cluster.
Някои от популярните функции на ProxySQL са:

  • Висока производителност
  • Ефективно управление на натоварването
  • Кеширане на заявки
  • Маршрутиране на заявка
  • Поддържа преминаване при отказ
  • Разширена конфигурация с 0 престой
  • Прокси сървър на слоя на приложението
  • Многоплатформа
  • Разширена поддръжка на топология
  • Защитна стена
Спецификация на средата:

192.168.56.115
centos

Предварителни изисквания:

Трябва да отворим портовете по-долу на всички сървъри

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

Разрешете ProxySQL сервизен порт 6033/tcp (той е обратният на MySQL порт по подразбиране 3306) в защитната стена на Linux.

firewall-cmd --permanent --add-port=6033/tcp

firewall-cmd --reload
Инсталиране на ProxySQL Load Balancer за Percona XtraDB Cluster на CentOS 7

ProxySQL v2 изначално поддържа Percona XtraDB Cluster, За да инсталирате ProxySql, инсталирайте го от хранилището на percona

sudo yum install proxysql2

За да се свържете с администраторския интерфейс на ProxySQL, имате нужда от MySQL клиент.

yum install Percona-XtraDB-Cluster-client-57

Сега стартирайте услугата proxysql

[[email protected] ~]# systemctl start proxysql.service

За да проверите порта на възела на клъстера, използвайте заявката по-долу.

mysql -uroot -p -e "SHOW GLOBAL VARIABLES LIKE 'PORT'";

Сега се свържете с административния панел на ProxySQL и конфигурирайте балансира на натоварването.

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)
Конфигуриране на наблюдение на възли на ProxySQL:

Влезте в екземпляр на базата данни MySQL и изпълнете следните команди, за да създадете потребителя за наблюдение  с привилегия USAGE

на всеки percona NODE:

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)
Създаване на 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';
Създаване на 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)

потвърдете, че потребителят е настроен правилно, можете да опитате да влезете:

[[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>

Нека видим към кой възел ще се свърже нашият клиент от клъстера.

[[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 |
+----------------------+

можете да видите, че прокси сървърът е свързан към percona3

Опитах от друга сесия за замазка, след което се свързва с 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 |
+----------------------+

След няколко многократни сесии се свързва с 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 |
+----------------------+
Свързване от MySQL Workbench:

По-долу са конфигурирането на моята сесия в MySQL workbench:

Опитах се да видя кой възел ще се свърже от MySQL Workbench

Отказ при отказ:

Сега ще проверим как това ще извърши преодоляването на отказ

[[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)

Сега нека стартираме mysql отново на възел 3 и проверете отново състоянието на клъстера от прокси сървър

[[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)

ЗАБЕЛЕЖКА:  Ако виждате състоянието на възела като ИЗБЯГНАТ  след това опитайте да се свържете няколко пъти, така че клиентът да получи най-новото състояние на клъстера, тъй като runtime_mysql_servers съхраняват най-новото състояние на възела при последния опит за свързване.

Тестване на клъстер със sysbench:
yum install sysbench

sysbench изисква потребителски идентификационни данни на клиента на ProxySQL, които сте създали (lbuser/lbpass) в Създаване на клиентски потребител на 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

За да видите броя на командите, които се изпълняват в клъстера:

proxysql> SELECT * FROM stats_mysql_commands_counters;

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Премахване на дублиращи се редове в MySQL

  2. mysqli::mysqli():(HY000/2002):Не мога да се свържа с локален MySQL сървър чрез сокет 'MySQL' (2)

  3. Светият граал на почистването на входа и изхода в php?

  4. Как да тествате дали даден низ е JSON или не?

  5. Примери за DAYOFWEEK() – MySQL