目录:
一、主从复制基本概念
二、MySQL主从复制介绍
三、主从搭建配置
四、MySQL主从复制常见问题分析
一、主从复制基础概念
在了解主从复制之前必须要了解的就是数据库的二进制日志(binlog),主从复制架构大多基于二进制日志进行。
1.1 二进制日志管理说明
二进制日志在哪?如何设置位置和命名?
在my.cnf文件中使用 log-bin = 指定;命名规则为 mysql-bin.000000 (后为6位数字)
二进制日志位置:
mysql> show variables like '%log_bin%' ;
+---------------------------------+-----------------------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------------------+
| log_bin | ON |
| log_bin_basename | /application/mysql/data/mysql-bin |
| log_bin_index | /application/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------------------+
6 rows in set (0.06 sec)
日志命名:
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 2979 |
| mysql-bin.000002 | 120 |
+------------------+-----------+
2 rows in set (0.00 sec)
二进制日志记录什么?二进制日志中记录的是一个个完成的事件
二进制日志格式是怎样的?推荐使用row格式
查看当前使用的日志格式:
mysql> show variables like '%format%';
+--------------------------+-------------------+
| Variable_name | Value |
+--------------------------+-------------------+
| binlog_format | ROW |
| date_format | %Y-%m-%d |
| datetime_format | %Y-%m-%d %H:%i:%s |
| default_week_format | 0 |
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| time_format | %H:%i:%s |
+--------------------------+-------------------+
8 rows in set (0.00 sec)
二进制日志如何滚动?每次重启都会刷新日志,也可以通过命令进行刷新 reset master;
二进制日志用来干嘛?备份恢复,起始点的备份恢复
二进制日志的操作命令?查看都有哪些二进制日志
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 2979 |
| mysql-bin.000002 | 167 |
| mysql-bin.000003 | 120 |
+------------------+-----------+
3 rows in set (0.00 sec)
查看当前使用的二进制日志文件:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
binlog*相关详情参照:*
cnblogs.com/clsn/p/8087678.html#_label6
1.2 mysql传统备份方式和缺陷 二进制日志备份
mysqldump
必须有数据库服务器完成逻辑工作,需要更多地cpu周期
逻辑备份还原速度慢:需要MySQL加载和解释语句、转化存储格式、重建引擎
xtrabackup
文件大不总是可以跨平台、操作系统和MySQL版本1.3 MySQL主从复制能为我们做什么二、MySQL主从复制介绍2.1 复制技术
作用:
保证数据安全(异机实时备份)
保证服务持续运行(宕机接管)
主从复制实现基本原理
自带功能,复制是 MySQL 的一项功能,允许服务器将更改从一个实例复制到另一个实例。
主服务器将所有数据和结构更改记录到二进制日志中。
从属服务器从主服务器请求该二进制日志并在本地应用其内容。即通过把主库的binlog传送到从库,从新解析应用到从库。
2.2 复制架构
mysql复制的应用常见场景:
应用场景1:从服务器作为主服务器的实时数据备份
应用场景2:主从服务器实现读写分离,从服务器实现负载均衡
应用场景3:把多个从服务器根据业务重要性进行拆分访问
传统的 MySQL复制提供了一种简单的主–从复制方法,有一个主,以及一个或多个从。
主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新执行(在基于语句的复制中)或应用(在基于行的复制中)。
这是一个 shared-nothing 的系统,默认情况下所有 server 成员都有一个完整的数据副本。

(图)MySQL 异步复制
还有一个半同步复制,它在协议中添加了一个同步步骤。
这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。

(图)MySQL 异步复制
在上面的两个图片中,可以看到传统异步 MySQL 复制协议(以及半同步)的图形展示。
蓝色箭头表示在不同 server 之间或者 server 与 client 应用之间的信息交互。
2.3 MySQL主从复制原理介绍
复制过程:
开启binlog日志,通过把主库的binlog传送到从库,从新解析应用到从库。
复制需要3个线程(dump、io、sql)完成,5.6从库多个sql。
复制是异步的过程。主从复制是异步的逻辑的SQL语句级的复制。
复制前提:
主服务期一定要打开二进制日志
必须两台服务器(或者是多个实例)
从服务器需要一次数据初始化
如果主服务器已经运行了很长时间,可以通过备份将主库数据恢复到从库
5.
主库必须要有对从库复制请求的用户。
从库需要有relay-log设置,存放从主库传送过来的二进制日志:
在第一次的时候mysql主机,从库需要change master to 去连接主库。
change master信息需要存放到master.info中 :
从库怎么知道,主库发生了新的变化?通过relay-log.info记录的已经应用过的relay-log信息。
在复制过程中涉及到的线程
从库会开启一个IO thread(线程),负责连接主库,请求binlog,接收binlog并写入relay-log。
从库会开启一个SQL thread(线程),负责执行relay-log中的事件。
主库会开启一个dump thrad(线程),负责响应从IO thread的请求。
主从怎么实现的?
通过二进制日志
至少两台(主、从)
主服务器的二进制日志“拿”到从服务器上再运行一遍。
通过网络连接两台机器,一般都会出现延迟的状态。也可以说是异步的。

2.4 执行原理--第一次开启主从过程 从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件:
(user、password、port、ip)
并且让从库知道,二进制日志的起点位置(file名 position号)
start slave
从库的IO和主库的dump线程建立连接
从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求
主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程
从库IO线程接收binlog evnets,并存放到本地relay-log中,传送过来的信息,会记录到master.info中。
从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info,默认情况下,已经应用过的relay会自动被清理purge。
到此为止,一次主从复制就完成
一旦主从运行起来:就不需要手工执行change master to,因为信息都会被存放到master.info(user、password、port、ip,上次获取过的binlog信息file和position)中。
详细的mysql replication 过程

三、 主从搭建配置
本次主从搭建使用mysql多实例进行实验。多实例配置参考文档进行配置:
cnblogs.com/clsn/p/8038964.html#_label8
3.1 多实例数据库slave配置
系统环境说明:
[root@db02 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@db02 ~]# uname -r
2.6.32-696.el6.x86_64
[root@db02 ~]# /etc/init.d/iptables status
iptables: Firewall is not running. # 注意:务必关闭防火墙(iptables selinux)
[root@db02 ~]# getenforce
Disabled
[root@db02 ~]# mysql --version
mysql Ver 14.14 Distrib 5.6.36, for Linux (x86_64) using EditLine wrapper
1、启动多实例数据库
[root@db02 ~]# /data/3306/mysql start
Starting MySQL...
[root@db02 ~]# /data/3307/mysql start
Starting MySQL...
2、配置文件说明:
master 配置文件说明:
[root@db02 ~]# cat /data/3306/my.cnf
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /application/mysql
datadir = /data/3306/data
log-bin = /data/3306/mysql-bin
server-id = 6 # server id 不能相同
skip_name_resolve = 0 # 跳过域名解析参数
[mysqld_safe]
log-error=/data/3306/mysql_3306.err
pid-file=/data/3306/mysqld.pid
slave 配置文件说明:
[root@db02 ~]# cat /data/3307/my.cnf
[client]
port = 3307
socket = /data/3307/mysql.sock
[mysqld]
user = mysql
port = 3307
socket = /data/3307/mysql.sock
basedir = /application/mysql
datadir = /data/3307/data
log-bin = /data/3307/mysql-bin
server-id = 7 # server id 不能相同
skip_name_resolve = 0 # 跳过域名解析参数
read_only = 1 # 从库只读 (非root用户 )
[mysqld_safe]
log-error=/data/3307/mysql_3307.err
pid-file=/data/3307/mysqld.pid
3、在主库创建复制用户
登陆到主数据库中:
mysql -uroot -p123 -S /data/3306/mysql.sock
创建授权用户,注意是slave用户。
grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
4、初始化从库数据
备份主库当前数据
mysqldump -uroot -p123 -A -B -F --master-data=2 -S /data/3306/mysql.sock >/tmp/full.sql
部分参数说明:
到从库进行恢复
mysql -uroot -p123 -S /data/3307/mysql.sock
恢复备份的数据
set sql_log_bin=0;
source /tmp/full.sql
5、开启从库复制
查看备份的当前使用的文件及POS号
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000012 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
登入数据库,进行slave配置。
mysql -uroot -p123 -S /data/3307/mysql.sock
CHANGE MASTER TO
MASTER_HOST='10.0.0.52',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000012',
MASTER_LOG_POS=120;
start slave; # 启动从库复制
该配置想关说明可以通过 help 获得。
mysql> help CHANGE MASTER TO
CHANGE MASTER TO
MASTER_HOST='master2.mycompany.com',
MASTER_USER='replication',
MASTER_PASSWORD='bigs3cret',
MASTER_PORT=3306,
MASTER_LOG_FILE='master2-bin.001',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;
3.2 测试主从同步
(编辑:成都站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|