MySQL主从复制
Posted 水木,年華
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从复制相关的知识,希望对你有一定的参考价值。
mysql主从复制
前言:
在企业应用中,成熟的业务通常数据量都比较大,单台MySQL在安全性、高可用性和高并发方面都无法满足实际的需求,需配置多台主从数据库服务器以实现读写分离。
一.什么叫高可性:
高可用性:
指的是冗余备份包含性能指标(五大负载+内核优化方向)
安全性指标:网络部分安全性、通讯加密,用户登陆、管理权限安全性
二.MySQL设计思路
①MySQL主从复制:让slave服务器中的中继日志同步master二进制日志
②MySQL读写分离:基于主从复制以功能性拆分成读和写,缓解MySQL读写的压力,解决读写比例失恒,单台读写瓶颈的问题。
③MHA高可用:对master服务器做一个冗余备份工作。
三种方式:
①纵向扩展:强化自己服务器(五大资源,内核优化 加数据库内的优化,索引,存储过程,select查询等等
②横向扩展:增加服务器数量
③借助于内存/缓存数据库:Redis,来帮助MySQL缓存一些高热数据,减少MySQL压力
除此之外可以考虑是否需要做一些架构,服务上的改动
三.MySQL主从复制原理
3.1MySQL的复制类型
基于语句的复制(基于SQL语句)
基于行的复制(ROW基于行)
混合类型的复制(MIXED混合模式)
3.2MySQL主从复制默认使用的机制
全同步
半同步
异步(默认)
3.3MySQL主从复制工作过程
主从复制原理核心在于2个日志文件,3个线程(4个线程)
2个日志:二进制日志和中继
三个线程:master上的dump线程,slave上的IO线程和SQL线程
目的:slave上的中继日志趋近实时同步master上的二进制日志
过程:
dump线程会监听二进制日志的更新,如果有更新则会通知slave IO
首先slave上的IO线程向master上申请同步二进制日志的更新内容
dump线程会把同步的sql日志内容与slave服务器,slave的IO线程会把写入自己的中继日志
slave sql线程把日志中的更新语句同步执行到数据库内部,以达到和master数据库趋近一致
##master
二进制日志
线程:dump,用于监听binlog同时通知SLAVE I/O
##slave
relay log
线程1 :I/O
负责向master请求更新的日志内容
将更新的内容同步到本地的relay log
线程2: sql
将本地的relay log中的更新内容(对本地relay log 做监听),同步执行到自己数据库内
四.主从复制配置
虚拟机:
客户端client(测试) 192.1683.80.1
mysql-master 192.168.80.2
mysql-slave1 192.168.80.3
mysql-slave2 192.168.80.4
Ameoba 192.168.80.5
4.1主从服务器时间同步
master服务器配置
①安装ntp,修改配置文件
ntpdate ntp.aliyun.com
hostnamectl set-hostname master #将主机名改成master
su
同样slave1和slave2也同步阿里云服务器
ntpdate ntp.aliyun.com
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
su
3台虚拟机设置计划任务
crontab -e
*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com
编译安装5.7MySQL,启动MySQL
4.2配置主从同步
(1)master服务器修改配置文件
vim /etc/my.cnf
19 log_bin=master-bin #开启二进制日志文件(之后生成的日志名为master-bin)
20 log_slave_updates=true #开启从服务器日志同步
21 server_id=11 #主服务器id为11(不可重复)
重启服务
systemctl restart mysqld
(2)从服务器配置
vim /etc/my.cnf
17 log_bin=master-bin #开启二进制日志文件
18 server_id = 23 #设置 server1 id为22,server2 id为23
19 relay-log=relay-log-bin #从服务器上同步日志文件记录到本地
20 relay-log-index=slave-relay-bin.index #定义relay-log的位置和名称(index索引)
4.3配置规则
[root@master mysql]# mysql -u root -p
mysql> grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
#给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456
mysql> flush privileges; #刷新权限表
Query OK, 0 rows affected (0.01 sec)
show master status; 查看状态
mysqlbinlog --no-defaults --base64-output=decode-rows -v master-bin.000001
开启从服务器功能
change master to master_host='192.168.80.2',master_user='myslave',master_password='123456',
master_log_file='master-bin.000001',master_log_pos=603;
开启从服务器同步
start slave;
查看slave的状态
show slave status\\G
查看主从是否同步的点在于
I/O和SQL的两个yes
当不同步时,需要查看的
1、last_error(全局,sql线程的、I/O线程的)
4.4验证主从同步
master创建表,在从服务器器上依旧可以查看到
五.小结
MySQL主从复制与读写分离是密切相关的,介绍了MysQL的主从复制(同步),紧接着下一篇会介MySQL读写分离。
这里简单介绍一下二进制日志:
MysQL的二进制日志是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的SQL语句二进制日志中记录了对MySQL数据库执行更改的所有操作,并且记录了语句发生时间、执行时长、操作数据等其他额外信息,但是它不记录SELECT 、SHOW等不修改数据的SQL语句。
同步失败可使用以下方法尝试解决:
忽略当前的错误执行 下一步同步
先stop slave;
slave 数据库中:
set global sql_slave_skip_counter=1;
start slave;
I/o线程一直处于connecting
第一件事,看laster error,报错项内容是为支点找不到
先
stop slave;
slave数据库中:
CHANGE MASTER TO MASTER _LOG_FILE= 'mysql-bin.000001',MASTER _LOG_POS=0;
遇到这个是因为binlog位置索引处的问题,生产环境下不要直接reset slave(删除change master操作的) ;
reset slave会将主从同步的文件以及位置恢复到初始状态,一开始没有数据还好,有数据的话,相当于重新开始同步,可能会出现一些问题;
一般做主从同步,都是要求以后的数据实现主从同步,而对于旧的数据完全可以使用数据库同步工具先将数据库同步,完了再进行主从同步;
遇到上面的问题,正确的做法是
1.打开主(master)服务器,进入mysql
2.执行flush logs; //这时主服务器会重新创建一个binlog文件;
3.在主服务上执行show master slave\\G
4.来到从服务器的mysql;
5.stop slave;
6.change master to master_log_file='mysql-bin.000002',master_log_pos=154;
//这里的file和pos都是上面主服务是master显示的。
7.start slave;
8.show slave status\\G;
以上是关于MySQL主从复制的主要内容,如果未能解决你的问题,请参考以下文章