为什么要进行主从复制
以前咱们做实验使用的mariadb都是单节点的,存在单点故障,如果服务出现问题,整个系统就挂掉了。那么为了解决这个单点问题,mariadb和mysql都有复制功能,简单来说就是有一个主节点(master),一个或者多个从节点(slave), 主节点可读可写,从节点只能进行读操作,这样数据在主节点更新后复制一份给从节点,保持两个数据库节点的数据集是一样的,这样做好处很多,下面分别介绍。
使用数据库复制功能的优势
- 横向扩展,增加多个从节点后,读操作可以被分散到这些节点上去,从而降低主节点压力,使用场景为读多写少,可以做到读写分离。
- 数据分析,对于需要进行数据处理分析的场景来说,使用从节点的数据进行分析,可以大大降低主节点压力。
- 备份用途,可以在从节点上进行备份操作,于此同时主节点继续正常提供服务,毫无影响。
复制步骤和原理说明
- 首先主节点上,在事务提交时会把数据变更作为事件记录在二进制日志(BINLOG)中。
- 从节点请求主节点的binlog事件,主节点通过自身的BINLOG Dump线程将需要的数据发送给从节点的IO线程。
- 从节点将刚才IO线程收到的数据写入到中继日志Relay Log(跟BINLOG类似,使用完了定期会进行删除)中。
- 从节点上的SQL线程读取中继日志并进行应用,从而保证与主节点数据一致。
可以看到整个过程一共涉及3个线程,主节点这边一个binlog dump,从节点这边俩线程,一个IO线程,一个SQL线程.
实验环境说明
本次实验使用两个虚拟机,分别都安装了mariadb最新版本.
- Master VM: 192.168.58.131/24
- Slave VM: 192.168.58.135/24
主节点上的操作
首先编辑配置文件,打开二进制日志功能,并设置一个唯一识别的server id.
log_bin=binlog_master
server_id=1
binlog_format=row
format等于row表示记录二进制日志的时候记录具体行的变化,而不是只记录sql语句,这样更详细,更能保持数据一致性,但是log占用磁盘空间比较大。
然后创建用于复制的用户(repuser),步骤如下(连接到mysql命令行下):
GRANT REPLICATION SLAVE ON *.* to 'repuser'@'192.168.58.%' identified by 'P@ssw0rd';
FLUSH PRIVILEGES;
重启数据库服务,以便配置文件的修改生效。
systemctl restart mariadb
重启过后再次登录主节点,使用下面命令观察下主节点的情况:
show master status;
可以看到正在使用的binlog文件名以及具体写到了什么位置,记录好.
从节点的配置
首先也是编辑配置文件:
server_id=2
只需要添加serverid就可以了暂时,只是注意不要和主节点一样,这是设置为2.
设置完需要重启数据库服务.
systemctl restart mariadb
下面开始配置主从关系,指定主节点是谁,用户密码是什么,还有从哪里开始复制。
CHANGE MASTER TO MASTER_HOST='192.168.58.131',MASTER_USER='repuser',MASTER_PASSWORD='P@ssw0rd',MASTER_LOG_FILE='binlog_master.000001',MASTER_LOG_POS=0;
最后的POS=0表示从一开始复制,接着开启slave:
start slave
此时使用下面的命令可以看到线程的情况,都是running就是对的:
show slave status;
此时主从复制已经配置完毕,咱们来在主节点上创建一个新的数据库,看看有没有同步到从库上。
create database testdb2
从节点上已经出现了新建的数据库,表示复制已经工作正常了。
解除主从复制关系
如果需要彻底删除主从关系,那么需要在从库上进行下面的操作:
stop slave;
reset slave all;
经过上面的操作后,主从关系的记录就删除了,此时在从节点上show slave status已经看不到输出了。