MySQL复制

jopen 10年前

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;