vlambda博客
学习文章列表

MySQL调优 - 读写分离

上一篇:[MySQL调优 - 索引原理及优化](https://blog.csdn.net/weixin_42288219/article/details/117954078?spm=1001.2014.3001.5501)


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


哪些情况适合读写分离:

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程序的话,可以直接集成在应用中,省去了一次通过中间件进行的网络传输,在性能上能获得更好的体验。


这里不搬运[官方文档](https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/configuration/java-api/readwrite-splitting/)了,大家可以自行查阅,使用也比较简单:

1. Maven集成以下;

2. 参考官方文档配置数据源;


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