目录
一、主从复制的应用常见场景
1.读写分离,提高查询访问性能,有效减少主数据库访问压力;
2.实时灾备,主数据库出现故障时,可快速切换到从数据库;
3.数据汇总,可将多个主数据库同步汇总到一个从数据库中,方便数据统计分析;
二、主从复制的原理
1.主从复制分为异步和半同步:
(1)异步:
传统的MySQL复制提供了一种简单的主从复制方法。有一个主,以及一个或多个从。主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新执行(在基于语句的复制中)或应用(在基于行的复制中)。这是一个shared-nothing的系统,默认情况下所有server成员都有一个完整的数据副本。
(2)半同步:
它在协议中添加了一个同步步骤,这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。
三、主从复制的过程
1.开启binlog日志,通过把主库的binlog传送到从库,从新解析应用到从库;
2.复制需要3个线程(dump、io、sql)完成;
3.复制是异步的过程。主从复制是异步的逻辑的SQL语句级的复制;
四、主从复制的前提
1.主服务器一定要打开二进制日志;
2.必须两台服务器(或者是多个实例);
3.从服务器需要一次数据初始化;
4.如果主从服务器都是新搭建的话,可以不做初始化;
5.如果主服务器已经运行了很长时间了,可以通过备份将主库数据恢复到从库;
6.主库必须要有对从库复制请求的用户;
7.从库需要有relay-log设置,存放从主库传送过来的二进制日志show variables like '%realy%';
8.在第一次的时候,从库需要change master to去链接主库;
9.change master信息需要存放到master.info中show variables like '%master_info%';
10.从库怎么知道,主库发生了新的变化?
(1)通过relay-log.info记录的已经应用过的relay-log信息
11.在复制过程中涉及到的线程:
(1)从库会开启一个IO thread(线程),负责链接主库,请求binlog,接收binlog并写入relay-log;
(2)从库会开启一个SQL thread(线程),负责执行relay-log中的事件;
(3)主库会开启一个dump thread(线程),负责响应从IO thread的请求;
五、MySQL主从复制的实现过程
1.通过二进制日志;
2.至少两台(主、从);
3.主服务器的二进制日志“拿”到从服务器上再运行一遍;
4.通过网络连接两台机器,一般都会出现延迟的状态,也可以说是异步的;
5.从库通过手工执行change master to语句连接主库,提供了连接的用户一切条件user、password、port、ip;
6.并且让从库知道,二进制日志的起点位置(file名 positicon号);
7.启动从库同步服务start slave;
8.从库的IO和主库的dump线程建立连接;
9.从库根据change master to语句提供的file名和position号,IO线程向主库发起binlog的请求;
10.主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程;
11.从库IO线程接收binlog events,并存放到本地relay-log中,传过来的信息,会记录到master.info中;
12.从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info,默认情况下,已经应用过的relay会自动被清理purge;
六、MySQL主从复制有三种核心格式
1.复制的工作原理是数据库修改记录到bin log日志并传递到slave,然后slave在本地还原的过程,而时间记录到bin log的格式会有所不同;
2.基于语句的复制(statement based replication);
(1)基于主库将SQL语句写入到bin log中完成复制;
3.基于行数据的复制(row based replication);
(1)基于主库将每一行数据变化的信息作为时间写入到bin log中完成日志。默认即使基于行级别的复制,因为它相对语句复制逻辑更为严谨;
4.混合复制(mixed based replication);
(1)上述两者的结合。默认情况下优先使用基于语句的复制,只有当部分语句如果基于语句复制不完全的情况下才会自动切换为基于行数据的复制;
七、MySQL传统主从同步设置
1.MySQL yum包下载:
wget http://repo.mysql.com/mysql157-community-release-e17-10.noarch.rpm
2.MySQL 软件源安装:
yum -y install mysql157-community-release-e17-10.noarch.rpm
3.MySQL服务安装:
yum install -y mysql-community-server mysql
4.MySQL服务启动:
systemctl start mysqld.service
5.MySQL服务运行状态检查:
systemctl status mysql.service
6.MySQL更改密码
7.MySQL授权远程登陆
八、MySQL编辑配置文件
1.主库配置:
# 打开MySQL配置文件
vim /etc/my.cnf
#在mysqld下面写入
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-storage-engine=INNODB
symbolic-links=0
server_id=6
log_bin=二进制日志的保存路径
2.从库配置:
# 打开MySQL配置文件
vim /etc/my.cnf
# 在mysqld下面写入
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-storage-engine=INNODB
symbolic-links=0
server_id=8
log_bin=二进制日志的保存路径
relay_log=relay_log的保存路径
九、MySQL创建主从同步账号
1.在主库创建一个专门用来复制的数据库用户,所有从库都用这个用户来连接主库,确保这个用户只有复制的权限;
grant replication slave on *.* to '用户名'@'主机名';
十、MySQL获取主库主库数据信息并生成主库数据镜像
1.对主库上的所有表加锁,停止修改:
flush tables with read lock;
2.获取主库的日志信息:
show master status;
十一、同步两台MySQL库的信息
1.可以通过备份主库数据到从库上恢复而完成同步(因为要同步信息,所以uuid可能会重复,需要更改);
2.进入var下的lib下的mysql目录下
cd /var/lib/mysql
3.找到auto.cnf更改里面的值
十二、MySQL从库配置同步
1.进入到mysql库中,在从库上建立复制关系,即从库指定主库的日志信息和链接信息;
2.在数据库中输入:
change master to
master_host='主库的地址',
master_port=主库端口,
master_user='用来复制的用户',
master_password='主库密码',
master_log_file='主库当前的二进制日志信息',
master_log_pos=当前的二进制日志信息的pos点;
十三、启动slave
1.在数据库中输入:
start slave;
# 停止slave命令
stop slave;
十四、查看从库的状态
show slave status\G