@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
ProxySQL
High Performance & High Availability
Proxy for MySQL
René Cannaò
rene@sysown.com
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
GA
Stable and production ready
version 0.2
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Genesis: main motivations
rewrite queries
cache frequent reads
solving/finding the answer for
DEVs vs DBAs
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Open Source proxies for MySQL
MySQL Proxy
HAProxy
http://tinyurl.com/ptjmzde
Now also MaxScale
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
MySQL Proxy
Pros:
customizable
expandable
acceptable performance
Cons:
CPU intensive
Not really reliable
Not maintained
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
HAProxy
Pros:
very stable
high performance
mature software
Cons:
Layer 7 proxy only for HTTP
Doesn’t understand the MySQL Protocol
Layer 4 for other services
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Proxy for rewrite and caching?
MySQL Proxy with:
Lua script
External caching
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
ProxySQL
Network database proxy that sits transparently
between the application and the database to:
empower the DBAs
improve operation
understand and improve performance
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
The right way!
Designed by a DBA for DBAs
Experience in a variety of setups
Experience in very large production environments
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Features
Some of the most interesting features:
on-the-fly rewrite of queries
caching reads outside the database server
connection pooling and multiplexing
complex query routing and read/write split
load balancing
real time statistics
Monitoring
High Availability and Scalability
Seamless failover
Firewall
Query throttling
query timeout
runtime reconfiguration
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Hostgroups and Query Routing
All backends are grouped into hostgroups
Hostgroups have logical functionalities
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Hostgroups example #1
HostGroup0 (HG0): Write masters
HostGroup1( HG1): Read slaves
Read/Write split
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Hostgroups example #2
HG0: main write masters
HG1: main read slaves
HG2: reporting slaves
HG3: ad-hoc queries slaves
HG4: data warehouse write masters
HG5: data warehouse read slaves
HG6: remote site servers
HG7: test servers
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Support for heterogeneous setups
Hostgroups have logical functionalities
No replication relationship between hostgroups
ProxySQL is not replication aware by design,
yet it monitors replication
A query is routed to a single hostgroup
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Basic design
HG0
HG2
HG1
ProxySQLAPP
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Basic design , example #2
HG0
HG2
HG1
ProxySQL
APP1
APP2
APP3
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Internals diagram
HG0
HG1
APP1 ProxySQL
Queries
cache
Queries
Processor
APP2
APP3
Thread#1
Thread#2
Thread#3
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Queries Processor
Rewrite queries
Defines what to cache
Defines the hostgroup target
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Queries rules
Complex rules to match incoming traffic.
Regex on query
username
schemaname
(a lot more in the roadmap)
Rules can be chained
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Queries cache
Caching on the wire
Internal key/value storage
In memory only
Pattern based
Expired by timeout
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Queries Cache Benchmark
Benchmark on a 4 cores server
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Queries Rewrite
Rewrite on the wire
Regex match/replace
Optionally cached
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Queries Rewrite Benchmark
Ref: http://tinyurl.com/oan4528
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Users Authentication
HG0
HG1
APP1 ProxySQL
Queries
cache
Query
Processor
APP2
APP3
Thread#1
Thread#2
Thread#3
Users Auth
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Users Authentication
Credentials stored in the proxy
User login always possible (even without backends)
Max connections
Security enhancement in roadmap:
different credentials on backends and frontends
internal mapping
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Hostgroup Manager
and Connections Pool
HG0
HG1
APP1 ProxySQL
Queries
cache
Query
Processor
APP2
APP3
Thread#1
Thread#2
Thread#3
Users Auth
Connection
Pool
Hostgroup
Manager
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Hostgroups Manager
Management of servers
Track servers status
Tightly integrated with the connections pool
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Connections Pool
Reduced the overhead of creating new connections, and
are recycled when not in use
One to many connections
Multiplexing & maximum connections
Auto-reconnect and automatic re-execution of queries
Failover management
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Multiplexing
Reduce the number of connections against mysqld
(configurable)
Many clients connections (tens of thousands) can use few
backend connections (few hundreds)
Order by waiting time
Few edge cases not handled correctly: open a feature request if you hit any
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Auto-reconnect and re-execution
Automatic detection of failures
Graceful handling
Auto-reconnect when possible
Pause until a backend becomes
available
Re-execution of queries
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Failover management
Seamless switchover:
http://www.proxysql.com/2015/09/proxysql-tutorial-seamles
s-replication.html
Managed by external process
Switchover in less than 1 second
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Monitoring Module
HG0
HG1
APP1 ProxySQL
Queries
cache
Query
Processor
APP2
APP3
Thread#1
Thread#2
Thread#3
Users Auth
Connection
Pool
Hostgroup
Manager
Monitoring
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Monitoring Module
It monitors backends and collects metrics
Monitors replication lag and shun hosts
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Admin Interface
HG0
HG1
APP1 ProxySQL
Queries
cache
Query
Processor
APP2
APP3
Thread#1
Thread#2
Thread#3
Users Auth
Connection
Pool
Hostgroup
Manager
Admin
Monitoring
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Admin Interface
Allows runtime configuration
Exports internal statuses
It uses MySQL protocol
Configuration possible from any client/tool
using MySQL API
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Admin Interface
mysql> show databases;
+-----+---------+------------------+
| seq | name | file |
+-----+---------+------------------+
| 0 | main | |
| 2 | disk | /tmp/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
| 5 | myhgm | |
+-----+---------+------------------+
5 rows in set (0.00 sec)
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Admin Interface
mysql> SHOW TABLES FROM main;
+-------------------+
| tables |
+-------------------+
| mysql_servers |
| mysql_users |
| mysql_query_rules |
| global_variables |
| mysql_collations |
| debug_levels |
+-------------------+
6 rows in set (0.01 sec)
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Admin Interface
mysql> SHOW TABLES FROM stats;
+--------------------------------+
| tables |
+--------------------------------+
| stats_mysql_query_rules |
| stats_mysql_commands_counters |
| stats_mysql_processlist |
| stats_mysql_connection_pool |
| stats_mysql_query_digest |
| stats_mysql_query_digest_reset |
| stats_mysql_global |
+--------------------------------+
7 rows in set (0.00 sec)
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Admin Interface
mysql> SHOW TABLES FROM monitor;
+----------------------------------+
| tables |
+----------------------------------+
| mysql_server_connect |
| mysql_server_connect_log |
| mysql_server_ping |
| mysql_server_ping_log |
| mysql_server_replication_lag_log |
+----------------------------------+
5 rows in set (0.00 sec)
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Queries cache rules
proxysql-admin> SELECT match_pattern ,
negate_match_pattern neg , destination_hostgroup hs_id ,
cache_ttl ttl FROM mysql_query_rules WHERE
replace_pattern IS NULL ORDER BY rule_id ;
+---------------------+------+-------+------+
| match_pattern | neg | hs_id | ttl |
+---------------------+------+-------+------+
| ^SELECT | 1 | 0 | -1 |
| s+FORs+UPDATEs*$ | 0 | 0 | -1 |
| .* | 0 | 1 | 30 |
+---------------------+------+-------+------+
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Queries rewrite rules
proxysql-admin> SELECT match_pattern m, replace_pattern
r , destination_hostgroup hs_id , cache_ttl ttl FROM
mysql_query_rules WHERE replace_pattern IS NOT NULLG
m: ^SELECT(| DISTINCT) c FROM sbtest WHERE id BETWEEN
(.*) AND (.*) ORDER BY c
r: SELECT c FROM sbtest WHERE id BETWEEN 2 AND 3
hs_id: 1
ttl: 30
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Deploy ProxySQL
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Location, location, location
ProxySQL sits between the application and the
database systems
Where is exactly the best location?
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Basic design
HG0
HG2
HG1
APP
APP
ProxySQL
Very low latency using
Unix Domain Socket
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Basic design
HG0
HG2
HG1
APP1
ProxySQL
APP2
ProxySQL
APP3
ProxySQL
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
High Availability
HG0
HG2
HG1
APP1
ProxySQL
APP2
ProxySQL
APP3
ProxySQL
HG0
ProxySQL
ProxySQL
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
HG0
HG2
HG1
APP1
ProxySQL
APP3
ProxySQL
ProxySQL
ProxySQL
Complex Potential Setups
APP2
ProxySQL
ProxySQL
HG0
HG0
HG0
HG1
ProxySQL
ProxySQL
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Hostgroup reconfiguration
HG0
HG1
1
43
ProxySQLAPP 2
Remove host :
all the connections to server2 are terminated
1
Add host :
New connections to HG1 can use also server1
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Failover
2 phases process:
remove host
add host
Fully supported
Seamless failover in under 1 second
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Failover : 2 phases task
HG0
HG1
1
43ProxySQLAPP 2
1.Connections to an empty hostgroup are put on hold
2
2.Connections to HG0 are resumed
Connections to HG1 were never stopped
1. remove host
2. add host
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Distributed failover
Multiple ProxySQL are available in a network
Failover managed by an external process that:
remove host from each ProxySQL instance
add new host into each ProxySQL instance
Manager is not part of ProxySQL.
Ex: MHA or MySQL Utilities
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
APP1
ProxySQL
APP2
ProxySQL
Distributed failover : remove host
HG0
1
HG1
32 4
MHA
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
APP1
ProxySQL
APP2
ProxySQL
Distributed failover : add host
HG0
1
HG1
3 4
MHA
2
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
New features in roadmap
Improved security (SSL support, SQL injection
detection, frontend/backend users, etc) ;
GUI;
Prepared statements;
Support for multiple backends (postgres, redis,
mongo) ;
Enhanced monitoring and statistics;
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Try it!
Source code on GitHub:
https://github.com/sysown/proxysql
Binaries on GitHub:
https://github.com/sysown/proxysql-binaries
Forum:
https://groups.google.com/forum/#!forum/proxysql
Tutorial on:
http://www.proxysql.com
@proxysql
http://proxysql.com
https://github.com/sysown/proxysql/sysown.com
Please contact me
Thanks!
Feedback, feature requests, contribution:
rene.cannao@gmail.com
rene@sysown.com
@rene_cannao
@proxysql

ProxySQL - High Performance and HA Proxy for MySQL