目录
背景
此文章只是简单记录了一次mysql主从复制的过程。
有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。
解决问题
- 数据分布
- 负载均衡(读数据)
- 数据备份
- 高可用和故障切换
主从复制原理
这里会开启三个线程:masterIO线程、slaveIO线程、SQL线程
步骤1:主服务器(master)开启bin-log功能,之后会产生二进制日志文件,master的增删改操作会记录到日志文件中。
步骤2:从服务器(slave)把master的bin-log,position之后的内容拷贝到它的中继日志(relay log)。
步骤3:Slave再执行中继日志的内容,把master改变的数据反映到自己的数据中以保持一致。
如下图(网上K来的):
主从服务器配置
主节点:
- 启用二进制日志
- 为当前节点设置一个全局唯一的server_id
- 创建有复制权限的用户账号 REPLIACTION SLAVE
如图,使用vi /etc/my.cnf 命令打开mysql配置文件(我是这个路径)
在[mysqld]部分最后面填加
#主从复制配置
server-id=1 #mysql源唯一标识
log-bin=mysql-bin #开启二进制日志
#log_bin_index =master-bin.index
然后重启master库,运行show master status,将File和Position的值记录下来后面用。
从节点:
- 启用中继日志
- 为当前节点设置一个全局唯一的server_id
- 使用有复制权限的用户账号连接至主节点,并启动复制线程
从节点也类似,找到配置文件进行配置
然后重启slave库,service mysqld restart
创建一个有复制权限的mysql账号
创建账号
create user xiaoming identified by 'xiaoming123';
授权
GRANT REPLICATION SLAVE ON *.* TO xiaoming @'%' IDENTIFIED
BY 'xiaoming123' WITH GRANT OPTION;
注意:创建账号时如果提示密码强度不够,可以修改密码强度设置
SHOW VARIABLES LIKE 'validate_password%'; //查询密码强度
set global validate_password_policy=LOW; //设置密码强度
启动slave库
让slave库连接master库并开始同步数据,这里不改配置文件而是使用CHANGE MASTER TO语句来执行。
change master to master_host='8.120.22.678',master_user='xiaoming',
master_password='xiaoming123',
master_log_file='mysql-bin.000001',master_log_pos=154;
这里的master_host就是master库的ip(这里我随便写一个)账号密码就是上面所创建的,master_log_file和master_log_pos就是第3步查询到的
然后执行完,再执行show slave status\G
如图,如果此时Slave_IO_Running和Slave_SQL_Running是No,表明slave还没有开始复制过程。
这时候再执行START SLAVE; 然后再运行show slave status\G 可以看到slave已经正常
当Slave_IO_Running, 和Slave_SQL_Running都为Yes时,表明slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。
测试结果
使用Navicat客户端,无论是执行sql语句还是手动删除一条数据 还是操作数据库或表,在另一个服务器库刷新都能马上看到效果,实时性很强。
ps:我这里主库mysql是5.7版本的,从库是mysql8 [滑稽脸]