千家信息网

ProxySQL如何帮助MySQL实行读写分离

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,本文主要给大家介绍ProxySQL如何帮助MySQL实行读写分离,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下ProxySQL如何帮助MySQ
千家信息网最后更新 2024年11月11日ProxySQL如何帮助MySQL实行读写分离

本文主要给大家介绍ProxySQL如何帮助MySQL实行读写分离,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下ProxySQL如何帮助MySQL实行读写分离吧。

ProxySQL是一个基于C++开发的高性能轻量级产品,是一款强大的mysql的中间件,他可以实现多种方式的读写分离。

Master IP:172.16.75.4 CentOS 7.5D server_id:401

Slave IP:172.16.75.3 CentOS 7.5C server_id:301

1.首先,yum安装即可,然后启动,启动端口为6032(我的proxysql安装在了master上);

[root@slave2 ~]# ss -tnlState      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port             LISTEN     0      50                           *:3306                                     *:*                 LISTEN     0      128                          *:111                                      *:*                 LISTEN     0      128                          *:6032                                     *:*                 LISTEN     0      128                          *:6033                                     *:*                 LISTEN     0      128                          *:6033                                     *:*                 LISTEN     0      128                          *:6033                                     *:*                 LISTEN     0      128                          *:6033                                     *:*

2.使用mysql客户端工具登录proxysql,用户名和密码都是admin,端口为6032,默认不允许localhost登录,所以要用127.0.0.1IP地址登录;

[root@slave2 ~]# mysql -uadmin  -padmin -h227.0.0.1  -P6032Welcome to the MariaDB monitor.  Commands end with ; or \g.Your MySQL connection id is 2Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show databases;+-----+---------------+-------------------------------------+| seq | name          | file                                |+-----+---------------+-------------------------------------+| 0   | main          |                                     || 2   | disk          | /var/lib/proxysql/proxysql.db       || 3   | stats         |                                     || 4   | monitor       |                                     || 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |+-----+---------------+-------------------------------------+5 rows in set (0.00 sec)

3.主要介绍其中mian库和monitor库;

MySQL [(none)]> show tables from main;+--------------------------------------------+| tables                                     |+--------------------------------------------+| global_variables                           || mysql_collations                           || mysql_group_replication_hostgroups         || mysql_query_rules                          || mysql_query_rules_fast_routing             || mysql_replication_hostgroups               || mysql_servers                              |  插入监控节点,master节点和slave节点| mysql_users                                || proxysql_servers                           || runtime_checksums_values                   || runtime_global_variables                   || runtime_mysql_group_replication_hostgroups || runtime_mysql_query_rules                  || runtime_mysql_query_rules_fast_routing     || runtime_mysql_replication_hostgroups       || runtime_mysql_servers                      || runtime_mysql_users                        || runtime_proxysql_servers                   || runtime_scheduler                          || scheduler                                  |+--------------------------------------------+20 rows in set (0.00 sec)

4.在mysql_servers表中有几个重要的属性:

hostgroup_id:组ID,用于区分master和slave;

hostname:后端master和slave的IP地址;

port:后端master和slave的IP端口,默认3306;

MySQL [main]> insert into mysql_servers (hostgroup_id,hostname,port) values (10,'172.16.75.4',3306),(20,'172.16.75.3',3306);Query OK, 2 rows affected (0.02 sec) MySQL [main]> load mysql servers to runtime;Query OK, 0 rows affected (0.01 sec) MySQL [main]> save mysql servers to disk;Query OK, 0 rows affected (0.06 sec)

注意:

1.设置的master的hostgroup_id为10(写组);

2.设置的slave的hostgroup_id为20(读组);

3.每次在proxysql执行完操作之后,需要手动加载至内存上,然后手动保存至磁盘上,表名中的"_"改为空格; mysql_servers à mysql servers

5.在master上授权一个监控用户,用于监控后端的节点(注意:是master的mysql,不是Proxysql);

这个用户需要的权限:replication client和replication slave

MariaDB [(none)]> grant replication client,replication slave on *.* to 'monitor'@'%' identified by '123456';Query OK, 0 rows affected (0.02 sec)

6.在proxysql上加入该节点;

MySQL [main]> set mysql-monitor_username='monitor';Query OK, 1 row affected (0.00 sec) MySQL [main]> set mysql-monitor_password='123456';Query OK, 1 row affected (0.00 sec) MySQL [main]> load mysql variables to runtime;Query OK, 0 rows affected (0.00 sec) MySQL [main]> save mysql variables to disk;Query OK, 95 rows affected (0.03 sec)

通过查看表mysql_server_ping_log了解后端云服务器状态信息;

MySQL [main]> select * from mysql_server_ping_log limit 1,10;+-------------+------+------------------+----------------------+----------------------------------------------------------------------+| hostname    | port | time_start_us    | ping_success_time_us | ping_error                                                           |+-------------+------+------------------+----------------------+----------------------------------------------------------------------+| 172.16.75.4 | 3306 | 1541505676594192 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) || 172.16.75.3 | 3306 | 1541505686592082 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  || 172.16.75.4 | 3306 | 1541505686594872 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) || 172.16.75.3 | 3306 | 1541505696592635 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  || 172.16.75.4 | 3306 | 1541505696595442 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) || 172.16.75.3 | 3306 | 1541505706593101 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  || 172.16.75.4 | 3306 | 1541505706596427 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) || 172.16.75.3 | 3306 | 1541505716593471 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  || 172.16.75.4 | 3306 | 1541505716596416 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) || 172.16.75.3 | 3306 | 1541505726593810 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  |+-------------+------+------------------+----------------------+----------------------------------------------------------------------+10 rows in set (0.00 sec)

7.对后端定义的云服务器的分组进行读组和写组的设定,mysql_replication_hostgroups表中添加定义即可,通过查看monitor库中的mysql_server_read_only_log表查看后端节点是否具有read_only权限;

MySQL [main]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values (10,20);Query OK, 1 row affected (0.00 sec) MySQL [main]> load mysql servers to runtime;Query OK, 0 rows affected (0.00 sec) MySQL [main]> save mysql servers to disk;Query OK, 0 rows affected (0.03 sec) MySQL [main]> select * from monitor.mysql_server_read_only_log limit 3;+-------------+------+------------------+-----------------+-----------+-------+| hostname    | port | time_start_us    | success_time_us | read_only | error |+-------------+------+------------------+-----------------+-----------+-------+| 172.16.75.4 | 3306 | 1541506648164762 | 766             | 0         | NULL  || 172.16.75.3 | 3306 | 1541506648162822 | 3585            | 1         | NULL  || 172.16.75.3 | 3306 | 1541506649664049 | 993             | 1         | NULL  |+-------------+------+------------------+-----------------+-----------+-------+3 rows in set (0.00 sec)

8.至此,基本配置完毕,我们在后端的master上创建两个用户账户,在proxysql上添加不同的hostgroup_id,完成基于不同用户之间进行读写分离;

Master mysql:

MariaDB [(none)]> grant all on *.* to 'reader'@'%' identified by  '123456';Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> grant all on *.* to 'writer'@'%' identified by  '123456';Query OK, 0 rows affected (0.00 sec)


Proxysql:

MySQL [main]> insert into mysql_users (username,password,default_hostgroup) values ('reader','123456',20),('writer','123456',10);Query OK, 2 rows affected (0.00 sec) MySQL [main]> load mysql users to runtime;Query OK, 0 rows affected (0.01 sec) MySQL [main]> save mysql users to disk;Query OK, 0 rows affected (0.03 sec) MySQL [main]> select * from mysql_users\G*************************** 1. row ***************************              username: reader              password: 123456                active: 1               use_ssl: 0     default_hostgroup: 20        default_schema: NULL         schema_locked: 0transaction_persistent: 1          fast_forward: 0               backend: 1              frontend: 1       max_connections: 10000*************************** 2. row ***************************              username: writer              password: 123456                active: 1               use_ssl: 0     default_hostgroup: 10        default_schema: NULL         schema_locked: 0transaction_persistent: 1          fast_forward: 0               backend: 1              frontend: 1       max_connections: 100002 rows in set (0.00 sec)

8.任意一台主机,测试基于用户的读写分离机制;

[root@slave2 ~]# mysql -uwriter -h272.16.75.4 -P6033 -p123456 -e 'select @@server_id';+-------------+| @@server_id |+-------------+|         401 |+-------------+[root@slave2 ~]# mysql -ureader -h272.16.75.4 -P6033 -p123456 -e 'select @@server_id';+-------------+| @@server_id |+-------------+|         301 |+-------------+

9.基于SQL语句实现读写分离;

需要在mysql_query_rules表中添加两条正则表达式的规则;

MySQL [main]> 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);Query OK, 2 rows affected (0.00 sec) MySQL [main]> load mysql query rules to runtime;Query OK, 0 rows affected (0.00 sec) MySQL [main]> save mysql query rules to disk;Query OK, 0 rows affected (0.02 sec)

10.任意一台主机测试基于SQL语句读写分离的机制;

[root@slave2 ~]# mysql -ureader -h272.16.75.4 -P6033 -p123456 -e 'set @@autocommit=0;\start transaction;\use hellodb;\insert into coc (ID,ClassID,CourseID) values (100,100,100);\select @@server_id;\commit;'+-------------+| @@server_id |+-------------+|         301 |+-------------+

Master中的hellodb数据库进行查看;

MariaDB [hellodb]> select * from coc;+----+---------+----------+| ID | ClassID | CourseID |+----+---------+----------+|  1 |       1 |        2 ||  2 |       1 |        5 ||  3 |       2 |        2 ||  4 |       2 |        6 ||  5 |       3 |        1 ||  6 |       3 |        7 ||  7 |       4 |        5 ||  8 |       4 |        2 ||  9 |       5 |        1 || 10 |       5 |        9 || 11 |       6 |        3 || 12 |       6 |        4 || 13 |       7 |        4 || 14 |       7 |        3 |+----+---------+----------+14 rows in set (0.00 sec) MariaDB [hellodb]> select * from coc;+-----+---------+----------+| ID  | ClassID | CourseID |+-----+---------+----------+|   1 |       1 |        2 ||   2 |       1 |        5 ||   3 |       2 |        2 ||   4 |       2 |        6 ||   5 |       3 |        1 ||   6 |       3 |        7 ||   7 |       4 |        5 ||   8 |       4 |        2 ||   9 |       5 |        1 ||  10 |       5 |        9 ||  11 |       6 |        3 ||  12 |       6 |        4 ||  13 |       7 |        4 ||  14 |       7 |        3 || 100 |     100 |      100 |+-----+---------+----------+15 rows in set (0.00 sec)

看完以上关于ProxySQL如何帮助MySQL实行读写分离,很多读者朋友肯定多少有一定的了解,如需获取更多的行业知识信息 ,可以持续关注我们的行业资讯栏目的。

用户 节点 帮助 端口 登录 监控 不同 主机 信息 地址 手动 服务器 机制 权限 端的 笔者 行业 语句 服务 测试 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库行锁加锁和释放 网络技术服务类公司成都 数据库技术中台 金昌网络安全支队 数据库及其建立过程面试 服务器加cpu需要提升卡吗 枣庄网络安全中标 网络安全对军人有哪些影响 web软件用什么数据库 网络技术2020年学习 华为青岛软件开发云洗心得体会 战略论坛网络安全人才培养体系 数据库原理及应用课程感受 java多线程测试数据库 财政一体化软件开发公司 专利数据库检索表达式 网络安全责任部门怎么填 初中毕业学什么软件开发 服务器代理跨域 上海软件开发设施有哪些 网络技术应用工作怎么样 国家统计局都发布什么数据库 山西戴尔服务器续保维护 宝成杰迈互联网科技有限公司 数据库算法服务上市公司 三种数据库类型有哪些 软件开发文档六性审查 国际服的原神一般用什么服务器好 软件开发和销售的账务处理 不能链接到数据服务器
0