MySQL主从复制读写分离
目前存在的问题:
在实际的生产环境中,由于单台Mysql作为独立的数据库无论是高并发或者在安全性等方面出现各种问题。因此,我们可以通过主从复制(Master-Slave)、读写分离(MySQL-Proxy)的方式来提升系统数据库的并发负载能力。简而言之,以前是一个人干活,现在是多个人干活。
—————————————————————————————————————————————
概念解析:
——主从复制,一台主机多台从机,一主多从,或者多台主机多台从机,多主多从。主机上的数据更新、插入或者删除之后,从机
也相应得做更新、插入或者删除操作;
——读写分离,数据新增更新删除或者建表改表删表,操作主库;数据查询,走读库;
——读写分离是应用层面的一个概念,而主从复制是数据库层面的一个概念。
—————————————————————————————————————————————
主从复制的过程解析:
——首先、master将改变记录到二进制日志(binary log)中;
——其次、slave将master的binary log events拷贝到它的中继日志(relay log)。slave开启一个I/O线程。该I/O线程在master上打开一个普通的连接,然后开始binlog dump process线程。改线程将master的二进制日志写入中继日志。;
——然后、slave重做中继日志中的事件,将改变反映它自己的数据。slave上还有一个SQL thread线程,该线程读取中继日志中的操作,并重放其中的事件使其与master中的数据一致。
—————————————————————————————————————————————
主从复制实现过程:
——准备虚拟机;
——安装MySQL;
——修改MySQL远程链接权限,将配置文件mysqld.cnf中的bind-address,将值由127.0.0.1改为0.0.0.0或者注释掉该行。不然其他机上上的MySQL如法连接到该机子上的MySQL;
——修改MySQL配置文件auto.cnf,将MySQL的UUID值改一下,保证每台虚拟机上的UUID是不同的。
——设定master
修改配置文件/etc/mysql/my.cnf,加入以下内容:
[mysqld]
log-bin=mysql-bin
server-id=133
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog-do-db=penn
binlog_ignore_db=mysql
——授权其它机子上的用户登录master
GRANT REPLICATION SLAVE ON *.* TO 'penn'@'192.168.184.136' IDENTIFIED BY 'root';
这样192.168.184.136上的MySQL就可以通过这个这个用户连接到master。
——重启master,通过show master status命令可以查到master的状态
如果出现以下界面,说明配置成功:
——设定slave
修改/etc/mysql/my.cnf,加入以下内容,其实只是改一下server的id:
[mysqld]
server-id=133
——再配置其master,把它关联到我们在前面设置的master:
change master to master_host='192.168.184.135',master_user='penn',master_password='root',master_log_file='mysql-bin.000019',master_log_pos=1415;
——重启slave,通过show slave status\G 命令查看slave的状态
如果出现以下界面,说明配置成功
—————————————————————————————————————————————
——测试,在master中新建数据库,表,以及添加数据,如果slave中在自动出现了相同的数据,则说明配置成功。
这个过程会出现很多小的问题,这里就不一一举例了,大家到时可以上网找找,关于主从复制的教程帖子很多。
—————————————————————————————————————————————
——读写分离实现过程:
读写分离可以有多种实现方式,但是大多可采用注解的方式,利用Spring切面编程,将注解加到repository层(mapper)方法上面,
实现自动选择数据库,一般是insert、update、delete方法走master,read走slave,这样能有效减轻master
压力,提升系统效率。
——主要思路:
通过AbstractRoutingDataSource类来管理数据源,利用面向切面编程方式,解析方法,在执行方法之前根据注解的值来选择数据源。
——配置pom.xml,添加aspect依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
——定义一个注解
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource {
String value();
}
——配置数据源,两个
——重新定义数据源管理类,继承AbstractRoutingDataSource,重写determineCurrentLookupKey方法
——定义切面
——OK。