Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
© 2017 Percona1
Marcelo Altmann
ProxySQL para MySQL
Mais que um simples proxy - Exemplos de uso
Senior Support Engineer
My...
© 2017 Percona2
Agenda
© 2017 Percona3
Agenda
▪ Sobre Mim
▪ ProxySQL
•Introdução
•Features
▪Load Balance
▪Firewall
▪Query Cache
▪Integrações
▪Out...
© 2017 Percona4
Sobre Mim
© 2017 Percona5
Marcelo Altmann
▪Engenheiro de Suporte @ percona
• MySQL DBA @ IEDR (CCTLD Irlanda)
▪Oracle ACE Associate
...
© 2017 Percona6
ProxySQL - Introdução
© 2017 Percona7
ProxySQL - Introdução
▪ Criado e mantido por René Cannaò
•MySQL Community - Contribuidor do ano (2017)
▪Op...
© 2017 Percona8
ProxySQL - Introdução
▪ Instalação
•Source Code / rpm / deb / percona repo (yum / apt-get)
▪MySQL admin in...
© 2017 Percona9
ProxySQL - Introdução
▪ Camadas
•Runtime - Dados que o proxySQL acessa
•Main/Memory - Camada onde executam...
© 2017 Percona10
ProxySQL - Introdução
▪ Tabelas
•mysql_servers - Contém a lista de servidores.
•mysql_query_rules - Conté...
© 2017 Percona11
ProxySQL - Features
© 2017 Percona12
ProxySQL - Features - Load Balance
▪ Usuários de autenticação
Admin> INSERT INTO mysql_users (username,pa...
© 2017 Percona13
ProxySQL - Features - Load Balance
▪ Redirecionamento do tráfego para lista de servidores
Admin> INSERT I...
© 2017 Percona14
ProxySQL - Features - Load Balance
▪ Redirecionamento do tráfego para lista de servidores
[root@localhost...
© 2017 Percona15
ProxySQL - Features - Load Balance
▪ Dividir leituras e escritas
•Host Groups - Agrupamento de servidores...
© 2017 Percona16
ProxySQL - Features - Load Balance
▪ Dividir leituras e escritas
Admin> SELECT username, default_hostgrou...
© 2017 Percona17
ProxySQL - Features - Load Balance
▪ Dividir leituras e escritas
Admin> INSERT INTO mysql_query_rules (ru...
© 2017 Percona18
ProxySQL - Features - Load Balance
▪ Dividir leituras e escritas
[root@localhost ~]# mysql -u application...
© 2017 Percona19
ProxySQL - Features - Stats
▪ SHOW TABLES FROM stats;
•Stats_mysql_commands_counters - Contador baseado e...
© 2017 Percona20
ProxySQL - Features - Reescrita de query
▪ stats_mysql_query_digest
Admin> SELECT digest, digest_text, su...
© 2017 Percona21
ProxySQL - Features - Reescrita de query
[root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0....
© 2017 Percona22
ProxySQL - Features - Firewall
▪Bloquear queries - SQL INJECTION!
•Original query: SELECT Name FROM world...
© 2017 Percona23
ProxySQL - Features - Firewall
Admin> INSERT INTO mysql_query_rules (rule_id, active, digest, error_msg, ...
© 2017 Percona24
ProxySQL - Features - Mirror
▪Espelhar queries em outros servidores
•Testar configurações
•Standby Master...
© 2017 Percona25
ProxySQL - Features - Mirror
▪Esquentar buffer pool
Admin> INSERT INTO mysql_servers (hostgroup_id, hostn...
© 2017 Percona26
ProxySQL - Features - Query Cache
▪Cache de queries baseado em TTL
[root@localhost ~]# sysbench --num-thr...
© 2017 Percona27
ProxySQL - Features - Query Cache
Admin> INSERT INTO mysql_query_rules (rule_id,active,digest,cache_ttl,a...
© 2017 Percona28
ProxySQL - Features - Query Cache
Admin> SHOW VARIABLES LIKE 'mysql-query_cache%';
+---------------------...
© 2017 Percona29
ProxySQL - Features - Query Cache
Admin> SELECT * FROM stats_mysql_global WHERE Variable_Name LIKE 'Query...
© 2017 Percona30
ProxySQL - Features - Integrações
▪MHA (sem alterar DNS ou VIP)
•https://www.percona.com/blog/2016/09/13/...
© 2017 Percona31
Estamos Contratando !!!
- Senior Support Engineer - Brazil - Americas
- Inglês fluente
- Manjar de MySQL
...
© 2017 Percona32
Perguntas?
© 2017 Percona33
DATABASE PERFORMANCE
MATTERS
Database Performance MattersDatabase Performance MattersDatabase Performance...
Nächste SlideShare
Wird geladen in …5
×

ProxySQL para mysql

562 Aufrufe

Veröffentlicht am

Slides da apresentaçao no Percona MySQL & MongoDB Mettup

Veröffentlicht in: Internet
  • Als Erste(r) kommentieren

ProxySQL para mysql

  1. 1. © 2017 Percona1 Marcelo Altmann ProxySQL para MySQL Mais que um simples proxy - Exemplos de uso Senior Support Engineer MySQL & MongoDB meetup - Sao Paulo 11/05/2017
  2. 2. © 2017 Percona2 Agenda
  3. 3. © 2017 Percona3 Agenda ▪ Sobre Mim ▪ ProxySQL •Introdução •Features ▪Load Balance ▪Firewall ▪Query Cache ▪Integrações ▪Outros
  4. 4. © 2017 Percona4 Sobre Mim
  5. 5. © 2017 Percona5 Marcelo Altmann ▪Engenheiro de Suporte @ percona • MySQL DBA @ IEDR (CCTLD Irlanda) ▪Oracle ACE Associate ▪Certificaçoes •Oracle Certified Professional, MySQL 5.6 Database Administrator •Oracle Certified Professional, MySQL 5.6 Developer •Oracle Certified Professional, MySQL 5 Database Administrator •Oracle Certified Professional, MySQL 5 Developer •Oracle Certified Associate, MySQL 5.0/5.1/5.5 ▪blog.marceloaltmann.com
  6. 6. © 2017 Percona6 ProxySQL - Introdução
  7. 7. © 2017 Percona7 ProxySQL - Introdução ▪ Criado e mantido por René Cannaò •MySQL Community - Contribuidor do ano (2017) ▪Open Source •http://www.proxysql.com/ •https://github.com/sysown/proxysql
  8. 8. © 2017 Percona8 ProxySQL - Introdução ▪ Instalação •Source Code / rpm / deb / percona repo (yum / apt-get) ▪MySQL admin interface [root@localhost ~]# mysql -u admin -padmin -P 6032 -h 127.0.0.1 --prompt='Admin> ' 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 1 Server version: 5.5.30 (ProxySQL Admin Module) . . . Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. Admin>
  9. 9. © 2017 Percona9 ProxySQL - Introdução ▪ Camadas •Runtime - Dados que o proxySQL acessa •Main/Memory - Camada onde executamos alterações e monitoramento •Disk - Camada para persistir dados. SQLite3 •Config - Arquivo em disco que é lido caso o banco de dados SQLite3 nao exista.
  10. 10. © 2017 Percona10 ProxySQL - Introdução ▪ Tabelas •mysql_servers - Contém a lista de servidores. •mysql_query_rules - Contém a lista de regras para cache, reescrita e redirecionamento de queries. •mysql_users - Contém a lista de usuário para autenticação. •global_variables - Contém a lista de variáveis de configuração.
  11. 11. © 2017 Percona11 ProxySQL - Features
  12. 12. © 2017 Percona12 ProxySQL - Features - Load Balance ▪ Usuários de autenticação Admin> INSERT INTO mysql_users (username,password) VALUES ('application', 'app'); Query OK, 1 row affected (0.00 sec) Admin> LOAD MYSQL USERS TO RUNTIME ; Query OK, 0 rows affected (0.00 sec) Admin> SAVE MYSQL USERS FROM RUNTIME; -- Hack para o plain-text password Query OK, 0 rows affected (0.00 sec) Admin> SAVE MYSQL USERS TO DISK ; Query OK, 0 rows affected (0.01 sec)
  13. 13. © 2017 Percona13 ProxySQL - Features - Load Balance ▪ Redirecionamento do tráfego para lista de servidores Admin> INSERT INTO mysql_servers (hostname) VALUES ('192.168.19.71'),('192.168.19.72'),('192.168.19.73'); Query OK, 3 rows affected (0.00 sec) Admin> LOAD MYSQL SERVERS TO RUNTIME; Query OK, 0 rows affected (0.01 sec) Admin> SAVE MYSQL SERVERS TO DISK; Query OK, 0 rows affected (0.02 sec)
  14. 14. © 2017 Percona14 ProxySQL - Features - Load Balance ▪ Redirecionamento do tráfego para lista de servidores [root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0.0.1 -e "SELECT @@server_id" +-------------+ | @@server_id | +-------------+ | 2 | +-------------+ [root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0.0.1 -e "SELECT @@server_id" +-------------+ | @@server_id | +-------------+ | 3 | +-------------+ [root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0.0.1 -e "SELECT @@server_id" +-------------+ | @@server_id | +-------------+ | 1 | +-------------+
  15. 15. © 2017 Percona15 ProxySQL - Features - Load Balance ▪ Dividir leituras e escritas •Host Groups - Agrupamento de servidores Admin> UPDATE mysql_servers SET hostgroup_id = 1 WHERE hostname <> '192.168.19.71'; Admin> SELECT hostgroup_id, hostname FROM mysql_servers; +--------------+---------------+ | hostgroup_id | hostname | +--------------+---------------+ | 0 | 192.168.19.71 | | 1 | 192.168.19.72 | | 1 | 192.168.19.73 | +--------------+---------------+ Admin> LOAD MYSQL SERVERS TO RUNTIME; Admin> SAVE MYSQL SERVERS TO DISK;
  16. 16. © 2017 Percona16 ProxySQL - Features - Load Balance ▪ Dividir leituras e escritas Admin> SELECT username, default_hostgroup FROM mysql_users; +-------------+-------------------+ | username | default_hostgroup | +-------------+-------------------+ | application | 0 | +-------------+-------------------+ 1 row in set (0.00 sec)
  17. 17. © 2017 Percona17 ProxySQL - Features - Load Balance ▪ Dividir leituras e escritas Admin> INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup) -> VALUES -> (1,1,'^SELECT.*FOR UPDATE$',0), -> (2,1,'^SELECT',1); Query OK, 2 rows affected (0.00 sec) Admin> LOAD MYSQL QUERY RULES TO RUNTIME; Query OK, 0 rows affected (0.00 sec) Admin> SAVE MYSQL QUERY RULES TO DISK; Query OK, 0 rows affected (0.01 sec)
  18. 18. © 2017 Percona18 ProxySQL - Features - Load Balance ▪ Dividir leituras e escritas [root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0.0.1 -e "INSERT INTO test.t1 VALUES (@@server_id)" [root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0.0.1 -e "SELECT @@server_id, server FROM test.t1" +-------------+--------+ | @@server_id | server | +-------------+--------+ | 3 | 1 | +-------------+--------+ [root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0.0.1 -e "SELECT @@server_id, server FROM test.t1" +-------------+--------+ | @@server_id | server | +-------------+--------+ | 2 | 1 | +-------------+--------+
  19. 19. © 2017 Percona19 ProxySQL - Features - Stats ▪ SHOW TABLES FROM stats; •Stats_mysql_commands_counters - Contador baseado em comandos •Stats_mysql_connection_pool - Conexoes por servidor •Stats_mysql_global - Estatisticas globais •Stats_mysql_processlist - SHOW PROCESSLIST •Stats_mysql_query_digest - Contador agrupado por digest •Stats_mysql_query_rules - Contador baseado nas query rules
  20. 20. © 2017 Percona20 ProxySQL - Features - Reescrita de query ▪ stats_mysql_query_digest Admin> SELECT digest, digest_text, sum_time FROM stats_mysql_query_digest ORDER BY sum_time DESC LIMIT 1; +--------------------+-----------------------------------------+----------+ | digest | digest_text | sum_time | +--------------------+-----------------------------------------+----------+ | 0xD69E622A5052289E | SELECT * FROM world.city WHERE Name = ? | 7016461 | +--------------------+-----------------------------------------+----------+ Admin> INSERT INTO mysql_query_rules (rule_id,active,match_pattern, replace_pattern) VALUES (3,1, '^SELECT * FROM world.city WHERE Name = (.*)$', 'SELECT Population FROM world.city WHERE Name = 1'); Query OK, 1 row affected (0.00 sec) Admin> LOAD MYSQL QUERY RULES TO RUNTIME; Query OK, 0 rows affected (0.01 sec) Admin> SAVE MYSQL QUERY RULES TO DISK; Query OK, 0 rows affected (0.01 sec)
  21. 21. © 2017 Percona21 ProxySQL - Features - Reescrita de query [root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0.0.1 -e "SELECT * FROM world.city WHERE Name = 'São Paulo'" +------------+ | Population | +------------+ | 9968485 | +------------+
  22. 22. © 2017 Percona22 ProxySQL - Features - Firewall ▪Bloquear queries - SQL INJECTION! •Original query: SELECT Name FROM world.city WHERE Name = ‘?’ •SQL Injection: ? = São Paulo' OR ID > 0; -- •SELECT Name FROM world.city WHERE Name = 'São Paulo' OR ID > 0; --' Admin> SELECT username, digest, digest_text FROM stats_mysql_query_digest WHERE digest_text LIKE '% OR ID %' ORDER BY first_seen DESC LIMIT 1; +-------------+--------------------+------------------------------------------------------+ | username | digest | digest_text | +-------------+--------------------+------------------------------------------------------+ | application | 0xD8AF41BF32707ABD | SELECT Name FROM world.city WHERE Name = ? OR ID > ? | +-------------+--------------------+------------------------------------------------------+ 1 row in set (0.00 sec)
  23. 23. © 2017 Percona23 ProxySQL - Features - Firewall Admin> INSERT INTO mysql_query_rules (rule_id, active, digest, error_msg, apply) VALUES (4,1,'0xD8AF41BF32707ABD','Suspeita de SQL Injection',1); Query OK, 1 row affected (0.00 sec) Admin> LOAD MYSQL QUERY RULES TO RUNTIME;SAVE MYSQL QUERY RULES TO DISK; Query OK, 0 rows affected (0.01 sec) Query OK, 0 rows affected (0.01 sec) [root@localhost ~]# mysql -u application -papp -P 6033 -h 127.0.0.1 -e "SELECT Name FROM world.city WHERE Name = 'São Paulo' OR ID > 0; --' " ERROR 1148 (42000) at line 1: Suspeita de SQL Injection
  24. 24. © 2017 Percona24 ProxySQL - Features - Mirror ▪Espelhar queries em outros servidores •Testar configurações •Standby Master - Manter buffer pool quente •Testar workload em versões diferentes - Upgrades •Troubleshooting
  25. 25. © 2017 Percona25 ProxySQL - Features - Mirror ▪Esquentar buffer pool Admin> INSERT INTO mysql_servers (hostgroup_id, hostname) VALUES (2, '192.168.29.29'); Admin> LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; Admin> SELECT rule_id, match_digest, destination_hostgroup, mirror_hostgroup FROM mysql_query_rules WHERE rule_id=2; +---------+--------------+-----------------------+------------------+ | rule_id | match_digest | destination_hostgroup | mirror_hostgroup | +---------+--------------+-----------------------+------------------+ | 2 | ^SELECT | 1 | NULL | +---------+--------------+-----------------------+------------------+ Admin> UPDATE mysql_query_rules SET mirror_hostgroup=2 WHERE rule_id=2; Admin> LOAD MYSQL QUERY RULES TO RUNTIME; Admin> SAVE MYSQL QUERY RULES TO DISK;
  26. 26. © 2017 Percona26 ProxySQL - Features - Query Cache ▪Cache de queries baseado em TTL [root@localhost ~]# sysbench --num-threads=16 --max-requests=0 --max-time=60 --test=/usr/share/doc/sysbench/tests/db/oltp.lua --mysql- user=application --mysql-password=app --mysql-db=test --mysql-host=127.0.0.1 --mysql-port=6033 --oltp-table-size=10000 --oltp-read-only=on --oltp-skip-trx=on --oltp-point-selects=100 --oltp-simple-ranges=1 --oltp-sum-ranges=1 --oltp-order-ranges=1 --oltp-distinct-ranges=1 run | grep 'read/write requests' read/write requests: 105664 (1744.81 per sec.) Admin> SELECT count_star,sum_time,hostgroup,digest,digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC; +------------+-----------+-----------+--------------------+----------------------------------------------------------------------+ | count_star | sum_time | hostgroup | digest | digest_text | +------------+-----------+-----------+--------------------+----------------------------------------------------------------------+ | 100200 | 459147213 | 1 | 0xBF001A0C13781C1D | SELECT c FROM sbtest1 WHERE id=? | | 1002 | 6533622 | 1 | 0xF7D3CD60704822A0 | SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? ORDER BY c | | 1002 | 6061540 | 1 | 0x877EEAAFADF3DDF2 | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? ORDER BY c | | 1002 | 5905677 | 1 | 0xAF7A51977DD56217 | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? | | 1002 | 5321376 | 1 | 0x3E268CF3E75DB831 | SELECT SUM(K) FROM sbtest1 WHERE id BETWEEN ? AND ?+? | +------------+-----------+-----------+--------------------+----------------------------------------------------------------------+
  27. 27. © 2017 Percona27 ProxySQL - Features - Query Cache Admin> INSERT INTO mysql_query_rules (rule_id,active,digest,cache_ttl,apply) VALUES (5,1, '0xBF001A0C13781C1D' ,2000,1); Query OK, 1 row affected (0.00 sec) Admin> LOAD MYSQL QUERY RULES TO RUNTIME;SAVE MYSQL QUERY RULES TO DISK; [root@localhost ~]# sysbench --num-threads=16 --max-requests=0 --max-time=60 --test=/usr/share/doc/sysbench/tests/db/oltp.lua --mysql- user=application --mysql-password=app --mysql-db=test --mysql-host=127.0.0.1 --mysql-port=6033 --oltp-table-size=10000 --oltp-read-only=on --oltp-skip-trx=on --oltp-point-selects=100 --oltp-simple-ranges=1 --oltp-sum-ranges=1 --oltp-order-ranges=1 --oltp-distinct-ranges=1 run | grep 'read/write requests' read/write requests: 238680 (3956.42 per sec.) Admin> SELECT count_star,sum_time,hostgroup,digest,digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC; +------------+-----------+-----------+--------------------+----------------------------------------------------------------------+ | count_star | sum_time | hostgroup | digest | digest_text | +------------+-----------+-----------+--------------------+----------------------------------------------------------------------+ | 140512 | 632180517 | 1 | 0xBF001A0C13781C1D | SELECT c FROM sbtest1 WHERE id=? | | 3372 | 18351846 | 1 | 0xF7D3CD60704822A0 | SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? ORDER BY c | | 3372 | 17739689 | 1 | 0x877EEAAFADF3DDF2 | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? ORDER BY c | | 3372 | 17709660 | 1 | 0xAF7A51977DD56217 | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? | | 3372 | 15646777 | 1 | 0x3E268CF3E75DB831 | SELECT SUM(K) FROM sbtest1 WHERE id BETWEEN ? AND ?+? | | 196688 | 0 | -1 | 0xBF001A0C13781C1D | SELECT c FROM sbtest1 WHERE id=? | +------------+-----------+-----------+--------------------+----------------------------------------------------------------------+
  28. 28. © 2017 Percona28 ProxySQL - Features - Query Cache Admin> SHOW VARIABLES LIKE 'mysql-query_cache%'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | mysql-query_cache_size_MB | 256 | +---------------------------+-------+ 1 row in set (0.00 sec) Admin> SET mysql-query_cache_size_MB=512; Query OK, 1 row affected (0.00 sec) Admin> LOAD MYSQL VARIABLES TO RUNTIME; Query OK, 0 rows affected (0.00 sec) Admin> SAVE MYSQL VARIABLES TO DISK; Query OK, 72 rows affected (0.03 sec)
  29. 29. © 2017 Percona29 ProxySQL - Features - Query Cache Admin> SELECT * FROM stats_mysql_global WHERE Variable_Name LIKE 'Query_Cache%'; +--------------------------+----------------+ | Variable_Name | Variable_Value | +--------------------------+----------------+ | Query_Cache_Memory_bytes | 4469785 | -- Resultset armazenado no QC | Query_Cache_count_GET | 542750 | -- Número de GET’s executados no QC | Query_Cache_count_GET_OK | 441122 | -- Número de GET’s que retornaram OK (Query estava em cache e nao estava expirada) | Query_Cache_count_SET | 101626 | -- Número de Resulset’s inseridos no QC | Query_Cache_bytes_IN | 19613818 | -- Bytes escritos no QC | Query_Cache_bytes_OUT | 85136546 | -- Bytes lidos do QC | Query_Cache_Purged | 100257 | -- Número de queries Purged | Query_Cache_Entries | 1369 | -- Queries atualmente no QC +--------------------------+----------------+
  30. 30. © 2017 Percona30 ProxySQL - Features - Integrações ▪MHA (sem alterar DNS ou VIP) •https://www.percona.com/blog/2016/09/13/proxysql-and-mha-integration/ ▪Galera / Percona XtraDB Cluster •https://www.percona.com/blog/2016/09/15/proxysql-percona-cluster-galera- integration/
  31. 31. © 2017 Percona31 Estamos Contratando !!! - Senior Support Engineer - Brazil - Americas - Inglês fluente - Manjar de MySQL percona.com/careers
  32. 32. © 2017 Percona32 Perguntas?
  33. 33. © 2017 Percona33 DATABASE PERFORMANCE MATTERS Database Performance MattersDatabase Performance MattersDatabase Performance MattersDatabase Performance MattersDatabase Performance Matters Obrigado!

×