MySQL读写分离部署实践
作者:杨了个杨8982
文章介绍了如何配置和使用ProxySQL进行MySQL主从复制集群的部署,包括环境准备、安装ProxySQL、配置主从服务器、设置读写分离、用户认证、监控和性能优化等步骤
1.环境准备
配置主从复制的 MySQL 集群(1 主多从)Mysql主从复制部署
开放必要的网络端口:
- ProxySQL 默认监听端口:6032(管理端口)、6033(客户端连接端口)
- MySQL 主从服务器端口(默认 3306)
2. 安装 ProxySQL
# 添加YUM仓库配置 wget https://repo.proxysql.com/ProxySQL/repo_pub_key -O /etc/pki/rpm-gpg/RPM-GPG-KEY-ProxySQL rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-ProxySQL sudo tee /etc/yum.repos.d/proxysql.repo <<EOF [proxysql] name= ProxySQL YUM repository baseurl=http://repo.proxysql.com/ProxySQL/proxysql-2.4.x/centos/\$releasever enabled=1 EOF sudo yum install proxysql -y
3. 配置 ProxySQL
通过管理接口连接到 ProxySQL
# 启动 ProxySQL 服务 systemctl start proxysql systemctl enable proxysql yum install mysql -y mysql -u admin -padmin -h 127.0.0.1 -P6032
3.1配置 MySQL 主从服务器
use main; -- 添加主库 INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, '主库IP', 3306); -- 添加从库(多个从库重复此步骤) INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '从库1IP', 3306); INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '从库2IP', 3306); -- 检查添加结果 select * from main.mysql_servers; -- 应用配置 LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;
3.2配置读写分离规则
-- 写操作路由到主库(hostgroup_id=10) INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply) VALUES (1, 1, '^INSERT|^UPDATE|^DELETE|^REPLACE|^CREATE|^ALTER|^DROP', 10, 1); -- 读操作路由到从库(hostgroup_id=20) INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply) VALUES (2, 1, '^SELECT', 20, 1); -- 应用配置 load mysql query rules to runtime; load admin variables to runtime; save mysql query rules to disk; save admin variables to disk;
3.3 配置 MySQL 用户认证
-- 添加MySQL客户端用户(与MySQL实际用户保持一致)
INSERT INTO mysql_users(username, password, default_hostgroup)
VALUES ('业务用户名', '业务用户密码', 10);
-- 查询账户添加结果
select * from mysql_users;
-- 应用配置
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;3.4 配置监控用户(可选但推荐)
-- 在MySQL主从服务器上创建监控用户 GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'proxysql'@'%' IDENTIFIED BY '监控用户密码'; flush privileges; -- 在ProxySQL中配置监控用户 set mysql-monitor_username='proxysql'; set mysql-monitor_password='监控用户密码'; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK;
4.验证配置
检查服务器状态:
SELECT * FROM mysql_servers; SELECT * FROM runtime_mysql_servers;
检查查询规则:
SELECT * FROM mysql_query_rules; SELECT * FROM runtime_mysql_query_rules;
5.客户端连接 ProxySQL
主机:ProxySQL服务器IP 端口:6033 用户名:业务用户名 密码:业务用户密码 mysql -uroot -p'Asdf#1234' -P6033 -h 127.0.0.1
6.性能优化建议
-- 调整连接池大小(根据实际情况调整) UPDATE global_variables SET variable_value=1000 WHERE variable_name='mysql-threads'; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK; -- 启用压缩(减少网络传输) UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-connections_compress'; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK;
7.监控与维护
查看服务器状态:
-- 查看主从服务器状态 SELECT hostgroup_id, hostname, port, status FROM runtime_mysql_servers; -- 查看查询统计 SELECT hostgroup, count_star, sum_time, first_seen, last_seen FROM stats_mysql_query_digest;
监控 ProxySQL 性能:
# 使用内置监控命令 proxysql-admin --help # 查看系统状态 top -p $(pgrep proxysql)
8.故障处理
-- 将某个从库提升为主库(假设从库IP为192.168.1.101) UPDATE mysql_servers SET hostgroup_id=10 WHERE hostname='192.168.1.101'; LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; -- 配置主从自动切换 -- 定义主从复制组(hostgroup_id 10=主库,20=从库) INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup) VALUES (10, 20); LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
