安装依赖:
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)