精华内容
下载资源
问答
  • 同步复制与异步复制
    万次阅读
    2021-06-21 10:36:30

    主从复制:其中一种设计,包括一个同步的从节点,和一个异步的从节点。

    从节点2在接收复制日志之前有一段很长的延迟。通常情况下,复制速度会非常快,例如多数数据库系统可以在一秒之内完成所有从节点的更新。但是,系统其实并没有保证一定会在多长时间内完成复制。有些情况下,从节点可能落后主节点几分钟甚至更长时间,例如,由于从节点刚从故障中恢复,或者系统已经接近最大设计上限,或者节点之间的网络出现问题。

    同步复制的优点是:一旦向用户确认,从节点可以明确保证完成了与主节点的更新同步,数据已经处于最新版本。万一主节点发生故障,总是可以在从节点继续访问最新数据。缺点则是:如果同步的从节点无法完成确认(例如:由于从节点发生崩溃,或者网络故障,或任何其他原因),写入就不能视为成功。主节点会阻塞其后所有的写操作,直到同步副本确认已完成。

    因此,把所有从节点都配置为同步复制有些不切实际。因为这样子的话,任何一个同步节点的中断都会导致整个系统更新停滞不前。**实践中,如果数据库启用了同步复制,通常意味着其中某一个从节点是同步的,而其他节点这是异步模式。**万一同步的从节点变得不可用或性能下降,则将另一个异步的从节点提升为同步模式。这样可以保证至少有两个节点(即主节点和一个同步从节点)拥有最新的数据副本。这种配置有时候也叫做半同步。

    主从复制还经常会被配置为全异步模式。此时如果主节点发生失败且不可恢复,则所有尚未复制到从节点的写请求都会丢失。这意味着即使向客户端确认了写操作,却无法保证数据的持久化。但是全异步配置的优点则是,不管从节点上数据多么滞后,主节点总是可以继续响应写请求,系统的吞吐性能更好、

    异步模式这种弱化的持久性听起来是一个非常不靠谱的折中设计,但是异步复制还是被广泛使用,特别是那些从节点数量巨大或者分布于广域地理环境。我们常见的问题,会有复制滞后问题

    配置新的从节点:
    当如果出现以下情况下,如需要增加副本数以提高容错能力,或者替换失败的副本,就需要考虑增加新的从节点。但是如何确保新的从节点和主节点保持数据一致呢?

    简单地将数据文件从一个节点复制到另一个节点通常是不够的,主要是因为客户端仍在不断得向数据库写入新数据,数据始终处于不断变化之中,因此常规的文件拷贝方式将会导致不同节点上呈现出不同时间点的数据,这不是我们所期待的。

    或许应该考虑锁定数据库(使其不可写)来使磁盘上的文件保持一致,但是这会违反高可用的设计目标。好在我们可以做到在不停机,数据服务不中断的前提下完成从节点的设置。逻辑上的主要操作步骤如下:

    1. 在某个时间点对主节点的数据副本产生一个一致性的快照。这样子避免长时间锁定整个数据库,炉前大多数数据库都支持此功能,快照也是系统备份锁必须的。而在某些情况下,可能需要第三方工具,入MYSQL的innobackupex
    2. 将此快照拷贝到新的从节点
    3. 从节点链接到主节点并请求快照点之后所发生的的数据更改日志;因为在第一步创建快照时候,快照与系统复制日志的某一个确定位置相关联,这个位置信息在不同的系统中有不同的称呼,
    4. 获得日志之后,从节点来应用这些快找点之后所有数据变更,这个过程称之为追赶。接下来,他可以继续处理主节点上新的数据变化。并且重复步骤一~步骤4

    从节点失效:追赶式恢复
    主节点失效:节点切换

    上述这些问题,包括节点失效,网络不可靠,副本一致性,持久性,可用性与延迟之间各种细微的权衡,实际上正是分布式系统核心的基本问题。

    基于行的逻辑日志复制 mySql
    另一种方法就是复制和存储引擎采用不同的日志格式,这样复制与存储逻辑剥离,这种复制日志称为逻辑日志,用来区分物理存储引擎的数据表示。

    关系型数据库的逻辑日志通常是指一系列记录来描述数据表行级别的写请求:

    1. 对于行插入,日志包含所有相关列的新值。
    2. 对于行删除,日志里有足够的信息来唯一标识已经三处的行,通常是靠主键,但是如果表上没有定义
      主键,就需要记录所有列的旧值
      3.对于行更新,日志包含足够的信息来唯一表示更新的行,以及所有列的新值(或者至少包含所有已经更新列的新值)

    如果一条事务设计多行的修改,则会产生多个这样的日志记录,并在后面跟着一条记录,指出该事务已经提交。Mysql的二进制日志binlog(当配置为基于行的复制时)使用该方式。

    从节点最终会赶上并且与主节点保持一致,这种效应也被称为最终一致性。正常情况下,主节点和从节点上完成写操作之间的时间延迟(复制滞后)可能不足1秒,这样子的滞后,在实践中中通常不会导致太大的影响。但是,如果系统已经接近设计上线,或者网络存在问题,则滞后可能轻松增加到几秒甚至几分钟不等。

    离线客户端操作:
    另一种多主复制比较适合的场景是:应用在于网络断开后还需要继续工作。

    更多相关内容
  • Oracle 白皮书 ADG 异步复制技术..
  • MySQL关于“异步复制”“同步复制”“半同步复制”“无损复制”的概念与区别,这技术面试经常问到的
  • RocketMQ双主双从异步复制部署流程

    千次阅读 2022-01-21 20:24:41
    #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH # 开启对 propertyfilter的支持 enablePropertyFilter = true filterSupportRetry = ...


    这里只用了两台机器,主和备用一台(测试资源有限)

    1、下载

    下载地址:http://rocketmq.apache.org/dowloading/releases/
    在这里插入图片描述

    拷贝至两台机器,解压下载的安装包

    2、修改配置文件

    第一台机器修改:

    rocketmq-all-4.8.0-bin-release/conf/2m-2s-async目录下的broker-a.properties、broker-b-s.properties
    

    broker-a.properties:

    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    #集群名
    brokerClusterName=Data-Cluster
    #broker名字
    brokerName=broker-a
    #0 表示 Master, >0 表示 Slave
    brokerId=0
    #nameServer地址,分号分割
    namesrvAddr=172.16.10.169:9876;172.16.10.168:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=3
    #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    #Broker 对外服务的监听端口
    listenPort=10911
    #删除文件时间点,默认凌晨 4点
    deleteWhen=04
    #文件保留时间,默认 48 小时
    #fileReservedTime=3600
    #commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824
    #ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    #destroyMapedFileIntervalForcibly=120000
    #redeleteHangedFileInterval=120000
    #文件磁盘最大利用率
    diskMaxUsedSpaceRatio=88
    #存储路径
    storePathRootDir=/home/rocketmq/data/store-a
    #commitLog 存储路径
    storePathCommitLog=/home/rocketmq/data/commitlog-a
    #消费队列存储路径存储路径
    storePathConsumeQueue=/home/rocketmq/data/consumequeue-a
    #限制的消息大小
    maxMessageSize=65536
    #flushCommitLogLeastPages=4
    #flushConsumeQueueLeastPages=2
    #flushCommitLogThoroughInterval=10000
    #flushConsumeQueueThoroughInterval=60000
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=ASYNC_MASTER
    flushDiskType=ASYNC_FLUSH
    # 开启对 propertyfilter的支持
    enablePropertyFilter = true
    filterSupportRetry = true
    

    broker-b-s.properties:

    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #集群名
    brokerClusterName=Data-Cluster
    #broker名字
    brokerName=broker-b
    #0 表示 Master, >0 表示 Slave
    brokerId=1
    #nameServer地址,分号分割
    namesrvAddr=172.16.10.169:9876;172.16.10.168:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=3
    #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=ture
    #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=ture
    #Broker 对外服务的监听端口
    listenPort=11911
    #删除文件时间点,默认凌晨 4点
    deleteWhen=04
    #文件保留时间,默认 48 小时
    #fileReservedTime=3600
    #commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824
    #ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    #destroyMapedFileIntervalForcibly=120000
    #redeleteHangedFileInterval=120000
    #磁盘最大利用率
    diskMaxUsedSpaceRatio=88
    #存储路径
    storePathRootDir=/home/rocketmq/data/store-b-s
    #commitLog 存储路径
    storePathCommitLog=/home/rocketmq/data/commitlog-b-s
    #消费队列存储路径存储路径
    storePathConsumeQueue=/home/rocketmq/data/consumequeue-b-s
    #限制的消息大小
    maxMessageSize=65536
    #flushCommitLogLeastPages=4
    #flushConsumeQueueLeastPages=2
    #flushCommitLogThoroughInterval=10000
    #flushConsumeQueueThoroughInterval=60000
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=SLAVE
    flushDiskType=ASYNC_FLUSH
    # 开启对 propertyfilter的支持
    enablePropertyFilter = true
    filterSupportRetry = true
    
    
    

    第二台机器修改:

    rocketmq-all-4.8.0-bin-release/conf/2m-2s-async目录下的broker-b.properties、broker-a-s.properties
    

    broker-b.properties:

    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #集群名
    brokerClusterName=Data-Cluster
    #broker名字
    brokerName=broker-b
    #0 表示 Master, >0 表示 Slave
    brokerId=0
    #nameServer地址,分号分割
    namesrvAddr=172.16.10.169:9876;172.16.10.168:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=3
    #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=ture
    #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=ture
    #Broker 对外服务的监听端口
    listenPort=10911
    #删除文件时间点,默认凌晨 4点
    deleteWhen=04
    #文件保留时间,默认 48 小时
    #fileReservedTime=3600
    #commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824
    #ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    #destroyMapedFileIntervalForcibly=120000
    #redeleteHangedFileInterval=120000
    #磁盘最大利用率
    diskMaxUsedSpaceRatio=88
    #存储路径
    storePathRootDir=/home/rocketmq/data/store-b
    #commitLog 存储路径
    storePathCommitLog=/home/rocketmq/data/commitlog-b
    #消费队列存储路径存储路径
    storePathConsumeQueue=/home/rocketmq/data/consumequeue-b
    #限制的消息大小
    maxMessageSize=65536
    #flushCommitLogLeastPages=4
    #flushConsumeQueueLeastPages=2
    #flushCommitLogThoroughInterval=10000
    #flushConsumeQueueThoroughInterval=60000
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=ASYNC_MASTER
    flushDiskType=ASYNC_FLUSH
    # 开启对 propertyfilter的支持
    enablePropertyFilter = true
    filterSupportRetry = true
    
    

    broker-a-s.properties:

    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #集群名
    brokerClusterName=Data-Cluster
    #broker名字
    brokerName=broker-a
    #0 表示 Master, >0 表示 Slave
    brokerId=1
    #nameServer地址,分号分割
    namesrvAddr=172.16.10.169:9876;172.16.10.168:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=3
    #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    #Broker 对外服务的监听端口
    listenPort=11912
    #删除文件时间点,默认凌晨 4点
    deleteWhen=04
    #文件保留时间,默认 48 小时
    #fileReservedTime=3600
    #commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824
    #ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    #destroyMapedFileIntervalForcibly=120000
    #redeleteHangedFileInterval=120000
    #文件磁盘最大利用率
    diskMaxUsedSpaceRatio=88
    #存储路径
    storePathRootDir=/home/rocketmq/data/store-a-s
    #commitLog 存储路径
    storePathCommitLog=/home/rocketmq/data/commitlog-a-s
    #消费队列存储路径存储路径
    storePathConsumeQueue=/home/rocketmq/data/consumequeue-a-s
    #限制的消息大小
    maxMessageSize=65536
    #flushCommitLogLeastPages=4
    #flushConsumeQueueLeastPages=2
    #flushCommitLogThoroughInterval=10000
    #flushConsumeQueueThoroughInterval=60000
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=SLAVE
    flushDiskType=ASYNC_FLUSH
    # 开启对 propertyfilter的支持
    enablePropertyFilter = true
    filterSupportRetry = true
    
    在两台机器上创建/home/rocketmq/data、/home/rocketmq/logs目录
    

    3、配置环境变量

    vi ~/.bashrc
    添加rocketmq环境变量

    export ROCKETMQ_HOME=/home/rocketmq/rocketmq-all-4.8.0-bin-release
    export PATH=$PATH:$ROCKETMQ_HOME/bin
    

    source ~/.bashrc

    4、启动namesrv

    确保安装jdk1.8的环境,并配置PATH与JAVA_HOME
    两台机器都执行:
    进入bin目录:

    nohup sh mqnamesrv > /home/rocketmq/logs/mqnamesrv.log 2>&1 &
    

    5、启动broker

    进入bin目录
    修改runbroker.sh,找到下面两行JVM参数,可以调大或调小内存

    JAVA_OPT=" J A V A O P T − s e r v e r − X m s 2 g − X m x 2 g − X m n 1 g " . . . J A V A O P T = " {JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g" ... JAVA_OPT=" JAVAOPTserverXms2gXmx2gXmn1g"...JAVAOPT="{JAVA_OPT} -XX:MaxDirectMemorySize=2g"

    修改runserver.sh,找到下免一行JVM参数,可以调大或调小内存

    JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=160m"

    第一台机器启动:
    broker-a:

    nohup sh mqbroker -c /home/rocketmq/rocketmq-all-4.8.0-bin-release/conf/2m-2s-async/broker-a.properties > /home/rocketmq/logs/mqbroker-a.log 2>&1 &
    
    第二台机器启动:
    broker-b:
    

    nohup sh mqbroker -c /home/rocketmq/rocketmq-all-4.8.0-bin-release/conf/2m-2s-async/broker-b.properties > /home/rocketmq/logs/mqbroker-b.log 2>&1 &

    第二台机器启动:
    broker-a-s:
    

    nohup sh mqbroker -c /home/rocketmq/rocketmq-all-4.8.0-bin-release/conf/2m-2s-async/broker-a-s.properties > /home/rocketmq/logs/mqbroker-a-s.log 2>&1 &
    第一台机器启动:
    broker-b-s:

    nohup sh mqbroker -c /home/rocketmq/rocketmq-all-4.8.0-bin-release/conf/2m-2s-async/broker-b-s.properties > /home/rocketmq/logs/mqbroker-b-s.log 2>&1 &
    

    关闭命令

    sh mqshutdown namesrv
    sh mqshutdown broker
    

    6、安装rocketmq-externals

    6.1、准备jar包

    安装maven(如果已安装请忽略)
    http://maven.apache.org/download.cgi下载
    解压apache-maven-3.8.1-bin.zip
    配置环境变量
    在这里插入图片描述
    配置阿里云仓库
    在C:\Users\admin.m2\settings.xml中添加:

    <mirrors>
       	……
         <mirror>
                <id>nexus-aliyun</id>
                <mirrorOf>central</mirrorOf>
                <name>Nexus aliyun</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </mirror>
    	……
      </mirrors>
    

    6.2、准备rocketmq-externals

    从[https://github.com/apache/rocketmq-externals](https://github.com/apache/rocketmq-externals)下载源码
    

    解压rocketmq-externals-master.zip
    进入目录:rocketmq-externals-master\rocketmq-console
    修改配置文件src\main\resources\application.properties(也可以不改,后面直接修改Jar包内的)
    将rocketmq.config.namesrvAddr和server.port修改
    在这里插入图片描述
    返回rocketmq-externals-master\rocketmq-console目录
    运行:

    mvn clean package -Dmaven.test.skip=true
    

    从target中拷贝出rocketmq-console-ng-2.0.0.jar就是打好的jar了

    6.3、运行rocketmq-externals

    将rocketmq-console-ng-2.0.0.jar拷贝至服务器:
    启动命令:
    nohup java -jar rocketmq-console-ng-2.0.0.jar > /home/rocketmq/logs/rocketmq-externals.log &
    访问172.16.10.168:18080

    展开全文
  • 同步复制 下图是基于存储设备的自主同步环境。 1)主站点服务器向磁盘阵列发出IO请求,向某LBA写入数据。待写数据进入缓存,此时控制器不会给服务器的SAN网络适配器驱动程序发送写入成功的应答。 2)主站点磁盘阵列...

    同步复制

    下图是基于存储设备的自主同步环境。
    在这里插入图片描述
    1)主站点服务器向磁盘阵列发出IO请求,向某LBA写入数据。待写数据进入缓存,此时控制器不会给服务器的SAN网络适配器驱动程序发送写入成功的应答。
    2)主站点磁盘阵列将变化的数据从缓存中写入LUN A,此时主站点的数据同步引擎感知,将变化的数据块从缓存中经过SAN交换机发送到备份站点的缓存中。
    3)备份站点磁盘阵列运行的同步引擎接收到数据后,在FC协议隐式的发一个ACK或者经过上层显试的发给主站点。
    4)主站点收到应答,向服务器发一个FC协议的隐式ACK。服务器上的FC HBA驱动程序探测到发送成功,一层层向上发送成功信号,最终应用程序会收到成功信号。
    5)若备站点迟迟未收到数据,则不会返回成功,应用程序会等待。若是此时应用程序使用的是同步IO,则相关进程会挂起,称为IO等待。
    因此同步复制的特色是主站点必须等待备份站点的成功信号,保持严格的同步。

    异步复制

    相对于同步复制,两边的步调不须要一致,要保证重要的事情先作完,因此会存在必定的数据不一致。
    在这里插入图片描述
    1)主站点服务器向磁盘发出IO请求,待写数据进入控制器缓存,若是此时主控制器设置为Write Back模式:则马上返回应答;主控制器设置为Write Through模式,则先写入LUN A之后,再返回ACK。
    2)主站点将数据经过SAN网络发送到备站点的缓存。
    3)备站点磁盘成功接收,则返回成功。

    展开全文
  • 目录:复制过程数据间的同步全量复制部分复制心跳异步复制复制原理1. 复制过程复制的过程步骤如下:从节点执行 slaveof 命令从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制从节点内部的定时任务...

    原文章地址 https://zhuanlan.zhihu.com/p/60239657

    目录:

    1. 复制过程
    2. 数据间的同步
    3. 全量复制
    4. 部分复制
    5. 心跳
    6. 异步复制

    复制原理

    1. 复制过程

    复制的过程步骤如下:

    1. 从节点执行 slaveof 命令
    2. 从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制
    3. 从节点内部的定时任务发现有主节点的信息,开始使用 socket 连接主节点
    4. 连接建立成功后,发送 ping 命令,希望得到 pong 命令响应,否则会进行重连
    5. 如果主节点设置了权限,那么就需要进行权限验证;如果验证失败,复制终止。
    6. 权限验证通过后,进行数据同步,这是耗时最长的操作,主节点将把所有的数据全部发送给从节点。
    7. 当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来,主节点就会持续的把写命令发送给从节点,保证主从数据一致性

    2. 数据间的同步

    上面说的复制过程,其中有一个步骤是“同步数据集”,这个就是现在讲的‘数据间的同步’。

    redis 同步有 2 个命令:sync 和 psync,前者是 redis 2.8 之前的同步命令,后者是 redis 2.8 为了优化 sync 新设计的命令。我们会重点关注 2.8 的 psync 命令。

    psync 命令需要 3 个组件支持:
    1.主从节点各自复制偏移量
    2.主节点复制积压缓冲区
    3.主节点运行 ID

    主从节点各自复制偏移量

    参与复制的主从节点都会维护自身的复制偏移量。
    

    主节点在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在 info replication
    中的 master_repl_offset 指标中。

    从节点每秒钟上报自身的的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量。

    从节点在接收到主节点发送的命令后,也会累加自身的偏移量,统计信息在 info replication 中。

    通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。

    主节点复制积压缓冲区

    复制积压缓冲区是一个保存在主节点的一个固定长度的先进先出的队列。默认大小 1MB。
    

    这个队列在 slave 连接是创建。这时主节点响应写命令时,不但会把命令发送给从节点,也会写入复制缓冲区。

    他的作用就是用于部分复制和复制命令丢失的数据补救。

    通过 info replication 可以看到相关信息。

    主节点运行 ID

    每个 redis 启动的时候,都会生成一个 40 位的运行 ID。
    

    运行 ID 的主要作用是用来识别 Redis 节点。如果使用 ip+port 的方式,那么如果主节点重启修改
    了 RDB/AOF 数据,从节点再基于偏移量进行复制将是不安全的。所以,当运行 id 变化后,从节点将
    进行全量复制。也就是说,redis 重启后,默认从节点会进行全量复制。

    如果在重启时不改变运行 ID 呢?
    可以通过 debug reload 命令重新加载 RDB 并保持运行 ID 不变。从而有效的避免不必要的全量复制。
    他的缺点则是:debug reload 命令会阻塞当前 Redis 节点主线程,因此对于大数据量的主节点或者
    无法容忍阻塞的节点,需要谨慎使用。

    一般通过故障转移机制可以解决这个问题。

    psync 命令的使用方式

    命令格式为 psync {runId} {offset}
    

    runId : 从节点所复制主节点的运行 id
    offset:当前从节点已复制的数据偏移量

    psync 执行流程:

    流程说明:从节点发送 psync 命令给主节点,runId 就是目标主节点的 ID,如果没有默认为 -1,offset 是从节点保存的复制偏移量,如果是第一次复制则为 -1.

    主节点会根据 runid 和 offset 决定返回结果:

    • 如果回复 +FULLRESYNC {runId} {offset} ,那么从节点将触发全量复制流程。
    • 如果回复 +CONTINUE,从节点将触发部分复制。
    • 如果回复 +ERR,说明主节点不支持 2.8 的 psync 命令,将使用 sync 执行全量复制。

    到这里,数据之间的同步就讲的差不多了,篇幅还是比较长的。主要是针对 psync 命令相关之间的介绍。

    3. 全量复制

    全量复制是 Redis 最早支持的复制方式,也是主从第一次建立复制时必须经历的的阶段。触发全量复制的命令是 sync 和 psync。之前说过,这两个命令的分水岭版本是 2.8,redis 2.8 之前使用 sync 只能执行全量不同,2.8 之后同时支持全量同步和部分同步。

    流程如下:

    介绍一下上图步骤:

    1. 发送 psync 命令(spync ? -1)
    2. 主节点根据命令返回 FULLRESYNC
    3. 从节点记录主节点 ID 和 offset
    4. 主节点 bgsave 并保存 RDB 到本地
    5. 主节点发送 RBD 文件到从节点
    6. 从节点收到 RDB 文件并加载到内存中
    7. 主节点在从节点接受数据的期间,将新数据保存到“复制客户端缓冲区”,当从节点加载 RDB 完毕,再发送过去。(如果从节点花费时间过长,将导致缓冲区溢出,最后全量同步失败)
    8. 从节点清空数据后加载 RDB 文件,如果 RDB 文件很大,这一步操作仍然耗时,如果此时客户端访问,将导致数据不一致,可以使用配置slave-server-stale-data 关闭.
    9. 从节点成功加载完 RBD 后,如果开启了 AOF,会立刻做 bgrewriteaof

    以上加粗的部分是整个全量同步耗时的地方。

    注意:

    1. 如过 RDB 文件大于 6GB,并且是千兆网卡,Redis 的默认超时机制(60 秒),会导致全量复制失败。可以通过调大 repl-timeout 参数来解决此问题
    2. Redis 虽然支持无盘复制,即直接通过网络发送给从节点,但功能不是很完善,生产环境慎用。

    4. 部分复制

    当从节点正在复制主节点时,如果出现网络闪断和其他异常,从节点会让主节点补发丢失的命令数据,主节点只需要将复制缓冲区的数据发送到从节点就能够保证数据的一致性,相比较全量复制,成本小很多。

    步骤如下:

    1. 当从节点出现网络中断,超过了 repl-timeout 时间,主节点就会中断复制连接。
    2. 主节点会将请求的数据写入到“复制积压缓冲区”,默认 1MB。
    3. 当从节点恢复,重新连接上主节点,从节点会将 offset 和主节点 id 发送到主节点
    4. 主节点校验后,如果偏移量的数后的数据在缓冲区中,就发送 cuntinue 响应 —— 表示可以进行部分复制
    5. 主节点将缓冲区的数据发送到从节点,保证主从复制进行正常状态。

    5. 心跳

    主从节点在建立复制后,他们之间维护着长连接并彼此发送心跳命令。

    心跳的关键机制如下:

    1. 中从都有心跳检测机制,各自模拟成对方的客户端进行通信,通过 client list 命令查看复制相关客户端信息,主节点的连接状态为 flags = M,从节点的连接状态是 flags = S。
    2. 主节点默认每隔 10 秒对从节点发送 ping 命令,可修改配置 repl-ping-slave-period 控制发送频率。
    3. 从节点在主线程每隔一秒发送 replconf ack{offset} 命令,给主节点上报自身当前的复制偏移量。
    4. 主节点收到 replconf 信息后,判断从节点超时时间,如果超过 repl-timeout 60 秒,则判断节点下线。

    注意:为了降低主从延迟,一般把 redis 主从节点部署在相同的机房/同城机房,避免网络延迟带来的网络分区造成的心跳中断等情况。

    6. 异步复制

    主节点不但负责数据读写,还负责把写命令同步给从节点,写命令的发送过程是异步完成,也就是说主节点处理完写命令后立即返回客户度,并不等待从节点复制完成。

    异步复制的步骤很简单,如下:

    1. 主节点接受处理命令
    2. 主节点处理完后返回响应结果
    3. 对于修改命令,异步发送给从节点,从节点在主线程中执行复制的命令。

    总结

    本文主要分析了 Redis 的复制原理,包括复制过程,数据之间的同步,全量复制的流程,部分复制的流程,心跳设计,异步复制流程。

    其中,可以看出,RDB 数据之间的同步非常耗时。所以,Redis 在 2.8 版本退出了类似增量复制的 psync 命令,当 Redis 主从直接发生了网络中断,不会进行全量复制,而是将数据放到缓冲区(默认 1MB)里,在通过主从之间各自维护复制 offset 来判断缓存区的数据是否溢出,如果没有溢出,只需要发送缓冲区数据即可,成本很小,反之,则要进行全量复制,因此,控制缓冲区大小非常的重要。

    展开全文
  • MySQL异步复制 master事务的提交不需要经过slave的确认,slave是否接收到master的binlog,master并不关心。slave接收到master binlog后先写relay log,最后异步地去执行relay log中的sql应用到自身。由于master的...
  • 区分:异步复制是Master将事宜写入binlog,提交事件,本身并不知道slave是不是吸收是不是处置惩罚,不能保证一切事件都被一切slave吸收。同步复制是Master提交事件,直到事件在一切slave都已提交,才会返回客户端...
  • MySQL数据复制的原理图大致如下:从上图我们可以看出MySQL数据库的复制需要启动三个线程来实现:其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它...
  • 一、主从复制简述 MySQL 主从复制也可以理解为主从同步,通过将一台主机的数据复制给其他一台或者多台主机,并重新应用中继日志中的SQL语句来实现复制功能。 1、常见的主从架构图: 单向主从复制 双向主从复制...
  • MySQL基于GTID异步复制

    千次阅读 2022-03-24 19:18:50
    环境准备: 操作系统:Oracle Linux 7.9 两台 数据库版本:5.7.36 主库IP:192.168.16.51 3306 ...需求及数据库架构:数据库业务量为10g,建设数据库环境,主从复制,主库用于生产,从库用于数
  • 两台电脑搭建RocketMQ 2master2slave-异步复制 集群 每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下: 优点:即使磁盘损坏,消息丢失的...
  • MySQL主从复制原理 _ 异步复制 _ 半同步复制 _ GTID复制
  • Mysql的异步复制

    千次阅读 2019-07-29 14:30:52
    文章目录Mysql的主从复制技术复制的用途复制存在的问题复制原理主从复制过程异步复制机制异步复制原理实验环境实验步骤server1(master)server2(slave)测试 Mysql的主从复制技术 mysql的主从复制又叫replication...
  • 文章目录MySQL异步复制和半同步复制、强同步复制的区别异步复制:半同步复制:强同步复制: MySQL异步复制和半同步复制、强同步复制的区别 异步复制: 应用发起数据更新(含insert、update、delete操作)请求,...
  • C sharp异步复制文件

    2015-11-12 21:51:22
    已经封装好的 文件异步复制类。比较实用,不用写一大遍代码了。
  • 一、MYSQL复制架构衍生史 在2000年,MySQL 3.23.15版本引入了Replication。Replication作为一种准实时同步方式,得到广泛应用。这个时候的Replicaton的实现涉及到两个线程,一个在Master,一个在Slave。Slave的I/O和...
  • MySQL主从复制 原理:将主服务器的binlog日志复制到从服务器上执行一遍,达到主从数据的一致状态。 过程:从库开启一个I/O线程,向主库请求Binlog日志。主节点开启一个binlog dump线程,检查自己的二进制日志,...
  • 区别:1、异步复制是Master将事件写入binlog,自身并不知道slave是否接收是否处理,不能保证所有事务都被所有slave接收;2、同步复制是Master提交事务,直到事务在所有slave都已提交,才会返回客户端事务执行完毕...
  • 部署MySQL主从异步复制(两台) mysql主 1.安装mysql(两台机器都装) yum -y install mariadb mariadb-devel mariadb-server 2.配置 mysql master(主) 服务器 Vim /etc/my.cnf 3.重启mysql服务器 systemctl rest
  • 1.什么是主从复制 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库。 可以理解为,主数据库的数据的任何变化,从数据库都会跟着发生变化。 2.主从复制的作用 在从服务器可以执行查询...
  • 下面我们要做两种主从复制方法都是异步复制异步复制的有点就是速度快,但当网络卡顿时,有可能导致数据不能完全同步。 从节点I/O线程 当从节点上执行 start slave 命令之后,从节点会创建一个I/O线程用来连接主...
  • rocketmq 多主多从异步复制 部署任务:在三台机器上部署 rocketmq 集群,集群包含着 3 个节点。 各节点信息以及主从配置如下表所示 IP 节点名 主服务配置 从服务配置 10.188.25.155 QHJKK-flow1 broker-a ...
  • 同步复制和异步复制 如果一个Broker组有Master和Slave,消息需要从Master复制到Slave 上,有同步和异步两种复制方式 1)同步复制 同步复制方式是等Master和Slave均写 成功后才反馈给客户端写成功状态; 在同步复制...
  • 三点容灾双活异步复制技术建议书.docx
  • 1.什么是主从复制 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库。 可以理解为,主数据库的数据的任何变化,从数据库都会跟着发生变化。 2.主从复制的作用 在从服务器可以执行查询...
  • MySQL的异步复制和半同步复制

    千次阅读 2017-11-07 14:50:36
    Mysql在5.5及其以后的版本引入了半同步的概念,在这里也普及一些基础知识。一:神马是半同步,同步,...3:默认情况下mysql主从复制就是异步的方式,别看好像数据刚被创建,slve就可以看到了,因为你的数据量太小了,
  • 1、redis的异步复制 首先我们了解一下redis的主从复制,redis的主从复制一般有一个master node和不超过三个slave node,当slave第一次连接master节点时会进行全量赋值(就是将rdb镜像进行复制传送),如果因为网络...
  • 一文看懂MySQL的异步复制、全同步复制与半同步复制 在线数据迁移经验:如何为正在飞行的飞机更换引擎 MySQL 主从复制 一、异步复制(relay_log)有两种实现方式: (1)主库dump线程异步通知:主库有一个 dump 线程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 225,117
精华内容 90,046
关键字:

异步复制

友情链接: PKM-master.zip