目录
在实际生产环境中,若对MySQL数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不满足实际需求的,一般要通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
<1>数据备份:当系统中某个节点发生故障时,可以方便故障切换
<2>读写分离:在开发过程中,若遇到某个sql语句需要锁表,导致暂时不能使用读的服务,使用主从复制,让主数据库负责写,从数据库负责读,即使主库出现锁表的情景,也可以通过从库正常读数据
<3>支持更大的并发:随着系统中业务访问量的增加,若是单机部署数据,会导致I/O访问频率过高。通过主从复制,增加多个数据存储结点,将负载分布在多个从节点上,降低单机的I/O访问频率,提高单机的I/O性能
主从复制
主从复制的流程:binlog二进制日志和三个线程(master的一个主线程和slave的二个线程)
一个运行在主节点:binary log dump thread
两个运行在从节点:I/O thread、SQL thread
原理介绍
<1> 主库的更新操作写入binlog二进制日志中
<2> master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器
<3> slave机器执行START SLAVE命令会在从服务器创建一个I/O线程,接收master的binary log复制到其中继日志(relay log)。
首先slave开始一个工作线程(I/O线程),I/O线程在master上打开一个普通的连接,然后开始binlog dump process,binlog dump process从master的二进制日志中读取事件,若已经跟上master,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志(relay log)。
<4> sql slave thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志中读取事件,并重放其中的事件而更新slave机器的数据,使其与master的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小。
主从复制模式:
1、异步模式
2、半同步模式
3、全同步模式
4、GTID复制模式
配置命令
条件:master和slave机器的信息
master(centos7):ifconfig
slave(win10):ipconfig
互ping一下保证master和slave之间的网络互通,并且保证3306端口是放开的
master配置:
<1>开启二进制日志:配置log_bin和全局唯一的server-id
<2>创建一个用于主从库通信用的账号
create user 'mslave'@'192.168.131.1' identified by 'lqaz@wsx';
grant replication slave on *.* to 'mslave'@'192.168.131.1' identified by 'lqaz@wsx';
flush privileges;
<3>获取binlog的日志文件名和position
show master status;
slave配置:
<1>配置全局唯一的server-id(在windows涉及修改配置文件,需要重启mysql57服务)
<2>使用master创建的账户读取binlog同步数据
change master to master_host='192.168.131.129',
master_port=3306,
master_user='mslave',
master_password='lqaz@wsx',
master_log_file='mysql-bin.000006',
master_log_pos=1106;
注:更新配置:需先stop slave,重新配置,然后start slave重启从线程
<3>通过show slave status命令查看主从复制状态
或通过show processlist查看master和salve相关线程的运行态
Error问题:
error 1045:connecting to master 'mslave'@'192.168.131.129:3306' -retry-time:60 retrises:1
若配置NET模式的虚拟机,会由NET提供一个ip
<1>网络是否互通?:ping
<2>主库所在机器的3306端口是否正常? telnet xxx.xxx.xxx.xxx 3306 是否对端口有限制
<3>查看主库的错误日志:/var/log/mysql/mysqld.log
error 1032:handler error HA_ERR_KEY_NOT_FOUND;the event's master log mysql-bin.000005,end_log_pos 1235
检查一下binlog和position是否配置正确!!!
开启centos防火墙3306端口
centos7防火墙配置不再是iptables了,配置如下:
#检查防火墙状态
systemctl stauts firewalld.service
#开启防火墙
systemctl start firewalld.service
#关闭防火墙
systemctl stop firewalld.service
#使能防火墙状态
systemctl enable firewalld.service
#不使能防火墙状态
systemctl disable firewalld.service
#开放3306端口
firewalld-cmd --zone=public --add-port=3306/tcp --permanent
#重启防火墙
firewall-cmd --reload
#查看当前开放的端口列表
firewall-cmd --list-ports