MySQL主从复制

1.简介

学习过Redis的同学,应该了解过主从复制的作用。在MySQL集群环境中,可以分为主节点与从节点,通过主从复制可以实现数据备份、故障转移、MySQL集群、高可用、读写分离等。

MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我再Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果。

2.原理

MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我再Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果。

从库生成两个线程,一个I/O线程,一个SQL线程;

I/O线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;

SQL线程负责执行I/O线程读取的sql,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog

3. 首先配置主数据库(192.168.212.200)

① service iptables stop   #关闭防火墙

② vi /etc/my.cnf  #新增以下内容
server_id=200   #服务器id(最好和ip地址结尾相同)
log-bin=mysql-bin   #开启日志文件

③ service mysqld restart   #重启mysql服务

④进入mysql

[root@localhost ~]# mysql -u root -p 

mysql>show variables like '%server_id%';   #能够查询对应配置文件中的server_id 说明已经配置成功,如下图:

⑤ show master status;  #能够看到同步的文件,和行数说明已经配置成功,如下图:

⑥ GRANT REPLICATION SLAVE ON *.* to 'zhao'@'%' identified by '123123';  #主服务器给从服务器设置账号权限(root也可以)

4. 从数据库配置(192.168.212.201)

① service iptables stop   #关闭防火墙

② vi /etc/my.cnf   #新增以下内容
server_id=201   #从服务器server_id
log-bin=mysql-bin   #日志文件同步方式
binlog_do_db=test    #同步数据库(这里是test数据库)

补充:如果配置多个数据库重复设置binlog_do_db=test 这个选项即可:

binlog-do-db=db1

binlog-do-db=db2

binlog-do-db=db3

③ service mysqld restart;   #重启mysql服务

④ show variables like '%server_id%';   #能够查询对应配置文件中的server_id 说明已经配置成功

stop slave;    #最好先关闭同步,一会再开启即可

⑤ change master to master_host='192.168.212.200',master_user='zhao',master_password='123123',master_log_file='mysql-bin.000001',master_log_pos=120;   

#zhao&123123:主数据库分配的账号和密码

#mysql-bin.000001:主数据库show master status;查出的file

#120:就是主数据库show master status;查出来的position

start slave;    #开始同步

⑥ SHOW SLAVE STATUS;    #检查从服务器复制功能状态

会发现在查出来的Last_IO_Error报错:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

原因:因为服务器克隆的时候交UUID产生了重复 ,如果两台服务器都是单独搭的mysql,则不会出现该问题

解决办法:(删掉从节点的auto.cnf文件,里面保存了server_uuid)

cat  /etc/my.cnf

cd /var/lib/mysql

rm -rf auto.cnf

重启服务器即可:

service mysqld restart

此时再执行SHOW SLAVE STATUS;如下图:

 

5. 总结

① 如何验证:在200节点上创建test数据库,如果201节点能都同步过来,则说明主从复制环境搭好了

② 如果从数据库的值改了,怎么办? 用读写分离技术,从数据库只能read,用到mycat技术

③ 主从复制用不到mycat,读写分离才用到mycat,mycat和nginx非常相似

下面来个促进理解的图:

MySQL主从复制_第1张图片

6. 拓展

互联网公司一般用rds等云数据库,购买一个RDS,其实你得了两个服务器(一个主服务器,一个备份用的从服务器)。如果主服务器出故障了,自动切换到从服务器。所以,不需要做我们自己来做主从配置、备份、切换等。

详情参考:http://www.cy580.com/10467.html

 

你可能感兴趣的:(MySQL主从复制)