SQL优化系列 - (二)数据库的主从分离

前言

对于大型网站,为了解决大量的并发访问,会在服务端实现分布式负载均衡,但是,这还不够。如果后台仅使用一个数据库来处理数据,那么,数据库压力势必过大,响应慢,甚至崩溃。如果数据库崩溃、数据丢失,后果将会很严重。

针对于上面存在的隐患,我们可以 主从分离 来避免。

使用主从数据库实现主从分离,主数据库支持数据的写操作,从数据库支持数据的读操作,所以,我们需要确保主库与从库中的数据完全一致。

 

使用主从分离,有如下好处:

    一:提高读写数据库的效率。对于大部分的应用程序,大部分的操作都是查询(即读数据),小部分的操作是增删改(即写数据)。所以,数据库的大部分压力来自于读操作。当读的压力较大时,我们可以通过读写分离的方式,降低读的压力,提升读取时的效率。

    二:确保数据的安全性。如果不实现读写分离,所有的数据全部存储于同一个库中,这样,如果因网络问题而连接不到这个库,或者,某些原因导致这个数据库出现故障,那么,所有数据都将丢失。可能会出现单点故障的风险。
 

主从分离的实现原理

我们可以提供多个数据库,其中,一个库为主库,主要实现写功能(增、删、改),其他库(一个或多个)为从库,主要实现读功能(查询)

主库与从库中的数据完全一致。所以,我们需要关注的是,如何确保主库与从库之间的数据是一致的。这里,主要是使用二进制日志文件来确保主从之间数据一致的。

这是从网络上搜来的一张图,及介绍: https://blog.csdn.net/qq_15092079/article/details/81672920

 

在上面的模型中,Mysql-A就是主库,即master,Mysql-B就是从库,即slave。

在 Mysql-A主库 的数据库事件(例如修改数据库的sql操作语句),都会存储到日志系统A中,在相应的端口(默认3306)通过网络发送给 Mysql-B从库 。Mysql-B从库 收到后,写入本地日志系统B,然后一条条的将数据库事件在数据库 Mysql-B从库 中完成。

日志系统A,是MYSQL的日志类型中的二进制日志,也就是专门用来保存修改数据库表的所有动作,即bin log,注意MYSQL会在执行语句之后,释放锁之前,写入二进制日志,确保事务安全。

日志系统B,不是二进制日志,由于它是从 MYSQL-A主库 的二进制日志复制过来的,并不是自己的数据库变化产生的,有点接力的感觉,称为中继日志,即relay log。

通过上面的机制,可以保证 Mysql-A主库 和 Mysql-B从库 的数据库数据一致,但是时间上肯定有延迟,即 Mysql-B从库 的数据是滞后的。因此,会出现这样的问题,Mysql-A主库 的数据库操作是可以并发的执行的,但是 Mysql-B从库 只能从relay log中一条一条的读取执行。若 Mysql-A主库 的写操作很频繁,Mysql-B从库 很可能就跟不上了。

 

主从同步复制有以下几种方式:

(1)同步复制,master的变化,必须等待slave-1,slave-2,...,slave-n完成后才能返回。

(2)异步复制,master只需要完成自己的数据库操作即可,至于slaves是否收到二进制日志,是否完成操作,不用关心。MYSQL的默认设置。

(3)半同步复制,master只保证slaves中的一个操作成功,就返回,其他slave不管。这个功能,是由google为MYSQL引入的。

 

主从分离的实现步骤

本文中的主从分离环境是:vmware虚拟机中安装两个centos7操作系统,每个操作系统上,分别安装MySQL5.7数据库。以此环境实现主从分离。CentOS7中离线安装MySQL5.7

前提: 主库所在系统的ip:192.168.11.58 ,  从库所在系统的ip:192.168.11.62 

1、配置主库

1.1 修改/etc/my.cnf 配置文件

  添加如下信息:

必须配置的选项:

1)server-id   服务器唯一标识。

2)log-bin     启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。

3)log-bin-index   二进制日志文件的索引

如果仅配置上面选项,指的是主服务器上的所有库都会同步到从库中,比如,主库中创建一个新的库,那么,从库中也将创建一个新的库。

可选配置的选项:

1)binlog-do-db = test   指定 将主库中的 test数据库 同步到 从库 中。

2)binlog-ignore-db = test  指定 不将主库 中的 test数据库 同步到 从库 中。

     需要注意的是,binlog-do-db和binlog-ignore-db为互斥选项,一般只需要一个即可。

1.2 创建从库连接主库时的用户与分配权限

1.3 使用 exit 退出数据库登录,并重启数据库

1.4  登录到mysql库中,查看主库信息

2、配置从库

2.1 修改 /etc/my.cnf配置文件

  添加如下信息:

必须配置的选项:

1)server-id     从服务器唯一标识,如果有多个从服务器,那么,每个从服务器的server-id不可重复。

2)relay-bin     启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。

3)relay-bin-index   二进制日志文件的索引

可选配置的选项:

1)replicate-do-db  指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。
2)replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
需要注意的是,replicate-do-db 和 replicate-ignore-db为互斥选项,一般只需要一个即可。

2.2 重启mysql服务

 

2.3 连接主库

选项说明:

1)master_host=主库所在的ip地址

2)master_port=主库的端口号

3)master_user=主库中为从库创建的连接用户名

4)master_password=连接用户名的密码

5)master_log_file=主库中二进制日志文件名,即主库中使用 show master status 命令显示的File列文件名,如:master-bin.000004。

6)master_log_pos=对应show master status显示的Position列的值,比如:1122。

2.4 启动slave,并查看信息

说明:必须确保红色框内的结果均为 Yes,才说明主从连接配置正确

3、测试

在主库中创建新的数据库:

在从库中查询:

 

 

至此,数据库中的 主从分离 已完成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值