用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 StateRecv-QSend-QLocalAddress:PortPeerAddress:Port LISTEN050*:3306*:* LISTEN0128*:111*:* LISTEN0128*:6032*:* LISTEN0128*:6033*:* LISTEN0128*:6033*:* LISTEN0128*:6033*:* LISTEN0128*:6033*:*
2.使用mysql客户端工具登录proxysql,用户名和密码都是admin,端口为6032,默认不允许localhost登录,所以要用127.0.0.1IP地址登录;
[root@slave2~]#mysql-uadmin-padmin-h227.0.0.1-P6032 WelcometotheMariaDBmonitor.Commandsendwith; or\g. YourMySQLconnectionidis2 Serverversion:5.5.30(ProxySQLAdminModule) Copyright(c)2000,2018,Oracle,MariaDBCorporationAbandothers. Type'help; 'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement. MySQL[(none)]> showdatabases; +-----+---------------+-------------------------------------+ |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| +-----+---------------+-------------------------------------+ 5rowsinset(0.00sec)
3.主要介绍其中mian库和monitor库;
MySQL[(none)]> showtablesfrommain; +--------------------------------------------+ |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| +--------------------------------------------+ 20rowsinset(0.00sec)
4.在mysql_servers表中有几个重要的属性:
hostgroup_id:组ID,用于区分master和slave;
hostname:后端master和slave的IP地址;
port:后端master和slave的IP端口,默认3306;
MySQL[main]> insertintomysql_servers(hostgroup_id,hostname,port)values(10,'172.16.75.4',3306),(20,'172.16.75.3',3306); QueryOK,2rowsaffected(0.02sec) MySQL[main]> loadmysqlserverstoruntime; QueryOK,0rowsaffected(0.01sec) MySQL[main]> savemysqlserverstodisk; QueryOK,0rowsaffected(0.06sec)
注意:
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)]> grantreplicationclient,replicationslaveon*.*to'monitor'@'%'identifiedby'123456'; QueryOK,0rowsaffected(0.02sec)
6.在proxysql上加入该节点;
MySQL[main]> setmysql-monitor_username='monitor'; QueryOK,1rowaffected(0.00sec) MySQL[main]> setmysql-monitor_password='123456'; QueryOK,1rowaffected(0.00sec) MySQL[main]> loadmysqlvariablestoruntime; QueryOK,0rowsaffected(0.00sec) MySQL[main]> savemysqlvariablestodisk; QueryOK,95rowsaffected(0.03sec)
通过查看表mysql_server_ping_log了解后端云服务器状态信息;
MySQL[main]> select*frommysql_server_ping_loglimit1,10; +-------------+------+------------------+----------------------+----------------------------------------------------------------------+ |hostname|port|time_start_us|ping_success_time_us|ping_error| +-------------+------+------------------+----------------------+----------------------------------------------------------------------+ |172.16.75.4|3306|1541505676594192|0|Accessdeniedforuser'monitor'@'172.16.75.4'(usingpassword:YES)| |172.16.75.3|3306|1541505686592082|0|Host'172.16.75.4'isnotallowedtoconnecttothisMariaDBserver| |172.16.75.4|3306|1541505686594872|0|Accessdeniedforuser'monitor'@'172.16.75.4'(usingpassword:YES)| |172.16.75.3|3306|1541505696592635|0|Host'172.16.75.4'isnotallowedtoconnecttothisMariaDBserver| |172.16.75.4|3306|1541505696595442|0|Accessdeniedforuser'monitor'@'172.16.75.4'(usingpassword:YES)| |172.16.75.3|3306|1541505706593101|0|Host'172.16.75.4'isnotallowedtoconnecttothisMariaDBserver| |172.16.75.4|3306|1541505706596427|0|Accessdeniedforuser'monitor'@'172.16.75.4'(usingpassword:YES)| |172.16.75.3|3306|1541505716593471|0|Host'172.16.75.4'isnotallowedtoconnecttothisMariaDBserver| |172.16.75.4|3306|1541505716596416|0|Accessdeniedforuser'monitor'@'172.16.75.4'(usingpassword:YES)| |172.16.75.3|3306|1541505726593810|0|Host'172.16.75.4'isnotallowedtoconnecttothisMariaDBserver| +-------------+------+------------------+----------------------+----------------------------------------------------------------------+ 10rowsinset(0.00sec)
7.对后端定义的云服务器的分组进行读组和写组的设定,mysql_replication_hostgroups表中添加定义即可,通过查看monitor库中的mysql_server_read_only_log表查看后端节点是否具有read_only权限;
MySQL[main]> insertintomysql_replication_hostgroups(writer_hostgroup,reader_hostgroup)values(10,20); QueryOK,1rowaffected(0.00sec) MySQL[main]> loadmysqlserverstoruntime; QueryOK,0rowsaffected(0.00sec) MySQL[main]> savemysqlserverstodisk; QueryOK,0rowsaffected(0.03sec) MySQL[main]> select*frommonitor.mysql_server_read_only_loglimit3; +-------------+------+------------------+-----------------+-----------+-------+ |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| +-------------+------+------------------+-----------------+-----------+-------+ 3rowsinset(0.00sec)
8.至此,基本配置完毕,我们在后端的master上创建两个用户账户,在proxysql上添加不同的hostgroup_id,完成基于不同用户之间进行读写分离;
Master mysql:
MariaDB[(none)]> grantallon*.*to'reader'@'%'identifiedby'123456'; QueryOK,0rowsaffected(0.01sec) MariaDB[(none)]> grantallon*.*to'writer'@'%'identifiedby'123456'; QueryOK,0rowsaffected(0.00sec)
Proxysql:
MySQL[main]> insertintomysql_users(username,password,default_hostgroup)values('reader','123456',20),('writer','123456',10); QueryOK,2rowsaffected(0.00sec) MySQL[main]> loadmysqluserstoruntime; QueryOK,0rowsaffected(0.01sec) MySQL[main]> savemysqluserstodisk; QueryOK,0rowsaffected(0.03sec) MySQL[main]> select*frommysql_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 2rowsinset(0.00sec)
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]> insertintomysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values
(1,1,'^SELECT.*FORUPDATE$',10,1),(2,1,'^SELECT',20,1); QueryOK,2rowsaffected(0.00sec) MySQL[main]> loadmysqlqueryrulestoruntime; QueryOK,0rowsaffected(0.00sec) MySQL[main]> savemysqlqueryrulestodisk; QueryOK,0rowsaffected(0.02sec)
10.任意一台主机测试基于SQL语句读写分离的机制;
[root@slave2~]#mysql-ureader-h272.16.75.4-P6033-p123456-e'set@@autocommit=0; \ starttransaction; \ usehellodb; \ insertintococ(ID,ClassID,CourseID)values(100,100,100); \ select@@server_id; \ commit; ' +-------------+ |@@server_id| +-------------+ |301| +-------------+
Master中的hellodb数据库进行查看;
MariaDB[hellodb]> select*fromcoc; +----+---------+----------+ |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| +----+---------+----------+ 14rowsinset(0.00sec) MariaDB[hellodb]> select*fromcoc; +-----+---------+----------+ |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| +-----+---------+----------+ 15rowsinset(0.00sec)
以上就是关于用ProxySQL实现MySQL读写分离的介绍,上述SQL语句具有一定的参考价值,有需要的朋友可以了解看看,希望对大家有帮助,想要了解更多可以继续浏览网络其他相关的文章。
文本转载自网络
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 用ProxySQL怎样实现MySQL读写分离?
本文地址: https://pptw.com/jishu/652012.html