mysql--主从复制

前戏

当我们的网站部署到生产环境之后,如果只有一个数据库,当这个数据库宕机之后,用户就访问不了我们的网站了,这会给公司带来很大的损失。那我们想,可不可以有两个或多个数据库,里面的数据都是一样的,当一个数据库宕机之后,人工切换到备份数据库,这样就不会大大的减少公司的损失。

MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上。

MySQL数据库支持单向、双向、链式级联等不同业务场景的复制。在复制的过程中,一台服务器充当主服务器(master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(slave),当接收来自master上binlog文件的日志内容,解析出SQL语句。重新更新到slave,使得主从服务器数据达到一致。

主从复制的逻辑有以下几种

一主一从,单向主从同步模式,只能在master端写入数据。

一主多从

双主主复制逻辑架构,此架构可以在Master1或Master2进行数据写入,或者两端同事写入(特殊设置)

 在生产环境中,MySQL主从复制都是异步的复制方式,既不是严格的实时复制,但是给用户的体验都是实时的。MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,且有效的保护了服务器宕机的数据备份。

利用复制功能当Master服务器出现问题时,我们可以人工的切换到从服务器继续提供服务,此时服务器的数据和宕机时的数据几乎完全一致。

复制功能也可用做数据备份,但是如果人为的执行drop,delete等语句删除,那么从库的备份功能也就失效了。

主从复制实现原理

 上图可以分为以下步骤

  • master是主库,用户可以往这里读写数据。
  • master将变动的数据,写入到一个binlog中,记录数据库的sql变化
  • slave服务器,指定和谁同步,然后slave开启一个线程,去读主库的binlog中的sql变动记录
  • 从服务器将那些sql变动写入到自己的中继日志中,然后在将这些sql在slave本机在执行一次

master主库配置

环境准备:

准备两台服务器,安装两个mariadb

1.开启binlog功能,修改/etc/my.cnf
vim /etc/my.cnf #写入

[mysqld]
server-id=1   #指明主库的身份id为1
log-bin=mysqls14-bin   #指明binlog的日志名
server-id服务的唯一标识(主从之间都必须不同);log-bin启动二进制日志名称为mysql-bin,可以自己定义

2.修改了配置文件,重启mariadb,使得binlog生效

systemctl restart mariadb 

3.登录mysql,检查主库的状态

show master status;

4.创建一个用户,用于进行主从同步

create user 'kangchen'@'%' identified by 'kangchen666';

5.授予账号权限,授予一个从库的身份权限

grant replication slave on *.* to 'kangchen'@'%';

6.锁定mysql的表,防止数据写入

flush table with read lock;

7.主从同步,将从库与主库的数据,保持一致后,它俩都在同一个起跑线,然后解除锁表,一同写入数据,保证数据一致性

# 1.导出当前的数据,用于slave机器导入数据,保证在一个起始点
mysqldump -u root -p --all-databases > /data/db.dump

# 2.将此db.dump文件远程传输给 slave机器,用于导入
scp /data/db.dump  root@192.168.12.87:/tmp/

# 3.登录slave从库,导入主库的数据信息
mysql >  source /tmp/db.dump 

# 4.查看主库和从库的信息,是否一致
show databases;

8.查看主库的状态信息,binlog信息

show master status; 

File是二进制日志文件名,Position 是日志开始的位置。后面从库会用到 后面从库会用到 后面从库会用到!!!!!!

9.解锁表,开始主从同步

unlock tables;

到此为止,主库已经设置完成了,接下来我们设置从库

slave从库配置

数据库的server-id在主从复制体系内是唯一的,Slave的server-id要与主库和其他从库不同,并且注释掉Slave的binlog参数。

1.在/etc/my.cnf当中写入server-id ,并注释掉binlog参数

vim /etc/my.cnf

[mysqld]
server-id=3

2.重启myariadb

systemctl restart mariadb

3.查看slave机器的身份信息

show variables like 'server_id';
show variables like 'log_bin';

4.通过命令,开启主从同步技术

change master to master_host='192.168.12.96',
master_user='kangchen',
master_password='kangchen666',
master_log_file='mysqls14-bin.000001',
master_log_pos=671;

5.开启slave

start slave;

6.检查slave状态,检查两条参数,如果都是yes,即主从ok

show slave statusG;   # 执行这行代码查看下面两行信息
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

此时可以在主库中写入数据,查看从库中是否生成了记录

注意此处还未配置从库的只读模式,只需在slave服务器上配置/etc/my.cnf,加上以下配置,并且在slave上创建普通用户,使用普通用户主从同步即可达到只读的效果

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
server-id=3
read-only=true
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

如果用root用户,无法达到readonly。

原文地址:https://www.cnblogs.com/zouzou-busy/p/11620921.html