前戏
当我们的网站部署到生产环境之后,如果只有一个数据库,当这个数据库宕机之后,用户就访问不了我们的网站了,这会给公司带来很大的损失。那我们想,可不可以有两个或多个数据库,里面的数据都是一样的,当一个数据库宕机之后,人工切换到备份数据库,这样就不会大大的减少公司的损失。
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 status\G; # 执行这行代码查看下面两行信息
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。