一.前言

主从复制是Mysql知识体系中非常重的要一个模块。学习主从复制和后续的读写分离是完善只是知识体系的重要环节。且主从复制读写分离的思想并不仅仅局限于Mysql,在很多存储系统中都有该方案,如:redis。

从应用的角度思考,主从复制有如下优点:

  • 可以备份数据,容灾
  • 可以做读写分离,分担单机Mysql节点的压力。master只做write,slave做read
  • 数据归类进行分析计算很耗性能时,可以只在slave节点上进行
  • 一定程度保证可用性,master write节点发生宕机,可以快速切换至slave节点

基于上述的这些原因,认为非常有必要了解更甚至深入主从复制。

本文主要从以下几个方面介绍主从复制的配置:

  1. 环境准备
  2. 配置Master节点
  3. 配置Slave节点
  4. 总结

二.环境准备

Slave节点可以有多个,但是由于机器原因,这里只配置一台Slave。

  1. 两台服务器:

    10.1.134.151/MacOS/Master

    172.16.162.157/Centos 6.9/Slave

  2. Mysql安装

    Mysql版本:v5.7.22

    MacOS:直接下载安装包

    Centos:使用Mysql yum repository安装,参考Installing MySQL on Linux Using the MySQL Yum Repository

  3. 配置两台机器防火墙受信,或者开放3306端口

二.配置主服务器

1.编辑/etc/my.cnf,如果没有该文件则新建。my.cnf是Mysql的配置文件:

vim /etc/my.cnf

2.配置服务器监听的网络接口:

bind-address=10.1.134.151

3.在[mysqld]选项下配置主从关系中的唯一标识。该标识必须保证在整个主从关系中是唯一的:

server-id=master

4.配置log_bin,这个是主从复制的关键部分。slave会一直不断的拷贝master的bin log,master的变化都写入了bin log中:

log_bin=mysql-bin.log
  • 注:这里需要注意,我在macOS中配置成目录的形式:log_bin=/var/log/mysql/mysql-bin.log,但是Mysql总是faild start。

5.需要指定主从复制哪个数据库。如果需要配置多个数据库都需要主从复制,则可以配置多行:

binlog_do_db=test

6.需要确保配置生效:

/usr/local/mysql/support-files/mysql.server restart

7.mysql有很多安全机制,其中有一项就是访问控制(IP白名单、认证授权),所以需要在Master上对Slave访问的IP和用户进行授权,登录Mysql shell:

mysql -uroot -p

GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
  • 注1:授权Slave访问Master的配置中,我并没有使用'%',因为'%'会匹配所有,我认为在线上时,该配置是不安全的,所以我指定:GRANT REPLICATION SLAVE ON . TO 'root'@'172.16.162.157' IDENTIFIED BY 'root'; 只有Slave可以访问,即授权的控制更细腻。

  • 注2:个人认为,在授权时,还可以指定在哪个数据库上进行主从复制:GRANT REPLICATION SLAVE ON test.* TO 'root'@'%' IDENTIFIED BY 'root';

8.确保授权生效落盘:

FLUSH PRIVILEGES;
  • 注:可以查询mysql.user表确保授权是否存在:use mysql; select host, use from user;

这样关于主服务器就已经配置完成。但是很多情况,线上都是临时增加slave,这种情况下,数据库本身已经有数据存在,这是需要进行一下操作,将已经有的全量数据进行复制到slave:

1.切换到需要主从复制的数据库上:

use test;

2.锁住test库,防止其发生新的变化:

FLUSH TABLES WITH READ LOCK;

3.然后查看当前master状态:

SHOW MASTER STATUS;

结果如下:

mysql> SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 | 107 | test | |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

这个Position非常重要,表示Slave从这个位置开始主从复制。先记录这些这句,后面会使用。

4.然后dump master上的test库:

mysqldump -u root -p --opt test > ~/test.sql
  • 注:该dump常用于mysql备份。不仅将数据导出,而且将表结构的创建sql也导出。但是没有导出库的创建sql

5.然后解锁test库:

UNLOCK TABLES;

三.配置从服务器

1.登录slave库的mysql shell,并创建test库:

create database test;

2.然后再使用mysql程序恢复数据:

mysql -u root -p test < ~test.sql

3.在配置slave节点的my.cnf,同理如果/etc下没有该文件,则创建。在[mysqld]选项下配置主从关系中唯一标识:

server-id=slave-1

4.再配置相关日志和主从复制的数据库,中继日志、bin_log、test库:

relay-log=mysql-relay.log
log_bin=mysql-bin.log
binlog_do_db=test

5.重启服务,确认配置生效:

service mysqld restart

6.然后配置授权master访问slave,登录mysql shell:

mysql -uroot -p

GRANT ALL PRIVILEGES ON test.* TO 'root'@'%' IDENTIFIED BY 'root';

7.然后再配置从服务器:

CHANGE MASTER TO MASTER_HOST='10.1.134.151',MASTER_USER='root', MASTER_PASSWORD='root', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

该命令做了以下几件事:

  • 指定当前节点为master节点的slave节点
  • 提供了登录认证信息
  • 提供了slave从哪个地方开始复制的postion

8.启动slave:

start slave;

9.查看主从复制的详细信息:

SHOW SLAVE STATUS\G

四.总结

1.问题总结

在主从复制的环境搭建中,我遇到了很多问题,所以这里总结一下:

主从复制读写分离的架构图:

从以上的图中可以看出:

  1. 主从服务器间网络通信需要正常,即防火墙受信或者3306端口需要开放。
  2. Mysql本省有访问授权(白名单user表),master和slave之间需要相互设置ip、用户和密码访问。

    使用grant授权,或者直接update mysql.user表中的host为'%'。

    具体可以参考:

    MySQL设置白名单教程

    解决mysql Navicat 出错:1130-host . is not allowed to connect to this MySql server

ps: 这里一定需要注意密码,不然主从之间将会无法认证连接。

一般排查手段就是:show slave status,通过查看连接状态信息,文件读写处理信息等。

3.以上两条即master和slave的保证了网络连接,授权认证。但是master和slave之间数据同步的控制仍需要关注,即position。我自己在搭建时,就无法完成主从复制,查看:show slave status后,发现:

Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event; consider out of disk space on master; the first event 'mysql-bin.000001' at 105, the last event read from './mysql-bin.000001' at 123, the last byte read from './mysql-bin.000001' at 124.'

从这里大致可以看出是slave读bin log时,position的位置错误。当时看到这份错误时,我有点怀疑position的问题,但是没有细想还是baidu了。。。

其实可以再进一步思考下,提高自己解决问题的能力。

可以参考:

MySQL主从失败 错误Got fatal error 1236解决方法

2.主从复制的思想思考:

在应用架构中,分离的思想的必须要深入理解:

  1. 分离后可以做扩容
  2. 分离后做不同应用
  3. 分离后负载压力

    ....

但是分离后必然又会引起如何合、如何拆分路由的问题,且数据如果没有分片,必然又会导致冗余存储。

  • 合并/拆分问题:还有在分离的这种架构中,又如何保证堆外提供一致性的接口,这里就涉及到应用的读写分离:应用层决策/中间件层统一接口;
  • 冗余存储:这个需要看场景,冗余也是做备份的策略;

且分离后,不同节点之间是否需要相互通信心跳,心跳时是否又需要考虑安全(授权、认证)等等

参考

MySQL主从失败 错误Got fatal error 1236解决方法

Last_IO_Error: error connecting to master

MySQL 插件安装或卸载(window validate_password 为例)

How to add a new MySQL slave

How To Set Up Master Slave Replication in MySQL

Mysql系列(三)—— Mysql主从复制配置的更多相关文章

  1. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句

    MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...

  2. Mysql系列三:Centos6下安装Mysql和Mysql主从复制的搭建

    一.Centos6下安装Mysql 检测下系统有没有自带的mysql:yum list installed | grep mysql, 如果已经有的话执行命令yum -y remove mysql-l ...

  3. MySQL系列(三)--数据库结构优化

    良好的数据库逻辑设计和物理设计是数据库高性能的基础,所以对于数据库结构优化是很有必要的 数据库结构优化目的: 1.减少数据的冗余 2.尽量避免在数据插入.删除和更新异常 例如:有一张设计不得当的学生选 ...

  4. MySQL系列之七:主从复制(转)

    一:实验环境 IP 操作系统 mysql版本号 master 192.168.25.11 CentOS7 5.6.35 slave 192.168.25.10 win10 5.7.18 slave版本 ...

  5. MySQL强人“锁”难《死磕MySQL系列 三》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 前言 最近数据库 ...

  6. mysql系列三、mysql开启缓存、设置缓存大小、缓存过期机制

    一.开启缓存 mysql 开启查询缓存可以有两种方法来开启一种是使用set命令来进行开启,另一种是直接修改my.ini文件来直接设置都是非常的简单的哦. 开启缓存,设置缓存大小,具体实施如下: 1.修 ...

  7. MySQL系列(二)--MySQL存储引擎

    影响数据库性能的因素: 1.硬件环境:CPU.内存.存盘IO.网卡流量等 2.存储引擎的选择 3.数据库参数配置(影响最大) 4.数据库结构设计和SQL语句 MySQL采用插件式存储引擎,可以自行选择 ...

  8. Mysql系列二:Mysql 开发标准规范

    原文链接:http://www.cnblogs.com/liulei-LL/p/7729983.html 一.表设计 1. 库名.表名.字段名使用小写字母,“_”分割. 2. 库名.表名.字段名不超过 ...

  9. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

  10. 【MySql系列】MySql踩坑系列

    问题一:远程登录报错Host '192.168.181.201' is not allowed to connect to this MySQL server 解决: 问题二:MySql access ...

随机推荐

  1. shell $x的含义

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  2. 【Spring Cloud】Spring Cloud之自定义@SpringCloudProfile注解实现@Profile注解的功能

    一.为什么会想到定义@SpringCloudProfile这样的注解 首页提一下@Profile注解:它主要用与Spring Boot多环境配置中,指定某个类只在指定环境中生效,比如swagger的配 ...

  3. Linux学习之路-基础入门 20191104

    1.计算机组成 2.开发接口标准 ABI--(Application Binary Interface) ABI描述了应用程序与OS之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动 ...

  4. KL散度=交叉熵-熵

    熵:可以表示一个事件A的自信息量,也就是A包含多少信息. KL散度:可以用来表示从事件A的角度来看,事件B有多大不同. 交叉熵:可以用来表示从事件A的角度来看,如何描述事件B. 一种信息论的解释是: ...

  5. 【pytorch】持续踩坑 & 错误解决经历

    报错 1.[invalid argument 0: Sizes of tensors must match except in dimension 0.] {出现在 torch.utils.data. ...

  6. SpreadJS 生成报表

    空了再写个完整的demo吧 //报表控件 输入参数待定 function SpreadObj(response) { var spread = null; //数据列表 var dataArray = ...

  7. idea开发工具

    IDEA简介 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支 ...

  8. 五一DAY1数论学习笔记

    by ruanxingzhi 整除性 如果a能把b除尽,也就是没有余数,则我们称a整除b,亦称b被a整除.(不是除以,是整除!!) 记作:\(a|b\) |这个竖杠就是整除符号 整除的性质 自反性 对 ...

  9. LOJ2507 CEOI2011 Matching

    题目链接 参考了 神仙yyb的博客 现在发现kmp不仅能匹配字符串,还可以用于处理任意模式匹配中的状态,如这题中已经匹配的序列中的数的大小关系就是一种状态,使用kmp找到模式序列的每一个前缀的bord ...

  10. 2019qbxtCSP-S2 模拟题1

    T1 \(solution\) 求出第一个开始下降的位置,移动到连续的与它相同的数的最前面的一个数的位置,记录为\(p\) \(p\)以前的位置的数与原数相同,\(p\)位置为原数-1,后面全部为9 ...