【DevOps】Ubuntu20.04安装Mysql8.0代理ProxySQL

我们数据部门遇到一个问题,他们需要将一部分数据从美国的gcp服务器提取出来,发送到国内的阿里云服务器当中,原来是通过做两个网络之间做vpn,然后直接写到阿里云的数据库当中,一直用得好好的,不知道怎么回事,8月底突然不行了,经常出现连接超时。排查以后发现是丢包率上升到了10%,这完全没办法用了。只能想别的办法,如果两边拉专线,问题倒是解决了,成本上升很多,老板不会批。还好我们在香港还有一台别的服务器,测试了一下,从美国gcp服务器到香港服务器和香港到阿里云的服务器丢包率都很低。这下就有办法了,通过香港的服务器做一下代理,这样访问阿里云的数据库服务器就没有问题了。服务器之间通过openvpn打通成内网,这个就不说了,我们香港的服务器是ubuntu20.04,我提供一个详细的指南,介绍如何在 Ubuntu 20.04 上安装和配置 ProxySQL,以连接到远程的 MySQL 8 服务器。

1、准备工作

首先,更新系统包列表:

复制代码
sudo apt update
sudo apt upgrade -y

2、安装 ProxySQL

a. 添加 ProxySQL 仓库的 GPG 密钥:

复制代码
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 95B2EB9D

b. 添加 ProxySQL 仓库:

复制代码
echo deb https://repo.proxysql.com/ProxySQL/proxysql-2.3.x/$(lsb_release -sc)/ ./ | sudo tee /etc/apt/sources.list.d/proxysql.list

c. 更新包列表并安装 ProxySQL:

复制代码
sudo apt update
sudo apt install proxysql -y

3、配置 ProxySQL

a. 启动 ProxySQL 服务:

复制代码
sudo systemctl start proxysql

b. 检查 ProxySQL 状态:

复制代码
sudo systemctl status proxysql

c. 连接到 ProxySQL 管理界面:

复制代码
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

d. 配置远程 MySQL 服务器:

复制代码
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1, 'remote_mysql_ip', 3306);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

将 'remote_mysql_ip' 替换为您的远程 MySQL 服务器的 IP 地址。

e. 配置 ProxySQL 用户:

复制代码
INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('your_mysql_user', 'your_mysql_password', 1);
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

使用远程 MySQL 服务器上存在的用户名和密码。

f. 配置查询规则:

复制代码
INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*', 1, 1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

g. 设置监控用户:

在远程 MySQL 服务器上,您需要创建一个监控用户。连接到远程 MySQL 服务器并执行:

复制代码
CREATE USER 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'monitor_password';
GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%';
FLUSH PRIVILEGES;

然后,在 ProxySQL 中配置监控用户:

复制代码
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='monitor_password' WHERE variable_name='mysql-monitor_password';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

h. 启用监控:

复制代码
UPDATE global_variables SET variable_value='true' WHERE variable_name IN ('mysql-monitor_connect', 'mysql-monitor_ping', 'mysql-monitor_read_only_timeout', 'mysql-monitor_replication_lag_use_percona_heartbeat');
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

4、测试 ProxySQL 连接

a. 退出 ProxySQL 管理界面:

复制代码
EXIT;

b. 连接到 ProxySQL:

复制代码
mysql -u your_mysql_user -p -h 127.0.0.1 -P6033

使用之前配置的远程 MySQL 用户名和密码。

c. 测试连接:

复制代码
SHOW DATABASES;
USE your_database;
SHOW TABLES;

执行一些查询来确保连接正常工作。

5、修改 ProxySQL 管理密码

首先,连接到 ProxySQL 管理界面(使用默认密码):

复制代码
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

然后,执行以下 SQL 命令来更改管理密码:

复制代码
UPDATE global_variables SET variable_value='new_admin_password' WHERE variable_name='admin-admin_credentials';
LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

将 'new_admin_password' 替换为您想要设置的新密码。

为了确保新的管理密码在 ProxySQL 重启后仍然有效,您需要修改 ProxySQL 的配置文件。

编辑 ProxySQL 配置文件:

复制代码
sudo nano /etc/proxysql.cnf

找到以下行:

复制代码
admin_credentials="admin:admin"

将其修改为:

复制代码
admin_credentials="admin:new_admin_password"

保存并关闭文件。

为了使更改生效,重启 ProxySQL 服务:

复制代码
sudo systemctl restart proxysql

验证新密码,使用新密码连接到 ProxySQL 管理界面:

复制代码
mysql -u admin -pnew_admin_password -h 127.0.0.1 -P6032 --prompt='Admin> '

如果成功连接,说明密码已经成功更改。

安全建议

  • 使用强密码:确保选择一个强密码,包含大小写字母、数字和特殊字符。
  • 定期更改密码:建立一个定期更改管理密码的策略。
  • 限制访问:使用防火墙规则限制对 ProxySQL 管理端口(默认 6032)的访问。
  • 使用密码加密:考虑使用环境变量或密码管理工具来存储密码,而不是明文存储在配置文件中。

6、配置 ProxySQL 自启动

复制代码
sudo systemctl enable proxysql

7、优化和安全建议

  • 使用防火墙限制访问(如 UFW)
  • 监控 ProxySQL 日志文件(通常在 /var/log/proxysql.log)
  • 定期检查 ProxySQL 的状态和性能
  • 考虑使用 SSL/TLS 加密连接到远程 MySQL 服务器
  • 根据实际负载调整 ProxySQL 的配置参数

8、高级配置(可选)

a. 配置连接池:

复制代码
UPDATE global_variables SET variable_value='200' WHERE variable_name='mysql-max_connections';
UPDATE global_variables SET variable_value='100' WHERE variable_name='mysql-default_max_latency_ms';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

b. 配置读写分离(如果有多个 MySQL 服务器):

复制代码
INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup, comment) VALUES (1, 2, 'cluster1');
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

c. 配置查询缓存:

复制代码
UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-query_cache_size_MB';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

记住,这些高级配置应该根据您的具体需求和系统性能来调整。

相关推荐
新*1 小时前
ES 7.17 三节点 Docker 集群接入 IK 自定义词典:一次从丢插件到热更新的完整排障
运维·elasticsearch·docker·中文分词·ik分词
风翼靓崽1 小时前
jenkins搭建与简单使用
运维·jenkins
Z21-X21 小时前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
进击的荆棘1 天前
Linux系统——线程同步与互斥之线程池和安全
linux·运维·服务器·安全·单例模式·线程
瑞雪兆丰年兮1 天前
JavaWeb-day11-SpringBootWeb案例(文件上传)
java·运维·服务器·javaweb·oss
那明眸似水1 天前
云原生项目三:Docker秒级启动NextCloud个人网盘存储办公系统
linux·运维·docker·云原生·容器
小南家的青蛙1 天前
微服务体系下DevOps运维岗位面试方案设计
运维·面试·职场和发展·devops
知已难寻1 天前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
Alluxio2 天前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
Sayai2 天前
Neo4j 图数据质量检查实战:环路检测、孤立节点与连通分量,两条 Cypher 引出的数据体检清单(含变长路径性能陷阱)
运维·neo4j·图数据库·数据质量·cypher