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优化的最后一片,分库分表。