复制的作用
l 水平扩展
l 数据备份
l 数据分析
l 数据分布
l 高可用性
复制的工作原理
Mariadb的复制功能是基于binlog进行的。复制的工作主要是由主库上Master dump 线程、从库上的slave IO线程以及slave SQL线程来完成的。
在主库上执行 SHOW PROCESSLIST 命令查看到dump线程。
当在从库上执行START SLAVE 语句来开启复制功能时,会闯将一个slave IO线程和一个slave SQL线程。slave IO线程负责连接到主库,然后接收主库master dump线程发送过来的binlog内容,写到本地的relay-log中。slave SQL线程负责重放relay-log中的内容,将主库的所有修改反映到从库上。
复制的大概过程可以总结为如下3步:
(1)主库将所有的修改以事件的形式记录到binlog中,主库的master dump线程负责发送binlog内容到从库。
(2)从库的slave IO 线程将接收到的binlog事件记录到本地的relay-log中。
(3)从库的slave SQL线程重放relay-log中的事件。
relay-log.info文件记录了slave SQL线程重放的进度等信息,保证了停止之后再重新开启复制时,复制工作能够从正确的位置开始。
relay-log由一系列包含了主库binlog事件的relay-log文件和一个管理这些文件的relay-log.index文件组成。(与binlog文件相似)
relay-log文件和binlog文件格式一样,同样可以使用mysqlbinlog工具来查看其中的内容。
通过配置relay-log="file-name"和relay-log-index="file-name"这两个参数,可以指定relay-log文件和relay-log.index文件的名称
relay-log会发生切换的几种情况如下:
l slave IO线程启动的时候。这发生在执行START SLAVE 语句或者Mariad/Mysql启动时。
。默认会使用主机名来命名relay-log日志,因此在复制的过程中更改主机名可能导致因找不到relay-log文件而引发的错误。
l 执行FLUSH LOGS语句刷新日志时。
l 达到参数max_relay_log_size指定的大小时。当max_relay_log_size为0时,以参数max_binlog_size的值作为max_relay_log_size的值。
l slave SQL线程重放完一个relay-log文件中所有事件时,会自动删除该relay-log文件,所以没有显示删除relay-log的命令。
master.info文件和relay-log.info文件
开启复制功能时,在从数据库的数据目录下回创建一个master.info文件和一个relay-log.info文件,他们用来记录复制工作进度。
l master.info 文件:该文件用来保存主库的主机名和端口信息以及登录到主库所需要的账号和密码。这里需要注意的是,账号和密码都是以文本的格式保存在master.info文件中,所以在实际应用中需要特别注意这一点,以防出现安全的问题。master.info文件还以binlog文件名和偏移量的形式记录了从库接收主库binlog事件的进度信息,有了这些信息,slave IO线程就知道从哪里从新开始自己的工作了。
l relay-log.info文件:该文件用来记录从库的重放进度。
通过配置master-info-file="file-name"和relay-log-info-file="file-name"参数可以改变master.info文件和relay-log.info文件的名称。在MySQL5.6和Mariadb10.0中可以通过配置master-info-repository=TABLE(默认为FILE)来使用表masql.salve_master_info来代替master.info文件,存储相关的信息。同样,通过配置relay-log-info-repository=TABLE,可以用表mysql.slave_relay_log_info来替代relay-log.info文件。