架构概念

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

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;

这两个参数都为YES即为正常

验证服务,在主服务器上解锁,对数据库进行操作,观察从数据库变化

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立即同步,将备份再导入主服务器即可,最后再重新配置延时