ProxySQL集成MHA的单机部署和集群部署方式
创始人
2025-06-01 01:45:58
0

在这里插入图片描述
说明:MHA为主从复制的MySQL集群提供了主节点故障转移的功能,但是如果此时你需要实现读写分离的话,就需要引入其他技术组件了,ProxySQL就是个不错的选择,它可以通过 read_only 参数自动识别MySQL集群中的读节点和写节点,从而实现读与写的分离操作。如果担心 ProxySQL 会发生单点故障,下面文章同样提供了集群版的 ProxySQL 实现方案(通过 Keepalived 实现)。

安装 ProxySQL

备注:此次安装测试机内核版本为CentOS-7.4.1708

将安装包 mysql_cluster_ha_pack.zip 上传至集群所有服务器,并解压。
上传位置 /root/

点击获取安装包

一、单机版

1 安装Proxysql

cd /root/mysql_cluster_ha_pack/proxysql/rpms/proxysql
rpm -ivh *.rpm --force

2 安装mysql客户端

cd /root/mysql_cluster_ha_pack/proxysql/rpms/mysql_client
rpm -Uvh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-client-5.7.28-1.el7.x86_64.rpm

备注:如果失败尝试命令后面加 --nodeps --force 并重试。

3 配置

# 通过命令修改配置
sed -i 's/threads=4/threads=8/' /etc/proxysql.cnf
sed -i 's/max_connections=2048/max_connections=10000/' /etc/proxysql.cnf

4 MySQL创建用户

(mysql主节点)

-- 连接mysql,输入root的密码
mysql ‐uroot ‐p
CREATE USER 'monitor'@'%' IDENTIFIED BY "monitor@2023";
CREATE USER 'proxysql'@'%' IDENTIFIED BY "proxysql@2023";
GRANT ALL PRIVILEGES ON *.* TO 'monitor'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'proxysql'@'%';
FLUSH PRIVILEGES;
-- 查看所有MySQL的read_only配置,确保主节点为OFF,从节点为ON
show variables like "read_only";

5 启动

rm -rf /var/lib/proxysql/proxysql.db
systemctl start proxysql

登录proxysql管理界面

# 管理员身份登录 proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
# 修改写节点不提供读服务
set mysql-monitor_writer_is_also_reader='false';
# 添加角色
set mysql-monitor_username='monitor';
set mysql-monitor_password='monitor@2023';
INSERT INTO mysql_users(username,password,active,default_hostgroup,transaction_persistent ) VALUES ('proxysql','proxysql@2023',1,10,1);
# 添加后端节点 注意修改成对应的ip!
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.101',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.102',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.103',3306);
# 设置读写主机组
INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,check_type) VALUES (10,20,'read_only');
# 设置读写分离规则
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1), (2,1,'^SELECT',20,1);
# 保存启用
load mysql servers to runtime;
save mysql servers to disk;
load mysql users to runtime;
save mysql users to disk;
load mysql variables to runtime;
save mysql variables to disk;
load mysql query rules to runtime;
save mysql query rules to disk;

日志位置:/var/lib/proxysql/proxysql.log

6 查看集群状态

# 管理员身份登录 proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '# 状态校验
select hostgroup_id,hostname,port,status from runtime_mysql_servers;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbo93NKh-1679397678055)(C:\Users\dragon\AppData\Roaming\Typora\typora-user-images\image-20230315093506069.png)]

除了 hostname 其余应保持一致。

# 接着测试一下能否正常登入数据库 (测试命令执行多次,则会登录到不同的mysql节点上)
[root@ProxySQL-node1 ~]# mysql -uproxysql -pproxysql@2023 -h 127.0.0.1 -P6033 -e"select @@hostname"
+------------+
| @@hostname |
+------------+
| MGR-node1  |
+------------+# 最后在proxysql管理端查看读写分离情况
[root@ProxySQL-node ~]# mysql -uadmin -padmin -h 127.0.0.1 -P6032
..........
MySQL [(none)]> select hostgroup,username,digest_text,count_star from stats_mysql_query_digest;

二、集群版

1 安装Proxysql

(proxysql01、02)

cd /root/mysql_cluster_ha_pack/proxysql/rpms/proxysql
rpm -ivh *.rpm --force

2 安装mysql客户端

(proxysql01、02)

cd /root/mysql_cluster_ha_pack/proxysql/rpms/mysql_client
rpm -Uvh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-client-5.7.28-1.el7.x86_64.rpm

备注:如果失败尝试命令后面加 --nodeps --force 并重试。

3 配置

(proxysql01、02)

vim /etc/proxysql.cnf
# 替换部分
admin_variables=
{admin_credentials="admin:admin;cluster_kevin:proxy2023"mysql_ifaces="0.0.0.0:6032"cluster_username="cluster_kevin"cluster_password="proxy2023"cluster_check_interval_ms=1000cluster_check_status_frequency=10cluster_mysql_query_rules_save_to_disk=truecluster_mysql_servers_save_to_disk=truecluster_mysql_users_save_to_disk=truecluster_proxysql_servers_save_to_disk=truecluster_mysql_query_rules_diffs_before_sync=3cluster_mysql_servers_diffs_before_sync=3cluster_mysql_users_diffs_before_sync=3cluster_proxysql_servers_diffs_before_sync=3
}# 追加部分(注意修改IP)
proxysql_servers =                                    
({hostname="192.168.x.104"port=6032weight=1comment="proxysql01"},{hostname="192.168.x.105"port=6032weight=1comment="proxysql02"}
)
# 通过命令修改配置
sed -i 's/threads=4/threads=8/' /etc/proxysql.cnf
sed -i 's/max_connections=2048/max_connections=10000/' /etc/proxysql.cnf

4 MySQL创建用户

(mysql主节点)

-- 连接mysql,输入root的密码
mysql ‐uroot ‐p
CREATE USER 'monitor'@'%' IDENTIFIED BY "monitor@2023";
CREATE USER 'proxysql'@'%' IDENTIFIED BY "proxysql@2023";
GRANT ALL PRIVILEGES ON *.* TO 'monitor'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'proxysql'@'%';
FLUSH PRIVILEGES;
-- 查看所有MySQL的read_only配置,确保主节点为OFF,从节点为ON
show variables like "read_only";

5 启动

(proxysql01、02)

rm -rf /var/lib/proxysql/proxysql.db
systemctl start proxysql

登录proxysql管理界面(proxysql01)

# 管理员身份登录 proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
# 修改写节点不提供读服务
set mysql-monitor_writer_is_also_reader='false';
# 添加角色
set mysql-monitor_username='monitor';
set mysql-monitor_password='monitor@2023';
INSERT INTO mysql_users(username,password,active,default_hostgroup,transaction_persistent ) VALUES ('proxysql','proxysql@2023',1,10,1);
# 添加后端节点 注意修改成对应的ip!
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.101',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.102',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.103',3306);
# 设置读写主机组
INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,check_type) VALUES (10,20,'read_only');
# 设置读写分离规则
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1), (2,1,'^SELECT',20,1);
# 保存启用
load mysql servers to runtime;
save mysql servers to disk;
load mysql users to runtime;
save mysql users to disk;
load mysql variables to runtime;
save mysql variables to disk;
load mysql query rules to runtime;
save mysql query rules to disk;

日志位置:/var/lib/proxysql/proxysql.log

6 查看集群状态

(proxysql01、02)

# 管理员身份登录 proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '# 状态校验
select hostgroup_id,hostname,port,status from runtime_mysql_servers;

在这里插入图片描述

除了 hostname 其余应保持一致。

# 接着测试一下能否正常登入数据库 (测试命令执行多次,则会登录到不同的mysql节点上)
[root@ProxySQL-node1 ~]# mysql -uproxysql -pproxysql@2023 -h 127.0.0.1 -P6033 -e"select @@hostname"
+------------+
| @@hostname |
+------------+
| MGR-node1  |
+------------+# 最后在proxysql管理端查看读写分离情况
[root@ProxySQL-node ~]# mysql -uadmin -padmin -h 127.0.0.1 -P6032
..........
MySQL [(none)]> select hostgroup,username,digest_text,count_star from stats_mysql_query_digest;

7 Keepalived安装

1) 安装Keepalivedexit

(proxysql01、02)

cd /root/mysql_cluster_ha_pack/keepalived/rpms/gcc
rpm -Uvh *.rpm --nodeps --force
cd /root/mysql_cluster_ha_pack/keepalived/rpms/gcc-c++
rpm -Uvh *.rpm --nodeps --force
cd /root/mysql_cluster_ha_pack/keepalived
tar -zxf keepalived-2.2.7.tar.gz -C /usr/local/src
cd /usr/local/src/keepalived-2.2.7/
./configure --prefix=/usr/local/keepalived
make & make install
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
mkdir /etc/keepalived
# 监控脚本
cp /root/mysql_cluster_ha_pack/keepalived/proxysql_check.sh /etc/keepalived/proxysql_check.sh
chmod u+x /etc/keepalived/proxysql_check.sh

2) 配置

查看网卡名(proxysql01、02)

ifconfig

在这里插入图片描述

(proxysql01)

vim /etc/keepalived/keepalived.conf
# 仅需修改网卡名称和虚拟IP
! Configuration File for keepalivedvrrp_script chk_proxysql_port  {script "/usr/bin/sh /etc/keepalived/proxysql_check.sh"interval 2weight 1
}vrrp_instance VI_1 {state MASTERinterface ens192 #节点网卡名virtual_router_id 51priority 100advert_int 2authentication {auth_type PASSauth_pass keep2023}virtual_ipaddress {192.168.0.99/24 #虚拟IP,和外网的IP要一个网段}track_script {chk_proxysql_port}
}

(proxysql02)

vim /etc/keepalived/keepalived.conf
# 仅需修改网卡名称和虚拟IP
! Configuration File for keepalivedvrrp_script chk_proxysql_port  {script "sh /etc/keepalived/proxysql_check.sh"interval 2weight 1
}vrrp_instance VI_1 {state BACKUPinterface ens192 #节点网卡名virtual_router_id 51priority 99advert_int 2authentication {auth_type PASSauth_pass keep2023}virtual_ipaddress {192.168.0.99/24 #虚拟IP,和外网的IP要一个网段}track_script {chk_proxysql_port}
}

3) 启动

(proxysql01、02)

systemctl start keepalived

日志位置:/var/log/messages

相关内容

热门资讯

“截然不同”造句 51、他是有话不说,她是锋芒毕露,两者截然不同。52、总在期待截然不同的一年能够时来运转,一反既往,...
滑模的解释及造句 滑模的解释及造句  滑模拼音  【注音】: hua mo  滑模解释  【意思】:滑动模板的简称,是...
接种的解释及造句 接种的解释及造句  接种拼音  【注音】: jie zhong  接种解释  【意思】:把疫苗注射到...
刚愎自用造句   刚愎自用造句  1、哪知我们老板是个刚愎自用的人,我们将利害关系说破嘴了,他还是我行我素。  2...
讽刺的词语解释及造句 讽刺的词语解释及造句  词目  讽刺  拼音  fěng cì  基本解释  用比喻、夸张等手法对人...
妄自菲薄造句 妄自菲薄造句9篇妄自菲薄造句1  1、当我们应对挑战时,既不宜妄自尊大,也不可妄自菲薄。  2、我们...
丘陵的解释及造句 丘陵的解释及造句  丘陵拼音  【注音】: qiu ling  丘陵解释  【意思】:连绵成片的小山...
“天会”造句 201、 我儿子保罗曾经对我说过,那个在青年队的14岁小正太总有一天会成为一个超顶级球员的。202、...
妻室的解释及造句 妻室的解释及造句  妻室拼音  【注音】: qi shi  妻室解释  【意思】:<书>妻子。  妻...
复兴的解释及造句 复兴的解释及造句  复兴拼音  【注音】: fu xing  复兴解释  【意思】:(1)衰落后再兴...
“谈笑风生”造句 1、他们谈笑风生地走进了校长办公室。2、人少言寡语不一定大智大勇,谈笑风生不一定是不严肃。3、我们走...
闷气的拼音解释及造句 闷气的拼音解释及造句  闷气拼音  【注音】: men qi  闷气解释  【意思】:2(mēqì)...
听差的拼音解释及造句 听差的拼音解释及造句  听差拼音  【注音】: ting cha  听差解释  【意思】:旧时指在机...
帘子的拼音解释及造句 帘子的拼音解释及造句  帘子拼音  【注音】: lian zi  帘子解释  【意思】:<口>帘②:...
慢慢地如何造句 慢慢地如何造句(精选70句)  造句是指用词语组织句子,下面是小编整理的慢慢地如何造句(精选70句)...
司空见惯的意思是什么-词语用... 其实人生便像是是平日司空见惯的太阳,它日复一日地遵循着东升西落的轨道。那么,司空见惯的具体意思是什么...
用不容置疑怎么造句 用不容置疑怎么造句用不容置疑怎么造句1  一、一切不容置疑,男人的霸气通过一种温暖的手段淋淳尽臻地表...
鼻音的解释及造句 鼻音的解释及造句  鼻音拼音  【注音】: bi yin  鼻音解释  【意思】:口腔气流通路阻塞,...
以此为鉴的意思并造句 以此为鉴的意思并造句  以此为鉴是一个常见的汉语词汇,是什么意思呢?要怎么造句?以下是小编整理的以此...
生财之道的造句 生财之道的造句(精选50句)  造句指懂得并使用字词,按照一定的句法规则造出字词通顺、意思完整、符合...