架构概念
在实际生产环境中,在一个数据库服务器进行读写操作,不管从安全性、高可用性或者高并发等方面都无法满足实际需求,因此采用主从复制来同步数据,读写分离来提升数据库的并发负载能力。
mysql复制原理

1)在每个事物更新数据完成之前,Master在二进制日志记录这些变化。写入二进制日志完成后,Master通知存储引擎提交事务。
2)Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作进程——I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process(二进制日志转储过程)。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它就会睡眠并等待Master产生新的事件。I/O线程将这些时间写入中继日志。
3)SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志中读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作。
mysql复制架构
1.主从复制
主服务器
修改数据库服务配置文件
vim /etc/my.cnf
[mysqld]
server-id=1
#id值要唯一
log-bin=mysql-master-bin
开启二进制日志功能
重启服务
systemctl restart mariadb
进入数据库服务
mysql -u root -p
创建复制用户
CREATE USER 'slave'@'从数据库IP' IDENTIFIED BY '密码';
授予权限
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'从数据库IP';
锁表(避免过程当中进行新的数据写入)
FLUSH TABLES WITH READ LOCK;
导出数据库
mysqldump -uroot -p -h127.0.0.1 -P数据库端口 --all-databases --triggers --routines --events >all.sql
记录配置信息(File和Position)
show master status;
从服务器
修改数据库服务配置文件
vim /etc/my.cnf
[mysqld]
server-id=2
#id值要唯一
log-bin=mysql-master-bin
#开启二进制日志功能,以防做其他slave的master角色
relay_log=mysql-relay-bin
#开启中继日志
重启数据库服务
systemctl restart mariadb
进入数据库服务
mysql -u root -p
导入数据库
mysql -uroot -p -h127.0.0.1 -P数据库端口 < all.sql
配置slave连接
change master to master_host='主服务器IP',master_user='slave',master_password='slave用户密码',master_port='主服务器数据库端口',master_log_file='主服务器File值',master_log_pos=主服务器Position值,master_connect_retry=连接失败重试间隔,默认60;
启动连接
start slave;
查看状态
show status \G;

验证服务,在主服务器上解锁,对数据库进行操作,观察从数据库变化
UNLOCK TABLES;
2.双主复制
其实主主复制就是将主从复制的SQL语法倒过来执行,唯一的一点注意的是,为了避免自增ID字段冲突,会对数据库配置文件增加配置。
服务器A
vim /etc/my.cnf
auto_increment_increment=2 # 步进值
auto_increment_offset=1 # 起始值
systemctl restart mariadb
服务器B
vim /etc/my.cnf
auto_increment_increment=2 # 步进值
auto_increment_offset=2 # 起始值
systemctl restart mariadb
其实上面的配置就是针对自增字段,服务器A使用奇数,服务器B使用偶数
3.多主多从
多主多从SQL语法上和主从是一致的,不过在次主服务器多了一个数据库配置,log-slave-updates=1,这个参数是让次主服务器记录主服务器的改变到binarylog,让之后的从服务器读取到这些改变。
TIPs:
1.如果担心主数据库遭到误删操作,可以将一个数据库设置延时同步,SQL语法为:CHANGE MASTER TO MASTER_DELAY=N,N为秒。这样可以在事故发生时将此从服务器的数据导出,然后将其延迟设置成0立即同步,将备份再导入主服务器即可,最后再重新配置延时