MySQL读写分离
1、读写分离的目的
数据库负载均衡:
当数据库请求增多时,单例数据库不能够满足业务 需求。需要进行数据库实例的扩容。多台数据库同时相 应请求。也就是说需要对数据库的请求,进行负载均衡 但是由于数据库服务特殊原因,数据库扩容基本要 求为:数据的一致性和完整性。所以要保证多台数据库 实例的数据一致性和完整性,以MySQL为例来说,官方 提供了主从复制机制。读写分离:
数据库的负载均衡不同于其他服务的负载均衡,数 据要求一致性。基于主从复制的基础上,常见的数据库 负载均衡使用的是读写分离方式。写入主数据库,读取 到从数据库。可以认为数据库读写分离,是一种特殊的 负载均衡实现。 实际业务中,读写分离存在的一个问题,不够实时性。 对于要求实时性高的业务 ①缓存 写主库 写缓存 读缓存 ②可以读主 ③添加完数据之后,有一个跳转等待的时间(5s),数 据正在审核中2、读写分离常见的实现方式
①业务代码的读写分离
需要在业务代码中,判断数据操作是读还是写,读连接 从数据服务器操作,写连接主数据库服务器操作 以当前LNMP为例,需要通过PHP代码实现读写分离。②中间件代理方式的读写分离
在业务代码中,数据库的操作,不直接连接数据库,而 是先请求到中间件服务器(代理) 由代理服务器,判断是读操作去从数据服务器,写操作 去主数据服务器, 也就是如下图示架构: 问:如何选择? ①业务实现读写分离,操作方便,成本低,当前的开发 框架基本支持读写分离 ②中间件代理服务器,除了能够实现读写分离,还可以 作为数据库集群的管理平台MySQL读写分离案列实现
0、搭建M-S复制: 主从复制的原理 :主服务器开启bin-log(记录了写操 作) 从服务器获取到主服务器的bin-log 记录到relaylog中。从服务器在通过异步的线程方式,对于relay-log 进行重放操作。 1、master配置 ①在master服务器授权,slave服务器replication slave权限 slave是通过MySQL连接登录到master上来读取二进制 日志的,因此需要在 master上给slave配置权限 mysql > grant replication slave on *.* to 'slave'@'192.168.17.%'identified by '123456'; ②master服务器打开bin-log日志,并标识server-id shell > vim /etc/my.cnf 配置文件内容 [mysqld] log-bin = mysql-index server-id = 1 注意重启mysql使配置生效 ③制作一个完整的备份( 如果确认主从的数据库,默认开始数据是一致的,可以 不做备份 ) shell > mysqldump -uroot -p'123456' --alldatabases > /root/mysql.sql ④查看master上的bin-log及其position位置 mysql > show master status; 查看并记录File的值,Position的值。之后需要在从服务 器上,指向这些信息 File 记录到的bin-log日志文件名称 Position bin-log日志文件所记录的位置 2、slave配置 ①恢复备份文件( 如果slave和master的数据本身就是相同的,可以不选择 备份和导入 ) ②配置server-id,标识服务器 shell > vim /etc/my.cnf 配置文件内容 [mysqld] server-id=2 由于是克隆获取的MySQL实例,所以auto.conf里记录的 UUID一样,需要删除/usr/local/mysql/data/auto.conf 文件,否则主从无法识别互相身份,重启自动生成新的 即可。 ③配置slave replication mysql > stop slave; mysql> change master to master_host='192.168.17.101' ,master_user='sl ave1' ,master_password='123456' ,master_log_fi le='mysql-bin.000002' ,master_log_pos=333; mysql > start slave; 参数说明 master_host 主master的IP master_user 主master允许登录,拥有replication slave权限 master_password 用户的密码 需要通过mysql > show master status; 在master执行 master_log_file 主master记录的bin-log日志文件名称 master_log_pos 主master记录的bin-log日志文件对 应的位置 ④启动replication,并检查结果 mysql > show slave status\G; 查看到两个yes,主从复制成功。否则,查看显示最下面 信息,通过error信息进行排查问题。简单业务代码实现
示例语法代码: 将此代码上传到web服务器,测试是否可以实现读写分离。注意修改对应的连接地址、用户名称、密码等信息。 #命令行执行php代码的方式 #php需要提前配置环境变量 xxx.php为需要执行的php 脚本文件 shell > php xxx.php框架配置实现读写分离
①通过查看thinkphp5手册找到处理方案 ②修改项目配置文件 (一定要先去确定主从数据库的数据一致(tp5shop), 用户名称和密码可以进行登录使用) shell > vim /usr/local/nginx/html/tp5shop/application/da tabase.php 配置文件示例return [
// 数据库类型
'type' => 'mysql' ,
// 服务器地址
// 1、主从数据库的连接地址 主在前 从在后
'hostname' => '192.168.17.100,192.168.17.105' ,
// 2、主从数据库的名称、用户、密码一样的话,只 配置一份即可。如果不一样,按照先后顺序,逗号分隔
// 数据库名
'database' => 'tp5shop' ,
// 用户名
'username' => 'tp5shop' ,
// 密码
'password' => '$Abc3721' ,
// 端口
'hostport' => '3306' ,
// 连接
dsn 'dsn' => '' ,
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8' ,
// 数据库表前缀
'prefix' => 'tpshop_' ,
// 数据库调试模式
'debug' => true,
// 3、项目框架的业务代码实现读写分离,使用的是 分布式(主从服务器) 配置为1
// 数据库部署方式:0 集中式(单一服务器),1 分布 式(主从服务器)
'deploy' => 1,
// 4、数据库读写分离是业务代码实现的,配置为 true
// 数据库读写是否分离 主从式有效
'rw_separate' => true,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '' ,
// 是否严格检查字段是否存在
测试down主库,看从库是否可以访问。thinkphp5中, 如果slave宕机,master提供读服务。