复制
让一台服务器的数据和另外的服务器保存同步MySQL支持的复制方案:基于语句复制,基于行复制。都是通过记录主服务器的二进制日志,并在从服务器上进行重放完成复制,都是异步的。从服务器上的数据并非随时都是最新的,也不保证从服务器上的延迟具体大小。
复制用途
数据分布负载平衡,可以把读取分布在不同的服务器上。
备份
高可用性和故障转移
测试MySQL升级
复制过程
1.主服务器把数据更改记录到二进制日志中2.从服务器把主服务器的二进制日志事件拷贝到自己的中继日志中
3.从服务器重放中继日志中的事件,把更改应用到自己的数据上
从服务器处理过程:
1.启动I/O从线程,开启一个普通的客户端连接,启动一个特殊的二进制日志转储进程,从主服务器的二进制日志中读取事件。不会对事件进行轮询。如果跟上了主服务器,就会进入休眠状态,并等待有新事件发生时主服务器发出的信号。I/O线程把事件写入从服务器的中继日志中。
2.SQL从线程读取中继日志,并重放其中的事件,更新从服务器的数据。中继日志在操作系统的缓存中,开销很低
从服务器打开的连接在主服务器上启动一个线程。
I/O线程可以独立于SQL线程,从服务器上的复制是串行的。
创建复制
1.在每一台服务器上建立复制账号2.配置主从服务器
3.指导从服务器进行连接于复制
创建复制账号
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO username@'192.168.0.%' IDENTIFIED BY 'passwd';
配置主从服务器
主服务器的my.cnf中输入:log_bin = mysql-bin(日志文件位置)
server_id = 10
SHOW MASTER STATUS(验证二进制文件是否建立)
从服务器配置:log_bin = mysql-bin
server_id = 2
relay_log = mysql-relay-bin(定义中继日志的位置和文件名)
log_slave_updates = 1(使从服务器把复制的事件记录到自己的二进制日志中)
read_only = 1(阻止任何没有特殊权限的线程更改数据,通常不够实际)
启动复制
在从服务器中使用命令启动复制:CHANGE MASTER TO MASTER_HOST='server1', MASTER_USER=' ',MASTER_PASSWORD=' ',MASTER_LOG_FILE = ' ',MASTER_LOG_POS=0;
SHOW SLAVE STATUS\G查看从服务器设置是否正确
START SLAVE;开始复制
SHOW SLAVE STATUS\G(查看从服务器I/O线程和SQL线程的状态)
SHOW PROCESSLIST\G(主服务器上可以看到从服务器建立的连接,从服务器上可以看到两个线程,I/O和SQL)
从另一个服务器开始复制
主从服务器同步数据条件:1.某个时间上主服务器数据的快照
2.主服务器当前的日志。可以用SHOW MASTER STATUS查找主服务器的日志文件坐标
3.从快照时间到现在的主服务器二进制日志文件
复制方法:1.冷拷贝,关闭主服务器把文件拷贝到从服务器,启动主服务器,它会启动一份新的二进制日志,利用CHANGE MASTER TO在二进制日志的开头启动从服务器。
2.热拷贝
3.使用mysqldump。使用InnoDB,用mysqldump --single-transaction -all-databases --master-data=1 --host=server1 | mysql -host=server2来转储主服务器的内容到从服务器。如果没有使用事务表,使用--lock-all-tables。
4.使用LVM快照或备份。可以使用主服务器的快照或备份来初始化从服务器,然后使用CHANGE MASTER TO
注意复制配置
主服务器设置sync_binlog = 1,每次提交事务时候二进制日志同步到磁盘上。
如果是InnoDB:innodb_flush_logs_at_trx_commit=1 innodb_support_xa=1 innodb_safe_binlog
从服务器:skip_slave_start(阻止从服务器在崩溃后自动启动) read_only(防止大部分用户更改非临时表)
复制其他事项
基于命令复制
通过记录主服务器上改变数据的查询来完成工作。当从服务器从中继日志中读取事件并执行它的时候,实际上执行了和主服务器同样的查询。
基于行复制
把实际的数据更改记录到二进制日志中。缺点二进制日志会变得大,但可以高效的复制数据
其他文件
Mysql-bin.index 和二进制日志文件同名。记录了磁盘上的二进制日志文件
Mysql-relay-bin.index 中继日志的索引文件
Master.info 包含了从服务器连接主服务器需要的信息
Relay-log.info 包含了从服务器的当前二进制日志和中继日志的坐标
expire_logs_days 定义MysSQL清除过期日志的方式
发送复制事件到其他服务器
log_slave_updates把一台从服务器变成主服务器。指导MySQL把自己执行的事件写到二进制日志,然后自己的从服务器可以取得这些事件并执行它。
复制拓扑
基本原则:1.一个MySQL从服务器只能有一个主服务器2.每个服务器有唯一的服务器ID
3.一个主服务器可以有很多从服务器
4.如果打开了log_slave_updates,一个从服务器能把主服务器的改动传播下去,并且成为其他从服务器的主服务器
一主多从
在写入较少,读取较多的时候最有用。
用途: 为不同的角色使用不同的从服务器
把一个从服务器当成待命主服务器,除了复制就没其他数据流量
把远程的数据中心作为从服务器,以备灾难恢复
延迟一个或多个从服务器,以备灾难恢复
为备份,培训,开发或测试使用从服务器
主动-被动模式下的主主复制
有很强的容错和高可用,有一个服务器是只读的‘被动’服务器
可以轻易交换主动、被动服务器角色,故障转移和故障恢复很容易
配置方式:1.启用二进制日志,选择唯一服务器ID,添加复制账号
2.启用记录从服务器更新功能
3.把被动服务器设置为只读
4.确保服务器有相同数据
5.启用服务器上MySQL
6.将每个服务器设置为对方的从服务器,使用新创建的二进制日志工作
定制复制解决方案
选择性复制复制少量数据到从服务器
简单的方法:把数据分到不同的数据库中,然后把数据库移到不同的从服务器上。
数据归档
在主服务器上执行删除查询并保证它不在从服务器上执行,以把数据保存在从服务器上,并从主服务器上删除。
方法:1)选择性的在主服务器上禁用二进制日志
2)在从服务器上使用replicate_ignore_db规则
从服务器用于全文搜索
在一台从服务器上,通过把某些表的存储引擎变为MyISAM实现全文搜索
创建日志服务器
创建没事数据的“日志服务器”,目的使其容易重放并且过滤二进制日志事件
复制管理
监控复制测量从服务器延迟
确定主,从服务器是否一致
从主服务器重新同步从服务器
改变主服务器