文章目录

    • 一. MySQL复制
      • 1.一主一从(小企业)
      • 2.一主多从(业务多)
    • 二. 主从复制原理
      • MySQL垂直分区( scale up)
      • MySQL水平分片(Sharding)
      • 对应shard中查询相关数据
    • 三. MySQL复制
      • 主从复制线程:
      • 跟复制功能相关的文件:
  • 四. 主从复制配置
    • 主节点配置:
    • 从节点配置:
    • ①新建主从复制
    • ② 给老的master创建slave
    • ③ 主服务器down,提升一个从服务器成为新的主
    • 主从复制相关
    • 复制冲突的解决
    • 保证主从复制的事务安全
  • 五.级联复制
  • 注意的问题:
    • 1、限制`从服务器为只读`
    • 2、从服务器清除
    • 3、从服务器忽略
    • 4、如何保证主从复制的事务安全
  • 常见问题
    • 优化

一. MySQL复制

扩展方式: Scale Up纵向 ,Scale Out横向
纵向:配置
横向:机器
MySQL的扩展
读写分离
复制:每个节点都有相同的数据集
向外扩展
二进制日志
单向
复制的功用

 数据分布负载均衡读备份高可用和故障切换(主坏了,将从切换为主)MySQL升级测试

前端(分片管理器—调度器

1.一主一从(小企业)

必须启用二进制日志
与sync同步有关
主master负责DML语言,增删改
从slave 负责读

2.一主多从(业务多)

二. 主从复制原理

必须在,主服务器里面启用二进制日志
从服务器,不要求,如果有二级从服务器,从服务器就得启用
relay中继

MySQL垂直分区( scale up)

分库分表:将一个服务器上的数据放到多个服务器
同一个数据库中毫不相干(join内连接)的若干表,放到不同的服务器中(都是主)

MySQL水平分片(Sharding)

把同一个表的数据按一定的逻辑拆分(根据用户的编号,范围等)

对应shard中查询相关数据

水平分片:就需要,前端(分片管理器—调度器)索引----用户在哪个服务器上

三. MySQL复制

主从复制线程:

主节点:
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events
从节点:
I/O Thread:向Master请求二进制日志事件,并保存于中继日志relay log中
SQL Thread:从中继日志中读取日志事件,在本地完成重放

跟复制功能相关的文件:

master.info:用于保存slave连接至master时的相关信息,例如账号、密码.服务器地址
relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的对应关系

主从复制特点:
异步复制
主从数据不一致比较常见

复制架构:
Master/Slave, Master/Master, 环状复制
一主多从
从服务器还可以再有从服务器 级联复制
一从多主:适用于多个不同数据库

复制需要考虑二进制日志事件记录格式
STATEMENT(5.0之前) 语句型
ROW(5.1之后,推荐)行型(推荐
MIXED 混合型

级联复制----主—从–从…

四. 主从复制配置

主从配置过程:参看官网
https://mariadb.com/kb/en/library/setting-up-replication/
https://dev.mysql.com/doc/refman/5.5/en/replication-configuration.html

主节点配置:

(1) 启用二进制日志

 [mysqld]log_bin

(2) 为当前节点设置一个全局惟一的ID号

 [mysqld]server_id=#log-basename=master 可选项,设置datadir中日志名称,确保不`依赖主机名`

(3) 创建有复制权限用户账号
*.*所有库

grant  replication slave  on   *.* to 'new'@'192.168.1.100'   identified  by  'password';

刷新权限flush privileges;

关闭所有表锁定数据库以防止写入数据

主节点:上锁
flush    tables    with  read  lock;从节点取消锁
unlock    tables;

查看从二进制日志的文件和位置开始进行复制

show master status;

从节点配置:

(1) 启动中继日志

 [mysqld]
server_id=# 为当前节点设置一个全局惟的ID号
read_only=ON 设置`数据库只读`
relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index 默认值hostname-relay-bin.index

(2) 使用有复制权限的用户账号连接至主服务器,并启动复制线程

查看从节点状态

show slave status  \G
 mysql> CHANGE MASTER TO MASTER_HOST='host',                     主节点地址
MASTER_USER='repluser',                   用户
MASTER_PASSWORD='replpass',                密码
MASTER_LOG_FILE=' mariadb-bin.xxxxxx',    文件MASTER_LOG_POS=#;                   要记住位置show master  logs;

这样就会生成master.info 主结点信息
relay-log.info中继日志

show slave status    \G

最后开启线程 start slave;
查看线程:show processlist;

测试:
在主节点创建库,看从节点是否同步

①新建主从复制

注意:主服务器有数据—需要备份

主节点


[root@master ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=8
log-binsystemctl restart mariadb#创建一个用户
[root@master ~]#mysql
MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.8.%' identified by '123456'; #查看二进制文件和位置
MariaDB [(none)]> show master logs;

从节点

[root@slave ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=18  systemctl restart mariadb连接master
[root@slave1 ~]#mysql
MariaDB [(none)]> CHANGE MASTER TO   MASTER_HOST='192.168.8.8',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000002',
MASTER_LOG_POS=545;MariaDB [(none)]> start slave;查看状态show slave status\G

② 给老的master创建slave

主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点

主节点

#在主服务器完全备份
mkdir /backup
chown mysql.mysql /backup#备份--single-transaction 会自动刷新一次日志 ,要配合-F备份前滚动日志注意这里的- -master-data=1
mysqldump -A -F --single-transaction --master-data=1 > /backup/fullbackup_`date +%F_%T`.sql拷贝到从服务器
scp /backup/fullbackup_2019-11-27_17\:41\:17.sql  192.168.8.11:/data/#建议优化 主 和 从 节点服务器的性能
MariaDB [hellodb]> set global innodb_flush_log_at_trx_commit=2
MariaDB [hellodb]> set global sync_binlog=0
MariaDB [hellodb]> set global innodb_flush_log_at_trx_commit=2;
#将完全备份还原到新的从节点
dnf -y install mariadb-servervim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=11
read-onlysystemctl restart mariadb#配置从节点,从完全备份的位置之后开始复制
[root@slave ~]#grep '^CHANGE MASTER' /data/fullbackup_2019-11-27_17\:41\:17.sql
CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000003', MASTER_LOG_POS=389;[root@slave ~]#vim /data/fullbackup_2019-11-27_17\:41\:17.sql
CHANGE MASTER TO
MASTER_HOST='192.168.8.10',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,                                                               MASTER_LOG_FILE='mariadb-bin.000003', MASTER_LOG_POS=389;[root@slave ~]#mysql < /data/fullbackup_2019-11-27_17\:41\:17.sql


将备份拷到 从服务器scp

给备份文件加入

vim /data/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.37.7',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000002',
MASTER_LOG_POS=245;

查看状态show slave status\G
启动线程start slave

③ 主服务器down,提升一个从服务器成为新的主

例如:突然断电(或者物理性损坏)

挑选从服务器提升为新的主
查看那个编号那个最大----那个最新

show slave status\G

  1. 新master修改配置文件,关闭read-only配置
vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=18
read-only=OFF
log-bin=/data/mysql/logbin/mysql-bin
  1. 清除旧的master复制信息
MariaDB [hellodb]>set global read_only=off;
MariaDB [hellodb]>stop slave;
MariaDB [hellodb]>reset slave all;
  1. 在新master上完全备份
mysqldump -A --single-transaction --master-data=1 -F >
backup.sql
scp backup.sql 10.0.0.28:

分析旧的master 的二进制日志,将未同步到至新master的二进制日志导出来,恢复到新master,尽可能恢复数据

  1. 其它所有 slave 重新还原数据库,指向新的master
vim backup.sql
CHANGE MASTER TOMASTER_HOST='10.0.0.18',MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=371;mysql
MariaDB [hellodb]>stop slave;
MariaDB [hellodb]>reset slave all;
MariaDB [hellodb]>set sql_log_bin=off;
MariaDB [hellodb]>source backup.sql;
MariaDB [hellodb]>set sql_log_bin=on;
启动线程
MariaDB [hellodb]>start slave;

主从复制相关

  1. 限制从服务器为只读
read_only=ON
#注意:此限制对拥有SUPER权限的用户均无效

以下命令会阻止所有用户, 包括主服务器复制的更新,防止写入数据

flush    tables    with  read  lock;
  1. 在从节点清除信息
    注意:以下都需要先 STOP SLAVE
RESET SLAVE #从服务器清除master.info ,relay-log.info, relay log ,开始新的relay log
RESET SLAVE  ALL #清除所有从服务器上设置的主服务器同步信息,如HOST,PORT, USER和
PASSWORD 等
  1. 复制错误解决方法
    可以在从服务器忽略几个主服务器的复制事件,此为global变量,或指定跳过事件的ID
#系统变量,指定跳过复制事件的个数
SET GLOBAL sql_slave_skip_counter = N
#服务器选项,只读系统变量,指定跳过事件的ID
[mysqld]
slave_skip_errors=1007|ALL
  1. START SLAVE 语句,指定执到特定的点
START SLAVE [thread_types]
START SLAVE [SQL_THREAD] UNTILMASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
START SLAVE [SQL_THREAD] UNTILRELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
thread_types:[thread_type [, thread_type] ... ]
thread_type: IO_THREAD | SQL_THREAD

复制冲突的解决

#方法1
MariaDB [(none)]> stop slave;
MariaDB [(none)]> set global sql_slave_skip_counter=1;
MariaDB [(none)]> start slave; #方法2
[root@slave1 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
slave_skip_errors=1007|ALL                                                       [root@slave1 ~]#systemctl restart mariadb

保证主从复制的事务安全

在master节点启用参数:

sync_binlog=1 每次写后立即同步二进制日志到磁盘,性能差
#如果用到的为InnoDB存储引擎:
innodb_flush_log_at_trx_commit=1 #每次事务提交立即同步日志写磁盘
innodb_support_xa=ON #分布式事务MariaDB10.3.0废除
sync_master_info=# #次事件后master.info同步到磁盘

在slave节点启用服务器选项:

skip-slave-start=ON #不自动启动slave

在slave节点启用参数:

sync_relay_log=# #次写后同步relay log到磁盘
sync_relay_log_info=# #次事务后同步relay-log.info到磁盘

五.级联复制


如果要启用级联复制,需要在中间从服务器启用以下配置

注意级联节点也是从节点---->配置和从结点一样

[mysqld]
log_bin     这个二进制日志,记录的是自身的更新
log_slave_updates    让级联节点->把中继日志同步到数据库并且写入二进制日志中
server-id=18
read-only

注意
主节点做备份---->给级联
级联做备份---->给从节点

三台主机:1  master 服务器配置
vim /etc/my.cnf
server-id=1
log-bin=/data/logbin/mysqlsystemctl restart mariadb创建用户用于同步信息
mysql> grant replication slave on *.* to repluser@'192.168.36.%' identified by  'centos';备份
mysqldump -A --single-transaction --master-data=1  -F > /data/all.sql
scp /data/all.sql 级联从服务器上:/data2 中间的级联从服务器
vim /etc/my.cnf
server-id=2
log-bin
log_slave_updates       // #级联复制中间节点的必选项   关键
read-onlyvim /data/all.sql
CHANGE MASTER TO
MASTER_HOST='主服务器',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=400;   mysql
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> source /data/all.sql
MariaDB [(none)]> show master logs;  #记录二进制位置,给第三个节点使用
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> start slave;mysqldump -A --single-transaction --master-data=1  -F > /data/all.sql  做备份
scp /data/all.sql 最终的从服务器上:/data3 最后的从服务器
vim /etc/my.cnf
server-id=3
read-onlyvim /data/all.sql
CHANGE MASTER TO
MASTER_HOST='中间的级联服务器',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245; mysql <  /data/all.sql
mysql> start slave;

注意的问题:

1、限制从服务器为只读

在从服务器上设置read_only=ON
注意:此限制对拥有SUPER权限的用户均无效
阻止所有用户, 包括主服务器复制的更新,防止写入数据

 mysql> flush    tables    with  read  lock;

2、从服务器清除

RESET SLAVE:从服务器清除master.info ,relay-log.info, relay log ,开始新的relay log
RESET SLAVE ALL:清除所有从服务器上设置的主服务器同步信息,如:PORT, HOST, USER和 PASSWORD 等
注意:以上都需要先STOP SLAVE

3、从服务器忽略

sql_slave_skip_counter = N 从服务器忽略几个主服务器的复制事件global变量 set global sql_slave_skip_counter=1;

4、如何保证主从复制的事务安全

参看https://mariadb.com/kb/en/library/server-system-variables/

  • 在master节点启用参数
    sync_binlog=1 每次写后立即同步二进制日志到磁盘,性能差
    如果用到的为InnoDB存储引擎:
    innodb_flush_log_at_trx_commit=1 每次事务提交立即同步日志写磁盘
    innodb_support_xa=ON 默认值,分布式事务MariaDB10.3.0废除
    sync_master_info=# #次事件后master.info同步到磁盘
  • 在slave节点启用服务器选项:
    skip-slave-start=ON 不自动启动slave
    在slave节点启用参数:
    sync_relay_log=# #次写后同步relay log到磁盘
    sync_relay_log_info=# #次事务后同步relay-log.info到磁盘

常见问题

  1. 假如从节点创建一个数据库db2(从节点只读 ready_only)
  2. 主节点又创建一个数据库db2,进而同步从节点,从节点会出现错误,并且不能同步
  3. 导致的问题
    主节点不能与从节点同步
  4. 解决办法
  • 忽略它(避免影响主从复制,导致不能备份数据)
    最主要确认从库没有写权限ready_only
    1、 stop slave;临时停止复制
    2、 set global sql_slave_skip_counter=# ; 忽略几个错误
    3、 start slave;
    4、 忽略错误编号(在show slave start \G中看)
    只能在配置文件中slave-skip-errors=1062
    然后重启服务—线程会自动重启

    总结:从节点不能使用DML语言,只能使用select

优化

#建议优化 主 和 从 节点服务器的性能
MariaDB [hellodb]> set global innodb_flush_log_at_trx_commit=2
MariaDB [hellodb]> set global sync_binlog=0
MariaDB [hellodb]> set global innodb_flush_log_at_trx_commit=2;

Mysql主从复制,级联复制(重点,重点,重点)命令,参数相关推荐

  1. 浅谈MYSQL之级联复制(附带实验)

    浅谈MYSQL之级联复制 级联复制 原理:级联结构就是通过减少直接从属于 Master 的 Slave 数量,减轻 Master 的压力,分散复制请求,从而提高整体的复制效率. 级联复制的应用场景 跨 ...

  2. MYSQL的级联复制

    MYSQL的级联复制实际上就是在主从的基础上多加一个复制,例如B复制A,C复制B. A>B>C A挂,B提升为主,此时C不用做change master,缺点是复制延迟大,无法避免. 1. ...

  3. mysql master status_MySQL show master / slave status 命令参数

    一.show master status 二.show slave status Slave_IO_State SHOW PROCESSLIST输出的State字段的拷贝.SHOW PROCESSLI ...

  4. 基于GTID模式MySQL主从复制

    基于GTID模式MySQL主从复制 GTID复制原理: 基于GTID的复制是MySQL 5.6后新增的复制方式 GTID (global transaction identifier) 即全局事务ID ...

  5. 马老师 生产环境mysql主从复制、架构优化方案

    Binlog日志(主服务器) => 中继日志(从服务器 运行一遍,保持一致).从服务器是否要二进制日志取决于架构设计.如果二进制保存足够稳定,从性能上来说,从服务器不需要二进制日志.默认情况下, ...

  6. MySQL主从复制与读写分离配置及实操

    MySQL主从复制与读写分离 一.MySQL主从复制 1.复制类型 2.工作过程 二.MySQL读写分离 1.定义 2.存在意义 3.作用时间 4.原理 5.类型 基于程序代码内部实现 基于中间代理层 ...

  7. mysql 案例~ 主从复制转化为级联复制

    一 需求 mysql 主从复制切换成级联复制 二 核心思想 1 开启级联复制 2 确定postion点 场景 A->B A-C 三 切换步骤   1 先确定好B为级联复制库   2 B添加log ...

  8. 关于MySQL 8.0的几个重点新特性及其他版本浅谈

    大家好今天又与大家见面了.IT技术无领域.国界之分,不断学习最新技术走在IT技术前沿一直是我们的目标网站模板下载争取把自己所学的知识,所经历的经验,拿出来与大家分享,共同成长与进步.在当前这个群雄并起 ...

  9. Mysql备机复制到主机_mysql主从复制的实现

    唱宇 2010-10-13 北京 最近测试了mysql主从复制的实现,现在记录一下:因为网上有些文章的mysql版本较老,有些参数已经不适合了. 确保 Master 与 Slave 之间的数据一致 [ ...

最新文章

  1. linux 内核调试前准备(简单记录,以后补充)
  2. 跨域问题的简单解决办法
  3. 计算机专业导论论文2000字,计算机专业导论论文.doc
  4. HTML页面加载顺序
  5. python函数知识七 闭包、装饰器一(入门)、装饰器二(进阶)
  6. 在线解答:怎么拥有TrustedInstaller权限?
  7. kindle dxg汉化和安装kindlepdfviewer
  8. 【综合】系统架构设计师考试经历分享
  9. 基于链表的学生信息管理系统和基于MySQL的学生信息管理系统 -C语言
  10. Could not establish connection to...
  11. JS 实现小游戏 打砖块
  12. 老徐WEB:js入门学习 - javascript对象之Array对象
  13. 电路设计软件详谈,基于电路设计软件protel实现脉冲电路仿真
  14. 第2章:几何方面:六边形面积
  15. 如何将本地文件自动备份到百度网盘?
  16. Photoshop投影与CSS中box-shadow的转换
  17. 这才是我要的工作!(强杀伤,慎入!)
  18. 二、Mingw下载安装
  19. 阿里云联合鼎捷软件发布云上数字工厂解决方案,实现云MES系统本地化部署
  20. pkpm弹性时程分析计算书怎么出_20190212_结构温度应力计算

热门文章

  1. 苹果Mac mini装win 7系统
  2. Vue中图片加载问题总结
  3. c语言编写开关程序,C语言开关语句:switch
  4. 使用fasttext实现文本处理及文本预测
  5. Android打开QQ临时会话和打开群聊
  6. 弱加密算法有哪几种_不安全的加密算法有哪几种
  7. 程序员是世界上最聪明、最具幽默感的一群人
  8. 单身程序狗解决了一个技术难题后,没有妹子可以炫耀,怎么办?
  9. STM32的脉冲宽度调制(PWM)
  10. 一种基于视频帧差异视频卡顿检测方案