您的位置:首页 > 数据库 > MySQL

day 62 mysql读写分离与分库分表

2018-01-25 22:48 274 查看
17.9 MySQL读写分离

1、mysql读写分离常用方法

基于程序代码内部实现:在代码中对select操作分发到从库;其它操作由主库执行;是目前生产环境应用最广泛,知名的如DISCUZ X2。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支。
基于中间代理层实现:代理一般是位于客户端和服务器之间,代理服务器接到客户端请求后通过判断然后转发到后端数据库。
典型的代理程序是mysql-proxy,它是mysql开源项目,通过其自带的lua脚本进行sql判断。
并非所有的应用都适合在程序代码中实现读写分离,像大型SNS、B2C这类应用可以在代码中实现,因为这样对程序代码本身改动较小;像一些大型复杂的java应用,在代码中实现对代码改动就较大,所以一般就会考虑使用代理层来实现。

2、搭建mysql-proxy来实现mysql读写分离
(1).安装lua (mysql-proxy需要使用lua脚本进行数据转发)

#tar zxvf lua-5.1.4.tar.gz
#cd lua-5.1.4
#vi Makefile,修改INSTALL_TOP= /usr/local/lua
#make posix
#make install

(2).安装libevent

#tar zxvf libevent-2.0.8-rc.tar.gz
#cd libevent-2.0.8-rc
#./configure --prefix=/usr/local/libevent
#make && make install

(3).安装check

#tar zxvf check-0.9.8.tar.gz
#cd check-0.9.8
#./configure && make && make install

(4).安装mysql客户端

#tar zxvf mysql-5.0.92.tar.gz
#cd mysql-5.0.92
#./configure --without-server && make && make install

(5).设置环境变量 (安装mysql-proxy所需变量)

#vi /etc/profile

export
LUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib -llua -ldl"
LDFLAGS="-L/usr/local/libevent/lib -lm"
export
CPPFLAGS="-I/usr/local/libevent/include"
export
CFLAGS="-I/usr/local/libevent/include"

# source /etc/profile

(6).安装mysql-proxy

#tar zxvf mysql-proxy-0.6.0.tar.gz
#cd mysql-proxy-0.6.0
# ./configure --prefix=/usr/local/mysql-proxy --with-mysql --with-lua
#make && make install

(7).启动mysql-proxy
本次对两台数据库实现读写分离;mysql-master为可读可写,mysql-slave为只读



图-1 读写分离数据库架构图

#/usr/local/mysql-proxy/sbin/mysql-proxy

--proxy-backend-addresses=192.168.1.201:3306
--proxy-read-only-backend-addresses=192.168.1.202:3306
--proxy-lua-script=/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua &
注:如果正常情况下启动后终端不会有任何提示信息,mysql-proxy启动后会启动两个端口4040和4041,4040用于SQL转发,4041用于管理mysql-proxy。如有多个mysql-slave可以依次在后面添加。
3、读写分离测试
(1).连接测试
默认情况下mysql数据库不允许用户在远程连接

mysql>grant all privileges on *.* to identified by '123456';
mysql>flush privileges;

客户端连接

#mysql -uroot -p123456 -h192.168.1.200 -P4040

(2).读写分离测试
为了测试出mysql读写分离的真实性,在测试之前,需要开启两台mysql的log功能,然后在mysql-slave服务器停止复制
① 在两台mysql配置文件my.cnf中加入log=query.log,然后重启
②在mysql-slave上执行SQL语句stop slave
③在两台mysql上执行#tail -f /usr/local/mysql/var/query.log
④在客户端上连接mysql(三个连接以上),然后执行create、select等SQL语句,观察两台mysql的日志有何变化
注:生产环境中除了进行程序调试外,其它不要开启mysql查询日志,因为查询日志记录了客户端的所有语句,频繁的IO操作将会导致mysql整体性能下降




17.10 Mysql分库分表

1、MySQL分库分表原因

当一张表的数据达到几千万时,查询一次所花的时间会变多,如果有联合查询的话,会严重影响数据库的工作。分表的目的就在于此,减小数据库的负担,缩短查询时间
主从复制存在系列性能瓶颈问题:写入无法扩展,写入无法缓存,复制延时,锁表率上升,表变大、缓存率下降,有必要通过分库分表来解决

2、MySQL垂直分区
如果把业务切割得足够独立,那把不同业务的数据放到不同的数据库服务器将是一个不错的方案,而且万一其中一个业务崩溃了也不会影响其他业务的正常进行,并且也起到了负载分流的作用,大大提升了数据库的吞吐能力。



图-2 MySQL垂直分区数据库架构图
然而,尽管业务之间已经足够独立了,但是有些业务之间或多或少总会有点联系,如用户,基本上都会和每个业务相关联,况且这种分区方式,也不能解决单张表数据量暴涨的问题
3、MySQL水平分片(Sharding)
将用户按一定规则(按id哈希)分组,并把该组用户的数据存储到一个数据库分片中,即一个sharding,这样随着用户数量的增加,只要简单地配置一台服务器即可



图-3 MySQL水平分片数据库架构图
可以建一张用户和shard对应的数据表,每次请求先从这张表找用户的shard id,再从对应shard中查询相关数据,见下图



图-4 查询用户shard id
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息