#################
源码安装说明:https://github.com/sysown/proxysql/blob/v2.x/INSTALL.md
源码地址:https://github.com/sysown/proxysql
安装依赖:
Shortcut commands for installing pre-requisites: # RHEL / CentOS < 7: yum install -y automake bzip2 cmake make g++ gcc git openssl openssl-devel gnutls libtool patch libuuid-devel # CentOS 7.4+ / Fedora 28+: yum install -y automake bzip2 cmake make gcc-c++ gcc git openssl openssl-devel gnutls gnutls-devel libtool patch libuuid-devel # Debian / Ubuntu Based: apt-get install -y automake bzip2 cmake make g++ gcc git openssl libssl-dev libgnutls28-dev libtool patch uuid-dev
下载源码代码:
git clone https://github.com/sysown/proxysql
编译安装:
cd proxysql
make
make install
安装后结果:
数据文件:datadir="/var/lib/proxysql" 错误日志:errorlog="/var/lib/proxysql/proxysql.log" 配置文件:/etc/proxysql.cnf 账号密码:admin:admin 管理的端口号:6032
wget https://downloads.percona.com/downloads/proxysql2/proxysql2-2.5.1/source/tarball/proxysql2-2.5.1.tar.gz
wget https://github.com/sysown/proxysql/archive/refs/tags/2.5.2.tar.gz
Percona ProxySQL是Percona公司基于ProxySQL二次开发的MySQL代理工具,相比于原生的ProxySQL,在功能和性能上都有一定的优势:
-
支持更多的负载均衡算法:Percona ProxySQL支持5种负载均衡算法,包括了原生ProxySQL的round-robin、first-available、lowest-latency和random算法,还新增了自适应负载均衡算法。
-
更好的SQL过滤和转发功能:Percona ProxySQL在SQL过滤和转发功能方面更加强大,支持根据多种条件过滤和转发SQL查询,包括SQL语句、客户端IP、用户名、数据库名、表名等条件。
-
更高的性能和稳定性:Percona ProxySQL在性能和稳定性方面做了一些优化和改进,支持更高的并发连接数和更快的查询速度,并且在故障转移和节点管理方面更加稳定可靠。
-
更好的监控和管理功能:Percona ProxySQL提供了更多的监控和管理功能,包括查询日志、慢查询日志、连接数统计、节点状态监控等,可以更方便地对MySQL集群进行管理和维护。
总之,Percona ProxySQL相比于原生的ProxySQL在功能和性能上都有一定的优势,特别是在负载均衡算法、SQL过滤和转发、性能和稳定性、监控和管理等方面更加强大和灵活。如果需要一个高性能、高可用性的MySQL代理工具,Percona ProxySQL是一个不错的选择。
ProxySQL是一款高性能、高可用性的SQL代理服务器,可以作为数据库中间件,在MySQL集群中提供负载均衡、故障转移、读写分离等功能。ProxySQL的配置包含多个方面,下面是一个简单的ProxySQL配置示例,介绍了一些基本配置项:
# 启用ProxySQL的日志功能 log_level = debug # 监听的本地IP地址和端口 admin_variables = { admin_credentials = 'admin:admin' mysql_ifaces = '0.0.0.0:6032' } # 集群节点的配置 mysql_servers = { # 读写分离的主节点 { hostgroup_id = 10 hostname = 'master.example.com' port = 3306 weight = 100 max_connections = 1000 }, # 读写分离的从节点 { hostgroup_id = 20 hostname = 'slave.example.com' port = 3306 weight = 100 max_connections = 1000 }, # 只读节点 { hostgroup_id = 30 hostname = 'readonly.example.com' port = 3306 weight = 100 max_connections = 1000 } } # 配置SQL查询规则 mysql_query_rules = ( # 根据查询类型和表名选择不同的节点 { rule_id = 10 active = 1 match_pattern = '^SELECT .* FROM table1' destination_hostgroup = IFNULL(nullif(substring_index(user(),'@',-1),''),10) apply = 1 }, { rule_id = 20 active = 1 match_pattern = '^SELECT .* FROM table2' destination_hostgroup = IFNULL(nullif(substring_index(user(),'@',-1),''),20) apply = 1 }, # 根据客户端IP地址选择不同的节点 { rule_id = 30 active = 1 match_pattern = '.*' destination_hostgroup = IF(client_ip IN ('192.168.1.1','192.168.1.2'), 30, 10) apply = 1 } )
这个配置文件包含了ProxySQL的一些基本配置项:
-
log_level
:指定ProxySQL的日志级别,可以是debug、info、notice、warning、error、critical或alert。 -
admin_variables
:指定ProxySQL监听的IP地址和端口,用于管理ProxySQL。这里监听了所有网卡的6032端口,并使用了默认的管理账号admin/admin。 -
mysql_servers
:指定ProxySQL管理的MySQL节点,包括主节点、从节点和只读节点,每个节点需要指定hostgroup_id、hostname、port、weight和max_connections等参数。 -
mysql_query_rules
:指定ProxySQL的SQL查询规则,可以根据查询类型、表名、客户端IP地址等条件选择不同的MySQL节点,包括rule_id、active、match_pattern、destination_hostgroup和apply等参数。
这只是一个简单的ProxySQL配置
在ProxySQL的配置文件中,可以通过mysql_servers和mysql_replication_hostgroups参数来实现读写分离。
mysql_servers参数定义了所有MySQL节点的信息,包括它们的IP地址、端口、权重和状态等。其中,权重用于指定节点在负载均衡时的权重值,状态用于指定节点的可用性。例如:
mysql_servers = { { 'hostgroup': 10, 'hostname': 'db1.example.com', 'port': 3306, 'weight': 100, 'max_connections': 1000, 'status': 'ONLINE', 'compression': 1 }, { 'hostgroup': 10, 'hostname': 'db2.example.com', 'port': 3306, 'weight': 100, 'max_connections': 1000, 'status': 'ONLINE', 'compression': 1 }, { 'hostgroup': 20, 'hostname': 'db3.example.com', 'port': 3306, 'weight': 100, 'max_connections': 1000, 'status': 'ONLINE', 'compression': 1 }, { 'hostgroup': 20, 'hostname': 'db4.example.com', 'port': 3306, 'weight': 100, 'max_connections': 1000, 'status': 'ONLINE', 'compression': 1 } }
mysql_replication_hostgroups参数定义了所有MySQL节点的复制拓扑结构,包括主节点和从节点的信息。其中,主节点的hostgroup_id为10,从节点的hostgroup_id为20。例如:
mysql_replication_hostgroups = { '10': {'hostgroup': 10}, '20': {'hostgroup': 20}, }
通过以上两个参数的配合,可以实现读写分离。在ProxySQL中,读操作使用SELECT语句,写操作使用INSERT、UPDATE、DELETE语句。可以通过proxySQL规则来指定不同操作的处理方式。例如:
mysql_query_rules = ( { 'rule_id': 1, 'active': 1, 'match_pattern': '^SELECT.*FOR UPDATE|.*LOCK IN SHARE MODE$', 'destination_hostgroup': 10, 'apply': 1 }, { 'rule_id': 2, 'active': 1, 'match_pattern': '^SELECT.*', 'destination_hostgroup': 20, 'apply': 1 }, { 'rule_id': 3, 'active': 1, 'match_pattern': '^INSERT.*|.*UPDATE.*|.*DELETE.*', 'destination_hostgroup': 10, 'apply': 1 } )
上面的规则指定了SELECT语句使用hostgroup 20的节点来处理,INSERT、UPDATE和DELETE语句使用hostgroup 10的节点来处理,从而实现了读写分离的效果。在这个例子中,hostgroup 20的节点为只读节点,hostgroup 10的节点为读写节点。
mysql_replication_hostgroups是ProxySQL中用于配置MySQL主从复制的组别,它是一个数组,每个元素都表示一个组。ProxySQL使用这些组别将读取流量分发到正确的服务器。每个组别都包含一个或多个MySQL主库服务器和一个或多个MySQL从库服务器。通常,一个组只包含一个主服务器和多个从服务器。
每个组都有一个唯一的ID和名称,以及其他属性,例如:read_only、write_only、max_replication_lag等。
具体来说,mysql_replication_hostgroups在ProxySQL中的作用如下:
-
读写分离:通过将读取流量分发到正确的服务器,可以实现读写分离。ProxySQL通过对mysql_replication_hostgroups的配置来控制读写请求的路由方式。
-
高可用性:使用mysql_replication_hostgroups可以在一个组中包含多个主从服务器,以实现高可用性。如果主服务器失效,则可以使用从服务器来替代。
-
负载均衡:ProxySQL使用mysql_replication_hostgroups对流量进行分发,以确保所有服务器都得到充分利用,以实现负载均衡。
下面是一个mysql_replication_hostgroups的示例配置:
mysql_replication_hostgroups=( { writer_hostgroup=10, reader_hostgroup=20, comment="MySql Host Group 1", backup_writer_hostgroup=30, offline_hostgroup=40, max_writers=2, writer_is_also_reader=1, check_type="read_only", max_replication_lag=30, use_slave_connection=0, max_connections_behind=100 }, { writer_hostgroup=20, reader_hostgroup=10, comment="MySql Host Group 2", backup_writer_hostgroup=30, offline_hostgroup=40, max_writers=2, writer_is_also_reader=1, check_type="read_only", max_replication_lag=30, use_slave_connection=0, max_connections_behind=100 })
该配置中有两个组别,每个组别都有一个读服务器和一个写服务器,组别10表示写操作的主服务器,组别20表示读操作的从服务器。
其中,writer_hostgroup指定了写服务器的组别ID,reader_hostgroup指定了读服务器的组别ID,comment是对该组的说明,backup_writer_hostgroup指定了备份写服务器的组别ID,offline_hostgroup指定了该组宕机时应使用的组别ID,max_writers指定了在写组中可以同时有多少个主服务器,writer_is_also_reader指定了在写组中的主服务器是否也可以充当读服务器,check_type指定了用于检查从服务器的连接类型,max_replication_lag指定了从服务器的最大延迟时间,use_slave_connection指定了是否使用从服务器连接来检查从服务器的健康状况,max_connections_behind指定了从服务器可以落后于主服务器的最大连接数
ProxySQL是一个开源的高性能SQL代理,可以在数据库和应用程序之间充当中间层。它提供了很多功能,包括负载均衡、故障转移、自动故障检测等。其中一个最常用的功能是读写分离,可以通过ProxySQL来优化数据库的读写操作。
以下是一些最佳实践,可以帮助您最佳地利用ProxySQL来进行读写分离:
- 配置ProxySQL的读写分离规则
ProxySQL使用规则来将读请求路由到只读节点,将写请求路由到主节点。您可以使用ProxySQL的配置文件来设置这些规则,或者使用ProxySQL提供的命令行工具和API。
例如,您可以使用以下命令来添加一个规则,将所有SELECT语句路由到只读节点:
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup) VALUES (1, 1, '^SELECT.*', 2);
- 配置主节点和只读节点的hostgroup
在ProxySQL中,您需要为主节点和只读节点配置hostgroup。主节点应该配置为hostgroup 0,只读节点可以配置为hostgroup 1或更高的数字。
例如,您可以使用以下命令将主节点添加到hostgroup 0:
INSERT INTO mysql_servers (hostname, port, hostgroup_id, max_connections) VALUES ('master-db.example.com', 3306, 0, 1000);
然后,您可以使用以下命令将只读节点添加到hostgroup 1:
INSERT INTO mysql_servers (hostname, port, hostgroup_id, max_connections) VALUES ('read-db1.example.com', 3306, 1, 500);
- 配置连接池和线程池
ProxySQL有两个重要的配置参数:连接池和线程池。连接池定义了与数据库建立的连接数,而线程池定义了同时处理的线程数。
您需要根据您的数据库负载和硬件资源来配置这些参数。通常,您应该将连接池和线程池设置为适当的值,以充分利用您的硬件资源,并防止过度使用数据库服务器。
例如,您可以使用以下命令设置最大连接数和线程数:
UPDATE global_variables SET variable_value='10000' WHERE variable_name='mysql-max_connections'; UPDATE global_variables SET variable_value='500' WHERE variable_name='mysql-thread_pool_size';
- 监控ProxySQL
最后,您需要监控ProxySQL以确保它正常运行。您可以使用ProxySQL提供的各种工具来监视连接数、查询速度、错误率等指标。
例如,您可以使用以下命令查看ProxySQL的当前连接数:
SELECT COUNT(*) FROM stats_mysql_connection_pool;
mysql> show databases; +-----+---------------+-------------------------------------+ | seq | name | file | +-----+---------------+-------------------------------------+ | 0 | main | | | 2 | disk | /var/lib/proxysql/proxysql.db | | 3 | stats | | | 4 | monitor | | | 5 | stats_history | /var/lib/proxysql/proxysql_stats.db | +-----+---------------+-------------------------------------+ 5 rows in set (0.00 sec) mysql> use main Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------------------------------------------+ | tables | +----------------------------------------------------+ | global_variables | | mysql_aws_aurora_hostgroups | | mysql_collations | | mysql_firewall_whitelist_rules | | mysql_firewall_whitelist_sqli_fingerprints | | mysql_firewall_whitelist_users | | mysql_galera_hostgroups | | mysql_group_replication_hostgroups | | mysql_hostgroup_attributes | | mysql_query_rules | | mysql_query_rules_fast_routing | | mysql_replication_hostgroups | | mysql_servers | | mysql_users | | proxysql_servers | | restapi_routes | | runtime_checksums_values | | runtime_global_variables | | runtime_mysql_aws_aurora_hostgroups | | runtime_mysql_firewall_whitelist_rules | | runtime_mysql_firewall_whitelist_sqli_fingerprints | | runtime_mysql_firewall_whitelist_users | | runtime_mysql_galera_hostgroups | | runtime_mysql_group_replication_hostgroups | | runtime_mysql_hostgroup_attributes | | runtime_mysql_query_rules | | runtime_mysql_query_rules_fast_routing | | runtime_mysql_replication_hostgroups | | runtime_mysql_servers | | runtime_mysql_users | | runtime_proxysql_servers | | runtime_restapi_routes | | runtime_scheduler | | scheduler | +----------------------------------------------------+ 34 rows in set (0.00 sec)
#################################