数据库系统中何时使用预写式日志和逻辑复制
时间:2025-11-05 12:18:14 出处:时尚阅读(143)
建议将预写日志 (WAL) 与复制结合在混合一致性模型中,数据使用式日以实现需要容错能力的库系弹性系统。
译自Here’s When To Use Write-Ahead Log and 统中Logical Replication in Database Systems,作者 Raja Chattopadhyay。预写

在数据库复制方面,志和两种广泛使用的逻辑方法是预写式日志 (WAL) 和逻辑复制。这些技术对于维护数据可用性、复制促进灾难恢复和扩展数据库系统至关重要。数据使用式日由于结构、库系功能和实际应用的统中不同,需要不同的预写策略来掌握它们的优点和局限性。
预写式日志 (WAL)
预写式日志 (WAL) 这种方法通常用于数据库系统中,志和例如PostgreSQL。逻辑它涉及利用存储在 WAL 文件中的复制修改流,将数据从数据库复制到一个或多个辅助副本。数据使用式日以下是它的分解方式:
在 WAL 中,主数据库通过在数据文件中最终确定所有更改之前将其记录到其预写式日志 (WAL) 文件中来保证持久性。然后,辅助副本从服务器获取这些 WAL 文件,并按顺序将其应用到它们自己的数据文件中。这种复制技术需要辅助服务器之间的异步通信,以维护整个系统中数据的一致性和可靠性。IT技术网
WAL 通过从数据库的事务日志中复制更改来维护数据完整性和一致性。此过程确保复制的数据与数据保持同步,从而确保整个过程的完整性。此外,WAL 支持时间点恢复,允许备用服务器重放特定时间段的 WAL 文件,从而在发生故障或数据损坏时实现恢复。在主服务器不可用的故障转移事件中,WAL 通过使用最新的 WAL 文件提升备用服务器成为新的主服务器,从而实现转换,以持续运行。
WAL 通过复制主数据库事务日志中的更改来维护数据完整性和一致性,从而在复制期间保持数据完整性。此方法还会影响数据库的性能,因为更改首先记录在 WAL 文件中,然后才应用到数据文件中。这种方法允许主数据库高效运行并在负载下写入。此外,WAL 非常适合灾难恢复场景,因为备用服务器会不断更新数据库中的更改,确保它们是最新的,云服务器并准备好在服务器故障时接管。确保数据库系统的可靠备份计划可保证灾难恢复措施。
在使用 WAL 时,为了使复制有效,必须意识到一些缺点。有时,由于网络延迟或高活动级别,备用副本落后于服务器时,可能会发生复制滞后。此滞后会导致备用服务器上的数据出现差异,从而影响数据一致性。此外,在某些情况下,可能需要手动步骤将服务器指定为新的主服务器。此手动过程可能会导致延迟。它需要参与,可能会延长恢复操作所需的时间。
逻辑复制
另一方面,逻辑复制是一种用于 PostgreSQL、MySQL 和MongoDB等数据库系统中的技术。它在复制 SQL 语句或数据修改的级别上运行。与在字节级别复制更改的 WAL 不同,逻辑复制提供了一种同步数据的方法。此方法由于其设计和功能而具有不同的源码库优点和挑战。
在复制中,主数据库将一组更改(可能包括 SQL 语句或行修改)发送到副本服务器。这些更改集通常通过副本服务器之间的复制连接传输。在收到这些更改集后,副本服务器通过执行 SQL 语句或应用修改将其实现到它们的数据集中。此方法允许备份服务器通过镜像其数据集中的更改来保持与数据库的更新。逻辑复制通常在发布者向订阅者分发更改的模型上运行,从而实现复制设置和可扩展性选项。
与 WAL 等方法相比,逻辑复制提供了优势。首先,它提供复制的优势,允许复制表或数据库,而不是所有更改,从而提高了灵活性和效率。其次,它启用复制,便于跨数据库类型进行同步,这在拥有不同系统的环境中特别有用。此外,逻辑复制授予对复制行为的控制,包括冲突解决和数据转换,从而实现准确的数据同步管理。根据设置的不同,逻辑复制可以异步或同步地运行,从而提供根据要求优先考虑性能或数据一致性的选项。这些功能使复制成为在分布式系统中维护同步数据的有力工具。
逻辑复制通过允许管理员选择要复制哪些数据以便进行有针对性的同步,为管理员提供了灵活性。此功能通过复制数据表或数据库并减少不必要的工作负载来简化此过程。此外,它对复制的支持促进了数据库类型之间的同步——促进了组织内各种系统之间无缝的数据迁移和集成。此外,通过复制过程中的数据转换,逻辑复制允许在必要时进行格式调整或数据清理。此功能可确保信息在系统中保持统一和兼容,从而提高数据质量和可用性。
虽然逻辑复制提供了好处,它也带来了它的挑战。首先,它通常需要与 WAL 等方法相比的资源。解析和执行 SQL 命令的过程可能会给系统性能带来压力。此外,如果复制过程因事务负载或网络延迟而落后,则存在数据不一致的可能性,这可能导致主数据库和备份数据库之间出现差异。配置和管理复制设置可能比使用 WAL 等方法更复杂。这种复杂性需要进行规划和监视,以确保复制系统运行。
比较 WAL 和逻辑复制
WAL 通常由于其成本而更受青睐,因为它以字节级复制更改,这更有效率。另一方面,逻辑复制在处理大量数据量或复杂 SQL 命令时可能会导致费用。这种成本的增加可归因于分析和处理 SQL 命令的必要性,在进行大量数据修改或使用复杂查询的情况下,这会消耗资源。
数据一致性
WAL 通过复制事务日志中的更改来保证数据一致性,确保副本与主数据库保持同步。相比之下,逻辑复制可能会出现一致性问题,主要是由于复制来自数据库的更改时有延迟。这可能会导致主数据库上更改的时间与副本上反映更改的时间之间存在时间差,从而可能导致两个数据库之间出现差异。即便如此,一旦复制赶上,数据一致性将重新建立。
灵活度
逻辑复制以其适应性和灵活性而闻名,它能够选择复制哪些数据并支持环境类型。通过复制,管理员可以根据自己的要求选择表或数据库进行复制,自定义同步。此外,它允许在数据库类型之间进行复制,简化了跨平台的数据迁移和系统集成的过程。另一方面,WAL 遵循数据复制方法。它以字节级别复制所有更改,而无法选择性地复制数据元素。此外,它需要在备用服务器上使用数据库引擎,这限制了它在混合数据库技术环境中的效率。
AWS RDS PostgreSQL 的主动-主动复制扩展
Amazon RDS 上适用于 PostgreSQL 的 PGActive Active Active 复制扩展允许多个 RDS 实例同时处理读写操作,通过复制和冲突解决技术确保数据一致性。此扩展允许管理员选择性地复制数据和支持环境,以及针对 Amazon RDS 上 PostgreSQL 数据库的可用性和可扩展性,提供自动故障转移和负载均衡功能。
结论
预写日志 (WAL) 和逻辑复制在实现数据库系统中的可用性、灾难恢复和可扩展性方面发挥着作用。WAL非常适合优先考虑数据一致性且对性能有影响的场景,例如灾难恢复设置。另一方面,逻辑复制提供了对复制行为的灵活性与控制,使其非常适合具有不同需求的复杂环境。
架构师和管理员必须了解差异,才能设计出有弹性的数据库复制设置。建议将预写日志 (WAL) 与复制结合起来,在混合一致性模型中,这适用于需要容错的高弹性系统。
猜你喜欢
- 需求 首先保证你有一个自有域名,然后登录到CloudFlare,添加你的域名。遵循指令操作,使用它给出的默认值就行了。你将让CloudFlare来托管你的域,所以你需要调整你的注册机构的设置。假如你想要使用子域名,请为它添加一条‘A’记录。目前,任何IP地址都可以。DDclient是一个Perl客户端,用于更新动态DNS网络服务提供商帐号下的动态DNS条目。它最初是由保罗·巴利编写的,现在大多数是由维姆潘科在做。它能做的不仅仅是动态DNS,也可以通过几种不同的方式获取你的WAN口IP地址。CloudFlare 的一个功能是它允许你通过API或叫做ddclient的命令行脚本更新你的DNS记录。不管哪一个,结果都一样,而且它是个免费软件。不幸的是,ddclient并不能在CloudFlare中即开即用。它需要打补丁,这里就是要介绍怎样在Debian或Ubuntu上破解它,它也能在带有Raspberry Pi的Raspbian上工作。在Ubuntu上安装ddclient 打开终端,并运行以下命令sudo apt-get install ddclient现在,你需要使用以下命令来安装补丁sudo apt-get install curl sendmail libjson-any-perl libio-socket-ssl-perlcurl -O http://blog.peter-r.co.uk/uploads/ddclient-3.8.0-cloudflare-22-6-2014.patchsudo patch /usr/sbin/ddclient < ddclient-3.8.0-cloudflare-22-6-2014.patch以上命令用来完成ddclient的安装和打补丁配置ddclient 你需要使用以下命令来编辑ddclient.conf文件sudo vi /etc/ddclient.conf添加以下信息##### CloudFlare (cloudflare.com)###ssl=yesuse=web, web=dyndnsprotocol=cloudflare, server=www.cloudflare.com, zone=domain.com, login=you@email.com, password=api-key host.domain.comComment out:#daemon=300你的 api-key 可以从 CloudFlare帐号页面找到,ssl=yes 可能已经设置,use=web, web=dyndns 表示使用 dyndns 来确定 IP(用于 NAT)。你已经搞定了。登录到 https://www.cloudflare.com 并检查列出的与你域名对应的IP地址是否与 http://checkip.dyndns.com 列出的相匹配。使用以下命令来验证你的设置sudo ddclient -daemon=0 -debug -verbose -noquiet
- mini2升级iOS10的优势与劣势(探索mini2升级iOS10的关键问题与解决方案)
- 长虹七K电视的综合评价及用户体验
- 比特犬小头身长的特点与饲养技巧(探讨比特犬在外貌上的独特之处及如何合理照料)
- 探索GTX1040的性能和功能(GTX1040)
- 金属鼠标垫的优势与特点(一款高质量金属鼠标垫的关键特性及其应用领域)
- 三星Q430笔记本电脑的性能与使用体验(探索三星Q430笔记本电脑的优势和不足)
- 西门子帝度洗衣机(西门子帝度洗衣机的关键特性及使用体验)
- 技巧一、用命令行往文件的顶部添加文字每次我都会重新寻找这个命令的写法。下面就是如何使用sed往一个文件顶部添加一行的方法:复制代码代码如下: sed -i 1s/^/line to insertn/ path/to/file/you/want/to/change.txt技巧二、用命令行往配置文件里插入多行文本这种方法非常简单,很多人都知道,下面就是如何用命令行将(>>)多行文本插入一个文件中。这里使用的是“here document”语法,它能让你通过块文本符号来将段落插入文件中,通常用的符合是EOF(意思是 “End Of File”):复制代码代码如下:cat >>path/to/file/to/append-to.txt << EOF export PATH=$HOME/jdk1.8.0_31/bin:$PATH export JAVA_HOME=$HOME/jdk1.8.0_31/ EOF两个”EOF“之间的所有内容都会被添加到文件中。技巧三、用命令行递归方式全局搜索目录文件和替换假如你使用Eclipse,ItelliJ或其它IDE,这些工具的强大重构能力也许会让你轻松实现很多事情。但我估计很多时候你的开发环境中没有这样的集成工具。如何使用命令行对一个目录进行递归搜索和替换?别想Perl语言,你可以使用find and sed。复制代码代码如下:# OSX version find . -type f -name *.txt -exec sed -i s/this/that/g {} +使用了一段时间后,我总结写出了一个函数,添加入了 .bashrc ,就像下面这样:复制代码代码如下:function sr { find . -type f -exec sed -i s/$1/$2/g {} +}你可以像这样使用它:复制代码代码如下:sr wrong_word correct_word技巧四、用命令行在vim和Dropbox里开启一个临时文件我过去喜欢用Emacs里的scratch facility功能。也经常用Vim快速创建临时文件。下面这两个函数是使用openssl生成随机的字符串作为文件名:复制代码代码如下:function sc { gvim ~/Dropbox/$(openssl rand -base64 10 | tr -dc a-zA-Z).txt } function scratch { gvim ~/Dropbox/$(openssl rand -base64 10 | tr -dc a-zA-Z).txt }在命令行窗口输入sc或scratch,一个新的gvim或macvim窗口就会弹出来,里面会加载一个随机文件名的临时文件。技巧五、用命令行下载文件,支持链接转向、HTTPS和安全加密等情况下载一个页面输出到终端,跟随链接转向,忽略安全异常:复制代码代码如下:curl -Lks 下载一个链接,跟随链接转向,忽略安全异常: [/code]curl -OLks 这里用了很多参数,你可以阅读这个简单的curl文档来了解它们。技巧六、Bashmarks你还没有在.bashrc里使用bashmarks吗?还在等待什么?它真的非常有用。它能帮你保持历史操作,跳回到你经常使用的目录。下面是我的配置文件里脚本,但我想上面的链接能提供你更多技巧:复制代码代码如下: # USAGE: # s bookmarkname - saves the curr dir as bookmarkname # g bookmarkname - jumps to the that bookmark # g b[TAB] - tab completion is available # l - list all bookmarks # save current directory to bookmarks touch ~/.sdirs function s { cat ~/.sdirs | grep -v export DIR_$1= >~/.sdirs1 mv ~/.sdirs1 ~/.sdirs echo export DIR_$1=$PWD >>~/.sdirs } # jump to bookmark function g { source ~/.sdirs cd $(eval $(echo echo $(echo $DIR_$1))) } # list bookmarks with dirnam function l { source ~/.sdirs env | grep ^DIR_ | cut -c5- | grep ^.*= } # list bookmarks without dirname function _l { source ~/.sdirs env | grep ^DIR_ | cut -c5- | grep ^.*= | cut -f1 -d = } # completion command for g function _gcomp { local curw COMPREPLY=() curw=${COMP_WORDS[COMP_CWORD]} COMPREPLY=($(compgen -W `_l` -- $curw)) return 0 } # bind completion command for g to _gcomp complete -F _gcomp g技巧七、从格式化输出里提取一列(我最常使用的awk技巧)我几乎天天都会使用它。真的。经常会有一些输出,我只需要其中的第二列,或第三列,下面这个命令就能做到这些:复制代码代码如下:#Sample output of git status -s command: $ git status -s M .bashrc .vim/bundle/extempore/ # Remove status code from git status and just get the file names $ git status -s | awk {print $2} .bashrc .vim/bundle/extempore/为什么不写个函数,让我们随时都可以用呢?复制代码代码如下: function col { awk -v col=$1 {print $col} }这使得提取列非常容易,比如,你不想要第一列?简单:复制代码代码如下:$ git status -s | col 2 .bashrc .vim/bundle/extempore/技巧八、忽略头x个词我对xargs很着迷,我感觉它就像一把快刀。但有时候用它获得的结果需要调整一下,也许需要取得一些值。例如,你想去掉下面文件影像里的一些信息:复制代码代码如下:function skip { n=$(($1 + 1)) cut -d -f$n- }下面是如何使用它: 使用 docker images 得到下面的输出:复制代码代码如下:$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 65a9e3ef7171 3 weeks ago 1.592 GB 7c01ca6c30f2 3 weeks ago 11.1 MB 9518620e6a0e 3 weeks ago 7.426 MB 430707ee7fe8 3 weeks ago 7.426 MB boot2docker/boot2docker latest 1dbd7ebffe31 3 weeks ago 1.592 GB spaceghost/tinycore-x86_64 5.4 f47686df00df 7 weeks ago 11.1 MB durdn/bithub latest df1e39df8dbf 8 weeks ago 100.9 MB c5e6cf38d985 8 weeks ago 100.9 MB nginx latest e426f6ef897e 12 weeks ago 100.2 MB zoobab/tinycore-x64 latest 8cdd417ec611 8 months ago 7.426 MB scratch latest 511136ea3c5a 20 months ago 0 B 使用上面的函数,你可以获取所有的IDs:复制代码代码如下:$ docker images | col 3 IMAGE 65a9e3ef7171 7c01ca6c30f2 9518620e6a0e 430707ee7fe8 1dbd7ebffe31 f47686df00df df1e39df8dbf c5e6cf38d985 e426f6ef897e 8cdd417ec611 511136ea3c5a 进一步处理:复制代码代码如下:docker images | col 3 | xargs IMAGE 65a9e3ef7171 7c01ca6c30f2 9518620e6a0e 430707ee7fe8 1dbd7ebffe31 f47686df00df df1e39df8dbf c5e6cf38d985 e426f6ef897e 8cdd417ec611 511136ea3c5a 但前面的”IMAGE”字符我也想去掉:复制代码代码如下:docker images | col 3 | xargs | skip 1 65a9e3ef7171 7c01ca6c30f2 9518620e6a0e 430707ee7fe8 1dbd7ebffe31 f47686df00df df1e39df8dbf c5e6cf38d985 e426f6ef897e 8cdd417ec611 511136ea3c5a 完整的写下来就是这样:复制代码代码如下:docker rmi $(docker images | col 3 | xargs | skip 1)技巧九、创建自己的命令包在bash里,你可以很容易的创建自己的命令组件,你可以看一下下面我写的:复制代码代码如下: function dur { case $1 in clone|cl) git clone git@bitbucket.org:nicolapaolucci/$2.git ;; move|mv) git remote add bitbucket git@bitbucket.org:nicolapaolucci/$(basename $(pwd)).git git push --all bitbucket ;; trackall|tr) #track all remote branches of a project for remote in $(git branch -r | grep -v master ); do git checkout --track $remote ; done ;; key|k) #track all remote branches of a project ssh $2 mkdir -p .ssh && cat >>.ssh/authorized_keys < ~/.ssh/id_rsa.pub ;; fun|f) #list all custom bash functions defined typeset -F | col 3 | grep -v _ | xargs | fold -sw 60 ;; def|d) #show definition of function $1 typeset -f $2 ;; help|h|*) echo [dur]dn shell automation tools echo commands available: echo [cl]one, [mv|move] echo [f]fun lists all bash functions defined in .bashrc echo [def] lists definition of function defined in .bashrc echo [k]ey copies ssh key to target host echo [tr]ackall], [h]elp ;; esac }通过上面的脚本,我可以将ssh key拷贝到任何网站服务器——只需要键入 dur key user@somehost.总结你可以试一下我的这个.bashrc文件,或你自己也可以写一个。