前言
环境: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等,如下图所示:
方法一、读写分离
可以给开发人员提供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只读吗?
欢迎回答。