• [技术干货] java面试题基础篇 温故而知新 没事在地铁上多看看
    答案在路上,自由在风里,风吹哪页读哪页,哪页不懂撕哪页就是你,你太棒啦今天也要开开心心呀Java语言有哪些特点Java是一种高级编程语言,具有以下特点:面向对象:Java是一种纯面向对象的语言,所有代码都必须定义在类中。这使得Java非常适合开发大型应用程序和企业级软件。可移植性:Java的跨平台特性使其可以在不同的操作系统上运行,例如Windows、Linux和Mac OS等。简单易学:Java的语法相对简单,易于学习和使用。它还提供了大量的文档和教程,使初学者能够快速入门。高性能:Java的虚拟机(JVM)可以动态地将Java字节码翻译为本地机器代码,从而提高了程序的性能。安全性:Java提供了强大的安全功能,例如沙箱环境和安全管理器,可以帮助保护应用程序免受恶意代码的攻击。大量的类库:Java拥有丰富的类库,涵盖了各种领域,例如网络编程、图形用户界面、数据库访问等。开放源代码:Java是开源的,任何人都可以查看和修改其源代码,这使得Java社区可以不断改进和扩展其功能。面向对象和面向过程的区别面向对象(Object-Oriented,简称 OO)和面向过程(Procedural,简称 PO)是两种不同的编程范式。它们的主要区别在于关注点、设计原则和代码组织方式。以下是面向对象和面向过程之间的一些主要区别:关注点:面向对象编程关注数据和行为之间的关系,强调封装、继承和多态性。面向过程编程关注解决问题的方法,强调输入、处理和输出。设计原则:面向对象编程的设计原则包括封装、继承和多态性。封装确保数据和方法在类内部隐藏,外部无法直接访问;继承允许子类从父类继承属性和方法;多态性允许不同类的对象对同一消息作出不同的响应。面向过程编程的设计原则包括模块化、结构化和自顶向下的分解。模块化使得程序更容易理解和维护;结构化编程有助于提高代码的可读性和可维护性;自顶向下的分解将问题分解为更小的、易于管理的部分。代码组织方式:面向对象编程通常使用类和对象来表示实体和关系,通过调用方法实现功能。这种方式使得代码更加模块化、可重用和易于维护。面向过程编程通常使用函数和过程来表示任务,通过调用函数实现功能。这种方式使得代码更加结构化、易于理解和调试。面向对象编程和面向过程编程的主要区别在于关注点、设计原则和代码组织方式。面向对象编程强调数据和行为之间的关系,以及封装、继承和多态性等设计原则;而面向过程编程关注解决问题的方法,以及模块化、结构化和自顶向下的分解等设计原则。在实际开发中,选择合适的编程范式取决于项目需求、团队技能和其他因素八种基本数据类型的大小,以及他们的封装类Java八种基本数据类型的大小如下:byte:8位,取值范围为-128~127short:16位,取值范围为-32768~32767int:32位,取值范围为-2^31~2^31-1long:64位,取值范围为-2^63~2^63-1float:32位,取值范围为1.4E-45~3.4028235E+38double:64位,取值范围为4.9E-324~1.7976931348623157E+308char:16位,Unicode编码,一个字符占用两个字节,取值范围为'\u0000'~'\uffff'Java中对应八种基本数据类型的封装类分别为:Byte:java.lang.ByteShort:java.lang.ShortInteger:java.lang.IntegerLong:java.lang.LongFloat:java.lang.FloatDouble:java.lang.DoubleCharacter:java.lang.CharacterString:java.lang.String// 使用byte类型存储整数 byte b = 10; // b的值为10,占用一个字节(8位) System.out.println("b的值为" + b); // 输出结果为b的值为10 // 使用short类型存储整数 short s = 10; // s的值为10,占用两个字节(16位) System.out.println("s的值为" + s); // 输出结果为s的值为10 // 使用int类型存储整数 int i = 10; // i的值为10,占用四个字节(32位) System.out.println("i的值为" + i); // 输出结果为i的值为10 // 使用long类型存储整数 long l = 10L; // l的值为10,占用八个字节(64位) System.out.println("l的值为" + l); // 输出结果为l的值为10 // 使用float类型存储浮点数 float f = 10F; // f的值为10,占用四个字节(32位),其中小数部分占用了三个字节(24位) System.out.println("f的值为" + f); // 输出结果为f的值为10.000000 // 使用double类型存储浮点数 double d = 10D; // d的值为10,占用八个字节(64位),其中小数部分占用了七个字节(56位) System.out.println("d的值为" + d); // 输出结果为d的值为10.0000000000000000000000000000000000000000000000000​标识符的命名规则Java标识符的命名规则如下:标识符由字母、数字和下划线组成,但是必须以字母或下划线开头。Java中的关键字不能作为标识符的一部分,包括public、private、protected、static、interface、abstract、final、volatile、transient等关键字。标识符只能在类、接口、方法和变量中使用。Java中的保留字(如if、else、for、while等)也不能作为标识符的一部分。public class MyClass { private int myInt; // 整型变量myInt的命名符合Java标识符的命名规则 private String myString = "Hello World"; // 字符串变量myString的命名符合Java标识符的命名规则 public void myMethod() { double myDouble = 3.14; // 双精度浮点型变量myDouble的命名符合Java标识符的命名规则 } }​instanceof 关键字的作用instanceof 是 Java 中的一种关键字,用于检查一个对象是否是某个特定类(或其子类)的实例。它通常与 new 操作符一起使用,以创建一个新对象并检查其类型。public class Animal { public void makeSound() { System.out.println("Animal is making a sound."); } } public class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog is barking."); } } public class Main { public static void main(String[] args) { Animal animal = new Dog(); // 创建一个狗对象 if (animal instanceof Dog) { // 检查动物对象是否是狗的实例 System.out.println("The animal is a dog."); } else if (animal instanceof Animal) { // 检查动物对象是否是任何动物的实例(包括狗和猫等) System.out.println("The animal is an animal."); } else { // 如果不是狗或任何动物的实例,则输出错误信息 System.out.println("The animal is neither a dog nor an animal."); } } }​Java自动装箱与拆箱Java自动装箱与拆箱是Java语言中的一个重要特性,它允许程序员在不需要显式声明类型的情况下将基本数据类型转换为对象类型。以下是Java自动装箱与拆箱的示例代码: 自动装箱 int a = 5; Integer b = a; // 将int类型的a自动装箱成Integer类型 System.out.println(b); // 输出结果为5 自动拆箱 Integer c = new Integer(5); int d = c; // 将Integer类型c自动拆箱成int类型 System.out.println(d); // 输出结果为5 抛出异常 int e = 0; try { int f = (int) "0"; // 将字符串"0"强制转换为int类型,会抛出NumberFormatException异常 } catch (NumberFormatException ex) { System.out.println(ex.getMessage()); // 输出结果为"Value is not a number" } 最大值和最小值检查 int g = Integer.MAX_VALUE; if (g == 10) { System.out.println("g is equal to 10"); // 输出结果为"g is equal to 10" } else { System.out.println("g is not equal to 10"); // 输出结果为"g is not equal to 10"​重载和重写的区别Java中的方法重载(Overloading)和方法重写(Overriding)是面向对象编程中的两个重要概念,它们在功能上有所区别。重载(Overloading): 重载是指在一个类中,方法名相同但参数列表不同的多个方法。编译器根据传递给方法的参数类型和数量来决定调用哪个方法。例如:public class MyClass { public void method(int a, int b) { System.out.println("Method with two integers: " + a + b); } public void method(String str) { System.out.println("Method with a string: " + str); } }​在这个例子中,我们定义了两个名为method的方法,它们具有相同的名称,但参数列表不同。当我们使用这两个方法时,编译器会根据传递给它的参数类型和数量自动选择合适的方法。重写(Overriding): 重写是指子类重新定义与父类同名、同参数列表和返回类型的方法。当子类重写一个父类的方法时,子类的方法将覆盖父类的方法。class Animal { public void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { @Override public void eat() { System.out.println("Dog is eating"); } } ​在这个例子中,我们定义了一个名为eat的方法,它是一个抽象方法,表示动物吃东西的行为。然后我们创建了一个名为Dog的子类,并重写了eat方法。当我们创建一个Dog对象并调用eat方法时,输出结果将是"Dog is eating",而不是"Animal is eating"。这是因为子类重写了父类的方法​​equals与==的区别Java中的equals()和==都是用于比较两个对象是否相等的方法,但它们之间有一些细微的差别。equals()方法是Object类中的方法,而==运算符是基本类型(如int、float等)的方法。因此,如果要比较一个自定义对象与另一个自定义对象,应该使用equals()方法而不是==运算符。equals()方法比较的是两个对象的内容是否相等,包括数据类型和值。而==运算符比较的是两个对象的引用是否相等,即它们是否指向同一个内存地址。​public class Person { private String name; private int age; // 构造函数 public Person(String name, int age) { this.name = name; this.age = age; } // equals方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } // toString方法 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }在上面的代码中,我们定义了一个Person类,它有两个属性:name和age。我们在类中重写了equals()方法和toString()方法。在equals()方法中,我们首先判断两个对象是否为同一个对象,如果是则返回true,否则通过getClass()方法获取两个对象的类类型并进行比较,最后再比较两个对象的属性值是否相等。在toString()方法中,我们只是简单地将属性值拼接成字符串输出。Hashcode的作用Hashcode是Java中用于比较两个对象是否相等的方法。它的作用是返回一个整数,表示当前对象的哈希码值。如果两个对象的哈希码值相同,则说明它们在内存中的地址相同,即相等。public class HashCodeExample { public static void main(String[] args) { String str1 = "Hello"; String str2 = "World"; int hash1 = str1.hashCode(); // 计算str1的哈希码值 int hash2 = str2.hashCode(); // 计算str2的哈希码值 System.out.println("str1的哈希码值为:" + hash1); System.out.println("str2的哈希码值为:" + hash2); if (hash1 == hash2) { // 判断两个字符串的哈希码值是否相等 System.out.println("str1和str2相等"); } else { System.out.println("str1和str2不相等"); } } } str1的哈希码值为:504839640 str2的哈希码值为:720774163 str1和str2不相等​​String、String StringBuffffer 和 StringBuilder 的区别是什么?Java中的String、StringBuffer和StringBuilder都是用于处理字符串的类,但它们之间存在一些关键区别。以下是关于这三个类的详细说明:String:String类是Java中最常用的字符串类,它表示一个不可变(immutable)的字符序列。当你创建一个String对象时,Java会在堆内存中分配一块连续的空间来存储这个字符串。这意味着一旦你创建了一个String对象,你就无法更改其内容。String str1 = "Hello, world!"; System.out.println(str1); // 输出: Hello, world!​StringBuffer:StringBuffer类是一个可变的字符串缓冲区,允许你在运行时修改字符串。当你创建一个StringBuffer对象时,Java会分配一块动态增长的内存空间来存储这个字符串。这意味着你可以在程序运行过程中随时修改字符串的内容。StringBuffer strBuffer = new StringBuffer("Hello, Java!"); strBuffer.append(", World!"); // 修改字符串内容 System.out.println(strBuffer); // 输出: Hello, Java!, World!StringBuilder:StringBuilder类也是一个可变的字符串缓冲区,但它的行为与StringBuffer类似,但性能更好。当你创建一个StringBuilder对象时,Java同样会分配一块动态增长的内存空间来存储这个字符串。然而,由于它的内部实现方式不同,它在修改字符串时的速度通常比StringBuffer快。StringBuilder stringBuilder = new StringBuilder("Hello, Java!"); stringBuilder.append(", World!"); // 修改字符串内容 System.out.println(stringBuilder); // 输出: Hello, Java!, World!如果你需要在程序运行过程中频繁地修改字符串,那么使用StringBuilder或StringBuffer可能更合适。而如果你只需要创建一个不可变的字符串常量,那么使用String就足够了。​​ArrayList和linkedList的区别ArrayList和LinkedList都是Java中常用的集合类,它们的主要区别在于内部实现和性能。内部实现:ArrayList是基于数组(Array)实现的,而LinkedList是基于链表(Linked List)实现的。因此,对于对元素的随机访问,ArrayList比LinkedList更快;而对于插入、删除操作,LinkedList比ArrayList更高效。性能:由于ArrayList是基于数组实现的,它在随机访问方面表现非常优秀,但是在插入、删除元素时需要移动后面的元素,所以时间复杂度为O(n),其中n为元素数量。而LinkedList是基于链表实现的,插入、删除元素的时间复杂度为O(1),但是随机访问元素需要遍历整个链表,所以时间复杂度为O(n)。import java.util.ArrayList; import java.util.LinkedList; import java.util.Random; public class ArrayListExample { public static void main(String[] args) { // 创建ArrayList对象 ArrayList<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(2); list1.add(3); list1.add(4); list1.add(5); System.out.println("ArrayList: " + list1); // 创建LinkedList对象 LinkedList<Integer> list2 = new LinkedList<>(); list2.add(1); list2.add(2); list2.add(3); list2.add(4); list2.add(5); System.out.println("LinkedList: " + list2); // 添加元素到ArrayList中 Random random = new Random(); for (int i = 0; i < 10; i++) { int num = random.nextInt(10); if (list1.contains(num)) { continue; } else { list1.add(num); } } System.out.println("ArrayList: " + list1); // 添加元素到LinkedList中 for (int i = 0; i < 10; i++) { int num = random.nextInt(10); if (list2.contains(num)) { continue; } else { list2.add(num); } } System.out.println("LinkedList: " + list2); } }HashMap和HashTable的区别Java中的HashMap和HashTable都是用于存储键值对的数据结构,但它们之间有一些重要的区别。线程安全性:HashTable是线程安全的,而HashMap是非线程安全的。这意味着在多线程环境下使用HashMap时需要进行同步处理,否则可能会出现数据不一致的情况。性能:HashMap通常比HashTable更快,因为HashMap内部使用哈希表来实现,而HashTable则是基于数组实现的。Null值:HashMap允许Key和Value为null,而HashTable不允许。初始容量和增长因子:HashMap有固定的初始容量和增长因子,而HashTable没有。HashMap的初始容量为16,增长因子为0.75;而HashTable的初始容量为11,增长因子为0.75。​import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class MapExample { public static void main(String[] args) { // 创建HashMap对象 HashMap<Integer, String> map1 = new HashMap<>(); map1.put(1, "one"); map1.put(2, "two"); map1.put(3, "three"); System.out.println("HashMap: " + map1); // 创建HashTable对象 HashSet<Integer> set1 = new HashSet<>(); set1.add(1); set1.add(2); set1.add(3); System.out.println("HashTable: " + set1); } }​Collection包结构,与Collections的区别Java Collection包是Java集合框架的核心,它提供了一组接口和类来处理集合。Java Collection包结构包括以下几个部分:接口Java Collection包中定义了许多接口,例如List、Set、Map等。这些接口定义了集合的基本操作,例如添加元素、删除元素、查找元素等。类Java Collection包中定义了许多类,用于实现各种接口。例如,ArrayList类实现了List接口,LinkedList类实现了List接口并保持元素的插入顺序,HashMap类实现了Map接口,TreeMap类实现了Map接口并按照自然排序或自定义排序方式对键进行排序等。静态方法Java Collection包中还定义了一些静态方法,用于创建新的集合对象或对现有集合进行操作。例如,Collections.singletonList()方法可以创建一个只包含一个元素的List集合,Collections.emptyList()方法可以创建一个空的List集合,Collections.unmodifiableList(List list)方法可以将一个List集合转换为不可修改的集合等。import java.util.ArrayList; import java.util.List; public class Example { public static void main(String[] args) { // 创建一个List集合对象 List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("orange"); // 输出List集合中的元素数量 System.out.println("List集合中的元素数量:" + list.size()); // 将List集合转换为字符串并输出 System.out.println("List集合转换为字符串:" + list); } }java 的四种引用,强软弱虚Java中四种引用是:Strong Reference(强引用):是指在程序中直接使用一个对象时所使用的引用,如果该对象没有其他强引用指向它,那么它会被垃圾回收器回收。Soft Reference(软引用):是指在程序中使用一个弱引用来引用一个对象,只有在内存不足时才会被回收。Weak Reference(弱引用):是指在程序中使用一个虚引用来引用一个对象,只要任何地方有一个强引用指向它,它就不会被回收。Final Reference(最终引用):是指在程序中使用一个永久引用来引用一个对象,无论何时何地,只要存在这个引用,对象就不会被回收。// 创建一个对象并使用Strong Reference引用它 Object obj = new Object(); ReferenceType objRef = new ReferenceType(obj); System.out.println("obj的值为:" + obj.toString()); System.out.println("objRef的值为:" + objRef.get()); // 将objRef设置为null,表示不再使用Strong Reference引用它 objRef = null; System.gc(); // 执行一次垃圾回收 System.out.println("obj的值为:" + obj.toString());​泛型常用特点Java泛型是Java编程语言的一个重要特性,它允许程序员在编译时为数据类型指定通用类型参数。以下是Java泛型的一些常用特点:类型安全:泛型可以确保在运行时不会发生类型不匹配的问题,从而提高程序的稳定性和安全性。代码重用:通过使用泛型,程序员可以将相同的代码用于不同类型的数据结构,从而提高代码的复用性。类型擦除:Java泛型实现了类型擦除,这意味着在运行时,实际使用的是原始类型,而不是泛型类型。这有助于减少内存开销,提高性能。public class GenericClass<T> { private T value; public void setValue(T value) { this.value = value; } public T getValue() { return value; } } public class Main { public static void main(String[] args) { GenericClass<Integer> integerClass = new GenericClass<>(); integerClass.setValue(10); System.out.println("Value of integerClass: " + integerClass.getValue()); // Output: Value of integerClass: 10 GenericClass<String> stringClass = new GenericClass<>(); stringClass.setValue("Hello, World!"); System.out.println("Value of stringClass: " + stringClass.getValue()); // Output: Value of stringClass: Hello, World! } } 我们定义了一个名为GenericClass的类,它具有一个泛型类型参数T。然后我们创建了两个不同的GenericClass实例:integerClass和stringClass,它们分别使用了整数和字符串作为泛型类型参数Java创建对象有三种方式:使用new关键字创建对象 java复制代码Person person = new Person("张三", 20);使用反射机制创建对象 java复制代码Class<?> clazz = Class.forName("com.example.Person"); Object obj = clazz.newInstance();使用工厂模式创建对象 java复制代码// 定义一个工厂类,用于创建Person对象 public class PersonFactory { public static Person createPerson(String name, int age) { Person person = new Person(name, age); return person; } } // 在其他地方调用工厂类创建Person对象 Person person = PersonFactory.createPerson("张三", 20);​有没有可能两个不相等的对象有相同的hashcode在Java中,如果两个对象的hashCode()方法没有正确实现,那么它们可能会有相同的hashCode值。这是因为hashCode()方法的目的是生成一个整数,用于标识对象在哈希表中的位置,而哈希表使用的是散列算法(如MD5或SHA-1),这些算法并不要求不同的对象具有不同的哈希码值。 java复制代码 public class UnequalHashCodeExample { public static void main(String[] args) { String str1 = "Hello"; String str2 = "World"; int hashCode1 = str1.hashCode(); int hashCode2 = str2.hashCode(); System.out.println("str1 hash code: " + hashCode1); System.out.println("str2 hash code: " + hashCode2); if (hashCode1 == hashCode2) { System.out.println("The two strings have the same hash code!"); } else { System.out.println("The two strings do not have the same hash code!"); } } }在这个例子中,我们创建了两个字符串对象:str1和str2,它们的内容分别为"Hello"和"World"。然后,我们分别调用它们的hashCode()方法并打印结果。由于这两个字符串的内容不同,我们期望它们的哈希码也不同。然而,当我们运行这段代码时,我们会发现它们确实具有相同的哈希码值(输出结果为:"The two strings have the same hash code!"),这说明在某些情况下,两个不相等的对象确实可能具有相同的哈希码。深拷贝和浅拷贝的区别是什么?Java中的深拷贝和浅拷贝都是对象复制的方式,它们的区别在于是否对原始对象及其引用类型进行递归复制。浅拷贝(Shallow Copy): 浅拷贝只复制对象本身及其基本类型属性(如int、float等),而不复制引用类型属性(如String、List等)所指向的对象。换句话说,浅拷贝会创建一个新的对象,但是新对象的引用类型属性仍然指向原始对象。这意味着在原始对象中修改引用类型属性时,新对象的引用类型属性也会受到影响。 public class ShallowCopyExample { public static void main(String[] args) { List<Integer> originalList = new ArrayList<>(Arrays.asList(1, 2, 3)); List<Integer> shallowCopyList = new ArrayList<>(originalList); // 浅拷贝 originalList.add(4); // 在原始列表中添加元素4 System.out.println("Original list: " + originalList); // [1, 2, 3, 4] System.out.println("Shallow copy list: " + shallowCopyList); // [1, 2, 3, 4] } }深拷贝(Deep Copy): 深拷贝会递归地复制原始对象及其引用类型属性所指向的对象。这意味着在原始对象中修改引用类型属性时,新对象的引用类型属性不会受到影响。​import java.util.ArrayList; import java.util.List; public class DeepCopyExample { public static void main(String[] args) { List<Integer> originalList = new ArrayList<>(Arrays.asList(1, 2, 3)); List<Integer> deepCopyList = new ArrayList<>(originalList); // 深拷贝 originalList.add(4); // 在原始列表中添加元素4 System.out.println("Original list: " + originalList); // [1, 2, 3, 4] System.out.println("Deep copy list: " + deepCopyList); // [1, 2, 3, 4] } }​
  • [其他] 修改ntp服务器失败
    问题描述:变更操作中,修改ntp服务器失败版本信息:纯软6.5.1.6处理过程:1.按照变更指导书配置NTP后,强制同步时间报错,页面存在告警,配置卡在init步骤2.排查同步脚本,执行ntpdate -t 3 ip报错,socket in use3.手动执行脚本,发现有进程不停调用ntp服务,与配置ntp的脚本冲突4.检查备oms节点没有这种情况,进行主备切换,在新的主oms节点配置ntp时钟源后,同步给原来的主
  • [其他] ntp服务告警
    问题现象:当发生主备倒换后,备oms的ntp就会异常版本信息:纯软8.0.2处理过程:1.现场使用的ntp外部时钟源和管理IP不在同一个网段,811之前的版本只监听了管理平面的浮动IP2.参考http://3ms.huawei.com/km/blogs/details/10295079?l=zh-cn规避
  • [生态空间] DWS NTP时钟同步原理
    1、为了保证集群内所有服务器和行内ntp时钟一致所需要监控的内容2、以下几个场景会导致的情况和处理方法  (1)OMS节点和行内ntp服务器连通性中断  (2)主OMS节点ntp服务异常​​  (3)​主备OMS节点出现切换  (4)业务节点ntp服务异常
  • [问题求助] fusioninsight 主管理节点ntp启动成功,备用节点的ntp启动失败
    证书还没到期,systemctl status ntpd也能看到ntp服务正常启动ntp状态信息每次都是主机和备机只能装上一个,另外一个就报ntp超时的错误
  • [其他] NTP服务器变更失败
    1.按照变更方案操作,执行到强制同步ntp服务器时报错2.检查oms主备状态、ntp服务均正常3.根据报错信息,跟踪脚本得执行过程4.跟踪脚本执行过程 发现sntp -v -P和sntp -S 均执行失败;单独执行这俩命令也失败5.现场是centos系统,之前执行脚本报sntp的包不存在,自行安装sntp包,导致脚本执行报错,但sntp命令是欧拉系统的6.检查又发现ntp服务状态为dead,手动不能拉起7.让客户OS的人修复ntp后,再停止、再拉起、检查状态,重新执行变更,强制同步成功修复ntp方法:7.1 编辑/etc/sysconfig/ntpd。注释掉第二行的OPTIONS=”-g”,重新写入第三行内容7.2/usr/lib/systemd/system/ntpd.service的内容可浏览
  • [大数据] 鲲鹏平台的虚拟机 基于openEuler 20.03 SP1 操作系统, ntp服务启动失败,亟待解决
    操作步骤按照参考:当前遇到的错误如下:[Server1 ~]$ service ntpd startRedirecting to /bin/systemctl start ntpd.service[Server1 ~]$ service ntpd statusRedirecting to /bin/systemctl status ntpd.service● ntpd.service - Network Time Service   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)   Active: active (running) since Tue 2022-01-25 14:26:37 CST; 9s ago  Process: 1614721 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 1614723 (ntpd)    Tasks: 2   Memory: 2.3M   CGroup: /system.slice/ntpd.service           └─1614723 /usr/sbin/ntpd -u ntp:ntp -gJan 25 14:26:37 server1 ntpd[1614723]: kernel reports TIME_ERROR: 0x41: Clock UnsynchronizedJan 25 14:26:38 server1 ntpd[1614723]: bind(24) AF_INET6 fe80::6434:de8b:eb91:63b6%2#123 flags 0x11 failed: Cannot assign requested addressJan 25 14:26:38 server1 ntpd[1614723]: unable to create socket on enp4s0 (8) for fe80::6434:de8b:eb91:63b6%2#123Jan 25 14:26:38 server1 ntpd[1614723]: failed to init interface for address fe80::6434:de8b:eb91:63b6%2Jan 25 14:26:38 server1 ntpd[1614723]: bind(24) AF_INET6 fe80::9ed:6206:dacd:c4b3%2#123 flags 0x11 failed: Cannot assign requested addressJan 25 14:26:38 server1 ntpd[1614723]: unable to create socket on enp4s0 (9) for fe80::9ed:6206:dacd:c4b3%2#123Jan 25 14:26:38 server1 ntpd[1614723]: failed to init interface for address fe80::9ed:6206:dacd:c4b3%2Jan 25 14:26:38 server1 ntpd[1614723]: bind(24) AF_INET6 fe80::ab5c:90cd:2289:5250%2#123 flags 0x11 failed: Cannot assign requested addressJan 25 14:26:38 server1 ntpd[1614723]: unable to create socket on enp4s0 (10) for fe80::ab5c:90cd:2289:5250%2#123Jan 25 14:26:38 server1 ntpd[1614723]: failed to init interface for address fe80::ab5c:90cd:2289:5250%2
  • [技术干货] 智慧园区数字平台NTP客户端和时区配置
    配置NTP时钟源,修改/etc/ntp.conf中server的参数为NTP服务器地址。# vi /etc/ntp.conf# Use public servers from the pool.ntp.org project. # Please consider joining the pool (https://www.pool.ntp.org/join.html). server 10.125.0.11 server 10.125.0.12重启NTP服务并设置开机自启动。# systemctl restart ntpd# systemctl enable ntpd配置时区。根据实际环境所在时区创建软连接。# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime等待一段时间后检查生效 。直到有*号表示同步成功。# ntpq -pn remote refid st t when poll reach delay offset jitter ============================================================================== *10.125.0.11 10.255.100.14 7 u 6 64 377 0.499 -1.462 0.411 +10.125.0.12 10.255.103.22 8 u 48 64 377 0.419 -1.258 0.399
  • [问题求助] 【IVS1800】【NTP功能】无法关闭NTP功能
    【功能模块】NTP【操作步骤&问题现象】1、联网环境修改时间,立即被修改成UTC时间2、格式化p4-p8分区,然后按回复出厂设置按钮10秒以上,等待重启3. 重启后设置一个可联网的IP4. date -s修改一个非UTC时间5. date 查看时间变为UTC时间【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] [2.1管理中心]op部署后修改NTP服务器ip地址-管理中心时间与本地时间不一致
    背景:当管理中心触发任务的时间(utc+8)与本地时间不一致时,需要修改ntp服务器地址,用于时间同步修改方案:1.将安装时场景包的clock_ip配置为客户场景的NTP服务器地址即可(适用于安装开始前)2.安装完成后再修改NTP服务器地址操作如下:准备:a.获取NTP修改工具软件包,附件下载。 b.已配置有gkit安装工具操作步骤:登录Gkit所在Linux机器,将软件包放到gkit所在目录下的packages下,再用命令:./easier.sh prepare package解压,启动gkit,2.登录gkit访问页面,依次点击:工具中心->ntp修改工具3.模板下载->模板上传->选择更换ntp服务器->启动任务模板填写样例(ps页签是前几个页签中列填写的说明,不需要填写):nodeList页签:Params页签:ntpServer页签:填写ntp服务器IP地址
  • [服务构建器] 【华为云Stack ManageOne 服务构建器】服务构建器编排常用脚本
    一、背景服务构建器资源编排、自动化部署等多种场景,需要虚拟机内注入初始化脚本。本文总结了常用操作的脚本,并提炼成框架、函数,可帮助开发者节约时间,快速编写脚本。二、功能清单序号类别功能适用场景1初始化yum源配置应用软件部署时,需要依赖大量三方包时,建议将包放置在本地yum源仓库,或者引用外部yum源2代理配置服务安装过程中,需要连接外网获取软件包3DNS配置1、客户现网有DNS,且租户ECS能访问2、应用部署/使用时,需要依赖DNS4NTP配置1、客户现场有NTP Server且租户ECS可访问2、应用部署、运行时依赖严格的时间同步5本地NTP Server安装配置1、客户现场无NTP Server2、主备、集群节点之间需要严格的时钟同步6初始化账户密码初始化root账号或其他账号密码7新建账户应用运行时,需要采用独立的账号进行执行,以确保权限最小化8挂载数据盘应用或中间件需要安装部署在指定数据盘9挂载swap分区系统运行时需要swap分区10配置防火墙云服务器部署了相关服务,需要放通指定端口11安装前检查网络连通性检查连接外部网络时,需要检查网络连通性12基础命令检查检查安装部署所依赖的命令是否存在13脚本执行脚本执行框架脚本的统一框架,可参考使用14日志输出脚本执行过程中需要输出日志,便于问题定位15使用指定用户执行命令使用指定用户执行命令,使权限最小化16安全加固敏感数据清理清除cloud-init执行完成后的脚本残留,避免脚本中的敏感数据泄露17禁用root用户远程登录安全要求较高的场景下,禁用root用户的远程登录三、代码实现1)配置本地yum源功能:配置本地yum源参数1-yum repo url(路径末需要加/),参数2-pgkeyfunction configYum() { local baseurl=${1} local pgkey=${2} tar -czvf /etc/yum.repos.d/repo.tar.gz /etc/yum.repos.d/*.repo rm -f /etc/yum.repos.d/*.repo echo -e \ "[base] name=local_repo baseurl=${baseurl} gpgcheck=0 pgkey=${pgkey}" \ > /etc/yum.repos.d/local.repo }2)配置代理(HTTP)参数1-IP:Port,参数2-用户名:密码function setProxy() { local ip_port=${1} local user_pwd=${2} if [ -z "${user_pwd}" ];then export http_proxy=http://${ip_port}/ else export http_proxy=http://${user_pwd}@${ip_port}/ fi }3)配置DNS功能:通过修改resolv.conf文件配置DNS参数1-DNS Server的IP地址,用空格隔开function configDns() { local configFilePath=/etc/resolv.conf mv ${configFilePath} ${configFilePath}.bak for ip in $* do echo "nameserver ${ip}" >> ${configFilePath} done for ip in $* do if [ -z "`cat ${configFilePath} | grep ${ip}`" ];then echo "Error: config \"${configFilePath}\" failed." cp ${configFilePath} ${configFilePath}.failed mv ${configFilePath}.bak ${configFilePath} return 1; fi done systemctl restart network }4)配置NTP客户端(chrony)功能:通过修改chrony.conf文件配置chrony NTP客户端参数1-NTP Server的IP地址或域名,用空格隔开function configNTPClient() { local configFilePath=/etc/chrony.conf cp ${configFilePath} ${configFilePath}.bak sed -i '/^server [a-zA-Z0-9\.]* iburst$/'d ${configFilePath} for ip in $* do echo "server ${ip} iburst">> ${configFilePath} done for ip in $* do if [ -z "`cat ${configFilePath} | grep ${ip}`" ];then echo "Error: config \"${configFilePath}\" failed." cp ${configFilePath} ${configFilePath}.failed mv ${configFilePath}.bak ${configFilePath} return 1; fi done systemctl restart chronyd.service }5)配置NTP服务端(chrony)功能:通过修改chrony.conf文件配置chrony NTP客户端参数1-允许连接的网络cidr网段,用空格隔开,需要放通323端口function configNTPServer() { local configFilePath=/etc/chrony.conf cp ${configFilePath} ${configFilePath}.bak sed -i "s/#local stratum/local stratum/g" ${configFilePath} for cidr in $* do echo "allow ${cidr}">> ${configFilePath} done for cidr in $* do if [ -z "`cat ${configFilePath} | grep ${cidr}`" ];then echo "Error: config \"${configFilePath}\" failed." cp ${configFilePath} ${configFilePath}.failed mv ${configFilePath}.bak ${configFilePath} return 1; fi done systemctl restart chronyd.service }6)初始化用户功能:初始化用户,创建用户组并创建用户(包含指定用户目录)参数1-用户组(建议统一为vapp),参数2-用户名,参数3-用户目录返回值:无function initVappUser() { groupadd $1 useradd -d $3 -m -g $1 $2 }7)修改用户密码参数1-用户名,参数2-密码function changeUserPwd() { echo "$1":"$2"|chpasswd -c SHA512s }8)挂载数据盘功能:通过fdisk挂载磁盘参数1-磁盘挂载点,参数2-目标路径function mountDisk() { checkAndMkdir ${2} fdisk $1 << EOF n p 1 w EOF partprobe mkfs -t ext4 ${1}1 mount ${1}1 ${2} if [ -z "`df -l | grep ${1}1 | grep ${2}`" ];then echo "Error: Disk ${1}1 mounting failed." return 1; else echo "Info: Disk ${1}1 mounting successful." fi local uuid=`blkid ${1}1 | awk -F [\":]+ '{print $3}'` echo "UUID=${uuid} ${2} ext4 defaults 0 0" >> /etc/fstab }9)以文件方式挂载swap分区功能:以文件方式挂载swap分区参数1-swap文件的位置,参数2-大小(单位M)function mountSwapByCreateFile() { local swapPath=${1} local size=${2} dd if=/dev/zero of=${swapPath} bs=1M count=${size} chmod 0600 ${swapPath} local uuid=`mkswap ${swapPath} | grep UUID= | awk -F UUID= '{print $2}'` if [ -z "${uuid}" ];then echo "Error: mkswap ${swapPath} failed." return 1; fi swapon ${swapPath} echo "${swapPath} swap swap defaults 0 0" >> /etc/fstab }10)初始化防火墙(firewall)function initFirewall() { systemctl start firewalld.service #清空配置 firewall-cmd --permanent --list-all | grep ports | head -n 1 | \ cut -d: -f2 | tr ' ' '\n' | xargs -I {} firewall-cmd --permanent --remove-port={} #添加端口 firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload systemctl enable firewalld.service }11)网络连通性检测功能:检测网络连通性,若失败则退出脚本function checkConnectivity() { local ip=$1 local port=$2 local result=`nohup ssh -o ConnectTimeout=30 -o PasswordAuthentication=no -p $port $ip 2>&1` if [[ $result == *'Connection closed by remote host'* ]] || [[ $result == *'Permission denied'* ]] then : else echo "Error: ${ip}:${port} connection failed" 1>&2 exit 1 fi }12)基础命令检查功能:检查命令是否有效,若无效则终止脚本。参数1-命令字符串返回值:无function checkCmd() { if ! [ -x "$(command -v ${1})" ]; then echo "Error: ${1} is not installed." 1>&2 exit 1 fi }13)、14)脚本框架(包含日志输出)#!/bin/bash -v #The build-in scripts on ManageOne may not be applicable for all scenarios. Huawei does not assume any liability for consequences due to the use of the scripts. set +x _CUR_PATH=$(cd $(dirname $0);pwd); _LOG_FILE=${_CUR_PATH}/${0##*/}.log function excuteScript() { ...... return 0 } function main() { checkAllCmd excuteScript cleanSensitiveData } main "$@" 2>&1 >> ${_LOG_FILE} exit $?15)使用指定用户执行命令功能:使用指定用户执行命令,避免直接使用rootsu {user_name} -c "...."16)清除敏感数据功能:清除敏感数据,目前仅cloud-init注入脚本的场景涉及function cleanSensitiveData() { cloud-init clean }17)禁用root远程登录function disableRootLogin() { sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config service sshd restart }其他命令:1)检查文件目录功能:检查目录是否存在,若不存在则创建文件目录。参数1-文件夹路径返回值:无function checkAndMkdir() { if [ ! -d $1 ]; then mkdir -p $1 fi }
  • [经验案例] 【服务器系列 05】CentOS7.6搭建NTP服务器
    1、yum安装:yum -y install ntp2、启动并设置时区:systemctl start ntpd timedatectl set-timezone Asia/Shanghai3、设置服务器硬件时间与系统时间同步:vim /etc/sysconfig/ntpd在文件中添加如下内容:set SYNC_HWCLOCK=yes保存退出后执行命令:hwclock --systohc --localtime4、修改配置文件:vim /etc/ntp.conf添加如下内容:restrict 9.88.47.xx nomodify notrap nopeer noquery restrict 9.88.47.1 mask 255.255.255.0 nomodify notrap server 127.127.1.0 fudge 127.127.1.0 stratum 109.88.47.xx是本机IP地址,9.88.47.1是网关地址5、重启服务,开启端口,添加自启systemctl restart ntpdntpd服务使用udp协议,123端口firewall-cmd --permanent --zone=public --add-port=123/udp firewall-cmd --reload systemctl enable ntpd
  • [其他] 集群ntp配置异常,节点时间有差异
    问题现象: 1.节点时间和本地时间不一致 2.节点时间和ntp服务时间不一致问题版本:HCS 802,HCS 803问题根因: 管控面配置的ntp服务器ip获取错误,导致下发的集群ntp配置有问题影响说明:对于DWS组件的影响较小,不会影响正常运行各组件情况如下:1. CM组件1)cma自杀的机制cms重启的时候,如果能和对方建连,会比较各自最近一次升主的机器时间,比较大的节点升主。如果无法建连,那么看cma的连接数,过半的升主。前者跟机器时间有关系。2)其它情况 cm 内部使用逻辑时钟,不受ntp限制2. OM组件1)安装、升级、巡检会检查时钟一致性,会报错2)正常运行无影响 3)cn/dn/gtm/ 组件3.会影响各结点插入时间截的数据 (now(), current_timestamps...)4.不会影响事务一致性包括xid,csn,xlog的获取修复措施:1.从dmk获取ntp服务器的ip        登录dmk界面进入公共配置界面,查看g_tenant_ntp地址2.配置每个节点/etc/ntp.conf,替换原有的ip        dws集群节点root用户执行        vi /etc/ntp.conf         把原ntp服务器配置更新为:($dmz_ntpIP就是dmk参数g_tenant_ntp的ip)        server $dmz_ntpIP minpoll 6 maxpoll 10 perfer3.重启ntp服务 systemctl restart ntpd待时间自动同步4.ntp参数修改,修改后删除pod重启     1) 登录cdk界面-运维服务-CloudAutoDeploy-CDK-变更管理-服务升级-选择dwscontroller服务修改ntpServer.endpoint为g_tenant_ntp的ip参数,升级成功      2)登录cdk-master节点,重启pod容器,看如下命令       kubectl get pod -n dws       kubectl delete pod dwscontroller-xxxx -n dws
  • [技术干货] DCS工业控制系统网络时间同步(NTP服务器)
    DCS工业控制系统网络时间同步(NTP服务器)DCS工业控制系统网络时间同步(NTP服务器)随着数字网络的不断发展,基于网络协议(IP)的技术不断涌现,因为它足够的方便、灵活和可扩展性。局域网(LANs)、广域网(WANs)以及蜂窝网络都是IP网络应用的常见例子。当我们在工业控制、测试和测量领域、传输声音、视频等信息的数据主干应用方面采用IP网络技术时,时间的同步是我们考虑的关键要点。例如声音和视频质量对不确定性的延迟和抖动非常的敏感,装配生产线上的机器人彼此之间也需要严格的同步。  IP网络和以太网最初设计时并没有考虑同步问题,但是这在现在非常的有必要。如果你的产品需要时间同步需要在设计上采取哪些措施呢?目前已经有几种解决方案,这里我们与大家讨论四种常见的解决方案:网络时间协议(NTP)、精简的网络时间协议(SNTP)、精确的时间协议(PTP)以及借助导航系统时间同步,比如全球定位系统GPS。幸运的是从架构的角度来看这些不同的实现方案有很多的共同之处。 主时钟源同步网络通常都会有一个主时钟,它的来源一般都是协调世界时(UTC),UTC是基于地球的自转而确立的公立时间。UTC与国际原子时(TAI)保持着固定的关系,两者之间的固定关系是根据地球自转减慢的速度而周期性的增加到UTC上的闰秒时间而保持的,目前UTC时间比TAI时间快了将近36秒。另一个度量标准是UT1,它是以平子夜作为0时开始的格林格林威治平太阳时加上人工极移校正后的时间标准,UTC与UT1之间的关系保持在9秒以内。目前有很多个时间服务器,但是在美国最常用的就是来自国家科学技术研究所(NIST)提供的时间,NIST提供的时间是基于UTC、UTC1和网络时间协议(NTP)服务器的,其他网络的计算机和主时钟源都是根据这个服务器来确定的,然而还有很多的辅助服务器存在,而且时间信息也可以来自于导航卫星。 时间研究要素在网络设计中存在异步和同步的时间模型,所有同步的方法都需要有一个内聚层次的定时解决方案。参考时钟对于网络元素的同步是必须的,网络元素通常需要一个电压控制的晶体振荡器(VCXO)、锁相环(PLL)或者时钟生成器通过调整实现同步状态。目前比较流行的方案包括Abracon公司推出的超低相位噪声的VXCO和IDT公司推出的82P33814-1NLG同步管理单元,支持多种同步模式。无论选择哪种解决方案,设计系统都需要能够提供适当的抖动衰减和相位噪声剔除,并且与网络中的其他元素保持适当的同步公差。时间设计方面要包括一定的保持特性,即在被通知同步状态之前保持时钟的能力以防止主时钟或参考时钟出现故障。 常用的同步解决方案网络时间协议(NTP)和精简网络时间协议(SNTP)最常用的公共网络时间同步方法就是NTP以及其精简版SNTP,公共的NTP子网在所有大陆甚至在海底都设有服务器,为全球互联网上无数的计算机提供时间支持服务。NTP服务器时间是基于UTC的,但是NIST组织架设了一个基于UT1的NTP服务器。NTP协议使用软件时间戳来实现精确的时间同步,精度范围从100µs 到100ms 或者更大。很多因素会导致差异,但是通常都是由于网络延迟、硬件、操作系统、环境温度变化引起的振荡器漂移以及时间更新引起的时间间隔引起的。当我们确定需要对客户端的本地时间进行调整时,还需要将往返时间延迟考虑在内。NTP和SNTP使用相同的过程来确定校正因子,计算结果是假设往返两方向的延迟都是相同的而确定的,因此在客户端与服务端之间一共发生了四个数据包交换。NTP和SNTP之间的主要区别是SNTP客户端需要周期性的直接从单个SNTP服务器同步它们的时间,因此,SNTP主要用于不需要太高精度要求的应用程序,NTP则采用基于状态的复杂算法来提升精度。 图2:前三层的同步路径 NTP支持多播/任播、客户端/服务器、点对点模式,而SNTP通常应用于客户端-服务端模式,NTP系统广播时间信息是分层的并建立不同的层级,每个级别被分配给一个对应层级(Stratum)的序号,Stratum 1服务器是最底层,提供全局的时间同步服务,上层的需要根据底层的时间信息来同步。(网络事件结构为进一步研究提供了很好的使用信息来源,并且提供了一个参考实现方案称为NTPd,适用于Unix和Windows操作系统) IEEE 1588 精确时间协议(PTP)PTP迅速变成以太网数据包网络首选的时间同步解决方案,尤其适用于工业控制、电信、测试与测量等应用,相比NTP协议它更加的精确、更加的确定。PTP协议与NTP协议有很多相似之处,但是有几个关键的区别。首先客户端的时间戳采用硬件来实现而不是软件,并尽可能的将其放在接近网络接口的地方,从而消除与客户端软件相关的不规则延迟,这样会提升几纳秒的精确性,其次PTP网络主时钟选择过程更具健壮性。 图3:同步机制和延迟计算-便宜校正=ó 在PTP协议中,时间信息会以主从结构的形式分层次的贯通到整个网络中,事件源是基于TAI标准的,“最好主时钟(BMC)”软件算法会从所有可用时钟源中选择最合适的时钟,时间信息会被传递给PTP的所有子网络中。PTP协议的所有子网络中的主时钟的选择也采用BMC算法,多播传输是时钟的主要传输方式,但是终端客户端会采用直接通信的方式与主时钟进行同步,以单播的形式定时发送时间同步请求。当然还会存在一个“透明时钟”的可能性,即网络交换机有可能在将PTP消息传递给PTP子网的过程中修改时间戳。这种修改是通过计算本地设备延迟来提升接收子网的时间戳的精确性。完美的PTP解决方案肯定存在,但是选择还是要归结于收发器的解决方案结合微控制器控制的PTP软件协议栈或者基于微控制器的解决方案和协议栈。网络时间组织提供了一个开源的PTP协议栈实现方案称为PTPd,可以免费下载。最广泛的分布式解决方案是TI公司推出的DP83640,作为通用模块在不同操作模式下都会输出一个从时钟,这个时钟与主时钟在频率和相位都保持同步,然后传递给下级子网络,精度在亚纳秒范围内,当然它也具有NTP协议的时间戳,TI公司提供了详细的应用说明,比如如何进行配置,如何实现较高的精度等。   全球定位系统(GPS) 图4:基于空间的导航系统包含一组环绕地球的卫星 基于空间的导航系统包括一组环绕地球的卫星,这些系统能够提供非常精确的时间和位置信息。美国系统成为“全球定位系统(GPS)”,俄罗斯称之为“全球导航卫星系统(GLONASS)”,中国的“北斗导航卫星系统(BeiDou-2)”,以及印度的“印度区域导航导航卫星系统(IRNSS)”,当然其他国家也都在开发自己的导航系统。 GPS卫星上都具备原子时钟,它们之间互相同步并且定期进行调整与地面时钟同步。时间是根据至少四颗卫星周期性发送来的时间戳来计算出来的,延迟的计算也相对简单,因为信号以光速进行传播,卫星会定期发送其位置信息。 与NTP和PTP协议不同,GPS系统的可变延迟问题则不一样,因为时间信息都直接来自于卫星,唯一限制的因素是接收器必须有一条畅通无阻的通路,大气环境以及卫星相对接收器的位置都会对精度产生影响。因为给每个网络元素都集成一个接收器会很昂贵,因此工程师们会有效的控制成本,不过GPS时代相关产品已经便宜很多了,使得实际的解决方案的同步精度能够达到100ns以内。 GPS系统接收器还有一个好的特性就是它可以应用于封闭网络,即没有互联网连接。它们同样可以为PTP网络提供精确的主时钟源。 总结除了上文提到的时间同步方法,当然还有其他的方案比如“同步网络(SyncE)”和“范围内仪表组时间编码(IRIG)”,这些都值得我们深入去研究。这些技术都是通过分发信号实现同步但是都需要专用的硬件平台。“同步网络”已经成为一种标准受到越来越多的欢迎,传统的时间划分多路复用网络演变为基于IP的切换和多路复用实现方案(上文提到的DP83640就是基于SyncE技术实现的)。为了进一步的探索,可以参考国际电信联盟相关标准:ITU-T Rec.G8261,62,64。网络时间同步解决方案也可以通过上文提到的方法组合来实现,比如基于PTP的工业控制网络可以从GPS接收器获取其主时钟源,当然也可以从NTP衍生服务器获取。许多可行的方法和组合可以一起工作,最终目标是通过网络实现精确的时间同步,但是每种技术都有自己独特的功能特性,而且随着网络和技术的发展逐渐都能够满足现代应用的大部分需求。
  • [其他] 【运维变更】【标准变更方案】【纯软】更换ntp服务器
    1.    适用场景安装FusionInsight Manager管理系统后,如果未配置NTP服务器或已配置的NTP不再使用,管理员可以为集群重新指定或者更换新的NTP服务器,使集群从新的NTP时钟源同步时间。2.    前提条件已准备新的NTP服务器并获取IP地址,并设置好集群与新NTP服务器的网络3.    对系统影响1) 更换NTP服务器是高危操作,更换后集群时间可能将会变化2) 更换NTP服务器前NTP服务器与集群当前时间偏差大于150s,则需先停止集群,防止数据丢失。停止集群期间服务无法访问3) 更换NTP服务器禁止将时钟倒退,例:将12:40调整同步至12:394.    变更步骤步骤1 登录FusionInsight Manager,查看是否存在未清除的告警是,请参见告警处理修复告警。告警处理完毕后,执行步骤2。否,执行步骤2。步骤2 使用PuTTY工具,以omm用户分别登录主备管理节点步骤3 在主管理节点执行以下命令查看管理平面网关cat ${BIGDATA_HOME}/om-server/OMS/workspace/conf/oms-config.ini | grep om_gateway步骤4 在主备管理节点分别执行ping 管理平面网关,检查节点是否与管理平面网关连通ping 管理平面网关是,执行步骤5。否,请联系网络管理员修复网络故障,处理完毕后,执行步骤5。步骤5 在主管理节点执行以下命令,检查集群时间与新的NTP服务器时间偏差。单位为秒RedHat系统。例如,检查与NTP服务器“10.1.1.1”的时间差,执行ntpdate -d 10.1.1.1界面显示:31 Jan 10:10:10 ntpdate[6015]: adjust time server 10.1.1.1 offset -0.000020 sec其中-0.000020表示时间偏差。正数表示NTP服务器时间比集群当前时间快,负数表示NTP服务器时间比集群当前时间慢。SUSE系统。例如,检查与NTP服务器“10.1.1.1”的时间差,需要先执行su - root并输入密码切换用户,查询版本号后,再执行sntp 10.1.1.1。su – rootsntp 10.1.1.1◾如ntp版本号显示4.2.4p,执行sntp 10.1.1.1后界面显示:10.1.1.112:~ # sntp 10.1.1.12016 Feb 02 17:45:59.064 + 427.949528 +/- 0.011 secs其中+427.949528表示时间偏差。正数表示NTP服务器时间比集群当前时间慢,负数表示NTP服务器时间比集群当前时间快。◾如ntp版本号显示4.2.8p,执行sntp 10.1.1.1后界面显示:10.1.1.112:~ # sntp 10.1.1.1sntp 4.2.8p8@1.3265-o Mon Jun  6 08:01:59 UTC 2016 (1)2017-10-24 09:23:28.182627 (+0800) +427.949528 +/- 285.309908 10.1.1.1 s1 no-leap其中+427.949528表示时间偏差。正数表示NTP服务器时间比集群当前时间快,负数表示NTP服务器时间比集群当前时间慢。说明ntp的版本号可以使用ntpq -v或者ntpq --version命令查询:◾ntpq -v界面显示:10.1.1.112: ~# ntpq -vntpq - standard NTP query program - Ver. 4.2.4p8◾ntpq --version界面显示:10.1.1.112: ~# ntpq --versionntpq 4.2.8p10@1.3728-o Mon Jun  6 08:01:59 UTC 2016 (1)具体显示信息以实际环境为准。步骤6 检查时间偏差的绝对值是否超过“150”是,执行步骤7。否,时间偏差的绝对值不超过“150”,以omm用户执行步骤9。步骤7  确认是否可以停止集群是,停止上层业务并停止集群,然后执行步骤8。否,任务结束。步骤8 确认NTP服务器时间是否比集群当前时间慢是,NTP服务器时间慢,停止集群界面显示“操作成功”后需等待,间隔大约为步骤5得到的时间偏差,再以omm用户执行步骤10。否,NTP服务器时间快,停止集群界面显示“操作成功”后直接以omm用户执行步骤10。步骤9 在主管理节点执行以下命令,更换NTP服务器,任务结束sh ${BIGDATA_HOME}/om-server/om/bin/tools/modifyntp.sh --ntp_server_ip 10.1.1.1 说明•NTP服务器IP地址不可以设置为集群内节点IP地址,否则可能会导致节点与主备oms节点业务网络断连。•当前最多允许配置2个NTP服务器以主备方式提供服务,可以用“,”将不同服务器分开。例如,sh ${BIGDATA_HOME}/om-server/om/bin/tools/modifyntp.sh --ntp_server_ip 10.1.1.1,10.1.1.2。步骤10  在主管理节点执行以下命令,从NTP服务器“10.1.1.1”立即强制同步时间并更换NTP服务器,任务结束sh ${BIGDATA_HOME}/om-server/om/bin/tools/modifyntp.sh --ntp_server_ip 10.1.1.1 --force_sync_time 说明•当前最多允许配置2个NTP服务器以主备方式提供服务,可以用“,”将不同服务器分开。例如,sh ${BIGDATA_HOME}/om-server/om/bin/tools/modifyntp.sh --ntp_server_ip 10.1.1.1,10.1.1.2 --force_sync_time。•如果停止了集群,在更换NTP服务器后需要重新启动集群。•执行强制同步时间命令后,集群节点大约需要5分钟完成时间同步。 
总条数:27 到第
上滑加载中