• 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 :成功

  • 相关阅读:
    vector使用的注意事项
    java计算机毕业设计WEB儿童运动馆业务信息系统MyBatis+系统+LW文档+源码+调试部署
    AI角色对环境信息的感知方式
    go初识iris框架(七) - 实战资源导入和项目框架搭建
    Apache Maven系列【1】settings.xml文件配置和mvn命令大全
    Minikube本地安装(mac M1版)
    由于找不到d3dx9_43.dll无法继续执行此代码怎么解决?全面解析d3dx9_43.dll
    初识进程以及父子进程
    SaaSBase:什么是易客管家SCRM?
    模拟实现Hash-Table(线性探测)
  • 原文地址:https://blog.csdn.net/weixin_48271370/article/details/127614232