Mysql的主从复制和读写分离

一、MySQL主从复制原理

  • 只在主服务器上写,只在从服务器上读。
  • 主数据库处理事务性查询,而从数据库处理 select 查询。
  • 数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。

二、主从复制

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

2.1Mysql支持的复制类型

  • 基于语句的复制(STATEMENT):在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。(基于sql语句复制,效率高,但在高并发高负债的情况下,可能会出现复制误差)
  • 基于行的复制(ROW):把改变的内容复制过去,而不是把命令在从服务器上执行一遍。(精确度较高,效率较低,日志占用的空间比较大)
  • 混合类型的复制(MIXED):默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

2.2主从复制的工作过程

就是对数据库的二进制日志中的数据、做备份复制

(1) Master节点将数据的改变记录成二进制日志(bin log),当Master上的数据发生改变时,则将其改变写入二进制日志中。

(2) slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个T/o线程请求Master的二进制事件。


(3)同时Master节点为每个T/o线程启动一个dump线程,用于向其发送二进制事件,并保存至slave节点本地的中继日志.(Relaylog)中(中继日志是缓存中的),Slave节点将启动sQL线程从中继日志中读取二进制日志,在本地重放,即解析成sql语句逐一执行,使得其数据和Master节点的保持一致,最后I/o线程和sQL线程将进入睡眠状态,等待下一次被唤醒。

注:
1.中继日志通常会位于os缓存中,所以中继日志的开销很小。
2.复制过程有一个很重要的限制,即复制在slave.上是串行化的,也就是说Master上的并行更新操作不能在 slave上并行操作。

Mysql的主从复制和读写分离_第1张图片

主节点需要先开启二进制日志,从节点开启中继日志,主节点的数据发生更新会记录到二进制文件里面,从节点会探测到主节点的二进制文件发生改变,从节点会启动IO线程请求主节点的二进制数据,主节点会开启dump线程,把二进制数据发送给从节点,从节点会写入到自己的中继日志当中,从节点这时候会开启一个sql线程读取中继日志中的二进制数据,在本地重放。从而保证主从两台服务器的数据保持一致。

三、读写分离

读写分离是基于主从复制实现的

什么时候需要读写分离呢?

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少的时候才会使用读写分离。利用数据库主从同步,在通过读写分离可以分担数据库的压力,从而提高性能。

Mysql的主从复制和读写分离_第2张图片

实验(主从复制)

准备三台服务器

192.168.195.100 (主)

192.168.195.200(从)

192.168.195.50(从)

(主服务器配置)192.168.195.100

 关闭防火墙Mysql的主从复制和读写分离_第3张图片

时间同步(如果有桌面的话是有的,但是现在没有)

Mysql的主从复制和读写分离_第4张图片

修改ntp.cof配置文件

Mysql的主从复制和读写分离_第5张图片

 最后一行添加

Mysql的主从复制和读写分离_第6张图片

 启动ntp

 如果是联网的话可以

修改数据库配置文件/etc/my.cof

其中log-slave-updates=true写错了

Mysql的主从复制和读写分离_第7张图片

 重启数据库

 授权Mysql的主从复制和读写分离_第8张图片

 刷新 

Mysql的主从复制和读写分离_第9张图片

(从服务器配置) 192.168.195.200

跟主服务器做对接

修改/etc/my.cnf 

Mysql的主从复制和读写分离_第10张图片

重启数据库

 设置从数据库Mysql的主从复制和读写分离_第11张图片

 开启同步

show slave status\G 查看一下两个线程状态必须为yes才算成功

Mysql的主从复制和读写分离_第12张图片

 (从服务器配置) 192.168.195.50

跟主服务器做对接时间

修改/etc/my.cnf

Mysql的主从复制和读写分离_第13张图片

重启数据库

Mysql的主从复制和读写分离_第14张图片

登陆数据库 

Mysql的主从复制和读写分离_第15张图片

 搭建完毕后实验一下

(主节点)

Mysql的主从复制和读写分离_第16张图片

 从节点

Mysql的主从复制和读写分离_第17张图片

 从节点2

Mysql的主从复制和读写分离_第18张图片

 主节点插入数据,从节点是同步的。但是从节点插入数据的话,其他节点是不会插入数据的。

读写分离小实验(使用Amoeba实现读写分离)

因为Amoeba是基于jdk1.5开发的,不推荐太新的安装

环境

192.168.195.100 (主)

192.168.195.200(从)

192.168.195.50(从)

192.168.195.101(Amoeba)

192.168.195.250(安装mysql的客户端)

Mysql的主从复制和读写分离_第19张图片

第一步:把安装包传进/opt

 执行的时候需要按空格进行,然后在根据提示进行

Mysql的主从复制和读写分离_第20张图片

修改/etc/profile 加入环境变量

并且source /etc/profile    ##刷新文件

Mysql的主从复制和读写分离_第21张图片

 java -version 查看版本

Mysql的主从复制和读写分离_第22张图片

安装 Amoeba

解压安装包

Mysql的主从复制和读写分离_第23张图片

把amoeba添加到环境变量

修改etc/profile

Mysql的主从复制和读写分离_第24张图片

 检查Amoeba是否安装好(图上就说明安装好了)

 mysql数据库需要给Amoeba服务器做相关的授权(一主两从都需要修改)(192.168.195.100/200/50)

Mysql的主从复制和读写分离_第25张图片

 到/usr/local/amoeba/cnf 修改amoeba.xml

可以修改amoeba的用户名密码

Mysql的主从复制和读写分离_第26张图片

 defaultpool 是amoeba默认找的服务器Mysql的主从复制和读写分离_第27张图片

 到/usr/local/amoeba/cnf 修改dbServers.xml

Mysql的主从复制和读写分离_第28张图片

 设置amoeba连接数据库的用户名密码Mysql的主从复制和读写分离_第29张图片

 设置master服务器池Mysql的主从复制和读写分离_第30张图片

设置slaves服务器池,和slaves的调度策略

Mysql的主从复制和读写分离_第31张图片

 进入/usr/local/amoeba/bin 启动amoeba   

./amoeba start &

Mysql的主从复制和读写分离_第32张图片

 检查端口是否开启(amoeba的端口号默认是8066)

Mysql的主从复制和读写分离_第33张图片

测试实验是否成功

测试这台机器需要安装mysql数据库,mariadb数据库也可以

yum install -y mariadb-server mariadb   #安装mariadb数据库
 systemctl start mariadb.service         #启动mariadb
mysql -u amoeba -p -h 192.168.195.101  -P 8066
 

Mysql的主从复制和读写分离_第34张图片

 关闭防火墙 向客户端服务器插入数据客户端192.168.195.250

Mysql的主从复制和读写分离_第35张图片

 查看两主一从是否数据已经插入

主 192.168.195.100   :成功

Mysql的主从复制和读写分离_第36张图片

 从 192.168.195.200 :成功

Mysql的主从复制和读写分离_第37张图片

 从 192.168.195.50 :成功

Mysql的主从复制和读写分离_第38张图片

你可能感兴趣的:(mysql,数据库,服务器)