linux时间跳变影响,MONGO 集群 修改linux主机时间后的影响

生产环境是

一主一从一仲裁

3

分片的集群,现在发现其中一个节点比当前时间大了好几天,后使用

NTP

将时间往回调整副本集上。

原来时间是

5

3

日,当前是

4

26

日,对此进行了调整。

[root@cwdtest1 bin]# date

Fri May  3 13:20:31 CST 2019

[root@cwdtest1 bin]# ntpdate -u 10.205.34.171

26 Apr 12:39:23 ntpdate[14568]: step time server 10.205.34.171 offset -607507.747595 sec

[root@cwdtest1 bin]# hwclock --systohc

调整后当前的时间:

[root@cwdtest1 bin]# date

Fri Apr 26 12:39:31 CST 2019

当完成调整时间之后,发现两个问题:

1.

副本集无法同步新的

oplog

,由此出现了延迟

shard2:PRIMARY> db.printSlaveReplicationInfo();

source: 10.3.252.231:27002

syncedTo: Fri May 03 2019 13:24:23 GMT+0800 (CST)

8 secs (0 hrs) behind the primary

2.

查看

oplog

tLast

时间比当前的大

shard2:PRIMARY> db.getReplicationInfo()

{

"logSizeMB" : 1383.3396482467651,

"usedMB" : 154.49,

"timeDiff" : 17015711,

"timeDiffHours" : 4726.59,

"tFirst" : "Thu Oct 18 2018 14:49:20 GMT+0800 (CST)",

"tLast" : "Fri May 03 2019 13:24:31 GMT+0800 (CST)",

"now" : "Fri Apr 26 2019 13:57:01 GMT+0800 (CST)"

}

shard2:PRIMARY> db.printReplicationInfo()

configured oplog size:   1383.3396482467651MB

log length start to end: 17015711secs (4726.59hrs)

oplog first event time:  Thu Oct 18 2018 14:49:20 GMT+0800 (CST)

oplog last event time:   Fri May 03 2019 13:24:31 GMT+0800 (CST)

now:                     Fri Apr 26 2019 15:46:27 GMT+0800 (CST)

查看

db.getReplicationInfo

中,我们找出

tLast

now

两个时间是从哪里得到的?

shard2:PRIMARY> db.getReplicationInfo

function () {

var localdb = this.getSiblingDB("local");

var result = {};

var oplog;

var localCollections = localdb.getCollectionNames();

if (localCollections.indexOf('oplog.rs') >= 0) {

oplog = 'oplog.rs';

} else if (localCollections.indexOf('oplog.$main') >= 0) {

oplog = 'oplog.$main';

} else {

result.errmsg = "neither master/slave nor replica set replication detected";

return result;

}

var ol = localdb.getCollection(oplog);

var ol_stats = ol.stats();

if (ol_stats && ol_stats.maxSize) {

result.logSizeMB = ol_stats.maxSize / (1024 * 1024);

} else {

result.errmsg = "Could not get stats for local." + oplog + " collection. " +

"collstats returned: " + tojson(ol_stats);

return result;

}

result.usedMB = ol_stats.size / (1024 * 1024);

result.usedMB = Math.ceil(result.usedMB * 100) / 100;

var firstc = ol.find().sort({$natural: 1}).limit(1);

var lastc = ol.find().sort({$natural: -1}).limit(1);

if (!firstc.hasNext() || !lastc.hasNext()) {

result.errmsg =

"objects not found in local.oplog.$main -- is this a new and empty db instance?";

result.oplogMainRowCount = ol.count();

return result;

}

var first = firstc.next();

var last = lastc.next();

var tfirst = first.ts;

var tlast = last.ts;

if (tfirst && tlast) {

tfirst = DB.tsToSeconds(tfirst);

tlast = DB.tsToSeconds(tlast);

result.timeDiff = tlast - tfirst;

result.timeDiffHours = Math.round(result.timeDiff / 36) / 100;

result.tFirst = (new Date(tfirst * 1000)).toString();

result.tLast = (new Date(tlast * 1000)).toString();

result.now = Date();

} else {

result.errmsg = "ts element not found in oplog objects";

}

return result;

}

从以上可以看出

:

var ol = localdb.getCollection(oplog);

var lastc = ol.find().sort({$natural: -1}).limit(1);

var last = lastc.next();

var tlast = last.ts;

result.tLast = (new Date(tlast * 1000)).toString();

result.now = Date();

tLast

的时间是获取

oplog.rs

集合中最后一条数据的

ts

时间。

Now

的时间是调用

Date()

函数获取当前时间。

于是,此时我怀疑副本集

无法同步,是因为

oplog

中存放比当前时间大的日志,而当调整时间后新生成的

oplog

日志记录并不是最新的,因此副本集在对比时发现最新的日志一直不变,便无法同步。

大概说下

mongodb

同步的机制(借鉴网络):

1.

执行写语句时,

primary

上完成写操作

2.

primary

上记录一条

oplog

日志,日志中包含一个

ts

字段,值为写操作执行的时间,比如本例中记为

t

3.

secondary

primary

拉取

oplog

,获取到刚才那一次写操作的日志

4.

secondary

按获取到的日志执行相应的写操作

5.

执行完成后,

secondary

再获取新的日志,其向

primary

上拉取

oplog

的条件为

{ts:{$gt:t}}

6.

primary

此时收到

secondary

的请求,了解到

secondary

在请求时间大于

t

的写操作日志,所以他知道操作在

t

之前的日志都已经成功执行了

于是,我在

primary

执行一次插入测试,来验证怀疑。

shard2:PRIMARY> use shtest

switched to db shtest

shard2:PRIMARY> db.coll.insert( {x:3339876})

WriteResult({ "nInserted" : 1 })

查询主节点最后一条操作记录:

rs.debug.getLastOpWritten()

从以上可以看出

:

var ol = localdb.getCollection(oplog);

var lastc = ol.find().sort({$natural: -1}).limit(1);

var last = lastc.next();

var tlast = last.ts;

result.tLast = (new Date(tlast * 1000)).toString();

result.now = Date();

tLast

的时间是获取

oplog.rs

集合中最后一条数据的

ts

时间。

Now

的时间是调用

Date()

函数获取当前时间。

于是,此时我怀疑副本集

无法同步,是因为

oplog

中存放比当前时间大的日志,而当调整时间后新生成的

oplog

日志记录并不是最新的,因此副本集在对比时发现最新的日志一直不变,便无法同步。

大概说下

mongodb

同步的机制(借鉴网络):

1.

执行写语句时,

primary

上完成写操作

2.

primary

上记录一条

oplog

日志,日志中包含一个

ts

字段,值为写操作执行的时间,比如本例中记为

t

3.

secondary

primary

拉取

oplog

,获取到刚才那一次写操作的日志

4.

secondary

按获取到的日志执行相应的写操作

5.

执行完成后,

secondary

再获取新的日志,其向

primary

上拉取

oplog

的条件为

{ts:{$gt:t}}

6.

primary

此时收到

secondary

的请求,了解到

secondary

在请求时间大于

t

的写操作日志,所以他知道操作在

t

之前的日志都已经成功执行了

于是,我在

primary

执行一次插入测试,来验证怀疑。

shard2:PRIMARY> use shtest

switched to db shtest

shard2:PRIMARY> db.coll.insert( {x:3339876})

WriteResult({ "nInserted" : 1 })

查询主节点最后一条操作记录:

rs.debug.getLastOpWritten()

a615875d50a7b2d7162c06656f3cdc42.png

查询副本节点上的最后条操作记录:

8ecda111d6665bfd1f60df4502c7ad10.png

发现此时数据可以同步到副本集上,即说明

oplog

日志不存在不同步的问题,也就是实际上集群的同步是正常的。

当时发现,每条

oplog

记录的

ts

一直保持着调整主机时间前的时间,

5

3

日的时间,且一直不变。关于原因,就需要进一步分析了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java容器解析——HashMap

前言 HashMap是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 1 定义 public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {}由HashMap定义可以看出 1&#xff09; HashMap<K,V>表示…

linux教程第五版第三章课后答案,linux 第三章 章习题.doc

填空题Linux_____可以理解为运行在_____之上&#xff0c;回避直接操作_____和配置文件的应用程序。在Linux中常见的两种图形环境是_____和______。在Linux中的配置文件为____和_____。在Fedor8.0中可以通过____窗口进行主题设置。在“自定义主题”对话框中可以对“控件”、“颜…

xp下添加linux启动项,grub.cfg--XP+ Ubuntu10.04双系统安装后无XP启动项

问题描述&#xff1a;Ubuntu 10.04发布了&#xff0c;随即裸机安装了Windows XP &#xff0c;然后用U盘启动盘安装了Ubuntu 10.04,安装速度飞快(不到10分钟吧)&#xff0c;但是装上后发现在grub启动项里没有XP&#xff0c;郁闷了&#xff0c;花了几分钟终于解决了&#xff0c;呵…

HashMap 源码详细分析(JDK1.8)

1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap。HashMap 最早出现在 JDK 1.2中&#xff0c;底层基于散列算法实现。HashMap 允许 null 键和 null 值&#xff0c;在计算哈键的哈希值时&#xff0c;null 键哈希值为 0。HashMap 并不保证键值对的顺序&…

linux错误码61,Linux编程中的错误码列表

有时可以知道错误的数值&#xff0c;但是如果不知道对应于那个宏定义&#xff0c;也很难知道这个错误描述的是什么。我平时这两种方法来确定&#xff1a;在内核源码中搜索和查看头文件。 在内核源码中搜索一般都可以搜到&#xff0c;而且使用source insight的话也很方便&#x…

linux无限刷屏代码,linux下如何实现简单刷屏

今天为了测试我的LCD有没有坏点写了一个简单的刷屏程序&#xff0c;效果还不错&#xff0c;分析给大家。代码如下&#xff1a;#include #include #include #include #include #include #include #include int main(int argc,char *argv[]){int fbfd 0;struct fb_var_screeninf…

mvc:annotation-driven 注解的作用

1.自动注册映射处理器和适配器 这是该注解的主要功能&#xff0c;添加< mvc:annotation-driven/>注解后&#xff0c;容器中会<自动注册HandlerMapping与HandlerAdapter 两个bean。省去手动注册HandlerMapping和HandlerAdapter的步骤。 当配置了< mvc:annotation-…

linux主机熵值过小,tomcat在linux启动应用慢解决方式

问题&#xff1a;o.a.c.util.SessionIdGeneratorBase - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [2,741] milliseconds原因&#xff1a;拿Tomcat /dev/random做关键词&#xff0c;一堆详细说明。建议看wiki。https://www.cnblogs.…

@Autowired注解能用在static属性吗?autowired注入static属性上为null

Autowired注解能用在static属性吗&#xff1f; 答案是否定的&#xff0c;我们来测试下&#xff1a; 日志信息已经很明确了&#xff0c;表示static不能被Autowired进行复制。为什么呢&#xff1f;我们现在就来一起了解其原因。 首先将我们的测试环境搭建好&#xff0c; Use…

linux下用c语言写黄金矿工,C语言写的黄金矿工O(∩_∩)O---初稿,能玩了

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼int main(void){initgr();go();getch();closegr();return 0;}void youxiye() /* 游戏页 */{setfillstyle(SOLID_FILL,15);bar(0,0,639,49);setfillstyle(SOLID_FILL,6);bar(0,49,639,349);setcolor(BLUE);line(0,49,638,49);setc…

Swagger介绍及使用

导语&#xff1a; 相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前端调用后端&#xff0c;还是后端调用后端&…

linux 安装libcurl4-gnutls-dev,curl / curl.h,libcurl,libcurl4-openssl-dev,libcurl4-nss-dev库之间的区别?...

我有以下curl标题,我仍然可以安装上面提到的libcurl4包 –kafkaMetamorphosis:~$ll /usr/include/curl/total 200drwxr-xr-x 2 root root 4096 Jan 16 13:29 ./drwxr-xr-x 51 root root 20480 Jan 16 13:29 ../-rw-r--r-- 1 root root 7303 Dec 18 01:11 curlbuild.h-rw-r--r--…

c语言输入四个成绩求最高分最低分,数组实现学生成绩录入、求最高分、最低分、平均分和排序...

/*使用数组实现10名学生的成绩录入&#xff0c;并输出这10名学生中成绩的最高分最低分平均分按照分数从大到小排序思考&#xff1a;如何实现从小到大排序&#xff1f;如果学院有5个班&#xff0c;每个班30人&#xff0c;如何处理&#xff1f;求所有成绩中的最高分是哪个班的&am…

c语言课设宿舍管理程序,C语言程序课程设计宿舍管理软件.doc

C语言程序课程设计宿舍管理软件.doc课程设计(论文)题 目 名 称 宿舍管理软件课 程 名 称 C语言程序课程设计学 生 姓 名学 号系 、专 业 信息工程系、信息大类指 导 教 师 黄 同 成目 录1 前言2 需求分析62.1要求62.2任务2.3运行环境2.4开发工具3 概要设计与详细设计73.1设计原…

接口文档生成工具Swagger2的使用

一、什么是Swagger Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法&#xff0c;参数和模型紧密集成到服务器端的代码&#xff0c;允许API来始终保…

Netty详解

一&#xff0e;Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架&#xff0c;用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架&#xff0c;Netty 在互联网领域、大数据分布式计算…

有没有检查c语言编译错误的软件,求大佬解答,为什么这个程序编译软件检查不出错误...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include /* malloc()等 */#include#include#include /* exit() */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; /* Status是函数的类型,其值是函数结果状态代码&…

语法分析器c语言实验报告,词法分析实验报告(C++)..doc

词法分析实验报告(C).词法分析实验报告一、实验目的1. 掌握词法分析的原理。2. 熟悉保留字表等相关的数据结构与单词的分类方法。3. 掌握词法分析器的设计与调试。二、实验内容根据编译中的分词原理,用C语言编写一个C语言的词法分析程序:.三、实验要求1. 输入:任意一个C语言程序…

详解 Java NIO

详解 Java NIO 文件的抽象化表示&#xff0c;字节流以及字符流的文件操作等属于传统 IO 的相关内容&#xff0c;我们已经在前面的文章进行了较为深刻的学习了。 但是传统的 IO 流还是有很多缺陷的&#xff0c;尤其它的阻塞性加上磁盘读写本来就慢&#xff0c;会导致 CPU 使用…

转专业计算机c语言,转专业申请美国计算机专业研究生必须要做的准备

先修课——转专业申计算机时&#xff0c;补先修课是使自己match的重要的一步。1.纽约大学的计算机硕士项目(计算机系的M.S. in Computer Science和M.S. in Information Systems项目)对申请人的先修课要求&#xff1a;The minimum prerequisite background for admission to the…