企业高可用性标准

1 全年无故障率(非计划内故障停机)
99.9% ----> 0.001*365*24*60=525.6 min
99.99% ----> 0.0001*365*24*60=52.56 min
99.999% ----> 0.0001*365*24*60=5.256 min 2 高可用架构方案
负载均衡: 有一定的高可用性
负载均衡常用软件: LVS Nginx 主备系统:有高可用性,但是需要切换,是单活的架构
keepalived, MHA, MMM 真正高可用(多活系统):
NDB Cluster Oracle RAC Sysbase cluster , InnoDB Cluster(MGR),PXC , MGC

主从复制简介

1. 基于二进制日志复制的
2. 主库的修改操作会记录二进制日志
3. 从库会请求新的二进制日志并回放,最终达到主从数据同步
4. 主从复制核心功能:
辅助备份,防止服务器物理损坏
扩展新型的架构:高可用,高性能,分布式架构等

主从复制前提(搭建主从的过程)

1 两台以上mysql实例,server_id,server_uuid不同
2 主库开启二进制日志
3 专用的复制用户
4 保证主从开启之前的某个时间点,从库数据是和主库一致
5 告知从库,复制user,passwd,IP port,以及复制起点(change master to)
6 线程(三个):Dump thread、 IO thread、 SQL thread 开启(start slave)

主从复制搭建

1 清理主库数据(实验环境)
[root@db01 data]# rm -rf /data/3307/data/* 2 重新初始化3307
[root@db01 data]# mysqld --initialize-insecure --user=mysql --basedir=/application/mysql --datadir=/data/3307/data 3 修改my.cnf ,开启二进制日志功能
[root@db01 3307]# vim /data/3307/my.cnf
log_bin=/data/3307/data/mysql-bin [root@db01 data]# cat /data/3307/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
port=3307
server_id=7
log_bin=/data/3307/mysql-bin
[root@db01 data]# [root@db01 data]# cat /data/3308/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3308/data
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
port=3308
server_id=8
log_bin=/data/3308/mysql-bin 4 启动所有节点
[root@db01 3307]# systemctl start mysqld3307
[root@db01 3307]# systemctl start mysqld3308
[root@db01 3307]# ps -ef |grep mysqld
mysql 3684 1 4 09:59 ? 00:00:00 /app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
mysql 3719 1 7 09:59 ? 00:00:00 /app/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
[root@db01 3307]# mysql -S /data/3307/mysql.sock -e "select @@server_id"
[root@db01 3307]# mysql -S /data/3308/mysql.sock -e "select @@server_id" 5 主库中创建复制用户
[root@db01 3307]# mysql -S /data/3307/mysql.sock
mysql> grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
mysql> select user,host from mysql.user; 6 备份主库并恢复到从库
## 在主库模拟创建一点数据
mysql> create database test charset utf8mb4;
mysql> use test;
mysql> create table t1(id int);
mysql> insert into t1 values (1),(2),(3);
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+ ## 备份主库3307的全部数据,
[root@db01 3307]# mysqldump -S /data/3307/mysql.sock -A --master-data=2 --single-transaction -R --triggers >/backup/full.sql ## 查看起始的binlog和POS号
[root@db01 ~]# head -25 /backup/full.sql |grep "CHANGE MASTER TO MASTER_LOG_FILE"
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1044; ## 如果是生产环境,那么还需要恢复binlog日志里面的数据,具体可以参考 07-备份恢复 章节,这里实验就直接只恢复全备了
[root@db01 3307]# mysql -S /data/3308/mysql.sock
mysql> source /backup/full.sql 7 告知从库关键复制信息(从库)
ip port user password binlog position
[root@db01 3307]# mysql -S /data/3308/mysql.sock
mysql> help change master to;
## 这里的 MASTER_LOG_FILE MASTER_LOG_POS 是从全备的日志中获取的
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.51',MASTER_USER='repl',MASTER_PASSWORD='123',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1044,MASTER_CONNECT_RETRY=10; 8 开启主从专用线程(从库)
mysql> start slave; 9 检查复制状态(从库)
mysql> show slave status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

主从复制的原理*****

主从涉及到的文件和线程

1 线程
主库:
DUMP THREAD
从库:
IO THREAD
SQL THREAD 2 文件
主库:
mysql-bin.000001
从库:
db01-relay-bin.000001 ===>中继日志
master.info ===>主库信息记录日志
relay-log.info ===>记录中继应用情况信息 [root@db01 data]# ll db01-relay-bin.000001 master.info relay-log.info
-rw-r----- 1 mysql mysql 206 Dec 18 10:26 db01-relay-bin.000001
-rw-r----- 1 mysql mysql 120 Dec 18 10:35 master.info
-rw-r----- 1 mysql mysql 59 Dec 18 10:29 relay-log.info
[root@db01 data]# pwd
/data/3308/data

主从复制原理

主从复制原理描述

  1. change master to 时,ip pot user password binlog position写入到master.info进行记录

  1. start slave 时,从库会启动IO线程和SQL线程

  2. IO_T,读取master.info信息,获取主库信息连接主库

  3. 主库会生成一个准备binlog DUMP线程,来响应从库

  4. IO_T根据master.info记录的binlog文件名和position号,请求主库DUMP线程,获取最新日志

  5. DUMP线程检查主库的binlog日志,如果有新的,TP(传送)给从从库的IO_T

  6. IO_T将收到的日志存储到了TCP/IP 缓存,立即返回ACK给主库 ,主库工作完成

  7. IO_T将缓存中的数据,存储到relay-log日志文件,更新master.info文件binlog 文件名和postion,IO_T工作完成

  8. SQL_T读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点,回放relay-log

  9. SQL_T回放完成之后,会更新relay-log.info文件

  10. relay-log会有自动清理的功能

细节:主库一旦有新的日志生成,binlog dump 线程会发送信号给IO线程 ,IO线程再请求。增强了主从复制的实时性

主从故障监控 分析 处理 *****

线程相关监控

主库:
mysql> show processlist;
+----+------+-----------------+------+-------------+------+---------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State |
+----+------+-----------------+------+-------------+------+---------------------------------------------------------------+
| 4 | root | localhost | test | Query | 0 | starting
| 6 | repl | 10.0.0.51:34406 | NULL | Binlog Dump | 1944 | Master has sent all binlog to slave; waiting for more updates |
+----+------+-----------------+------+-------------+------+---------------------------------------------------------------+ 每个主库都会有一行dump相关的信息
Host:
10.0.0.51:34406
State:
Master has sent all binlog to slave; waiting for more updates
如果现实非以上信息,说明主从之间的关系出现了问题 从库:
mysql> show slave status\G;
*************************** 1. row *************************** 主库相关信息监控
Master_Host: 10.0.0.51
Master_User: repl
Master_Port: 3307
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 444 从库中继日志的应用状态
Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 485 从库复制线程有关的状态
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error: 过滤复制有关的状态
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: 主从延时相关状态(非人为)
Seconds_Behind_Master: 0 延时从库有关的状态(人为)
SQL_Delay: 0
SQL_Remaining_Delay: NULL GTID 复制有关的状态
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0

主从复制故障分析

故障1:报错日志
Last_IO_Error: error reconnecting to master 'repl@10.0.0.51:3307' - retry-time: 10 retries: 7
[root@db01 ~]# mysql -urepl -p123333 -h 10.0.0.51 -P 3307
ERROR 1045 (28000): Access denied for user 'repl'@'db01' (using password: YES) 原因分析:
密码错误
用户错误
skip_name_resolve
地址错误
端口错误 处理方法
mysql> stop slave
mysql> reset slave all
mysql> change master to 这里后面需要接正确的地址ip端口什么的
mysql> start slave
####################################################################################### 故障2:报错日志
主库连接数上限,或者是主库太繁忙
mysql> show slave staus \G
Last_IO_Errno: 1040
Last_IO_Error: error reconnecting to master 'repl@10.0.0.51:3307' - retry-time: 10 retries: 7 处理思路:
拿复制用户,手工连接一下
[root@db01 ~]# mysql -urepl -p123 -h 10.0.0.51 -P 3307
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1040 (HY000): Too many connections
修改主库的连接数
mysql> set global max_connections=300
####################################################################################### 故障3:主库缺失日志,从库方面,二进制日志位置点不对
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'could not find next log; the first event 'mysql-bin.000001' at 154, the last event read from '/data/3307/data/mysql-bin.000002' at 154, the last byte read from '/data/3307/data/mysql-bin.000002' at 154.' 注意: 在主从复制环境中,严令禁止主库中reset master; 可以选择expire 进行定期清理主库二进制日志 解决方案:
重新构建主从
####################################################################################### 故障3:SQL 线程故障
SQL线程功能:
(1)读写relay-log.info
(2)relay-log损坏,断节,找不到
(3)接收到的SQL无法执行 导致SQL线程故障原因分析:
1.版本差异,参数设定不同,比如:数据类型的差异,SQL_MODE影响
2.要创建的数据库对象,已经存在
3.要删除或修改的对象不存在
4.DML语句不符合表定义及约束时
归根揭底的原因都是由于从库发生了写入操作
Last_SQL_Error: Error 'Can't create database 'db'; database exists' on query. Default database: 'db'. Query: 'create database db' 处理方法(以从库为核心的处理方案):
暴力的解决方法
方法一:
stop slave;
set global sql_slave_skip_counter = 1;
#将同步指针向下移动一个,如果多次不同步,可以重复操作。
start slave; 方法二:
/etc/my.cnf
slave-skip-errors = 1032,1062,1007
常见错误代码:
1007:对象已存在
1032:无法执行DML
1062:主键冲突,或约束冲突 但是,以上操作有时是有风险的,最安全的做法就是重新构建主从。把握一个原则,一切以主库为主 一劳永逸的方法
(1) 可以设置从库只读.
mysql> set global read_only=1;
mysql>show variables like '%read_only%';
或者
在配置文件/etc/my.cnf中的mysqld中配置read_only=1
注意:
只会影响到普通用户,对管理员用户无效。 (2)加中间件
读写分离

主从延时监控及原因 *****

主库做了修改操作,从库比较长时间才能追上

外在因素

网络差
主从硬件差异较大
版本差异
参数因素

主库因素

1 二进制日志写入不及时。双1标准中的1个,为1时,代表只要事务提交就写入到binlog日志
mysql> select @@sync_binlog;
+---------------+
| @@sync_binlog |
+---------------+
| 1 |
+---------------+ 2 主从复制中,binlog_dump线程,事件为单元,串行传送二进制日志(5.6 5.5)
2.1. 主库并发事务量大,主库可以并行,传送时是串行
2.2. 主库发生了大事务,由于是串行传送,会产生阻塞后续的事务 解决方案:
1. 5.6 开始,开启GTID,实现了GC(group commit)机制,可以并行传输日志给从库IO
2. 5.7 开始,不开启GTID,会自动维护匿名的GTID,也能实现GC,我们建议还是开启GTID
3. 大事务拆成多个小事务,可以有效的减少主从延时

从库因素

SQL线程导致的主从延时
在CR复制情况下: 从库默认情况下只有一个SQL,只能串行回放事务SQL
1. 主库如果并发事务量较大,从库只能串行回放
2. 主库发生了大事务,会阻塞后续的所有的事务的运行 解决方案:
1. 5.6 版本开启GTID之后,加入了SQL多线程的特性,但是只能针对不同库(database)下的事务进行并发回放.
2. 5.7 版本开始GTID之后,在SQL方面,提供了基于逻辑时钟(logical_clock),binlog加入了seq_no机制,
真正实现了基于事务级别的并发回放,这种技术我们把它称之为MTS(enhanced multi-threaded slave).
3. 大事务拆成多个小事务,可以有效的减少主从延时.
[https://dev.mysql.com/worklog/task/?id=6314]

主从延时的监控

mysql> show slave  status\G
*************************** 1. row ***************************
Seconds_Behind_Master: 0

主库方面原因的监控

mysql> show master status ;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1297 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

从库方面原因监控

mysql> show slave status\G;
*************************** 1. row ***************************
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1297 Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 573
Relay_Master_Log_File: mysql-bin.000001 Exec_Master_Log_Pos: 1297
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 7
Master_UUID: ed11d738-2139-11ea-941c-000c2990cef0
Master_Info_File: /data/3308/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400 拿了多少:
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1297 执行了多少:
Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 573
Exec_Master_Log_Pos: 1297
Relay_Log_Space: 779 [root@db01 data]# cat relay-log.info
7
./db01-relay-bin.000002
573
mysql-bin.000001
1297
0
0
1

主从延时的监控

(1) 有没有的问题?
Seconds_Behind_Master: 0 (2) 有没有主库原因?
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 154 | mysql-bin.000003 | 154 (3) 有没有及时回放
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 154 [root@db01 data]# cat relay-log.info
./db01-relay-bin.000009
367
mysql-bin.000003
154 对得上就没问题

MySQL-15-主从复制的更多相关文章

  1. Mysql中主从复制的原理、配置过程以及实际案例

    Mysql中主从复制的原理.配置过程以及实际案例1.什么是主从复制?原理:主从分离,什么意思呢?我们不妨画个图看看.如图1所示: 2.准备工作:预备两台服务器,我这里使用虚拟机安装了两个Centos6 ...

  2. mysql (主从复制)(proxy , Amoeba)

    原址如下: http://heylinux.com/archives/1004.html Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中 ...

  3. mysql的主从复制原理与实现

    关于mysql的主从复制,之前一直在听说这个话题,一直没有实现,昨天学习了下,原来是这么回事: 既然是主从复制,那么肯定有主有从,也就说一个主数据库(一般为写库),一个从数据库(读库).主数据库更新了 ...

  4. 实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)

    主从复制原理: 从库生成两个线程,一个I/O线程,一个SQL线程: i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中:主库会生成一个 log ...

  5. Spring002--实现读写分离(Mysql实现主从复制)

    Spring AOP实现读写分离(Mysql实现主从复制) 本文来自于博客:http://www.cnblogs.com/bjlhx/p/8297460.html 一.背景 一般应用对数据库而言都是“ ...

  6. mysql的主从复制是如何实现的

    前言 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为 ...

  7. mysql数据库主从复制部署笔记

    主从复制是mysql中数据库实时同步的一个常用做法了,今天我来给各位介绍一下关于mysql数据库主从复制部署一个过程,希望此例子对各位同学参考参考. 数据库主从复制原理: 数据库的主从复制就是从mas ...

  8. mysql之主从复制

    原理--> 在数据库层面,复制语句或者行,因为在数据库层面,故只有主服务器生成,并放到二进制日志里面,才能复制给从服务器. 原理--> mysql的主从复制基于异步,主要有三个进程执行,分 ...

  9. mysql简单主从复制(一)

    MYSQL简单主从复制 master:172.25.44.1 slave:172.25.44.2 mysql5.7安装 master和slave均操作 准备rpm包:mysql-5.7.17-1.el ...

  10. Mysql数据库主从复制搭建

    Mysql数据库主从复制原理: 主库开启bin-log日志,同时生成IO线程.IO线程负责将用户写入数据库的sql语句记录在二进制日志bin-log,该记录过程可并发进行:生成标识号 server i ...

随机推荐

  1. CentOS-yum安装chrome+chromeDriver+xvfb

    安装chrome 创建yum源文件 $ vim /etc/yum.repos.d/google-chrome.repo [google-chrome] name=google-chrome baseu ...

  2. LRU工程实现源码(一):Redis 内存淘汰策略

    目录 内存淘汰是什么?什么时候内存淘汰 内存淘汰策略 Redis中的LRU淘汰算法 源码剖析 第一步:什么时候开始淘汰key 配置读取 检查时机 getMaxmemoryState 第二步:淘汰哪些k ...

  3. SpringBoot:springboot项目jar包如何引入外置配置文件

            springboot项目打成jar包,默认读取的classpath路径下的配置文件,config.properties是自定义配置文件. 如果要把config.properties配置 ...

  4. CentOS查看和修改PATH环境变量的方法 (转)

      查看PATH:echo $PATH以添加mongodb server为列修改方法一:export PATH=/usr/local/mongodb/bin:$PATH//配置完后可以通过echo $ ...

  5. 关于mysql binlog二进制

    binlog 在mysql中,当发生数据变更时,都会将变更数据的语句,通过二进制形式,存储到binlog日志文件中. 通过binlog文件,你可以查看mysql一段时间内,对数据库的所有改动. 也可以 ...

  6. 《PHP基础知识总结》系列分享专栏

    总结PHP基础知识,对初学者还是高手都值得参考巩固. <PHP基础知识总结>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/2017 ...

  7. Nacos实战一:架构及部署

    2018年,阿里巴巴开源 Nacos,由此成为继 Eureka.Consul.Apollo 等服务注册发现&配置的又一开源框架,到如今2021年,Nacos 已经历了 0.01->1.4 ...

  8. C语言常用函数笔记

    strcmp 比较字符串: sscanf 读取格式化的字符串中的数据: memset 初始化内存的"万能函数",通常为新申请的内存进行初始化工作.对一段内存空间全部设置为某个字符, ...

  9. Java刷题常用API

    目录 输入输出 快速查看 最大最小值 string stringbuilder 集合 map queue stack set 优先队列 PriorityQueue (Heap) 数组 静态数组 动态数 ...

  10. DNS部署与安全

    1.DNS Domain Name Service 域名服务 作用: 为客户机提供域名解析服务器 2.域名组成 2.1 域名组成概述 如"www.baidu.com"是一个域名,从 ...