读写分离
MySQL读写分离基本原理是让master数据库处理写操作,slave数据库处理读操作,非常适用于 读操作量比较大的场景。MySQL实现读写分离的主要目的是为了提高系统性能以及减小服务压力。读写分离能提高系统性能的原因在于:
1、物理服务器增加,机器处理能力提升。拿硬件换性能。
2、主从只负责各自的读和写,极大程度缓解X锁和S锁争用。
3、slave可以配置myiasm引擎,提升查询性能以及节约系统开销。
4、master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步。
5、slave可以单独设置一些参数来提升其读的性能。
6、增加冗余,提高可用性。
使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。
下载安装包并解压到指定目录
yum install lua-devel
yum install glib2-devel
yum -y install libevent-devel
wget https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz tar -zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
配置项可以通过命令查看
/usr/local/mysql-proxy/bin/mysql-proxy --help
配置启动文件
vim /etc/mysql-proxy.cnf
[mysql-proxy]
user=root
proxy-address=172.25.5.5:3306
proxy-read-only-backend-addresses=172.25.5.3:3306
proxy-backend-addresses=172.25.5.2:3306 proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true
chmod 660 /etc/mysql-proxy.cnf
启动mysql-proxy
./mysql-proxy --plugins=admin --plugins=proxy --defaults-file=/etc/mysql-proxy.cnf
查看监听端口
netstat -antlp | grep mysql
测试
mysql -h mysql-proxy的ip -P 端口号 -uroot -p521365
在master主机上进行授权(因为主从复制,所以就不需要在slave上再进行此操作了)
mysql> grant select,insert,update on 数据库名.* to root@‘mysql-proxy的ip.%’ identified by ‘521365’;
在外部主机登陆进行操作测试
mysql -h mysql-proxy的ip -uroot -p521365
通过tcpdump抓取数据分析读写分离
tcpdump -i eth1 -v port 3306
1、在开启主从复制的情况下进行插入操作,主从的结果一致,查询的结果也是一致的
2、关闭slave:stop slave
然后进行插入操作,结果是master上的数据正常插入,如果开启了半同步的话,操作会有一个10s的停顿,然后进行查询发现刚才插入的数据并没有返回,这是因为写操作在master上,关闭了主从复制,所以数据还没有同步到slave上去,而读操作是在slave上进行的,所以没有获得刚才写入的数据
3、开启slave:start slave 然后再次查询发现数据一致了