主从复制原理(基于至少二实例,依赖二进制日志来实现的,三个线程)
主从复制原理:
当主节点接收到用户的写操作时,就会更新自己的数据库,提交后写入bin log二进制日志中,dump线程会自动读取新生成的二进制日志,通过网络发送到从节点上的io线程,io线程会把数据转存到中继日志,SQL线程从中继日志中读取数据,并执行到对应的数据库中,完成数据库的更新。
实现主从复制配置流程
主从版本要一样,如果不一样,主节点要低,一般升级时会用,要先升级从服务器
配置一:一主双从
主节点配置:
关闭mysql
第一步:启动二进制日志,8.0默认已启动
[mysqld]
log_bin=/data/mysql/mysql-bin
第二步:为当前节点设置一个全局唯一的ID号
[mysqld]
server-id=# 可以和ip最后的数字相同,确保唯一
启动mysql并登录
第三步:查看主二进制的文件和位置开始进行复制
show master status; binlog.000001 156
第四步:创建有复制权限的的用户帐号
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
从节点配置:
关闭mysql
第一步:启动二进制日志,8.0默认已启动
[mysqld]
log_bin=/data/mysql/mysql-bin
第二步:为当前节点设置一个全局唯一的ID号
[mysqld]
server-id=# 可以和ip最后的数字相同,确保唯一
启动mysql并登录
第三步:查看从节点配置和线程
show slave status;查看为空
show processlist;查看需要的两个线程(io线程和sql线程)
第四步:在主节点的mysql中,help change master to;把下列贴到从节点的mysql中
CHANGE MASTER TO
MASTER_HOST='10.0.0.150', #主服务器地址
MASTER_USER='repluser', #用户
MASTER_PASSWORD='123456', #密码
MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000001', #主服务器二进制日志文件名
MASTER_LOG_POS=156,
MASTER_CONNECT_RETRY=10; #网络断了多长时间重试一次(默认60s)
再次查看从节点配置和线程
show slave statusG #查看有内容了 (这两个值观察主从复制是否异常,有一个NO就是异常)
Slave_IO_Running:NO
Slave_SQL_Running:NO #程还没有启动,这两个线程是未来观察主从复制的核心指标,看yes还是no
Seconds_Behind_Master:NULL #差多长时间能从主节点把数据同步好,时间为0,复制完了
第五步:开启同步
mysql> start slave;
查看状态:show slave statusG
Slave_IO_Running:YES
Slave_SQL_Running:YES
查看主节点线程:发现了dump线程开启以及从节点的连接信息 show processlist;
查看从节点两个线程:发现io线程和sql线程已经开启。
主服务器非新建时,主服务器运行一段时间后,新增从节点服务器(一主双从),需要先备份发到从节点
第一步:在主节点完全备份
mysqldump -uroot -p123456 -A -F --single-transaction --master-data=1 > /backup/mysql_all-`date +%F`.sql
第二步:把导出的文件复制到从节点2上
scp /backup/mysql_all-`date +%F`.sql 10.0.0.152:输入密码
第三步:从节点2启动二进制日志,8.0默认已启动
[mysqld]
log_bin=/data/mysql/mysql-bin
第四步:从节点2为当前节点设置一个全局唯一的ID号
[mysqld]
server-id=# 可以和ip最后的数字相同,确保唯一
第五步:从节点2更改主节点传输过来的文件,找到CHANGE MASTER TO,改为以下形式
vim mysql_all-`date +%F`.sql
CHANGE MASTER TO
MASTER_HOST='10.0.0.150',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=156, MASTER_CONNECT_RETRY=10;
第六步:从节点2进入mysql临时禁用二进制日志
mysql> set sql_log_bin=0;
第七步:从节点2把文件导入
mysql> source mysql_all-`date +%F`.sql
第八步:开启同步
mysql> start slave;
查看状态:show slave statusG
Slave_IO_Running:YES
Slave_SQL_Running:YES
此时,主节点有两个从节点,进入mysql查看线程,会发现有几个从节点,就会产生几个dump线程
如果在配置从节点主从复制时数据填写出错,可停止从节点,清除主从复制信息,并重新进行主从复制
在从节点清除信息:
停止从服务:stop slave;
清除从服务数据:reset slave all;
重新写入主从复制信息:
开启从服务:start slave;
配置二:双主双从
从原来的从节点上面查询二进制日志,
show master logs;
查询CHANGE MAETER TO;
CHANGE MASTER TO
MASTER_HOST='10.0.0.151',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=156,
把查询到的信息复制到原来的主节点上,做到相互为对方的主,又相互为对方的从
主节点配置如下:
mysq> CHANGE MASTER TO
MASTER_HOST='10.0.0.151',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=156,
查看slave信息:
show slave statusG;查看信息
开启线程:
start slave;
双主存在问题:
由于两个都可以写,同时插入相同的数据,会产生主键冲突,复制出现问题,show slave statusG可看到异常,并且接下来的复制都会卡在这里
双主模式下,应该让一个主节点直接受写,防止同时写入出现问题
双主复制错误解决方法
可以在从服务器忽略几个主服务器的复制事件,此为global变量,或指定跳过事件的ID
模仿同时对两个实例执行命令
如:insert test (name)values('b');
结果是,双方都可以创建成功,但是复制给对方时,会遇到主键冲突,我也有你也有,都有了,就复制不过去了。
一个实例再往下执行增加任务时,由于上个复制任务失败了,造成堵塞,后面的复制也过不去了
Last_SQL_Error:出现错误
如何跳过错误,解决堵塞?
方法一:
第一步:双方停掉复制线程
stop slave;
第二步:双方跳过一个错误
set global sql_slave_skip_counter=1;
第三步:启动线程
start slave;
如果还有错误,就接着跳
方法二:
找到错误编号:
Last_SQL_Error:1000 在配置文件里跳
[mysqld]
slave_skip_errors=all |编号 all代表全部跳
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com