1. 主从复制搭建

1.1 环境准备

OS: Ubuntu 18.04
master: 192.168.0.3
slave: 192.168.0.6

1.2 安装依赖包

# Ubuntu
apt-get install -y libaio-dev
# CentOS
yum install -y libaio-devel

1.3 下载二进制安装包

# https://downloads.mysql.com/archives/community/
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz

1.4 解压安装包

tar zxf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
mv /usr/local/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.30

1.5 创建 mysql 用户和数据、日志目录

useradd mysql -s /usr/sbin/nologin
mkdir -p /data/mysql/3306 /data/mysql/binlog/3306
chown -R mysql:mysql /data/mysql

1.6 添加环境变量

echo "export PATH=/usr/local/mysql-5.7.30/bin:$PATH" > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh

1.7 初始化数据

mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.30 --datadir=/data/mysql/3306 --user=mysql

1.8 简单配置

# master 节点
# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql-5.7.30
datadir=/data/mysql/3306
server_id=3
port=3306
socket=/tmp/mysql.sock
log_bin=/data/mysql/binlog/3306/logbin [mysql]
socket=/tmp/mysql.sock # mysqld 启动时加载配置文件的顺序
# mysqld --help --verbose | grep my.cnf
# /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
# 指定配置文件, 启动 mysqld
# /etc/init.d/mysqld start --defaults-file=/etc/my.cnf
# slave 节点
# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql-5.7.30
datadir=/data/mysql/3306
server_id=6
port=3306
socket=/tmp/mysql.sock [mysql]
socket=/tmp/mysql.sock

1.9 拷贝启动脚本

cp /usr/local/mysql-5.7.30/support-files/mysql.server /etc/init.d/mysqld

1.10 启动 mysqld

# 第一次启动需用这个命令
/etc/init.d.mysqld start # 后面可以用 systemctl 命令管理
# 启动/重启/停止 mysqld
systemctl start/restart/stop mysqld # 查看 mysqld 状态
systemctl status mysqld

1.11 设置 root 密码

# --initialize-insecure 这个参数初始化后的 mysql 默认是没有密码的, 为了安全需要设置 root 用户密码
mysqladmin -uroot password
# qq.123

以上操作就是搭建mysql服务,主从节点都要做。

1.12 检查主库是否开启 binlog

# 在主库上操作
mysql -uroot -pqq.123 -e "select @@log_bin;"

1.13 主库创建复制用户

# 在主库上操作
mysql -uroot -pqq.123 -e "grant replication slave on *.* to repl@'192.168.0.%' identified by '123';"
mysql -uroot -pqq.123 -e "select user,host from mysql.user;"

1.14 主库备份并恢复到主库

# 由于我们的数据库都是新搭建的,这一步可以不用操作
# 如果生产环境主库开启时间比较早已经有业务数据的情况下这一步是要的
# 在主库上操作
mysqldump -uroot -pqq.123 -A --master-data=2 --single-transaction > /tmp/all.sql
scp /tmp/all.sql 192.168.0.6:/tmp/ # 在从库上操作
mysql -uroot -pqq.123 < /tmp/all.sql

1.15 告知从库复制信息

# grep "\-- CHANGE MASTER TO" /tmp/all.sql
# -- CHANGE MASTER TO MASTER_LOG_FILE='logbin.000001', MASTER_LOG_POS=154; # help change master to
change master to master_host='192.168.0.3',master_user='repl',master_password='123',master_port=3306,master_log_file='logbin.000001',master_log_pos=154,master_connect_retry=10;

1.16 从库开启复制线程

# 在从库上操作
mysql -uroot -pqq.123 -e "start slave;"

1.17 验证主从状态

# 在从库上操作
mysql -uroot -pqq.123 -e "show slave status\G" | grep Running:
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes

1.18 如果以上步骤 12-17 中出现问题,可以执行以下命令重置,然后从新配置 12-17 步。

# 在从库上操作
mysql -uroot -pqq.123 -e "stop slave; reset slave all;"

2. 主从复制原理

2.1 主从复制涉及到的资源

  • 2.1.1 文件

    • 2.1.1.1 主库 binlog 文件

    • 2.1.1.2 从库 relay-log.bin 文件,作用是存储接收的 binlog,默认在从库的数据目录下, 手工定义方法:relay_log_basename=/data/mysql/3306/${hostname}-relay-bin

    • 2.1.1.3 从库 master.info 文件,作用是存放连接主库的信息,已经接收的 binlog 位置点信息。默认存储在从库的数据目录下。手工定义方法:master_info_repository=FILE/TABLE

    • 2.1.1.4 从库 relay-log.info 文件,作用是记录回放到的 relay-log 的位置点, 默认存储在从库的数据目录下。手工定义方法:relay_log_info_repository=FILE/TABLE

  • 2.1.2 线程

    • 2.1.2.1 主库 Binlog_dump_Thread 作用是用来接收从库请求,并且投递 binlog 给从库 show processlist; 命令可以查看

    • 2.1.2.2 从库 IO 线程 作用是请求 binlog, 接收 binlog SQL 线程 作用是回放 relay-log show slave status; 命令可以查看

2.2 主从复制原理说明

  • 2.2.1 S: change master to ip,port,user,password,binlog 位置信息写入到 master.info 中, 执行 slave start; (启动 SQL, IO 线程)。

  • 2.2.2 S: 连接主库

  • 2.2.3 M: 分配 Dump_Thread, 专门和 S_IO 通信。

  • 2.2.4 S: IO 线程请求新日志

  • 2.2.5 M: Dump_T 接收请求, 截取日志, 返回给 S_IO

  • 2.2.6 S: IO 线程接收 binlog, 日志放在 TCP/IP 缓存, 此时网络层返回 ACK 给主库。主库工作完成。

  • 2.2.7 S: IO 线程将 binlog 最终写入到 relay-log 中, 并更新 master.info, IO 线程工作结束。

  • 2.2.8 S: SQL 线程读 relay-log.info, 获取上次执行到的位置点。

  • 2.2.9 S: SQL 线程向后执行新的 relay-log, 再次更新 relay-log.info

小细节:
  • S: relay-log 参数: relay_log_purge=ON, 定期删除应用过的 relay-log

  • M: Dump 线程实时监控主库的 binlog 变化, 如果有新变化, 发信号给从库。

以上就是 mysql 5.7 主从复制搭建的过程及原理的简单说明。搭建过程也不复杂,感兴趣的话自己也动动小手试一下吧。如有问题可以在评论区留言。

mysql 5.7 主从复制搭建及原理的更多相关文章

  1. 《MySQL数据库》MySQL主从复制搭建与原理

    前言 主从复制:两台或者更多的数据库实例,通过二进制日志,实现数据同步.为什么需要主从复制,主从复制的作用是什么,答:为了预防灾难. 搭建 第一步:准备多实例环境.如何创建多实例见: 第二步:确保每一 ...

  2. Mysql 主从复制搭建

    Mysql 主重复制搭建 Linux版本:Linux Centos 6.4 32位 Mysql版本:Mysql-5.6.38-linux-glibc2.12-i686 Mysql安装:Mysql安装教 ...

  3. MYSQL主从复制搭建及切换操作(GTID与传统)

    结构如下: MYSQL主从复制方式有默认的复制方式异步复制,5.5版本之后半同步复制,5.6版本之后新增GTID复制,包括5.7版本的多源复制. MYSQL版本:5.7.20 操作系统版本:linux ...

  4. MySQL数据的主从复制、半同步复制和主主复制详解

    一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...

  5. MySQL数据的主从复制、半同步复制和主主复制详解-转

    一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...

  6. Mysql主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录

    Mysql复制概念Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一 ...

  7. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  8. MySQL 复制介绍及搭建

    MySQL复制介绍 MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard. M ...

  9. 数据切分——Atlas读写分离Mysql集群的搭建

    关于数据切分的原理可以参见博客: http://blog.csdn.net/jhq0113/article/details/44226789 关于Atlas的介绍可以参见博客: http://blog ...

随机推荐

  1. 终于有人把鸿蒙OS讲明白了,大佬讲解!快收藏!

    来自 | GitHub科技 本文面向的是开发人员,主要想通过科普让大家了解一下鸿蒙开发.接下来,我想给大家科普一下这个这么火的鸿蒙系统. 到底什么是鸿蒙 OS 在官网上看到鸿蒙 OS 的简介是,分布式 ...

  2. 浅谈AsyncLocal,我们应该知道的那些事儿

    前言 最近查看有关框架源码,发现AsyncLocal这玩意水还挺深,于是花了一点功夫去研究,同时对比ThreadLocal说明二者区别以及在何时场景下使用AsyncLocal或ThreadLocal. ...

  3. 如何使用Python 进行数据可视化

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 在进行数据分析的时候,经常需要将数据进行可视化,以方便我们对数据的认识和理解. 0,Matplotl ...

  4. MIT-6.006算法导论(2011秋)

    L01 Algorithmic Thinking,Peak Finding 算法定义:高效处理大量数据的程序 在学本课之前最好先学习6.042,本课进阶为6.046 本门课的8个主要章节:算法思想.排 ...

  5. Beta冲刺随笔——Day_Eight

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...

  6. rest-framework 解析器

    一 解析器的作用: 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有application/json,x-www-form-urlencoded,form-data等格 ...

  7. Java动态代理设计模式

    本文主要介绍Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理. 什么是代理模式 就是为其他对象提供一种代理以控制对这个对象的访问.代理可以在不改动目标对象的基础上,增加其他额外 ...

  8. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...

  9. 课堂练习之疫情APP

    title: 课堂练习之疫情查询APP date: 2020-03-17 20:08:51 tags: 在之前的体温记录APP上改进,只写出疫情信息查询页面的代码. 实体类与上篇博客SSM整合中的Ci ...

  10. centos7 yum搭建lamp

    环境 系统:centos7 安装apache #yum 安装apache [root@localhost ~]# yum install httpd httpd-devel #启动httpd服务 [r ...