MySQL复制
MySQL的复制支持故障恢复,也频繁用于读操作的横向扩展(scale out)。复制允许在出现不可避免的故障的情况下提供高可用服务。故障的原因很多,磁盘、服务器、数据中心的损耗以及人为因素等。MySQL支持冗余和备份,可以保证从故障中恢复。MySQL可以实现大量服务器的高效复制,对于读频繁的应用,是支持大量查询的有效策略。
什么是复制
复制就是同步,将主节点(服务器)的所有改变复制到从节点(服务器),复制用来创建主节点的一个可靠副本。
常用复制例子:
1-创建一个主节点的备份,以避免主节点崩溃时丢失数据
2-拥有一份主节点的副本,从而在不干扰其他业务情况下执行报表和分析工作等
我们使用复制,是为了减少主节点上的负载,通过横向扩展,实现高读写比。负载均衡器会将读请求放在从节点上,而写请求交给主节点服务器。
复制的基本步骤
1-配置Master
添加选项到my.cnf
log-bin=master-bin log-bin-index=master-bin.index server-id=1 binlog-do-db=mydatabase binlog-ignore-db=mysql
在Master上创建一个复制用户
mysql> create user repl_user; mysql> grant replication slave on *.* to repl_user indentified by 'ya0';
2-配置Slave
添加选项到my.cnf
server-id=2 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin
3-连接Master和Slave
将Slave指向Master,让它知道从哪里复制,需要知道Master的4个信息:
* 主机名
* 端口号
* Master上拥有 replication slave 权限的用户账号
* 该用户的秘密
连接Master的Slave执行sql脚本
mysql> change master to master_host='master-1', master_port=3306, master_user='repl_user', master_password='ya0'; mysql> start slave;
克隆Slave
通常的做法从一个Slave(目前连在Master)创建新的Slave,这样不用离线Master。
以下使用old_slave和new_slave。
1-old_slave
mysql> stop slave; mysql> show slave status\G
记录
...
Master_Log_File: master-bin.000042
Exec_Master_Log_Pos: 141476830
...
2-new_slave
从old_slave导出数据
mysqldump -hold_slave_host -uuser -ppassword --default-character-set=utf8 mydatabases > /home/xl/mydatabase-utf8-time.sql
数据导入到new_slave
mysql> use mydatabase; mysql> source /home/xl/mydatabase-utf8-time.sql;
连接到Master
mysql> stop slave; mysql> change master to master_host='master-1', master_port=3306, master_user='repl_user', master_password='ya0', master_log_file='master-bin.000042', master_log_pos=141476830; mysql> start slave;
重启old_slave的slave
mysql> start slave;
故障恢复
1-从节点服务器故障可以采用克隆Slave方法。
2-Slave停机处理办法
检查停机前位置 show slave status\G
...
Master_Log_File: master-bin.000040
Read_Master_Log_Pos: 141901565
...
Relay_Master_Log_File: master-bin.000040
Exec_Master_Log_Pos: 141901565
...
调查问题,并且如果需要,在数据库中删除几行。
mysql> stop slave; mysql> set sql_slave_skip_counter=1; mysql> start slave;