学习过Redis的同学,应该了解过主从复制的作用。在MySQL集群环境中,可以分为主节点与从节点,通过主从复制可以实现数据备份、故障转移、MySQL集群、高可用、读写分离等。
MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我再Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果。
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
① 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也可以)
① 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;如下图:
① 如何验证:在200节点上创建test数据库,如果201节点能都同步过来,则说明主从复制环境搭好了
② 如果从数据库的值改了,怎么办? 用读写分离技术,从数据库只能read,用到mycat技术
③ 主从复制用不到mycat,读写分离才用到mycat,mycat和nginx非常相似
下面来个促进理解的图:
互联网公司一般用rds等云数据库,购买一个RDS,其实你得了两个服务器(一个主服务器,一个备份用的从服务器)。如果主服务器出故障了,自动切换到从服务器。所以,不需要做我们自己来做主从配置、备份、切换等。
详情参考:http://www.cy580.com/10467.html