关于MYSQL的读写的需求,大部分都是在跟读作战,怎么读写分离,是在应用上实现, 或者通过的dns 转接,还是通过简单的中间件实现, 实际上这和需求以及当时可以满足需求的技术以及功耗比有关, 当然这也和数据库的量有关,所以没有那个更好,各花入个眼,没有那个更....
m'n
由于在目前的企业中大批使用了proxysql 作为替代MHA中的VIP功能的方式,已适应目前的需求,所以自然对于读写分离和只读的需求的事情就需要通过proxysql 来实现. 至于proxysql 有多好用,这个不必再说,之前的几期已经阐明了.
今天会实现两个功能,
1 某个账号只能去读取从库,不能去主库进行操作
2 某个账号,可以进行读写分离的功能实现
首先2台MYSQL 主从是要做的,另外如果喜欢可以加上MHA,这里已经忽略上次几期对于 MYSQL replication cluster 和 Innodb cluster 与 PROXYSQL 之间的如何顺利配置和工作的问题,,直接跳到,配置账号的步骤.
在MYSQL 中配置只读账号.
insert into mysql_users(username,password,default_hostgroup,default_schema) values ('read_only','1234.com',601,'mysql');
不知道 601 的意思的同学可以参照前两篇文字里面的hostgroup 定义,这里里面600表示写库 601 表示读库 这里面可以自定义.
所以经过上面的设置后,通过read_only账号则一定会访问读库,而不会访问写库.
红色的位置已经标明我们已经通过这个账号直接到了读库,而不是写库.
第一个需求已经完成了,那就到了第二个需求,我需要进行读写,这里需要进行相关的匹配,这个需求主要需要考虑几点
1 哪些开头的语句需要转移到读库
2 需要对于语句出现在事务的读做特殊处理
3 需要确认读库和主库的之间是否有延迟
问题一个一个回答
1 select 语句,一定是SELECT 语句,当然在proxysql中绑定是需要注意的
2 这个是需要验证的
3 在proxysql中是有相关的配置,通过second behind master 参数来做比对
在继续下面的文字之前,个人觉得在大部分的读写分离目前还是采用应用逻辑来做的不少,当然也有中间件来做的,在实际当中还是应用逻辑配合中间件来做的更合理一些,完全一种技术想HOLD整个的场景是有疏漏的.
问题1 在mysql的 query rule 中增加关于select 开头的语句的去向
并加载到proxysql中,然后直接测试到底是不是select的查询去了从库
这里会进行一个标识方便确认,这里将主库的一个表和从库的对应的表的数据进行不一致的处理,让从库比主库多一条数据库.
下面截图是从中间件访问,不同的语句可以访问同一个表,到达不同的数据库,第一个是到达从库,因为从库比主库的表多一行数据, 而使用了for update后则语句直接到了主库.
这就回答了第二个问题,如果我们有事务,则业务场景是我们读取数据,并且马上根据数据的结果进行DML 操作,则需要在语句中增加 for update .
满足事务统一在主库进行的要求. 而一般的查询,在从库进行,进行相关的读写分离,和事务中特殊的SELECT 语句与普通SELECT 查询的分割.
最后 一个问题通过UPDATE mysql_servers SET max_replication_lag=3;
来设置判断主从之间的存在差异以及容忍的时间,这里设置了是3秒 ,当然有关于与各个服务器进行monitor的配置也要进行变动.
另外在多提一个问题,如果我有多个从库,那怎么让80%的查询到一个从库,让20%的查询到另一个从库,可以设置吗? 答可以