学习目标和内容
1
、能够理解读写分离的目的
2
、能够描述读写分离的常见实现方式
3
、能够通过项目框架配置文件实现读写分离
4
、能够通过中间件实现读写分离
一、背景描述及其方案设
计
1
、业务背景描述
时间:
2014.6.-2015.9
发布产品类型:互联网动态站点 商城
用户数量:
10000-12000
(用户量猛增)
PV
:
100000-500000
(
24
小时访问次数总和)
QPS
:
50-100*
(每秒访问次数)
DAU
:
2000
(每日活跃⽤户数)
之前业务中是单台
MySQL
提供服务,使用多台MySQL数据库务器,降低单台压力,实现集群架构的稳定性和高可用性
数据的一致性
完整性
replication通过业务比对和分析发现,随着活跃用户数增多,读取数据的请求变多,故着重解决读取数据的压力
2
、模拟运维设计方案

根据以上业务需求,在之前业务架构的基础上实现数据的读写分离

二、
MySQL
读写分离介
绍
1
、读写分离的目的
数据库负载均衡
:
当数据库请求增多时,单例数据库不能够满足业务需求。需要进行数据库实例的扩容。多台数据库同时相应请求。也就是说需要对数据库的请求,进行
负载均衡
但是由于数据库服务特殊原因,数据库扩容基本要求为:
数据的一致性和完整性
。所以要
保证多台数据库实例的数据一致性和完整性
,以
MySQL
为例来说,官方提供了
主从复制机制
。
读写分离:
数据库的负载均衡不同于其他服务的负载均衡,数据要求一致性。
基于主从复制的基础上,常见的数据库负载均衡使用的是读写分离方式。写入主数据库,读取到从数据库
。可以认为
数据库读写分离,是一种特殊的负载均衡实现。
实际业务中,读写分离存在的一个问题,不够实时性。
对于要求实时性高的业务
①缓存
写主库
写缓存
读缓存
②可以读主
③添加完数据之后,有一个跳转等待的时间(
5s
),数据正在审核中
2
、读写分离常见的实现方式
①业务代码的读写分离
需要在业务代码中,判断数据操作是读还是写,读连接从数据服务器操作,写连接主数据库服务器操作以当前LNMP
为例,需要通过
PHP
代码实现读写分离
②中间件代理方式的读写分离
在业务代码中,数据库的操作,不直接连接数据库,而是先请求到中间件服务器(代理)由代理服务器,判断是读操作去从数据服务器,写操作去主数据服务器

也就是如下图示架构

问:如何选择?
①业务实现读写分离,操作方便,成本低,当前的开发框架基本支持读写分离
②中间件代理服务器,除了能够实现读写分离,还可以作为数据库集群的管理平台
三、
MySQL
读写分离案
列实现
0
、搭建
M-S
复制
主从复制的原理 :主服务器开启
bin-log
(记录了写操作) 从服务器获取到主服务器的bin-log
记录到
relay-log中。从服务器在通过异步的线程方式,对于
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
配置文件内容

注意重启
mysql
使配置生效
③制作一个完整的备份
如果确认主从的数据库,默认开始数据是一致的,可以不做备份

④查看
master
上的
bin-log
及其
position
位置

查看并记录
File
的值,
Position
的值。之后需要在从服务 器上,指向这些信息

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
=
'slave1'
,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
记录的
bi