安装依赖:

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,在功能和性能上都有一定的优势:

  1. 支持更多的负载均衡算法:Percona ProxySQL支持5种负载均衡算法,包括了原生ProxySQL的round-robin、first-available、lowest-latency和random算法,还新增了自适应负载均衡算法。
  2. 更好的SQL过滤和转发功能:Percona ProxySQL在SQL过滤和转发功能方面更加强大,支持根据多种条件过滤和转发SQL查询,包括SQL语句、客户端IP、用户名、数据库名、表名等条件。
  3. 更高的性能和稳定性:Percona ProxySQL在性能和稳定性方面做了一些优化和改进,支持更高的并发连接数和更快的查询速度,并且在故障转移和节点管理方面更加稳定可靠。
  4. 更好的监控和管理功能: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的一些基本配置项:

  1. log_level:指定ProxySQL的日志级别,可以是debug、info、notice、warning、error、critical或alert。
  2. admin_variables:指定ProxySQL监听的IP地址和端口,用于管理ProxySQL。这里监听了所有网卡的6032端口,并使用了默认的管理账号admin/admin。
  3. mysql_servers:指定ProxySQL管理的MySQL节点,包括主节点、从节点和只读节点,每个节点需要指定hostgroup_id、hostname、port、weight和max_connections等参数。
  4. 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中的作用如下:

  1. 读写分离:通过将读取流量分发到正确的服务器,可以实现读写分离。ProxySQL通过对mysql_replication_hostgroups的配置来控制读写请求的路由方式。
  2. 高可用性:使用mysql_replication_hostgroups可以在一个组中包含多个主从服务器,以实现高可用性。如果主服务器失效,则可以使用从服务器来替代。
  3. 负载均衡: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来进行读写分离:

  1. 配置ProxySQL的读写分离规则

ProxySQL使用规则来将读请求路由到只读节点,将写请求路由到主节点。您可以使用ProxySQL的配置文件来设置这些规则,或者使用ProxySQL提供的命令行工具和API。

例如,您可以使用以下命令来添加一个规则,将所有SELECT语句路由到只读节点:

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup) VALUES (1, 1, '^SELECT.*', 2);
  1. 配置主节点和只读节点的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);
  1. 配置连接池和线程池

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';
  1. 监控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)