一、复制概述
Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
1.1 mysql支持的复制类型
- 基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。
- 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从mysql5.0开始支持。
- 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
1.2 复制的作用
- 备份,确保数据安全;做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据的丢失。
- 数据分布,提升I/O性能;随着日常生产中业务量越来越大,I/O访问频率越来越高,单机无法满足,此时做多库的存储,有效降低磁盘I/O访问的频率,提高了单个设备的I/O性能。
- 读写分离,使数据库能支持更大的并发;在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
1.3 复制的原理
整体上来说,复制有3个步骤:
- master将修改(增、删、改)记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
- slave将master的binary log events拷贝到它的中继日志(relay log)
- slave执行中继日志中的事件,将修改的数据同步到它自己的数据中
1.4 复制应用的注意点
从库同步主库数据的过程是串行化的,也就是说主库上并行的操作,在从库上会串行执行。在高并发场景下,从库的数据会比主库慢一些,是有延时的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。而且这里还有另外一个问题,如果主库宕机,然后数据恰好还没同步到从库,那么没同步的数据可能在从库上是没有的,有些数据可能就丢失了。所以建议mysql主从同步一般在读远远多于写,而且读的时候一般对数据时效性要求没那么高的应用场景。
mysql实际上有两个机制用来解决主从同步数据库丢失和延时的问题。一个是半同步复制,用来解决主库数据丢失问题;一个是并行复制,用来解决主从同步延时问题。
所谓半同步复制,semi-sync复制,指的就是主库写入binlog日志之后,就会强制将此时数据立即同步到从库,从库将日志写入自己本地的relay log之后,接着会返回一个ack给主库,主库接收到至少一个从库的ack之后才会认为写操作完成了。
所谓并行复制,指的是从库开启多个线程,并行读取relay log中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。
二、配置主从
2.1 同步master数据库的数据到slave数据中
2.1.1 在主节点(192.168.0.58)数据库备份数据
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ./master_db.sql
参数说明:
- --all-databases :备份所有数据库
- --lock-all-tables :备份时锁住所有表,防止操作时有数据修改
- >:导出
- ./master_db.sql :备份数据存放的位置
2.1.2 在从节点(192.168.0.68)数据库还原数据
使用 scp 将备份文件发送到 从数据库节点
scp master_db.sql root@192.168.0.68:~
使用命令恢复备份数据
mysql -uroot -p123456 < master_db.sql
2.2 修改master数据库和slave数据库的配置文件
2.2.1 在master数据库配置文件中设置log_bin和server-id,并重启mysql服务
2.2.2 登录master数据库创建用于slave数据库同步数据使用的账号
grant replication slave on *.* to "slave"@"%" identified by "slave";
flush privileges;
2.2.3 获取master数据库的二进制日志信息
File为使用的日志文件名称,Position为使用的文件位置,这两个参数会在配置slave数据库时用到
2.2.4 在slave数据库配置文件中设置server-id,并重启mysql服务
2.2.5 进入slave数据库配置连接master数据库
change master to master_host="192.168.0.58",master_user="slave",master_password="slave",master_log_file="mysql-bin.000004",master_log_pos=154;
flush privileges;
参数说明:
- master_host:master数据库服务器的ip地址
- master_user 和 master_password:master中为slave创建的创建
- master_log_file: 前面查询到的master数据库使用的日志文件名称
- master_log_pos: 前面查询到的master数据库使用的日志文件位置
2.2.6 开启同步状态
start slave;
show slave status \G; -- \G让查询结果便于查看
2.2.7 验证主从复制
在master数据库创建数据库,并在slave数据库中查看