概述
MySQL数据同步机制支持主从模式和互为主从(主主)模式,及master-slave、master-master部署模式。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的变更。master-slave模式对复制中表的更新必须在主服务器上进行,否则可能由于主键等因素导致主从库之间的更新冲突,master-master模式要处理好主键生成策略。
数据同步机制
MySQL 使用3 个线程来执行复制功能(其中1 个在主服务器上,另两个在从服务器上,执行过程如下:
步骤 | 说明 |
1 | 主服务器发出START SLAVE操作 |
2 | 从服务器创建一个I/O线程,连接主服务器并让主服务器发送二进制日志 |
3 | 主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O 线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。 |
4 | 从服务器创建sql线程,使用此线程读取中继日志并执行日志中包含的更新。 |
SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。默认中继日志使用host_name-relay-bin.nnnnnn 形式的文件名,其中host_name 是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪中继日志索引文件来识别目前正使用的中继日志。默认中继日志索引文件名为host_name-relay-bin.index。在默认情况,这些文件在从服务器的数据目录中被创建。中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。当SQL 线程执行完中继日志中的所有事件后,中继日志将会被自动删除。从服务器在数据目录中另外创建两个状态文件--master.info 和relay-log.info。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。
Mysql主从数据库版本要相同,或者slave比master版本低,但是互为主从模式需要数据库版本相同,考虑到数据库的集群部署及可扩展性,如下介绍互为主从模式的配置示例。
1) 网络要求示例如下
服务器 | 主机名称 | IP地址示例 |
master | mysql_master | 192.168.0.1 |
slave | mysql_slave | 192.168.0.2 |
2) master/slave配置示例
master配置部分
server-id=1 # 数据库ID log-bin=mysql-bin # 启动二进制日志系统 log-bin=/var/log/mysql/updatelog # 设定log文件名,若路径不存在需要手动创建 binlog-ignore-db=mysql,test # 忽略同步的数据库 binlog-do-db=vod # 二进制需要同步的数据库名 replicate-do-db=vod # 需要更新的库 master-host=192.168.0.2 # 设置slave数据库地址 master-user=user # 用户 master-password=password # 密码 master-port=3306 # 端口 master-connect-retry=60 # 断点从新连接时间 |
slave配置部分
server-id=2 # 数据库ID log-bin=mysql-bin # 启动二进制日志系统 log-bin=/var/log/mysql/updatelog # 设定log文件名,若路径不存在需要手动创建 binlog-ignore-db=mysql,test # 忽略同步的数据库 binlog-do-db=vod # 二进制需要同步的数据库名 replicate-do-db=vod # 需要更新的库 master-host=192.168.0.1 # 设置master数据库地址 master-user=user # 用户 master-password=password # 密码 master-port=3306 # 端口 master-connect-retry=60 # 断点从新连接时间 |
1) Mysql管理命令
操作 | 命令 |
Mysql关闭 | service mysqld stop |
Mysql启动 | service mysqld start |
Mysql重启 | service mysqld restart |
2) 配置开机自启服务
在/etc/rc.local中加入mysql启动命令,如
/etc/init.d/mysqld start |
3) Master状态查看,显示类似如下表示配置正常
mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | updatelog.000001 | 106 | vod | mysql | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) |
4) slave状态查看,显示类似如下表示从库的I/O,SQL线程都已正常启动,其他的信息按照配置核实
mysql> show slave status/G; …………. Slave_IO_Running: Yes Slave_SQL_Running: Yes …………. |