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上并行操作。

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

三、读写分离

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

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

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

实验(主从复制)

准备三台服务器

192.168.195.100 (主)

192.168.195.200(从)

192.168.195.50(从)

(主服务器配置)192.168.195.100

 关闭防火墙

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

修改ntp.cof配置文件

 最后一行添加

 启动ntp

 如果是联网的话可以

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

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

 重启数据库

 授权

 刷新 

(从服务器配置) 192.168.195.200

跟主服务器做对接

修改/etc/my.cnf 

重启数据库

 设置从数据库

 开启同步

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

 (从服务器配置) 192.168.195.50

跟主服务器做对接时间

修改/etc/my.cnf

重启数据库

登陆数据库 

 搭建完毕后实验一下

(主节点)

 从节点

 从节点2

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

读写分离小实验(使用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的客户端)

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

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

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

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

 java -version 查看版本

安装 Amoeba

解压安装包

把amoeba添加到环境变量

修改etc/profile

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

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

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

可以修改amoeba的用户名密码

 defaultpool 是amoeba默认找的服务器

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

 设置amoeba连接数据库的用户名密码

 设置master服务器池

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

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

./amoeba start &

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

测试实验是否成功

测试这台机器需要安装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
 

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

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

主 192.168.195.100   :成功

 从 192.168.195.200 :成功

 从 192.168.195.50 :成功

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值