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。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinqing5130

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值