前言

环境:CentOS 7.9 、mysql 5.7 已配置好master、salve主从复制

读写分离

在大规模、高并发的企业环境中,为了缓解数据库的访问压力,我们一般的解决办法是对数据库进行读写分离,即前端用户对数据的增删改访问的是master主库,对数据的读取检索访问的salve库,这样就能大大减缓master主库的访问压力。

读写分离常见的实现方式

1、业务代码的读写分离

需要开发工程师在业务代码中,判断数据操作是读还是写,读则连接salve从库进行操作,写则连接master从库进行操作。目前大部分语言的框架中都有关于配置mysql的读写分离,其基本含义就是,代码判断传入SQL语句是否包含select,包含则可以则认为该语句是读操作,则连接salve从数据库,否则连接master主库,代码还可以可以实现当从salve库连接不上时链接master主库来读。

2、通过数据库中间件代理的方式实现读写分离

在业务代码和数据库中,添加了一个数据库中间件(代理),即业务代码首先连接中间件服务器,由中间件服务器判断数据操作是读还是写,读则连接salve从库进行操作,写则连接master从库进行操作。常见的mysql中间件有很多,如mycat、mysql router、Atlas、Proxysql等,如下图所示:

mysql 读写分离如何保证数据一致性 mysql5.7读写分离_数据库

方法一、读写分离

可以给开发人员提供2个不同的账号,如下:

master主库IP: 192.168.1.1	端口: 3306	数据库: web	用户名: web_w	密码: AAABBB001
授权: grant select,insert,update delete on 'web'.* to	'web_w'@'192.168.1.%'	identified by 'AAABBB001';

salve从库IP: 192.168.1.2	端口: 3306	数据库: web	用户名: web_r	密码: AAABBB001
授权: grant select on 'web'.* to	'web_r'@'192.168.1.%'	identified by 'AAABBB001';

此方法显然不够专业,但也能满足需求,只需开发在程序中DAL层调用不同的数据库用户即可。

方法二、读写分离

只给开发提供一个用户,即主从使用相同的用户账号,但授予不同的权限。

master主库IP: 192.168.1.1	端口: 3306	数据库: web	用户名: web	密码: AAABBB001
授权: grant select,insert,update delete on 'web'.* to	'web'@'192.168.1.%'	identified by 'AAABBB001';

此时,对salve从库撤销权限,如下:
revoke insert,update,delete on 'web'.* to	'web'@'192.168.1.%'	identified by 'AAABBB001';

或者忽略权限
在master主库配置文件/etc/my.cnf中[mysqld]下添加:
binlog-ignore-db = mysql					#等号两边有空格,指定mysql是因为mysql是储存权限的数据库
replication-ignore-db = mysql

方法三、设置salve从库只读

只给开发提供一个用户,即主从使用相同的用户账号,授予相同的权限,但设置salve从库为只读状态。

master主库IP: 192.168.1.1		端口: 3306		数据库: web		用户名: web		密码: AAABBB001
授权: grant select,insert,update delete on 'web'.* to	'web'@'192.168.1.%'	identified by 'AAABBB001';

此时配置salve从库只读:
vim /etc/mysql.cnf
[mysqld]
read-only

说明: read-only参数设置了salve从库只读,表示从库不允许被前端用户更新,但具有super权限的用户和来自线程的用户是具有对从库更新的权限的,如
root用户、主从复制的用户rep用户等.

企业中读写分离配置方案

我们可以在给开发人员提供一个web用户,限制master的权限的主从复制,同时为了保险还可以设置salve从库为只读状态,如下配置:

在master主库配置文件my.cnd中[mysqld]下添加:
binlog-ignore-db = mysql						#等号两边有空格,指定mysql是因为mysql是储存权限的数据库
replication-ignore-db = mysql

master主库创建用户并授权:
grant select,insert,update delete on 'web'.* to	'web'@'192.168.1.%'	identified by 'AAABBB001';

此时配置salve从库为只读read-only:
vim /etc/mysql.cnf
[mysqld]
read-only

疑问?

我们在master主库中的配置文件中添加了这两个参数binlog-ignore-db = mysql 和replication-ignore-db = mysql,那么master主库创建用户web的时候,从库有没有创建该用户呢?如果没有创建那么需要自己手动创建一个吗然后在设置从库为read-only只读吗?
欢迎回答。