当前位置: 首页 > 知识库问答 >
问题:

redis主从复制-从机上缺少数据

邓卓
2023-03-14

问题

主Redis DB设置信息

我有一个在10.1.1.1上运行的主程序。配置设置为“保存”到磁盘。下面是配置文件的一个片段:

save 900 1
save 300 10
save 60 10000

当我对所讨论的散列运行扫描命令时,以下是结果(正确):

127.0.0.1:6379> scan 0 match dep:*
1) "13"
2) 1) "dep:+19999999999_00:00_00:00"
   2) "dep:+19999999999_19:00_25:00"
   3) "dep:+19999999999_08:00_12:00"
127.0.0.1:6379> 

下面是我在slave 1中的数据:(缺少一条记录)

127.0.0.1:6379> scan 0 match dep:*
1) "15"
2) 1) "dep:+19999999999_00:00_00:00"
   2) "dep:+19999999999_19:00_25:00"
127.0.0.1:6379> 

当我在这个从属程序上运行“info”命令时,我得到的结果是:(只选择了我认为可能与此问题有关的特定项)

# Replication
role:slave
master_host:10.1.1.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:346292
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

#Stats
expired_keys:0

#Persistence
aof_enabled:0

从机2设置

#save 900 1
#save 300 10
#save 60 10000
127.0.0.1:6379> scan 0 match dep:*
1) "3"
2) 1) "dep:+19999999999_00:00_00:00"
   2) "dep:+19999999999_08:00_12:00"
127.0.0.1:6379> 
# Replication
role:slave
master_host:10.1.1.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:346754
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

#Stats
expired_keys:0

#Persistence
aof_enabled:0

这是我使用REDIS的第一次尝试,所以我肯定我错过了一些简单的东西。我还没有尝试在奴隶上重启REDIS,因为我不想失去任何可能帮助我解决问题/理解我是如何在这里的神器。

如有任何建议,将不胜感激。

编辑%1

4651:S 27 Sep 18:39:27.197 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4651:S 27 Sep 18:39:27.197 # Server started, Redis version 3.0.5
4651:S 27 Sep 18:39:27.197 * The server is now ready to accept connections on port 6379
4651:S 27 Sep 18:39:27.198 * Connecting to MASTER 10.1.1.1:6379
4651:S 27 Sep 18:39:27.198 * MASTER <-> SLAVE sync started
4651:S 27 Sep 18:40:28.284 # Timeout connecting to the MASTER...
4651:S 27 Sep 18:40:28.284 * Connecting to MASTER 10.1.1.1:6379
4651:S 27 Sep 18:40:28.284 * MASTER <-> SLAVE sync started
4651:S 27 Sep 18:41:29.369 # Timeout connecting to the MASTER...
4651:S 27 Sep 18:41:29.369 * Connecting to MASTER 10.1.1.1:6379
4651:S 27 Sep 18:41:29.369 * MASTER <-> SLAVE sync started
4651:S 27 Sep 18:42:00.452 * Non blocking connect for SYNC fired the event.
4651:S 27 Sep 18:42:00.453 * Master replied to PING, replication can continue...
4651:S 27 Sep 18:42:00.453 * Partial resynchronization not possible (no cached master)
4651:S 27 Sep 18:42:00.463 * Full resync from master: b46c3622e4ef4c5586ebd2ec23eabcb04c3fcf32:1
4651:S 27 Sep 18:42:00.592 * MASTER <-> SLAVE sync: receiving 173 bytes from master
4651:S 27 Sep 18:42:00.592 * MASTER <-> SLAVE sync: Flushing old data
4651:S 27 Sep 18:42:00.592 * MASTER <-> SLAVE sync: Loading DB in memory
4651:S 27 Sep 18:42:00.592 * MASTER <-> SLAVE sync: Finished with success

编辑2

这是另一个非常有趣的发现(至少对我来说)。我刚加了一个新项目的主人,就像这样:

127.0.0.1:6379> HMSET dep:+19999999999_15:00_18:45:00 ext 2222 dd me.net days "fri"
OK
127.0.0.1:6379> scan 0 match dep:*
1) "13"
2) 1) "dep:+19999999999_00:00_00:00"
   2) "dep:+19999999999_19:00_25:00"
   3) "dep:+19999999999_15:00_18:45:00"
   4) "dep:+19999999999_08:00_12:00"
127.0.0.1:6379> 

现在,当我再次检查slave one时,它仍然只有2条记录,但它删除了一条以前存在的记录,并用我刚才添加的新记录替换了它:

127.0.0.1:6379> scan 0 match dep:*
1) "7"
2) 1) "dep:+19999999999_00:00_00:00"
   2) "dep:+19999999999_15:00_18:45:00"
127.0.0.1:6379> 
127.0.0.1:6379> scan 0 match dep:*
1) "7"
2) 1) "dep:+19999999999_00:00_00:00"
   2) "dep:+19999999999_15:00_18:45:00"
127.0.0.1:6379> scan 7 match dep:*
1) "0"
2) 1) "dep:+19999999999_19:00_25:00"
   2) "dep:+19999999999_08:00_12:00"
127.0.0.1:6379> 
127.0.0.1:6379> scan 0 match dep:* count 3
1) "10"
2) 1) "dep:+19999999999_00:00_00:00"
127.0.0.1:6379> scan 10 match dep:* count 3
1) "3"
2) (empty list or set)
127.0.0.1:6379> scan 3 match dep:* count 3
1) "7"
2) 1) "dep:+19999999999_15:00_18:45:00"
127.0.0.1:6379> scan 7 match dep:* count 3
1) "0"
2) 1) "dep:+19999999999_19:00_25:00"
   2) "dep:+19999999999_08:00_12:00"
127.0.0.1:6379> 

为什么第一个请求没有返回3条记录?在我的脑海中,最多,我应该已经必须运行这个扫描命令2次。你能解释一下这里发生了什么吗?

另外,也许我不应该在我的节点js REST API中使用scan命令?假设一个用户会请求小部件信息...我需要查询这个哈希来找到密钥。感觉这种类型的迭代效率很低。KEYS命令也可以工作,但是根据文档,我不应该在生产中使用它,因为它会影响性能。如有任何意见/见解,将不胜感激。

共有1个答案

蔚宏大
2023-03-14

您还没有迭代Redis实例中的所有键。

为了进行完整的迭代,您应该继续将SCAN命令与返回的游标一起发送给Redis,直到返回的游标为0

在上一个示例中:

127.0.0.1:6379> scan 0 match dep:*
1) "7"    <---- returned cursor
2) 1) "dep:+19999999999_00:00_00:00"
   2) "dep:+19999999999_15:00_18:45:00"
127.0.0.1:6379> 
// here, you need continue sending scan command with the returned cursor, i.e. 7
127.0.0.1:6379> scan 7 match dep:*
// then you can get more results from Redis
// If the full iteration is finished, it should return something like this:
1) "0"    <----- this means the full iteration is finished
2) 1) "dep:more result"
   2) "dep:last result"

从您的问题描述来看,我认为您应该将您的数据存储在Redis的哈希结构中,并使用hkeyshgetallhscan来获取数据:

hset dep:+19999999999 00:00_00:00:00 value
hset dep:+19999999999 15:00_18:45:00 value
hkeys dep:+19999999999    <----- get all fields in this hash
hgetall dep:+19999999999  <----- get all fields and values in this hash
hscan dep:+19999999999 0  <----- scan the hash to key fields

这应该比遍历整个密钥空间效率高得多。特别是,如果散列中没有太多字段,hkeyshgetall可以在一次拍摄中获得所有键/数据,而且非常快。但是,如果哈希中的字段太多,则仍然需要使用hscan进行迭代。

 类似资料:
  • 本文向大家介绍Redis主从复制详解,包括了Redis主从复制详解的使用技巧和注意事项,需要的朋友参考一下 单机Redis存在的问题 无法故障转移 ,无法避免单点故障 磁盘空间的瓶颈 QPS瓶颈 Redis主从复制的作用 提供数据副本 扩展读性能 配置方法 通过命令 通过配置文件 演示 为方便演示,在一台服务器上搭建redis主从(生产上不会这样做),根据端口区分。 主库 6379 从库 6380

  • 原因是: 这是在主服务器上设置的,由于最大内存不可用,它会中断新从服务器的复制。我看到这个问题Redis复制和客户机输出缓冲区限制,类似的问题正在讨论,但我有一个更广泛的问题范围。 我们不能用很多内存。那么,在这种情况下,有什么可能的方法来进行复制,以防止主服务器上的任何失败(WRT.内存和延迟影响)

  • 问题内容: 我不需要丢失Redis上的任何数据,并且它具有较高的写入请求,因此我不能使用AOF持久性。RDB可以帮到您,但也许有可能丢失上次备份中的某些数据。 现在,我将复制视为备份,因此当主服务器崩溃,重新启动或发生其他任何事情时,我已经同步了从属服务器中的数据并可以再次还原它。 现在有什么办法可以将master设置为slave,并在崩溃时自动将slave设置为master,然后将它们同步? 问

  • 我在创建带有依赖项的jar时遇到了一个错误。运行jar时,我遇到以下错误: 这是我的pom。xml文件 但是当我生成jar时,我得到错误无法找到或加载主类com.faro.engine.MainAppLoader这里是我的pom文件。 有什么想法吗? 提前感谢:)

  • 2天前,我开始设置y MySQL主从复制。我从主人那里做了输出,然后把它输入到奴隶身上,还有所有这些东西。一切都很顺利。但我在建立从服务器到主机的连接时遇到了一些麻烦。所以我晚上就不做了。现在,大约1.5天后,我修复了这个问题,我的复制正在运行。主人一直在跑。但现在当我运行时,我比master落后了125,000秒。我以为从机会自动从主机下载所有记录的东西,并运行这些东西,使它们同步。但是的值会非

  • MySQL主从复制 MySQL主从复制原理过程 主数据库配置步骤 从数据库配置步骤 MySQL主从复制生产标准实践过程 MySQL主从同步配置步骤 定义服务器角色 数据库环境准备 主库上需要执行的操作 编辑主库的配置文件 查看开启结果 建立同步账号密码 从库上需要执行的操作 将全备导入到数据库 登陆从库执行change master语句 开启同步 查看是否同步成功语句 一些常用语句 MySQL主从