Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL读写分离部署

MySQL读写分离部署实践

作者:杨了个杨8982

文章介绍了如何配置和使用ProxySQL进行MySQL主从复制集群的部署,包括环境准备、安装ProxySQL、配置主从服务器、设置读写分离、用户认证、监控和性能优化等步骤

1.环境准备

配置主从复制的 MySQL 集群(1 主多从)Mysql主从复制部署

开放必要的网络端口:

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;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文