温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-05-06 12:00:01 来源:亿速云 阅读:350 作者:三月 栏目: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 -tnl State      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  -P6032 Welcome to the MariaDB monitor.  Commands end with ; or \g. Your MySQL connection id is 2 Server 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;

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

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: 0 transaction_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: 0 transaction_persistent: 1           fast_forward: 0                backend: 1               frontend: 1        max_connections: 10000 2 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实行读写分离,很多读者朋友肯定多少有一定的了解,如需获取更多的行业知识信息 ,可以持续关注我们的行业资讯栏目的。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI