这篇文章从三方面描述:主从复制的用途?如何实现主从复制?主从复制原理?
一、主从复制的用途
用途一:数据库备份 。从数据库会建立一个和主数据库一样的数据环境,当主数据发生故障时或数据丢失时,从数据库可以代替主数据继续工作,减少损失。
用途二:读写分离。根据28定律,大部分的互联网应用80%是读操作,20%是写操作。通过读写分离,把原来所有操作都集中在主服务器上,变为写操作在主服务器上,读操作在从服务器上,缓解了主数据库的压力,从而提高应用的整体性能。
从系统架构上来说,基本上还是那两个术语:高可用,高性能。
二、如何实现主从复制
这里我不过多的描述,如何实现mysql的主从复制,网上一搜一大堆,照着说明一步一步做就行了。主要描述一下容易出问题的地方;
1.主服务器在创建有复制权限的用户时,注意语句里面的参数。
完整的语句如下:grant replication slave on *.* to username@slave_ip identified by 'password'
username :创建的账户名,这个账户主要用来主从复制使用的,最好不要用root
@后面跟的是从服务器的ip地址,这是为了安全起见;也可以写成%,表示任意ip的从服务器都可访问。
这里要注意一点,主从服务器之间的网络一定要是通的,可以用ping命令测试。
2.从服务器使用 change master to语句实现复制主库。这个语句里面要注意master_log_file和master_log_pos这两个参数 ,这两个参数的值是主库的系统状态值,用show master_status语句查看。
需要注意的是:重启mysql服务能改变主服务器master_log_file的值,主库的操作能改变master_log_pos的值,所以如遇到同步错误,可以检查一下主服务器的状态值,再同步从库。
3.要会看懂从服务器的状态。语句为 show slave status,两个参数比较重要:
Slave_IO_Running,Slave_SQL_Running。看从服务器是否复制成功,需要这两个参数的值都必须为YES,一个为NO都意味着复制失败。 密码错误,网络不通,主服务器binlog文件位置不对等等。
三、讲一下主从复制的原理
主服务器把操作日志写导二进制文件中(binlog),从服务器开启两个线程,一个是IO线程,用来向主服务器请求二进制中发生的事件,写到自身中继日志中(relay_log)。然后从服务器再启动一个SQL线程,执行中继日志中的事件,就得到和主服务器中一样的数据了。上图:
这两个线程其实就是上面提到的Slave_IO_Running,Slave_SQL_Running。