MySQL技术专题指南(4)针对主从复制Replication机制的介绍(实用篇)

原创
05/05 11:02
阅读数 248

前提概要

随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作。此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求,从而减少单库的访问压力,进而应用得到优化

复制概述

  • Replication复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步
  • MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制

复制原理

MySQL 的主从复制原理如下

从上层来看,复制分成三步

  • Master主库在事务提交时,会把数据的更新记录作为时间Events记录在二进制日志文件Binlog中。(Dump线程 - 主库线程)
  • Master主库推送二进制日志文件Binlog中的日志事件到从库的并且通过写入中继日志Relay Log(I/O线程 - 从库线程)。
  • Slave从库 读取且重做(重放中继日志(Relay Log) 中的事件,将改变反映它自己的数据。(SQL线程 - 从库线程

复制优势

MySQL复制的有点主要包含以下三个方面

  • 主库出现问题,可以快速切换到从库提供服务(提供故障切换机制)
  • 从库上执行查询操作,从主库中更新,实现读写分离,降低主库的访问压力(提高读写分离并且提高高可用和负载以及吞吐)
  • 从库中执行备份,以避免备份期间影响主库的服务(提高数据的安全性)

搭建步骤

master

  1. 在master 的配置文件(/usr/my.cnf)中,配置如下内容
  • mysql 服务ID,保证整个集群环境中唯一

server-id=1

  • mysql binlog 日志的存储路径和文件名
  • log-bin=/var/lib/mysql/mysqlbin
  • log-bin-index = mysql-bin.index(设置二进制日志索引文件名)
  • binlog_format = mixed (binlog的模式)
    • STATEMENT:语句复制
    • ROW:行复制
    • MIXED:混和复制,默认选项
  • sync-binlog = 1(是否开启同步方式): 默认为0,为保证不会丢失数据,需设置为1,用于强制每次提交事务时,同步二进制日志到磁盘上。

character-set-server = utf8字符串编码

  • 错误日志,默认已经开启
  • log-err
  • mysql的安装目录

basedir

  • mysql的临时目录

tmpdir

  • mysql的数据存放目录

datadir

  • 是否只读,1 代表只读, 0 代表读写

read-only=0

  • 忽略的数据, 指不需要同步的数据库(逗号分割)

binlog-ignore-db=mysql

  • 指定同步的数据库

binlog-do-db=db01

  1. 执行完毕之后,需要重启Mysql:

service mysql restart;

  1. 创建同步数据的账户,并且进行授权操作:

grant replication slave on . to 'itcast'@'192.168.192.131' identified by 'itcast'; flush privileges;

  1. 为了获取一个一致性的快照,需对所有表设置读锁:

flush tables with read lock;

  1. 备份主数据库数据
  • 主库可以停机,则直接拷贝所有数据库文件
  • 主库是在线生产库,可采用mysqldump备份数据,它对所有存储引擎均可使用。

针对事务性引擎

mysqldump -uroot -ptiger --all-database -e --single-transaction --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql

针对 MyISAM 引擎,或多引擎混合的数据库

mysqldump -uroot --all-database -e -l --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql

主从数据库都是数据都是一致的,直接执行 show master status 查看日志坐标。

show master status;

字段含义:

  • File : 从哪个日志文件开始推送日志文件
  • Position : 从哪个位置开始推送日志
  • Binlog_Ignore_DB : 指定不需要同步的数据库
  1. 恢复主库的写操作:

unlock tables;


slave

  • 导入备份数据

mysql -uroot -p < /data/all_db.sql

  1. 在 slave 端配置文件中,配置如下内容
  • mysql服务端ID,唯一
  • server-id=2
  • 指定binlog日志
  • log-bin=/var/lib/mysql/mysqlbin

其他配置

  • binlog_format = mixed
  • log-slave-updates = 0(控制 slave 上的更新是否写入二进制日志,默认为0;若 slave 只作为从服务器,则不必启用;若 slave 作为其他服务器的 master,则需启用,启用时需和 log-bin、binlog-format 一起使用,这样 slave 从主库读取日志并重做,然后记录到自己的二进制日志中;)
  • relay-log = mysql-relay-bin(设置中继日志文件基本名)
  • relay-log-index = mysql-relay-bin.index(设置中继日志索引文件名)
  • read-only = 1(设置 slave 为只读,但具有super权限的用户仍然可写)
  • slave_net_timeout = 10(设置网络超时时间,即多长时间测试一下主从是否连接,默认为3600秒,即1小时,这个值在生产环境过大,我们将其修改为10秒,即若主从中断10秒,则触发重新连接动作。)
  1. 执行完毕之后,需要重启Mysql

service mysql restart;

  1. 执行如下指令 :
change master to
master_host='192.168.2.21',
master_user='repl',
master_password='repl',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=120;

指定当前从库对应的主库的IP地址,用户名,密码,从哪个日志文件开始的那个位置开始同步推送日志

  1. 开启同步操作
  • start slave;
  • show slave status;

可以看到图中显示出来的:IO线程和SQL线程都处于运行状态:

  • Slave_IO_Running此进程负责 slave 从 master 上读取 binlog 日志,并写入 slave 上的中继日志
  • Slave_SQL_Running此进程负责读取并执行中继日志中的 binlog 日志

这两个进程的状态需全部为 YES,只要有一个为 NO,则复制就会停止。当 Relay_Master_Log_File = Master_Log_File 且 Read_Master_Log_Pos = Exec_Master_Log_Pos 时,则表明 slave 和 master 处于完全同步的状态

  1. 停止同步操作

stop slave;

验证同步操作

  1. 在主库中创建数据库,创建表,并插入数据 :
create database db01;
user db01;
create table user
(
    id   int(11)     not null auto_increment,
    name varchar(50) not null,
    sex  varchar(1),
    primary key (id)
) engine = innodb
  default charset = utf8;

insert into user(id, name, sex)
values (null, 'Tom', '1');
insert into user(id, name, sex)
values (null, 'Trigger', '0');
insert into user(id, name, sex)
values (null, 'Dawn', '1');

  1. 在从库中查询数据,进行验证 :
  • 在从库中,可以查看到刚才创建的数据库:

  • 在该数据库中,查询user表中的数据:

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部