MySQL调优 - 读写分离

Posted zero13_小葵司

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL调优 - 读写分离相关的知识,希望对你有一定的参考价值。

上一篇:MySQL调优 - 索引原理及优化

索引是数据量达到一定之后数据量很好的优化方式,那么读写分离又是解决什么问题呢?以及你是否真的需要读写分离呢?首先读写分离是有额外成本的,而且成本不低,因为这需要至少再来一套数据库从库,所以我们列一些情况,帮助你判断是否真的需要读写分离。

哪些情况适合读写分离:

  1. 数据量很大;
  2. 读远多于写(互联网应用基本都是如此),且读取已经造成了性能瓶颈;
  3. 缓存已不足以解决读的性能问题(缓存的性价比更高);
  4. 有经费做数据库的主从;
  5. 架构上支持了应用系统的读写分离;

基于上面几点大家可以自行评估一下,是否有必要上读写分离,如果确实需要上,那么接着往下看。

设置数据库主从

mysql数据库的主从同步会通过binlog进行,我们首先要有两台数据库(或以上),设置一主多从的方式。

配置主库

修改配置文件

找到mysqld.cnf文件

添加以下配置信息

bind_address = 0.0.0.0
server-id = 1 #没有特别要求
log_bin = /MYSQL-PATH/mysql-bin.log #开启binlog 日志
binlog_do_db = phoenix #同步的数据库名称
binlog_ignore_db = mysql #忽略同步的数据库

添加同步用账号

mysql>CREATE USER ‘phoenix’@‘SLAVE-IP’ IDENTIFIED BY ‘abcd1234’; #创建用户

mysql>GRANT REPLICATION SLAVE ON . TO ‘phoenix’@‘SLAVE-IP’ IDENTIFIED BY ‘abcd1234’; #分配权限
mysql>flush privileges; #刷新权限

查看master状态

SHOW MASTER STATUS;
±-----------------±---------±-------------±-----------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
±-----------------±---------±-------------±-----------------+
| mysql-bin.000003 | 73 | phoenix | manual,mysql |
±-----------------±---------±-------------±-----------------+

配置从库

修改配置文件

找到mysqld.cnf文件

添加以下配置信息

bind_address = 0.0.0.0
server-id = 2
replicate_do_db = phoenix #同步的数据库名称
replicate_ignore_db = mysql #忽略同步的数据库

配置master信息

mysql> change master to
-> master_host=‘MASTER-IP’,
-> master_user=‘phoenix’,
-> master_password=‘abcd1234’,
-> master_port=3306,
-> master_log_file=‘mysql-bin.000003’,
-> master_log_pos=73;

查看同步状态

出现以下状态,证明同步成功。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

通过proxy进行读写分离

proxy是mysql的官方中间件。有小伙伴可能会提用mycat,不过mycat的社区并不活跃,其问题也不少,这不太符合我们选用开源方案的标准,所以我们讲一讲用proxy来干这件事。

创建配置文件

这里我们就不分享怎么安装了,照着官网下载安装就好。
在mysql-proxy文件夹中创建mysql-proxy.cnf配置文件:

admin-username=admin
admin-password=admin
admin-lua-script=PATH/mysql-proxy/lua/admin.lua
proxy-backend-addresses=MASTER-IP:PORT
proxy-read-only-backend-addresses=SLAVE-IP:PORT
proxy-lua-script=PATH/mysql-proxy/rw-splitting.lua
log-file=PATH/mysql-proxy/mysql-proxy.log
log-level=info
daemon=true
keepalive=true

修改只读接入连接数

修改rw-splitting.lua中的4改为1,#默认超过4个连接数时,才开始读写分离

if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1,
max_idle_connections = 8,
is_debug = false
}
end

应用程序接入

应用程序的接入会因为客户端的不同而有所不同,但是对于应用程序修改很简单,便是将数据库连接从直接连数据库改为连接proxy即可。

使用Sharding sphere

这也是一种实现读写分离的方式,上面的proxy是需要单独部署的中间件,Sharding sphere开发java程序的话,可以直接集成在应用中,省去了一次通过中间件进行的网络传输,在性能上能获得更好的体验。

这里不搬运官方文档了,大家可以自行查阅,使用也比较简单:

  1. Maven集成以下;
  2. 参考官方文档配置数据源;

下一篇我们将分享MySql优化的最后一片,分库分表。

以上是关于MySQL调优 - 读写分离的主要内容,如果未能解决你的问题,请参考以下文章

MySQL调优 - 读写分离

MySQL调优 - 读写分离

MySQL调优 - 读写分离

29_MySQL读写分离 MySQL多实例 MySQL性能调优

MySQL调优分库分表读写分离高可用

MySQL调优分库分表读写分离高可用