首页 > mysql > mysql的复制(主从)

mysql的复制(主从)

作者:bin

主从,说白了就是mysql的复制

一、如何实现复制的?

首先你需要知道mysql的日志类型,并且了解其中的二进制日志存了什么;

大致过程:[主库]更新数据=》[主库]二进制日志binlog=》[从库]中继日志relaylog=》[从库]更新;

二、复制的3种常见架构

1、一主多从:

实现读写分离,将请求通过负载均衡分布在多个从库上,如果主库挂了,可以把一个从库切换为主库继续服务;

2、多级复制;

2个主库,减轻主库io压力;

一级主库:用于接受写入数据,然后推送给二级主库;

二级主库:接受推送,然后推送给从库;

缺点是延迟会更高些,我们可以在二级主库上设置表引擎为blackhole(黑洞),那样二级主库并不会将数据写入表中,而是仅仅在binlog中记录事件;

3、互为主从:

这种架构,方便DBA做维护;

写数据都写入A库,然后读数据,从A和B读都行,如果数据库A服务器需要维护,那么就关闭A的读,然后从B读,在维护完成后再恢复原样,

三、复制的搭建过程

1、[主库]锁定表的读写:

mysql> flush tables with read lock;

查看二进制是否开启,并且查看偏移量(position):

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000018 | 700602 | | |
+------------------+----------+--------------+------------------+

2、[主库]备份数据库:

很多种方法,这里我们既然都锁定读写了,直接复制文件是最快的;

mysql -uroot -ptoot -e 'show global variables like "%datadir%";' 

+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+

cd /var/lib/mysql/

 tar -zcvf test.tar.gz  ./

scp test.tar.gz ben@192.168.1.2:~

3、[从库]然后切换到从服务器,完成数据库的复制:

cp test.tar.gz /var/lib/mysql/ 

tar zxvf test.tar.gz

4、[主库]关闭主库读锁定:

mysql> unlock tables;

5、[从库]修改从库server-id:

my.cnf中修改server-id=2,这里要注意主从库的server-id不同即可;

6、[从库]重启从库

service mysql restart

7、[主库]配置repl账户:

至少需要如下2个权限

grant file on *.* to 'repl'@'%' identified by 'test'; 

grant replication slave on *.* to 'repl'@'%' identified by 'test';

8、[从库]配置slave线程:

mysql> change master to 
 -> master_host='192.168.1.1',
 -> master_port='3306',
 -> master_user='repl',
 -> master_password='test',
 -> master_log_file='mysql-bin.000018',
 -> master_log_pos=700602;

mysql> start slave;

 

9、查看slave 进程:

show processlist\G;

至少要包含以下两列,才表示正常连接:

Waiting for master to send event

Slave has read all relay log; waiting for the slave I/O thread to update it

如果缺少上面的,那么使用如下命令查看:

show slave status\G;

主要查看:

 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

这两个都应该是Yes,任意一个不是yes,那么可以在Last_Error中查看错误,然后百度自己查找错误原因,配置问题,或者数据同步问题,通过修改表结构、更改master_log_file和position等方式修复问题;

 

四、半同步复制

实现原理:

异步复制:事物提交后,立即返回客户端结果,然后异步通知从库。

全同步复制:事物提交后,先通知全部从库成功后,再返回客户端结果

半同步复制:事物提交后,通知成功1个从库,就返回客户端结果

您必须 [ 登录 ] 才能发表留言!