我们数据部门遇到一个问题,他们需要将一部分数据从美国的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;

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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部