数据库读写分离Master-Slave

数据库读写分离Master-Slavemysql

 

一个平台或系统随着时间的推移和用户量的增多,数据库操做每每会变慢,这时咱们须要一些有效的优化手段来提升数据库的执行速度;如SQL优化、表结构优化、索引优化、引擎优化和读写分离优化等手段。web

一、SQL优化(简单列几点)sql

尽可能避免用SELECT*;
只查询一条记录时使用limit1;
使用链接查询代替子查询;
尽可能使用一些能经过索引查询的关键字。
数据库

二、表结构优化:vim

尽可能使用数字类型字段,提升对比效率;
长度不变且对查询速度要求高的数据能够考虑使用char,不然使用varchar;
表中字段过多时能够适当的进行垂直分割,将部分字段移动到另外一张表;
表中数据量大能够适当的进行水平分割,将部分数据移动到另外一张表。
缓存

三、索引优化:安全

对查询频率高的字段适当创建索引,提升效率。(在常常用到的字段上适合创建索引)服务器

四、引擎优化:并发

选择合适的引擎提升数据库性能,如InnoDB和MyISAM,InnoDB和MyISAM是许多人在使用MySQL时最经常使用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差异为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,可是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
InnoDB:
支持事务处理,支持外键,支持崩溃修复能力和并发控制。若是须要对事务的完整性要求比较高(好比银行),要求实现并发控制(好比售票),那选择InnoDB有很大的优点。若是须要频繁的更新、删除操做的数据库,也能够选择InnoDB,由于支持事务的提交(commit)和回滚(rollback)。
MyISAM:
插入数据快,空间和内存使用比较低。若是表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。若是应用的完整性、并发性要求比较低,也可使用。
MEMORY:
全部的数据都在内存中,数据的处理速度快,可是安全性不高。若是须要很快的读写速度,对数据的安全性要求较低,能够选择MEMOEY。它对表的大小有要求,不能创建太大的表。因此,这类数据库只使用在相对较小的数据库表。
注意:
同一个数据库也可使用多种存储引擎的表,若是一个表要求比较高的事务处理,能够选择InnoDB;这个数据库中能够将查询要求比较高的表选择MyISAM存储;若是该数据库须要一个用于查询的临时表,能够选择MEMORY存储引擎。
框架

五、读写分离优化:

随着用户量的增多,数据库操做每每会成为一个系统的瓶颈所在,但通常的系统“读”的压力远远大于“写”,So咱们能够经过实现数据库读写分离-主从复制来提升系统的性能。

主从设计思路:

经过设置主从数据库实现读写分离,主数据库负责“写操做”,从数据库负责“读操做”,根据压力状况,从数据库能够部署多个提升“读”的速度,借此来提升系统整体的性能。固然,咱们能够根据项目等须要配置多个从库。

如上图所示,读写分离的实现,主要是解决主从数据库数据同步的问题,在主数据库写入数据后要保证从数据库的数据也要更新。主服务器master记录数据库操做日志到Binary log,从服务器开启i/o线程将二进制日志记录的操做同步到relay log(存在从服务器的缓存中),另外sql线程将relay log日志记录的操做在从服务器执行。

Master-Slave具体步骤

准备工做,在这以前须要准备两个服务器,分别在上面安装Mysql数据库,一个做为Master,另一个是Slave,固然须要多个从库能够本身搞多个Slave。以下图:

两个虚拟机服务器:

分别安装Mysql数据库:

1.主mysql数据库配置文件修改

[root@tjt03 ~]# vim /etc/my.cnf

在主服务器master上配置开启Binary log,主要是在[mysqld]下面添加:

server-id=132
log-bin=master-bin      //[必须]启用二进制日志
log-bin-index=master-bin.index     //[必须]服务器惟一ID,默认是1,通常取IP最后一段

配置修改好后重主库Mysql:

[root@tjt03 ~]# sudo service mysqld stop
Stopping mysqld (via systemctl): [ OK ] [root@tjt03 ~]# sudo service mysqld start
Starting mysqld (via systemctl): [ OK ] [root@tjt03 ~]# 

在主数据库检查配置效果:

mysql> SHOW MASTER STATUS;

能够看到下图表示配置没问题,这里面的File名:master-bin.000001 咱们接下来在从数据库的配置会使用:

2.从mysql数据库配置文件修改

[root@tjt02 mysql]# vim /etc/my.cnf

在从服务器slave上的[mysqld]下面添加:

server-id=131    //这里面的server-id 必定要和主库的不一样
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin

配置修改好后重从库Mysql:

[root@tjt02 mysql]# service mysqld stop
Stopping mysqld (via systemctl): [ OK ] [root@tjt02 mysql]# service mysqld start
Starting mysqld (via systemctl): [ OK ] [root@tjt02 mysql]# 

三、配置连个数据库的关联

首先咱们先创建一个操做主从同步的数据库用户,切换到主数据库执行:

mysql> GRANT REPLICATION SLAVE ON *.* to 'tjt'@'%' identified by 'TANjintao@520';

这个配置的含义就是建立了一个数据库用户tjt,密码是TANjintao@520, 在从服务器使用tjt这个帐号和主服务器链接的时候,就赋予其REPLICATION SLAVE的权限, *.* 表面这个权限是针对主库的全部表的,“%”表示全部客户端均可能连,只要账号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,增强安全。

进入从数据库执行受权Slave:

mysql> change master to master_host='172.16.114.132',master_port=3306,master_user='tjt',master_password='TANjintao@520',master_log_file='master-bin.000001',master_log_pos=0;

上述步骤执行完毕后执行start slave启动配置:

mysql> start slave;

中止主从同步的命令为:

mysql> stop slave;

查看状态命令,\G表示换行查看:

mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.114.132 Master_User: tjt Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 870 Relay_Log_File: slave-relay-bin.000002 Relay_Log_Pos: 1085 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB:

能够看到状态以下:

这里看到从数据库已经在等待主库的消息了,接下来在主库的操做,在从库都会执行了。咱们能够主库负责写,从库负责读,达到读写分离的效果。

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,不然都是错误的状态(如:其中一个NO均属错误)。

简单测试

在主数据库中建立一个新的数据库:

mysql> create database tjt0702;

在从数据库查看数据库:

mysql> show databases;

到这里,数据库的主从复制Master-Slave已经OK了。

代码层面实现读写分离

假设咱们使用的是主流的SpringBoot框架开发的web项目,实现数据库读写分离以下。

配置了一个从库Slave:

https://blog.csdn.net/zhouzeqiang/article/details/87800590

配置了两个从库Slave:

http://www.javashuo.com/article/p-fhruoflr-cd.html  

 

 

配置两个数据库的关联

配置两个数据库的关联

相关文章
相关标签/搜索