一、实现主从复制的方式。
异步复制:它是mysql默认的同步方式,从库通过io线程去拉取 bin log时,主库不需要关注这个时候是否有从库在同步数据,他只做自己的事情就可以了, 整个复制过程都是异步完成的 ;
半同步复制:它需要依赖至少一个从库将bin log写入relay log中,在性能上有所降低,但是可以保证至少有一个从库跟主库的数据是一致的,所以数据的安全性很高;
全同步复制:它的全局一致性是最好的,但是性能也是最低的。
二、主从复制的方法。
1、从库通过io线程连接到主库,并且向主库要对应的bin log文 件;
2、主库会通过dump线程去获得bin log文件,并发送给从库;
3、从库会把主库发送过来的bin log文件写入到relay log文件中,也就是中继日志;
4、从库中的sql线程会读取relay log文件中的内容;
5、最后去执行relay log文件中的内容。
三、解决主从复制延迟问题。
关于如何解决主从复制延迟的问题,我认为可以从两个方面入 手,分别是架构层面和从库的配置层面 。
首先是在架构层面上解决
1、我们可以将业务的持久化层的实现采用分库的架构来进行处理,让不同的请求分散到不同的数据库服务上,分散掉单台服务器的压力;
2、我们可以把服务的基础架构在业务层和mysql之间加入缓存层,减少mysql的读的压力,但是需要注意的是,如果我们的数据 经常会发生修改,那么这种设计是不合理的;
接下来我们也可以考虑从库的配置方面上解决问题(修改sync_binlog的参数的值)
如果想要正确的设置sync_binlog参数的值,我们就需要清楚 binlog在写盘时的工作流程,在进行操作时,每个线程有自己的 binlog cache,但是他们共用同一份binlog。
每个线程在执行写的操作时,会执行write和fsync两个操作。
write,指的就是把日志写入到文件系统的page cache中,它并没 有把数据持久化到磁盘,所以速度快,也就是说fsync才是将数据 持久化到磁盘的操作。一般情况下,我们认为只有fsync操作,才占用磁盘的IOPS(I/O per second)而write和fsync的时机就是 由sync_binlog参数来进行控制的。
1、当sync_binlog=0的时候,表示每次提交事务都只write, 不fsync;
2、当sync_binlog=1的时候,表示每次提交事务都要执行 fsync;
3、当sync_binlog=N的时候,表示每次提交事务都write,但 积累N个事务后才执行fsync。
一般情况下,公司在大部分的应用场景中,我们建议将此参数的值设置为1,因为这样的话能够保证数据的安全性,但是如果出现主从复制的延迟问题,可以考虑将此值设置为100~1000中的某个数值,非常不建议设置为0,因为设置为0的时候没有办法控制丢失日志的数据量。
四、主库宕机后的处理方法。
可以从多个从库中选择新的主库,那么如何操作呢?我认为大概有这么几个步骤:
1.确保所有的relay log全部更新完毕,在每个从库上执行stop slave io_thread; show processlist;直到看到Has read all relay log,则表示从库更新都执行完毕了;
2.登陆所有从库,查看master.info文件,对比选择pos最大的 作为新的主库,这里我们选择192.168.1.102为新的主库;
3.登陆192.168.1.102,执行stop slave; 并进入数据库目录, 删除master.info和relay-log.info文件, 配置my.cnf文件,开启 log-bin,如果有log-slaves-updates和read-only则要注释掉,执行 reset master;
4.创建用于同步的用户并授权slave,同第五大步骤;
5.登录另外一台从库,执行stop slave停止同步;
6.根据第七大步骤连接到新的主库;
7.执行start slave;
8.修改新的master数据,测试slave是否同步更新。
五、什么是主从复制?
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。
MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
主从复制是MySQL最重要的功能之一。
对于多级复制,数据库服务器既可充当主机,也可充当从机。
MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
六、为什么要主从复制?
随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。
有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能;
一般会让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
从库可以实时从主库进行复制,这样就可以做数据的热备。
注意事项
1、如果修改了主服务器的配置,记得删除从服务器上的 master.info文件。否则从服务器使用的还是老配置,可能会导致错误;
2、如果你想使用复制数据文件的方式来备份数据库,只要在从服 务器上的mysql命令行先键入stop slave;然后复制数据库文件,复 制好了,再在mysql命令行键入start slave;启动从服务器,这样既 备份了数据又保证了数据完整性,而且整个过程中主服务器的mysql无需停止。并且如果在此期间master的数据有改动,在下次 start slave时数据也会同步更新过来;
3、双机互备则是两个mysql同时配置为master及slave。
因为项目的开发人员比较少,所以我也参与了一些别的模块的开 发,我们系统也涉及到了OA系统中的一些常见的功能,比如说用户 权限,所以我也参与了权限的设计,由于这个的代码实现方式是比 较固化的,所以我就没有参与编码。
我们给予RBAC的设计思想,也就是基于角色的权限控制,我们 用了5张表,分别是用户表、角色表、权限表,其中还有两张关联 表,分别是用户角色关联表、角色权限关联表。像登陆权限的拦 截,我们使用的是SpringMVC的拦截器实现的。
其实市面上也有很多用于权限设计的框架,比如Spring的 Security和Apache的Shiro,也都可以完成我们的需求,如果有需 要的话,按需选取就可以了。