Mysql主从复制是指数据可以从一个Mysql数据库服务器主节点复制到一个或多个从节点。Mysql默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
MySQL主从复制有异步模式、半同步模式、GTID模式以及多源复制模式,MySQL默认模式是异步模式。所谓异步模式,只MySQL主服务器上I/O thread线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就会发生丢失
1、Slave上的IO thread线程连接上Master,并请求获取指定的位置(或者从最开始)的Binary log文件
2、Master接收到Slave的IO thread线程的请求后,通过Slave的IO线程返回binlog文件。除了返回数据文件,还返回本次返回的信息在Master端binlog文件的名字及位置
3、Slave的IO线程在接收到信息后,将接受到的日志文件内容依次写入到Slave端的Relay log(中继日志)文件中,将接收到的Master端binlog文件的名字及位置追加至master-info文件中,以便下一次访问Master端时,能够清楚地告诉Master端需要请求什么位置以后的binlog文件
4、Slave端中的SQL线程会自动检测Relay log文件中发生变化的部分,并将其翻译成对应的SQL语句,并执行。
对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库会为每一个从库建立一个 binlog 输出线程,而每个从库也有自己的IO线程 和 SQL线程
1、读写分离
在开发工作中,有时候会遇见某个sql语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让从库负责写,从库负责读,这样,计时主库出现缩表的情景,通过读从库也能保证业务正常运作
2、数据实时备份,当系统中某个节点发生故障时,可以方便的故障切换
3、高可用HA
随着系统中业务访问量的增大,如果是单机部署数据库,就会导致IO访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个节点上,降低单机磁盘IO访问频率,提高单个机器的IO性能。
环境要求:
(1)两台centos7机器,分别装有mysql数据库,并初始化。若是克隆机,修改server-uuid,不能相同。
vim /usr/local/mysql/data/auto.cnf
#删除server-uuid,重启服务,生成server-uuid
(2)检查两台机器防火墙是否关闭
包过滤防火墙 firewalld,内核防火墙 selinux
#关闭firewalld防火墙
systemctl stop firewalld
systemctl disable firewalld
#检查状态
systemctl status firewalld
#关闭selinux防火墙
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
(3)
主库 | 192.168.139.152 |
---|---|
备库 | 192.168.139.153 |
两台机器数据库初始化(展示一台操作,另一台相同)
#先停掉msyqld服务
systemctl stop mysqld
#删除mysql原数据文件
rm -rf /usr/local/mysql/data
#初始化
cd /usr/local/mysql/
/bin/msyqld --initialize --user=msyql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
#启动服务
systemctl start mysqld
#查看密码
grep 'password*' /var/log/mysql-error.log
#重置库
msyql_secure_installation
时钟源同步
#根据自己情况选择同步源,两台机器一样
ntpdate ntp1.aliyun.com
配置主库
#编辑配置文件
vim /etc/my.cnf
#找到[msyqld]模块并编辑
server_id = 10(编号随便写)
#开启binlog功能
log-bin = mysql-bin (binlog文件名随便写,但是尽量规范化)
log-bin-index = master-bin.index (开启索引)
#找到[log]模块编辑
log_bin = /usr/local/mysql/data/mysql-bin
重启服务
systemctl stop mysqld
systemctl start mysqld
主库上创建用户并授权
#创建用户copy(用户名自定义)
create user "copy"@"192.168.139.153" identified by "xxxxx";
#授权用户
grant replication slave on *.* to "copy"@"192.168.139.153";
#刷新权限表
flush privileges;
从库上测试
mysql -h 192.168.139.152 -u copy -p
在主库上查看日志文件信息
show master status;
配置从库
#编辑从库配置文件< /etc/my.cnf 中找到[mysqld]模块并编辑>
server_id = 20 (与主库id不同)
relay-log = relay-log
relay-log-index = relay-log.index
重启从库
systemctl stop mysqld
systemctl start mysqld
再从库中配置主节点
#登录从库编辑
change master to
master_host = "192.168.139.152", #主库地址
master_user = "copy", #以什么用户登录主库
master_password = "xxxxx", #登录密码
master_log_file = "mysql-bin.000004", #日志文件名称
master_log_pos = 536; #日志文件节点号
此处的master_log_file与master_log_pos是上面在主库中查看的日志信息
show master status;
从库上开始主从同步
start slave;
在从库上查看主从信息
show slave status \G