MySQL多机房容灾设计 淘宝核心系统研发 彭立勋  @plinux  2012-12-08 
跨机房同步的原因 •  机房更靠近用户,提升用户体验  •  容灾,防止整机房崩溃后系统不可用  •  机房满载,拓展容量  •  不同业务共享、相互推送数据  2
跨机房同步的类型 •  一写多读  •  多写一读  •  到处可写  3
跨机房同步的方案 •  应用层:  程序写多个库,以多数成功后返回  •  MySQL 层:  MySQL Replication [Master-Slave]  中间件 [Tungsten, Otter, Erosa, DRC, Transfer]  Multi-Source Replication [MariaDB]  •  引擎层:  InnoDB Redo Replication [In the further]  4
一写多读 •  一写多读符合 MySQL Master-Slave 架构模型  •  设定一个主机房,接收所有的写请求  •  设定多个读机房,接收就近的用户读请求  •  场景:读多写少,或写集中的系统  •  注意:及时性要求高的读  应该发生在Master  5
多写一读(1) •  如果备机房机器数与主机房相同,则可以使用 Master-Slave 架构 [资源利用率低]  •  改进:单机多实例,单机利用率提升 [维护成本也 提高]  •  继续改进:单机可以配置多路 Master [Multi- Master, 中间件]  •  场景:汇总数据进行分析 (OLAP)  利用大容量主机进行备份  6
多写一读(2) •  如果不同的 Master 之间存在相同的表名如何?  •  答:只要表结构相同,没有相同的数据(例如 唯一键相同、所有列相同),不会有任何冲突 。建议在一个复制网络内的所有实例,ID序列 不要相同。  •  经过分库后不同的Master库名不同但表名相同 如何汇总?  •  答:Slave可以rewrite库名和表名  的映射关系,把不同库/表的操作  重写到指定的表  7
多处可写(1) •  最常见的需求是任意机房可读可写  •  如何规避数据冲突?  •  1.划分ID段 [每个实例划分一段]  •  2.错开ID序列 [每个实例取模不同]  •  3.业务错开 [每个实例负责不同的表 集]  8
多处可写(2) •  注意:读取及时性要求高的数据应 该发生在写此数据的节点  •  场景:利用公用主机作为整集群的在 线备用主机,多机房要求写入数据 并读取其他机房数据  9
Multi-Source Replication •  MariaDB 10.0 以上版本: Link  •  Transfer 2.0 以上版本: Link  •  独立Patch (5.5.18): Link  10
Multi-Source Replication •  CHANGE MASTER ["connection_name"] ... •  FLUSH RELAY LOGS ["connection_name"] •  MASTER_POS_WAIT(....,["connection_name"]) •  RESET SLAVE ["connection_name"] •  SHOW RELAYLOG ["connection_name"] EVENTS •  SHOW SLAVE ["connection_name"] STATUS •  SHOW ALL SLAVES STATUS •  START SLAVE ["connection_name"...] •  START ALL SLAVES ... •  STOP SLAVE ["connection_name"] ... •  STOP ALL SLAVES ... 11
Multi-Source Replication •  set @@default_master_connection=''; •  show status like 'Slave_running'; •  set @@default_master_connection='other_connection'; •  show status like 'Slave_running'; •  兼容原生单Master命令,default_master_connection 变量可以指定当前操作的通道,使用单通道的命令操作指 定通道。 12
广而告之 •  Flashback 工具: Link [新增-T参数过滤表]  •  InnoDB 建表设定初始大小: Link [CREATE TABLE 新增 datafile_initial_size 参数]  •  淘宝MySQL开源站点: mysql.taobao.org •  有功能需求或报告patch bug: penglixun@gmail.com 13
提问时间  谢谢大家! 14

MySQL多机房容灾设计(with Multi-Master)

  • 1.
    MySQL多机房容灾设计 淘宝核心系统研发彭立勋  @plinux  2012-12-08 
  • 2.
    跨机房同步的原因 •  机房更靠近用户,提升用户体验  •  容灾,防止整机房崩溃后系统不可用  •  机房满载,拓展容量  •  不同业务共享、相互推送数据  2
  • 3.
  • 4.
    跨机房同步的方案 •  应用层:  程序写多个库,以多数成功后返回  •  MySQL层:  MySQL Replication [Master-Slave]  中间件 [Tungsten, Otter, Erosa, DRC, Transfer]  Multi-Source Replication [MariaDB]  •  引擎层:  InnoDB Redo Replication [In the further]  4
  • 5.
    一写多读 •  一写多读符合 MySQL Master-Slave 架构模型  •  设定一个主机房,接收所有的写请求  •  设定多个读机房,接收就近的用户读请求  •  场景:读多写少,或写集中的系统  •  注意:及时性要求高的读  应该发生在Master  5
  • 6.
    多写一读(1) •  如果备机房机器数与主机房相同,则可以使用 Master-Slave 架构 [资源利用率低]  •  改进:单机多实例,单机利用率提升 [维护成本也 提高]  •  继续改进:单机可以配置多路 Master [Multi- Master, 中间件]  •  场景:汇总数据进行分析 (OLAP)  利用大容量主机进行备份  6
  • 7.
    多写一读(2) •  如果不同的 Master之间存在相同的表名如何?  •  答:只要表结构相同,没有相同的数据(例如 唯一键相同、所有列相同),不会有任何冲突 。建议在一个复制网络内的所有实例,ID序列 不要相同。  •  经过分库后不同的Master库名不同但表名相同 如何汇总?  •  答:Slave可以rewrite库名和表名  的映射关系,把不同库/表的操作  重写到指定的表  7
  • 8.
    多处可写(1) •  最常见的需求是任意机房可读可写  •  如何规避数据冲突?  •  1.划分ID段 [每个实例划分一段]  •  2.错开ID序列 [每个实例取模不同]  •  3.业务错开 [每个实例负责不同的表 集]  8
  • 9.
    多处可写(2) •  注意:读取及时性要求高的数据应 该发生在写此数据的节点  •  场景:利用公用主机作为整集群的在 线备用主机,多机房要求写入数据 并读取其他机房数据  9
  • 10.
    Multi-Source Replication •  MariaDB10.0 以上版本: Link  •  Transfer 2.0 以上版本: Link  •  独立Patch (5.5.18): Link  10
  • 11.
    Multi-Source Replication •  CHANGE MASTER ["connection_name"] ... •  FLUSH RELAY LOGS ["connection_name"] •  MASTER_POS_WAIT(....,["connection_name"]) •  RESET SLAVE ["connection_name"] •  SHOW RELAYLOG ["connection_name"] EVENTS •  SHOW SLAVE ["connection_name"] STATUS •  SHOW ALL SLAVES STATUS •  START SLAVE ["connection_name"...] •  START ALL SLAVES ... •  STOP SLAVE ["connection_name"] ... •  STOP ALL SLAVES ... 11
  • 12.
    Multi-Source Replication •  set @@default_master_connection=''; •  show status like 'Slave_running'; •  set @@default_master_connection='other_connection'; •  show status like 'Slave_running'; •  兼容原生单Master命令,default_master_connection 变量可以指定当前操作的通道,使用单通道的命令操作指 定通道。 12
  • 13.
    广而告之 •  Flashback 工具:Link [新增-T参数过滤表]  •  InnoDB 建表设定初始大小: Link [CREATE TABLE 新增 datafile_initial_size 参数]  •  淘宝MySQL开源站点: mysql.taobao.org •  有功能需求或报告patch bug: penglixun@gmail.com 13
  • 14.