百度数据库运维及Redis异地多活实践余杰&廖洪流百度智能云目录Ø百度数据库综述Ø数据库运维-高可用揭秘ØRedis异地多活综述—MySQL数据库运维发展史2014-至今DBA创建-商业广告-知识产品-标准、统一2009-2013年2005-2009年技术储备期-集群化-分布式-架构、性能技术成熟-私有云XDB-公有云RDS-自动化、智能化综述—百度Redis发展史2014201520162014.62.0在线扩容2015.72.0整机房切换2014.9SCS上线2015.2SCS在线扩容2016.102.0安全版本上线2016.112.0灾备功能上线20182018.33.0异地多活功能上线2017.62.0限流版本上线20172013.101.0上线2013目录Ø百度数据库综述Ø数据库运维-高可用揭秘ØRedis异地多活数据库高可用—背景ping主库ØDBA服务故障主要两类:l流量介入层故障:多入口部署,识别与恢复较容易lDB故障:单点,故障需将从库提升为主库ØDB故障人工恢复时间为5min+,且受熟练程度限制难点:Ø主库故障识别:原因较多,表征也不同,难覆盖全,容易误判Ø故障恢复:各个节点均带数据与状态从库拉取执行主库二进制日志保持数据同步除快速恢复外,还需保证数据一致、可靠DBProxydbproxyMySQLMySQLMySQL流量接入层数据存储层读写/读读DBProxyDBProxy数据库高可用—业内方案分析–MHA(架构对比)SlaveMasterSlaveNodeNodeNodeManagerSSHØManager:Perl后台任务配置:[server_default]:ssh_usermysql_usermysql_password[server1]ipbinlog_dir[server2]ipbinlog_dirØNode:Perl脚本save_binary_logs:masterlog保存apply_diff_relay_logspurge_relay_logs数据库高可用-业内方案分析–MHA(流程)检测主库存活状态等待从库完成同步检查数据一致性获取从库丢失Log补齐数据选取新主库解决方案:故障识别故障恢复(数据一致性保证)通过select1判断主库故障.等待所有从库均需同步完成找同步点:日志偏移获取数据:MySQLbinlog执行日志无法识别:机器、硬盘故障错误识别:压力太大所有从库完成数据补齐日志偏移正确?信任关系需要完成?数据库高可用—架构DBProxy(menu)SlaveDBProxy(menu)DBProxy(menu)MasterSlaveXagentXagentXagentXagentXagentXagentZookeeperTCPØXagent:l托管MySQL实例l单点切换l相互通信lDBProxy配置管理l日志切分、清理ØZookeeperl存储:拓扑信息、节点信息l协调:状态信息数据库高可用—故障感知ØMySQL故障lDown-无法连接l假死-无法操作l反复故障–频繁切换Ø故障机器故障l磁盘故障-内存正常l机器Down-Standby异常l机器假死–Standby正常Ø网络故障l批量机器故障-多机器故障BMI:HB–4,HD–4主:IDC01从:HB–1,HD-1Xmaster源信息提取XagentMySQLProxyZoneMasterZoneAXagentMySQLProxyZoneMasterZoneB容器容器实例层区域层服务层实例汇报实例汇报区域汇总网络监控源信息对齐故障机房、二次诊断策略发起数据库高可用—故障识别ØMySQL故障lDown-无法连接l假死-无法操作l反复故障–频繁切换Ø故障机器故障l磁盘故障-内存正常l机器Down-Standby异常l机器假死–Standby正常Ø网络故障l批量机器故障-多机器故障网络故障MySQL故障硬盘故障机器故障(非硬盘)MySQL反复故障中间层组件故障数据库高可用—故障识别开始连接DB插入语句内存检查写本地文件DB故障DB正常连接数过多失败异常正常成功失败成功主库可能异常检查从库主从状态同步账户连主库主库故障主库异常主库正常所有从库IO线程异常IO线程正常无法连接连接成功距上次切换时间间隔集群剩余副本个数人工介入集群可切换?故障切换是大于允许切换间隔小于允许切换间隔小于最少副本数大于最少副本数否单节点检测联合检测集群检测压力大or故障?硬盘故障DBDown压力大,非故障主库机器Down主库机器假死Agent异常主库反复故障压力评估数据库高可用—故障处理XagentXagentXagentXagentXagent主库ZMaster从库2从库1ZookeeperDBproxyDBproxy主从复制切换协调拓扑更新拓扑拉取通知加载拓扑节点状态汇报读写DB业务访问数据库高可用—脑裂问题解决Ø网络脑裂l半同步、分布式:部署策略规避l异步复制:存在Ø思路分布式一致性协议Ø解决方案:第三方仲裁机制机房级别检查p网络故障(HB)-XM与HDZM协调切换出新主;-HBZM心跳检测端口,关闭入口写入;-网络恢复后,拉取最新配置为Proxy加载Proxy主库从库1新主库从库4ProxyXMasterZMaster1ZMaster2HBHDYFPaxosXXX数据库高可用—方案优势Ø完善的故障识别机制及策略ØManage角色:脑裂,网络问题Ø易部署,完全网络通信机制,消除信任关系依赖Ø开放,可扩展性强数据库高可用—更多场景解决方案主库从库从库从库同步复制主库从库从库从库分组同步复制Ø强同步方案(金融类解决方案)Ø分布式方案(Raft,NewSQL):自愈异步复制从库分组1分组2从库单点机房容灾主库从库从库从库binlog提交raftNodeNodeNodeNodeNewSQL(DataRaft)Range1Range2Range2Range3Range2Range3Range1Range3目录Ø百度数据库综述Ø数据库运维-高可用揭秘ØRedis异地多活业务总览:百度分布式Redis平台3.2w亿主要产品线:日PV数据量机器数64T53631080服务数单地域架构•AutoFailover•白名单•读写分离TwemproxyTwemproxyM-RedisTwemproxyM-RedisS-RedisS-RedisSentinelMonitor更新•集群管理(多地域)•整机房切换近地域多活•背景•O2O业务,多机房部署,读多写少•多地域管理•整机房切换•在线扩容ClientProxyRedisMasterClientProxyRedisSlave机房一(主)机房二(从)机房三(从)读写读写ClientProxyRedisSlave读写异地多活架构—背景异地多活背景1.AI/FEED业务的高速发展,要求在多地域支持快速的读写服务,并且作为存储使用2.要求单地域出现故障,可快速容灾ClientProxyRedisMasterClientProxyRedisSlave地域一地域二地域三读写读写ClientProxyRedisSlave读写地域故障异地多活—业内架构1业内架构1说明:此方案是让业务进行写入MQ,通过DTS同步组件进行多地域数据同步,再基于MQ进行数据的分发.问题:需要业务进行改造,成本较高WebWebMQMQDTSProcessorProcessorCacheCacheIDC1IDC2IDC1数据流IDC2数据流异地多活—业内架构2业内架构2说明:此方案架构是通过Reader对Redis进行两地的数据同步,每个需要同步的地域都需要有一个对应的Reader来接收数据问题:可扩展性差,压力随着同步地域数增加而线性增加Redis(M)Redis(S)ReaderReaderRedis(M)Redis(S)ReaderReaderRedis(M)Redis(S)ReaderReaderIDC1IDC2IDC3异地多活—百度架构•处理方案:(1)引入消息中间件进行多地域数据分发,架构清晰各地域解耦合•业务支持:数据基于业务拆分(单元化)Redis(M)Redis(M)Redis(M)ReaderReaderReaderIDC1IDC3IDC2IDC1数据流向IDC3数据流向IDC2数据流向MQ异地多活—技术难点ReaderRedisProxyRedisDTS1.原生主从同步是否问题?MQIDC1IDC2异地多活—数据流Redis-Slave(reader)Redis-MasterIDC13.psyncrunidoffset4.replyreplbufbyoffsetreplbuf2.copydatatobuf1.writecmds问题1.replbuf限制2.全量同步效率低3.同步期间Slave无法服务Redis主从数据同步异地多活—数据流解决方案setab(opid:1)setcd(opid:2)setgh(opid:3)setkl(opid:4)AOF-1.AOFRedis1.writecmds(setkeyvalue)2.writetoAOFfileRedisshiftAOF生成AOF-1AOF-23.filebigenough4.psync?-13(psync$run_id$offset$op_id)异地多活—数据回环问题RedisProxyRedisMQIDC21.writecmds(setab)setabAOF2.sendtoSlave3.sendtoIDC2setab4.sendtoSlave5.sendtoRedis,Datacomeback!!!(setab)解决方案1.命令添加来源2.Reader只同步指定来源数据异地多活—其他难点ZK1ReaderZK2读取点写入点RedisProxyRedisMQIDC1IDC22.如何保证异地1w+QPS,1s内同步?3.如何保障传输系统高可用?ZK3异地多活效果及计划•效果•低耦合:数据同步对业务层透明•高性能:多地域读写,相比近地域多活架构写入延时20~50ms降低到1~3ms•高可用:支持异地多活,单地域故障,RTO在五分钟内•计划•一致性冲突:冲突检测及可定制化合并策略•不丢不重:命令幂等转换