以 Ubuntu 18.04.5,redis-7.0.4 为例,准备三台机器并修改配置,这里以一台机器的三个端口作演示,分别是 6379、6380、6381,对应主节点、从节点一、从节点二
我们可以使用 replicaof(Redis 5.0 之前使用 slaveof)命令,形成主服务器和从服务器的关系
比如,分别在从节点一、从节点二执行下面这条命令:
#replicaof <主节点的IP地址> <主节点的Redis端口号>
replicaof 127.0.0.1 6379
也可以修改从节点一、从节点二的配置文件
从节点一配置
slave1
port 6380
# replicaof <masterip> <masterport> 分别对应主节点的ip和port
replicaof 127.0.0.1 6379
从节点二配置
slave2
port 6381
# replicaof <masterip> <masterport> 分别对应主节点的ip和port
replicaof 127.0.0.1 6379
然后分别进入三个节点的目录,启动 redis
/redis/master/redis-server redis.conf
/redis/slave1/redis-server redis.conf
/redis/slave2/redis-server redis.conf
# 设置master的密码(如果master用requirepass指定了密码)
masterauth <master-password>
# 设置指定的master用户,可以用该项为slave指定一个特定用户用于同步
masteruser <username>
# 当slave失去与master的连接,或者数据同步正在进行时,slave的行为有两种可能:
# yes(默认):slave会继续响应客户端请求,可能会返回过期数据或空数据
# no:slave将对所有数据访问命令返回指定错误信息,除了以下命令:
# INFO, REPLICAOF, AUTH, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE,UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST,HOST and LATENCY
replica-serve-stale-data yes
# 设置slave是否接受写操作,可写的slave实例可能对存储临时数据比较有用(因为写入salve的数据在同master同步后很容易被删除)
# 但如果客户端由于配置错误而向其写入数据,也可能会导致问题,所以默认不接受写操作
replica-read-only yes
# 数据同步策略:磁盘或socket,默认使用socket
# 新创建的slave和重新连接的slave只能执行“完全同步”,即将RDB文件从master传输到副本
# 可能发生的传输方式有两种:
# 磁盘备份:master创建一个用于将RDB文件写入磁盘的进程,完成之后将RDB文件传输给slave
# socket:master创建一个新的进程,直接将RDB文件写入副本套接字
# 使用磁盘方式,所有slave可以共享生成的RDB文件,而使用socket方式,所有salve必须排队等候传输
# 绝大多数情况下,磁盘速度比网络慢
repl-diskless-sync yes
# 如果开启socket方式,可以配置延迟时间,以等待master创建子进程,从而并行的通过socket传输
# 默认值为5秒,设置为0秒则为无延迟,必须等当前传输完成才能继续下一个
repl-diskless-sync-delay 5
# 如果开启socket方式,可以配置最大连接salve数,当连接的slave数量达到最大值时将开始传输,不需要等到延迟时间结束
# 设置为0则为不限制,延迟时间结束才开始传输
repl-diskless-sync-max-replicas 0
# 如果使用socket方式,当slave收到master的rdb文件时有三种选择:
# disabled:将rdb文件存储到磁盘,等全部接收以后加载到内存
# on-empty-db:接受所有rdb文件到内存中,然后直接解析该rdb文件
# swapdb:先拷贝当前数据到内存,当来自master的rdb文件解析成功以后再删除掉拷贝,不成功则恢复,这能避免数据丢失,但需要相当大的内存,有可能导致OOM
repl-diskless-load disabled
# master每隔一段时间slave发送ping,默认值为10秒
repl-ping-replica-period 10
# 超时时间,适用于三种场景:
# 1.同步期间的大容量传输I/O
# 2.master认为slave超时
# 3.slave认为master超时
# 注意超时时间必须大于repl-ping-replica-period设置的时间间隔,默认60s
repl-timeout 60
# 是否设置主从之间tcp链接为nodelay
# 如果设置为yes,Redis将使用较少的带宽将数据复制到副本,这可能会增加数据在副本的延迟
# 如果设置为no,Redis将更多带宽将用于复制,数据在副本的延迟减少
repl-disable-tcp-nodelay no
# 设置复制缓冲区的大小
# 如果slave断开连接,当slave再次连接时,通常不需要重新同步所有数据,只需要重新同步slave断开时丢失的部分数据即可
# 缓冲区越大,副本所能承受的断开时间就越长
# 只有在master至少连接了一个slave时,才会使用缓冲区
repl-backlog-size 1mb
# 如果一段时间后master没有连接的slave,那么缓存将被释放,下面选项配置释放缓冲的时间
# 注意,slave不会释缓冲,因为slave随时可能升级为master,并且与其他slave重新同步数据
# 如果设置为0表示永不释放
repl-backlog-ttl 3600
# Redis哨兵机制会根据优先级来选择要升级为master的slave,优先级较低的slave被认为更适合升级
# 如果优先级设置为0表示无法升级
# 默认情况下,优先级为100
replica-priority 100
# 从master同步数据或者从aof读取数据时可能会出错,造成数据不一致
# 默认设置ignore,表示忽略错误继续执行命令(旧版redis可能会复制持久化在未来版本中可能会出错的命令)
# 设置为panic或panic-on-replicas,出现错误则抛出异常
propagation-error-behavior ignore
# 默认为no,表示当slave无法将从master收到的写命令持久化时,将抛出异常
# 不建议修改默认值,但为了兼容老版本redis可以设置yes,这只会记录一个警告日志并执行收到的写命令
replica-ignore-disk-write-errors no
# 设置是否公布该副本,默认情况,哨兵会公布所有副本
# 副本可以从哨兵的公告中移除,一个未公布的副本会忽略"sentinel replicas <master>"命令并且不会暴露给哨兵的客户端
# 该项不影响replica-priority优先级设置
replica-announced yes
# 以下两个设置通常联合使用,用于设定slave(在线且延迟不超过指定秒数,延迟从最后一次收到slave的ping计算,slave通常每秒一次ping)数量少于某个值时master停止将写操作
# 任何一个设置为0都可关闭该功能
# 默认min-replicas-to-write为0,功能是关闭的,min-replicas-max-lag是10
min-replicas-to-write 3
min-replicas-max-lag 10
# master有多种方式展示slave的ip和port列表,例如“INFO replication”命令,master的“ROLE”命令
# 在使用端口转发或者NAT时,副本可能会使用多个不同的ip和port
# 以下两个设置可以明确的将slave的ip和prt报告给master
# 如果只需要覆盖port或IP地址,可以不需要同时设置这两个选项
replica-announce-ip 5.5.5.5
replica-announce-port 1234
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
之前有人问过这个问题,我发现了以下clip关于如何一次设置一个类对象的所有属性,但由于批量分配保护,这在Rails中是不可能的。(例如,您不能Object.attributes={})有没有一种很好的方法可以将一个类的属性合并到另一个类中?object1.attributes=object2.attributes.inject({}){|h,(k,v)|h[k]=vifObjectModel.column_names.include?(k);h}谢谢。 最佳答案 利用assign_attributes使用:without_prote
(跟进我之前的问题,Ruby:howcanIcopyavariablewithoutpointingtothesameobject?)我正在编写一个简单的Ruby程序来在.svg文件中进行一些替换。第一步是从文件中提取信息并将其放入数组中。为了避免每次调用此函数时都从磁盘读取文件,我尝试使用memoize设计模式-在第一次调用后的每次调用中都使用缓存结果。为此,我使用了一个在函数之前定义的全局变量。但是,即使我在返回局部变量之前将该变量.dup为局部变量,调用该变量的函数仍在修改全局变量。这是我的实际代码:#memoizetokeepfromhavingtoreadoriginalfi
我有一台服务器,其中只有xls日志文件。每个文件为5-15Mb,并且在文件随时添加的意义上是动态的。现在我需要一种使用Ruby执行以下过程的方法。通过将文件名从一台只有日志文件的服务器发送到另一台服务器来复制文件。我需要将服务器密码作为参数传递。一切都在后台发生,由Ruby脚本触发。 最佳答案 查看Net::SCP和Net::SSHgem。第一个让您使用安全副本检索文件,第二个让您轻松找到可用于检索的文件的名称。在Net::SSH中,ssh.exec!将成为您的friend。来自Net::SCP文档:Net::SCPimplemen
Rails有一个.blank?如果对象为空,将返回true的方法?还是零?可以找到实际代码here.当我尝试在1.9.2上复制它时:classObjectdefblank?respond_to?(:empty?)?empty?:!selfendend调用“.blank”?返回true但调用"".blank?根据railsdocumentation返回false对于.blank,空白字符串应该eval为true?在查看我最初编写的代码之前:classObjectdefblank?!!self.empty?||!!self.nil?endend结果相同。我错过了什么?
当我尝试预编译我的Assets时,出现以下错误。这是具有完整输出的跟踪:RAILS_ENV=productionbundleexecrakeassets:precompile--trace**Invokeassets:precompile(first_time)**Invokeassets:environment(first_time)**Executeassets:environment**Invokeenvironment(first_time)**Executeenvironmentrakeaborted!TypeError:can'tdupNilClass/var/lib/ge
我遇到一个奇怪的问题,我正在使用的Rails引擎中的某些模型在对象空间中被复制。(rdb:1)ObjectSpace.each_object(::Class).each{|klass|putsklass.to_s+":"+klass.object_id.to_sifklass.to_s.eql?("DynamicFieldsets::Field")}DynamicFieldsets::Field:66866100DynamicFieldsets::Field:718363802479发生这种情况时,我不能使用is_a?或相等性检查以测试对象是否是Field类的实例。这个问题只发生在开发
我的目标是将一组由模式指定的文件复制到目标目录。源目录中的文件可以有子目录。我试过:cp_r(Dir.glob('**/*.html'),@target_dir):和cp_r(FileList['**/*.html'],@target_dir):但都不起作用。它只在我做类似的事情时有效:cp_r(Dir['.'],@target_dir):但我只需要复制*.html文件而不是其他任何文件。我需要什么cp--parents命令确实对使用现有的Ruby/Rake方法有什么建议吗?更新看起来用Ant更容易做的事情,用Ruby/Rake堆栈是不可能的-可能我需要研究其他东西。我不想编写自定义代
也许我今天盯着屏幕看的时间太长了,但我认为应该是非常基本的东西却难倒了我。我正在尝试制作一个变量的“副本”,这样我就可以在不修改原始变量的情况下对其进行操作。#originalvarissetfoo=["a","b","c"]#iwantacopyoftheoriginalvarsoidontmodifytheoriginalbar=foo#modifythecopiedvarbar.delete("b")#outputthevaluesputsbar#outputs:["a","c"]-thisisrightputsfoo#outputs:["a","c"]-whyisthisals
我添加到我的.irbrc:IRB.conf[:PROMPT].reverse_merge!(:RAILS_ENV=>{:PROMPT_I=>"#{current_app}#{rails_env}#{prompt}",:PROMPT_N=>"#{current_app}#{rails_env}#{prompt}",:PROMPT_S=>nil,:PROMPT_C=>"?>",:RETURN=>"=>%s\n"})IRB.conf[:PROMPT_MODE]=:RAILS_ENV如果我这样做:current_app="\e[31mfoo_bar_app\e[0m"rails_env="\e