• 叶问1


    《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点

    2018年6月10日,周日

    MySQL主从复制什么原因会造成不一致,如何预防及解决?

    一、导致主从不一致的原因主要有: 

    1. 人为原因导致从库与主库数据不一致(从库写入)

    2. 主从复制过程中,主库异常宕机

    3. 设置了ignore/do/rewrite等replication等规则

    4. binlog非row格式

    5. 异步复制本身不保证,半同步存在提交读的问题,增强半同步起来比较完美。 但对于异常重启(Replication Crash Safe),从库写数据(GTID)的防范,还需要策略来保证。

    6. 从库中断很久,binlog应用不连续,监控并及时修复主从

    7. 从库启用了诸如存储过程,从库禁用存储过程等

    8. 数据库大小版本/分支版本导致数据不一致?,主从版本统一

    9. 备份的时候没有指定参数 例如mysqldump --master-data=2 等

    10. 主从sql_mode 不一致

    11. 一主二从环境,二从的server id一致

    12. MySQL自增列 主从不一致

    13. 主从信息保存在文件里面,文件本身的刷新是非事务的,导致从库重启后开始执行点大于实际执行点

    14. 采用5.6的after_commit方式半同步,主库当机可能会引起主从不一致,要看binlog是否传到了从库

    15. 启用增强半同步了(5.7的after_sync方式),但是从库延迟超时自动切换成异步复制

    二、预防和解决的方案有:

    1. master:innodb_flush_log_at_trx_commit=1&sync_binlog=1

    2. slave:master_info_repository="TABLE"&relay_log_info_repository="TABLE"&relay_log_recovery=1

    3. 设置从库库为只读模式

    4. 可以使用5.7增强半同步避免数据丢失等

    5. binlog row格式

    6. 必须引定期的数据校验机制

    7. 当使用延迟复制的时候,此时主从数据也是不一致的(计划内),但在切换中,不要把延迟从提升为主库哦~

    8. mha在主从切换的过程中,因主库系统宕机,可能造成主从不一致(mha本身机制导致这个问题)

    2018年6月11日,周一

    你为什么会决定进行分库分表,分库分表过程中遇到什么难题,如何解决的?

    一、为什么决定进行分库分表?

    1. 根据业务类型,和业务容量的评估,来选择和判断是否使用分库分表

    2. 当前数据库本事具有的能力,压力的评估

    3. 数据库的物理隔离,例如减少锁的争用、资源的消耗和隔离等

    4. 热点表较多,并且数据量大,可能会导致锁争抢,性能下降

    5. 数据库的高并发,数据库的读写压力过大,可能会导致数据库或系统宕机

    6. 数据库(MySQL5.7以下)连接数过高,会增加系统压力

    7. 单表数据量大,如SQL使用不当,会导致io随机读写比例高。查询慢(大表上的B+树太大,扫描太慢,甚至可能需要4层B+树)

    8. 备份和恢复时间比较长

    二、都遇到什么问题?

    1. 全局pk(主键和唯一索引)的冲突检测不准确,全局的自增主键支持不够好

    2. 分片键的选择。如没有选择好,可能会影响SQL执行效率

    3. 分布式事务,中间价产品对分布式事务的支持力度

    4. 对于开发来说,需要进行业务的拆分

    5. 对于开发来说,部分SQL不兼容则需要代码重构,工作量的评估

    6. 对于开发来说,跨库join,跨库查询

    三、如何解决?

    1. 使用全局分号器。或者使用全局唯一id,(应用生成顺序唯一int类型做为全局主键)

    2. 应用层来判断唯一索引

    3. 配合应用选择合适的分片键,并加上索引

    4. 配合应用,配合开发,对不兼容SQL的进行整改

    2018年6月13日,周三

    MySQL备份,使用xtrabackup备份全实例数据时,会造成锁等待吗?那么如果使用mysqldump进行备份呢?

    一、xtrabackup和mysqldump会造成锁等待吗? 

    1. xtrabackup会,它在备份时会产生短暂的全局读锁FTWL(flush table with read lock),用于拷贝frm/MYD/MYI等文件,以及记录binlog信息。如果MyISAM表的数据量非常大,则拷贝时间就越长,加锁的时间也越长

    2. mysqldump有可能会。如果只是添加 --single-transacton 选项用于保证备份数据一致性,这时就不会产生FTWL锁了。但通常我们为了让备份文件和binlog保持一致,通常也会设置 --master-data 选项用于获得当前binlog信息,这种情况也会短暂加锁

    3. 数据量特别大的话,建议优先用 xtrabackup,提高备份/恢复速度。而如果数据量不是太大或者想备份单表,则建议用mysqldump了,方便逻辑恢复。各有利弊,注意其适用场景

    二、xtrabackup冷知识

    1. 基于MySQL 5.6版本开发的xtrabackup,会在备份过程中生成内部通信文件 suspend file,用于 xtrabackup 和 innobackupex 的通信,备份结束后文件删除,默认文件位置 /tmp/xtrabackup_suspended 

    2. 如果在备份过程中,修改了 /tmp 的访问权限或该文件的权限,则两个程序间直接不能通信,会造成 xtrabackup hang 住,正在备份的表不能正常释放锁,会造成锁等待,此时需要强制 kill 掉 xtrabackup 进程

    2018年6月15日,周五

    MySQL 5.7开始支持JSON,那还有必要使用MongoDB存JSON吗?请列出你的观点/理由。

    一、观点A:支持MySQL存储JSON

    1.MongoDB不支持事务,而MySQL支持事务

    2.MySQL相对MongoDB而言,MySQL的稳定性要优于MongoDB

    3.MySQL支持多种存储引擎

    二、观点B:支持MongoDB存储JSON 

    1.从性能的角度考虑,对于JSON读写效率MongoDB要优于MySQL

    2.MongoDB相对MySQL而言,MongoDB的扩展性要优于MySQL

    3.MongoDB支持更多的JSON函数

    三、总结

    1.如果应用程序无事务要求,存储数据表结构复杂并且经常被修改, 例如游戏中装备等场景用MongoDB比较适合

    2.如果应用程序有事务要求,存储数据的"表"之间相互有关联,例如有订单系统等场景用MySQL比较适合

    3.整体来看相对看好MySQL的JSON功能,在未来官方的努力下MySQL的JSON功能有机会反超MongoDB

    2018年6月17日,周日

    当数据被误删除/误操作后造成数据丢失。你尝试过用什么手段来挽救数据/损失?

    一、前提 
    1.当数据被误删除/误操作后,第一时间要关闭数据库。业务方需要紧急挂停机公告,避免数据二次污染,用于保护数据的一致性

    2.BINLOG格式为ROW格式,不讨论其他格式的BINLOG

    二、数据被误操作(update/delete/drop)造成数据丢失,可以用哪些手段来恢复? 

    1.BINLOG恢复:可以使用逆向解析BINLOG工具来恢复。例如:binlog2SQL等

    2.延迟从库: 可以通过解除延迟从库,并指定BINLOG结束位置点,可以实现数据恢复

    三、数据被误删除(rm/物理文件损坏)造成数据丢失,可以用哪些手段来恢复? 

    1.如果有备份,可以通过备份恢复 mysqldump/xtrabackup + binlog 来实现全量+增量恢复

    2.如果无备份但是有从库,可以通过主从切换,提升从库为主库,从而实现数据恢复

    3.如果无备份并且无从库,但MySQL没有重启,可以通过拷贝/proc/$pid/fd中的文件,来进行尝试恢复

    4.如果无备份并且无从库,但MySQL有重启,可以通过extundelete或undrop-for-innodb来恢复

    2018年6月19日,周二

    MySQL 5.7的复制架构,在有异步复制、半同步、增强半同步、MGR等的生产中,该如何选择?

    一、生产环境中: 

    几种复制场景都有存在的价值。下面分别描述一下: 

    1. 从成熟度上来选择,推荐:异步复制(GTID+ROW)

    2. 从数据安全及更高性能上选择:增强半同步 (在这个结构下也可以把innodb_flush_log_trx_commit调整到非1, 从而获得更好的性能)

    3. 对于主从切换控制觉的不好管理,又对数据一致性要求特别高的场景,可以使用MGR

    二、理由:

    1. 异步复制,相对来讲非常成熟,对于环境运维也比较容易上手 

    2. 增强半同步复制,可以安全的保证数据传输到从库上,对于单节点的配置上不用要求太严格,特别从库上也可以更宽松一点,而且在一致性和性能有较高的提升,但对运维上有一定的要求

    3. MGR组复制。相对增强半同步复制,MGR更能确保数据的一致性,事务的提交,必须经过组内大多数节点(n/2+1)决议并通过,才能得以提交。MGR架构对运维难度要更高,不过它也更完美

    总的来讲,从技术实现上来看:MGR> 增强半同步>异步复制。

    未来可能见到更多的MGR在生产中使用,对于MySQL的运维的要求也会更上一层楼。

  • 相关阅读:
    scrapy框架(一)
    selenium爬取京东商品信息
    自动化测试工具selenium的使用
    xpath选择器的使用
    爬取网页数据实例
    爬虫实操
    爬虫之`beautifulsoup4`模块
    DNS学习笔记
    MongoDB集群部署
    MongoDB单机部署
  • 原文地址:https://www.cnblogs.com/allenhu320/p/11323256.html
Copyright © 2020-2023  润新知