第12章 ProxySQL中间件
ProxySQL安装部署
1.安装ProxySQL--集群模式
yum localinstall proxysql-2.3.1-1-centos7.x86_64.rpm -y
2.修改ProxySQL配置文件支持集群模式
cat > /etc/proxysql.cnf << 'EOFF'
datadir="/var/lib/proxysql"
errorlog="/var/lib/proxysql/proxysql.log"
admin_variables=
{
admin_credentials="admin:admin;cluster_user:cluster_user"
mysql_ifaces="0.0.0.0:6032"
cluster_username="cluster_user"
cluster_password="cluster_user"
cluster_check_interval_ms=200
cluster_check_status_frequency=100
cluster_mysql_query_rules_save_to_disk=true
cluster_mysql_servers_save_to_disk=true
cluster_mysql_users_save_to_disk=true
cluster_proxysql_servers_save_to_disk=true
cluster_mysql_query_rules_diffs_before_sync=3
cluster_mysql_servers_diffs_before_sync=3
cluster_mysql_users_diffs_before_sync=3
cluster_proxysql_servers_diffs_before_sync=3
}
proxysql_servers=
(
{
hostname="10.0.0.51"
port=6032
weight=1
comment="ProxySQL-node1"
},
{
hostname="10.0.0.52"
port=6032
weight=1
comment="ProxySQL-node2"
},
{
hostname="10.0.0.53"
port=6032
weight=1
comment="ProxySQL-node3"
}
)
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:6033"
default_schema="information_schema"
stacksize=1048576
server_version="5.5.30"
connect_timeout_server=3000
monitor_username="monitor"
monitor_password="monitor"
monitor_history=600000
monitor_connect_interval=60000
monitor_ping_interval=10000
monitor_read_only_interval=1500
monitor_read_only_timeout=500
ping_interval_server_msec=120000
ping_timeout_server=500
commands_stats=true
sessions_sort=true
connect_retries_on_failure=10
}
mysql_servers =
(
)
mysql_users:
(
)
mysql_query_rules:
(
)
scheduler=
(
)
mysql_replication_hostgroups=
(
)
EOFF
配置解释:
# 数据目录路径
datadir="/var/lib/proxysql"
# 错误日志文件路径
errorlog="/var/lib/proxysql/proxysql.log"
# 管理变量配置块
admin_variables=
{
# 管理员凭证设置
admin_credentials="admin:admin;cluster_user:cluster_user"
# MySQL接口和端口
mysql_ifaces="0.0.0.0:6032"
# 集群用户名
cluster_username="cluster_user"
# 集群密码
cluster_password="cluster_user"
# 集群检查间隔(毫秒)
cluster_check_interval_ms=200
# 集群状态检查频率
cluster_check_status_frequency=100
# 将集群查询规则保存到磁盘
cluster_mysql_query_rules_save_to_disk=true
# 将集群MySQL服务器配置保存到磁盘
cluster_mysql_servers_save_to_disk=true
# 将集群MySQL用户配置保存到磁盘
cluster_mysql_users_save_to_disk=true
# 将集群ProxySQL服务器配置保存到磁盘
cluster_proxysql_servers_save_to_disk=true
# 同步前集群查询规则差异的次数
cluster_mysql_query_rules_diffs_before_sync=3
# 同步前集群MySQL服务器差异的次数
cluster_mysql_servers_diffs_before_sync=3
# 同步前集群MySQL用户差异的次数
cluster_mysql_users_diffs_before_sync=3
# 同步前集群ProxySQL服务器差异的次数
cluster_proxysql_servers_diffs_before_sync=3
# 开启调试模式
debug=true
}
# ProxySQL服务器配置
proxysql_servers=
(
{
hostname="10.0.0.51"
port=6032
weight=1
comment="ProxySQL-node1"
},
{
hostname="10.0.0.52"
port=6032
weight=1
comment="ProxySQL-node2"
},
{
hostname="10.0.0.53"
port=6032
weight=1
comment="ProxySQL-node3"
}
)
# MySQL变量配置
mysql_variables=
{
threads=4 # 线程数
max_connections=2048 # 最大连接数
default_query_delay=0 # 默认查询延迟
default_query_timeout=36000000 # 默认查询超时时间
have_compress=true # 启用压缩
poll_timeout=2000 # 轮询超时
interfaces="0.0.0.0:6033" # 接口配置
default_schema="information_schema" # 默认数据库模式
stacksize=1048576 # 栈大小
server_version="5.5.30" # 服务器版本
connect_timeout_server=3000 # 服务器连接超时
monitor_username="monitor" # 监控用户名
monitor_password="monitor" # 监控密码
monitor_history=600000 # 监控历史
monitor_connect_interval=60000 # 监控连接间隔
monitor_ping_interval=10000 # 监控Ping间隔
monitor_read_only_interval=1500 # 监控只读间隔
monitor_read_only_timeout=500 # 监控只读超时
ping_interval_server_msec=120000 # 服务器Ping间隔(毫秒)
ping_timeout_server=500 # 服务器Ping超时
commands_stats=true # 命令统计
sessions_sort=true # 会话排序
connect_retries_on_failure=10 # 连接失败重试次数
eventslog_filename = "/var/lib/proxysql/proxysql_events.log" # 事件日志文件路径
eventslog_default_log_level = 3 # 事件日志默认级别
}
# MySQL服务器配置(空)
mysql_servers =
(
)
# MySQL用户配置(空)
mysql_users:
(
)
# MySQL查询规则配置(空)
mysql_query_rules:
(
)
# 调度器配置(空)
scheduler=
(
)
# MySQL复制主从组配置(空)
mysql_replication_hostgroups=
(
)
3.启动服务
systemctl restart proxysql
4.检查节点信息
[root@db-51 ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
mysql> select * from proxysql_servers;
+-----------+------+--------+----------------+
| hostname | port | weight | comment |
+-----------+------+--------+----------------+
| 10.0.0.51 | 6032 | 1 | ProxySQL-node1 |
| 10.0.0.52 | 6032 | 1 | ProxySQL-node2 |
| 10.0.0.53 | 6032 | 1 | ProxySQL-node3 |
+-----------+------+--------+----------------+
3 rows in set (0.00 sec)
ProxySQL配置读写分离
1.配置读写组编号
1)查询分组信息
mysql -uadmin -padmin -h127.0.0.1 -P6032
select * from mysql_replication_hostgroups;
2)写入分组
mysql -uadmin -padmin -h127.0.0.1 -P6032
insert into mysql_replication_hostgroups
(writer_hostgroup, reader_hostgroup, comment)
values (10,20,'luffy');
3)再次查看
mysql -uadmin -padmin -h127.0.0.1 -P6032
mysql> select * from mysql_replication_hostgroups;
+------------------+------------------+------------+---------+
| writer_hostgroup | reader_hostgroup | check_type | comment |
+------------------+------------------+------------+---------+
| 10 | 20 | read_only | luffy |
+------------------+------------------+------------+---------+
1 row in set (0.00 sec)
4)生效配置
load mysql servers to runtime;
save mysql servers to disk;
命令解释:
load 立刻生效
save 保存到磁盘
5)check_type字段说明
ProxySQL会根据数据库的read_only的值对服务器进行分组
read_only=0的会被分到10号的writer组
read_only=1的会被分到20号的reader组
2.添加主机到PorxySQL
1)添加主机到读写组
mysql -uadmin -padmin -h127.0.0.1 -P6032
insert into mysql_servers(hostgroup_id,hostname,port) values
(10,'10.0.0.51',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values
(20,'10.0.0.52',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values
(20,'10.0.0.53',3306);
2)保存配置
load mysql servers to runtime;
save mysql servers to disk;
3)检查
select * from mysql_servers;
3.MySQL主库创建监控用户
grant replication client on *.* to monitor@'%' identified by '123';
select user,host from mysql.user;
4.ProxySQL修改variables表:
mysql -uadmin -padmin -h127.0.0.1 -P6032
set mysql-monitor_username='monitor';
set mysql-monitor_password='123';
生效配置
load mysql variables to runtime;
save mysql variables to disk;
5.ProxySQL查询监控日志
mysql -uadmin -padmin -h127.0.0.1 -P6032
select * from mysql_server_connect_log;
select * from mysql_server_ping_log;
select * from mysql_server_read_only_log;
select * from mysql_server_replication_lag_log;
6.MySQL主库配置应用用户
create user admin_user@'%' identified with mysql_native_password by 'admin_user';
grant all on *.* to admin_user@'%';
7.ProxySQL配置应用用户
mysql -uadmin -padmin -h127.0.0.1 -P6032
insert into mysql_users(username,password,default_hostgroup)
values('admin_user','admin_user',10);
select * from mysql_users\G
应用配置
load mysql users to runtime;
save mysql users to disk;
8.ProxySQL配置读写规则
mysql -uadmin -padmin -h127.0.0.1 -P6032
insert into
mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply)
values(1,1,'^select.*for update',10,1);
insert into
mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply)
values(2,1,'^select',20,1);
应用配置
load mysql query rules to runtime;
save mysql query rules to disk;
9.测试
mysql -uadmin_user -padmin_user -h10.0.0.51 -P6033 -e 'select@@server_id;'
mysql -uadmin_user -padmin_user -h10.0.0.52 -P6033 -e 'select@@server_id;'
mysql -uadmin_user -padmin_user -h10.0.0.53 -P6033 -e 'select@@server_id;'
mysql -uadmin_user -padmin_user -h10.0.0.51 -P6033 -e 'begin;select@@server_id;commit;'
mysql -uadmin_user -padmin_user -h10.0.0.52 -P6033 -e 'begin;select@@server_id;commit;'
mysql -uadmin_user -padmin_user -h10.0.0.53 -P6033 -e 'begin;select@@server_id;commit;'
更新: 2025-01-09 15:44:46