linux 主从复制和读写分离

发布时间 2023-07-23 18:49:11作者: 纸签

企业中高并发时,为了追求性价比,MySQL必须采用主从复制和读写分离,这样可以提供性能和高可用。

目录

一、主从复制原理

二、主从复制实验

三、MySQL 读写分离

四、读写分离实验

五、总结

 

 

 

 

 

 

一、主从复制原理

    1 MySQL的复制类型

  •  基于语句的复制(STATEMENT, MySQL默认类型)

  •  基于行的复制(ROW)

  •  混合类型的复制(MIXED)

  2 MySQL主从复制的工作过程  

    两日志、三线程

  (1)在每个事务更新数据完成之前,Master 在二进制日志(Binary log)记录这些改变。写入二进制日志完成后,Master 通知存储引擎提交事务。

  (2)Slave 将 Master 的复制到其中继日志(Relay log)。首先slave 开始一个工作线程(I/O),I/O线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件,I/O线程将这些事件写入中继日志。

  (3)SQL slave thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据一致,只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。 复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。

   3.MySQL主从复制延迟

      1、master服务器高并发,形成大量事务

      2、网络延迟

      3、主从硬件设备导致 cpu主频、内存io、硬盘io

         4、本来就不是同步复制、而是异步复制 从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。 从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。 从库使用SSD磁盘 网络优化,避免跨机房实现同步

      问题解决方法

      半同步复制- 解决数据丢失的问题

      并行复制---解决从库复制延迟的问题

   4.MySQL 有几种同步方式

    1、异步复制(Async Replication:主库将更新写入,不需要等待数据更新是否已经复制到从库中,就可以继续处理更多的请求。MySQL复制默认是异步复制,异步复制提供了最佳性能。

     2、同步复制(sync Replication):主库将更新写入,需要等待数据更新是否已经复制到从库中,才可以继续处理更多的请求。同步复制提供了最佳安全性,保证数据安全,数据不会丢失,但对性能有一定的影响。

    3、半同步复制(Async Replication):主库将更新写入,需要等待数据更新是否已经复制到从库中,才可以继续处理更多的请求。该功能确保至少有1个从库接收并完成服复制,才会进行下去。

    4、增强半同步复制(lossless Semi-Sync Replication)、无损复制:因为默认的配置就是增强半同步,所以,大家一般说的半同步复制其实就是增强的半同步复制,也就是无损复制。

  5.Mysql应用场景

    mysql 数据库 主要的性能是读和写,一般场景来说读请求更多。

    根据主从复制可以演变成读写分离,因为读写分离基于主从复制,使用读写分离从而解决高并发的问题。

    mysql架构演变的方向:

     1、单台mysql有单点故障

    2、集群发展到主从复制

    3、主从复制渡河写的压力不均衡

    4、读写分离

    5、读写分离的基础是主从复制

    6、mysql的高可用架构MHA(master HA高可用) MGR MMM

二、主从复制实验

 

虚拟机服务环境

   Master服务器:192.168.140.222  mysql5.7

   slave1服务器:192.168.140.223 mysql5.7

   Slave2服务器:192.168.140.111 mysql5.7

   Amoeba服务器:192.168.140.224 (预备机器) jdk1.6

   客户端服务器:192.168.140.228 测试

 

主从服务器时间同步

master服务器配置

   1. 安装ntp、修改配置文件
[root@master ~]# yum install ntp -y
[root@master ~]# vim /etc/ntp.conf
[root@master ~]# yum -y install ntpdate ntp    #安装ntp软件
[root@master ~]# ntpdate ntp.aliyun.com        #时间同步
[root@master ~]# vi /etc/ntp.conf                   #编辑配置文件
fudge 127.127.1.0 stratum 10
#设置本机的时间层级为10级,0级表示时间层级为0级,是向其他服务器提供时间同步源的意思,不要设置为0级

server 127.127.1.0    #设置本机为时间同步源 

 

 

 

2. 开启NTP服务、关闭防火墙和增强性安全功能

 

 

2.两台SLAVE服务器配置

  1.安装ntp、ntpdate服务

 

   2.开启ntp服务,关闭防火墙、增强性安全功能

   3.时间同步master服务器

 

 

 

3.MySQL手工编译安装(这里忽略)

 

  2.配置主从同步 

    1.master服务器修改配置文件

  #开启二进制日志文件(之后生成的日志名为master-bin)

  #开启从服务器日志同步

  #主服务器id为1(不可重复)

     2.重启服务

 

 

  4.从服务器配置

#开启二进制日志文件

#设置server id为22,slave2 为23

#从主服务器上同步日志文件记录到本地

#定义relay-log的位置和名称(index索引) 

 

 开启从服务器功能

   进入MySQL

 开启从服务器功能

   查看表状态

 

  5.测试数据同步

    在主服务器上创建一个数据库

 在两台从服务器上直接查看数据库列表

  第一台从服务器

    第二台服务器

 

 

三、MySQL 读写分离

   1.读写分离概念

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

   2.读写分离原因

    因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库的“读”(读10000条数据可能只要5秒钟)。 所以读写分离,解决的是,数据库的写入,影响了查询的效率。

  3.读写分离应用场景

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

   企业 使用MySQL 读写分离场景

    目前较为常见的 MySQL 读写分离分为以下两种:

    1.基于程序代码内部实现

      2.基于中间代理层实现

  4.主从复制与读写分离

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

  5.读写分离原理

    读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。

四、读写分离实验

  1.Amoeba搭建 MySQL读写分离

 

 

Amoeba服务器配置

  1.安装 Java 环境

    因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。

 

   修改配置环境

 

   查看java版本

 

 安装 Amoeba软件

   解压文件

 //如显示amoeba start|stop说明安装成功

  

配置 Amoeba读写分离,两个 Slave 读负载均衡

#先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问

 再回到amoeba服务器配置amoeba服务:

#修改amoeba配置文件

 

 

 

 

 #修改数据库配置文件

   取消注释

   取消注释,添加密码

 

 

 

 

 

 

 #启动Amoeba软件,按ctrl+c 返回

 #查看8066端口是否开启,默认端口为TCP 8066

 测试读写分离

#先安装数据库  

  

 通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从--从服务器

 为了看到读写分离,需要先关闭主从复制。

 插入数据

//在slave1上:
insert into test values('1','zhangsan','this_is_slave1');

//在slave2上:
insert into test values('2','lisi','this_is_slave2');

//在主服务器上:
insert into test values('3','wangwu','this_is_master');

在客户端服务器上

   可以看到读到的是从服务器的内容

 在客户端插入数据

insert into test values('4','qianqi','this_is_client');

 slave1看不到

 slave2也看不到

 在master可以看到

 至此读写分离完成

 

//在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
start slave;

 可以看到数据同步,至此实实现主从复制和读写分离

 

 

2.mycat搭建读写分离

  1.配置安装Java环境

# vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
# source /etc/profile
# java -version 

  2.下载并解压Mycat

官网:Mycat1.

 

   3.移动到/usr/local下并改名为mycat

   4.创建用户并且加入组

   5.配置Mycat环境变量

   6.配置Mycat读写分离信息

 

 

 

 

 

 

五、总结

  读写分离是一种常见的数据库优化技术,它的核心思想是将数据库的读操作和写操作分别分配给不同的服务器处理,从而提高系统的性能和可靠性。通过读写分离,可以将读请求分散到多个从库上进行并发处理,从而缓解主库的负载压力,提高系统的读取速度和并发能力。同时,由于写操作只在主库上进行,可以保证数据的一致性和完整性,避免了因多个从库的并发写操作而引发的数据冲突和损坏。读写分离还可以提高系统的容错能力,当主库发生故障时,可以快速切换到从库进行读写操作,避免系统的宕机和数据丢失。总之,读写分离是一种非常有效的数据库优化技术,可以提高系统的性能、可靠性和容错能力,是现代大型网站和应用的基础架构之一。