y2.第一章 Ceph企业级存储实战进阶 -- Ceph简介和部署Ceph集群(二)

2.5 ceph 逻辑组织架构

Pool:存储池、分区,存储池的大小取决于底层的存储空间。
PG(placement group):一个pool 内部可以有多个PG 存在,pool 和PG 都是抽象的逻辑概念,一个pool 中有多少个PG 可以通过公式计算。
OSD(Object Storage Daemon,对象存储设备):每一块磁盘都是一个osd,一个主机由一个或多个osd 组成.

ceph 集群部署好之后,要先创建存储池才能向ceph 写入数据,文件在向ceph 保存之前要先进行一致性hash 计算,计算后会把文件保存在某个对应的PG 的,此文件一定属于某个pool的一个PG,在通过PG 保存在OSD 上。
数据对象在写到主OSD 之后再同步对从OSD 以实现数据的高可用。
在这里插入图片描述
注:存储文件过程:
第一步: 计算文件到对象的映射:

计算文件到对象的映射,假如file 为客户端要读写的文件,得到oid(object id) = ino + ono
ino:inode number (INO),File 的元数据序列号,File 的唯一id。
ono:object number (ONO),File 切分产生的某个object 的序号,默认以4M 切分一个块大小

第二步:通过hash 算法计算出文件对应的pool 中的PG:

通过一致性HASH 计算Object 到PG, Object -> PG 映射hash(oid) & mask-> pgid

第三步: 通过CRUSH 把对象映射到PG 中的OSD

通过CRUSH 算法计算PG 到OSD,PG -> OSD 映射:[CRUSH(pgid)->(osd1,osd2,osd3)]

第四步:PG 中的主OSD 将对象写入到硬盘
第五步: 主OSD 将数据同步给备份OSD,并等待备份OSD 返回确认
第六步: 主OSD 将写入完成返回给客户端

2.6 ceph 元数据保存方式

Ceph 对象数据的元数据信息放在哪里呢? 对象数据的元数据以key-value 的形式存在,在RADOS 中有两种实现:xattrs 和omap:

ceph 可选后端支持多种存储引擎,比如filestore,bluestore,kvstore,memstore,ceph 使用bluestore 存储对象数据的元数据信息。

2.6.1 xattrs(扩展属性)

是将元数据保存在对象对应文件的扩展属性中并保存到系统磁盘上,这要求支持对象存储的本地文件系统(一般是XFS)支持扩展属性。

2.6.2 omap(object map 对象映射)

omap:是object map 的简称,是将元数据保存在本地文件系统之外的独立key-value 存储系统中,在使用filestore 时是leveldb,在使用bluestore 时是rocksdb,由于filestore 存在功能问题(需要将磁盘格式化为XFS 格式)及元数据高可用问题等问题,因此在目前ceph主要使用bluestore。

2.6.2.1 filestore 与leveldb

ceph 早期基于filestore 使用google 的levelDB 保存对象的元数据,LevelDb 是一个持久化存储的KV 系统,和Redis 这种内存型的KV 系统不同,leveldb 不会像Redis 一样将数据放在内存从而占用大量的内存空间,而是将大部分数据存储到磁盘上,但是需要把磁盘上的leveldb空间格式化为文件系统(XFS).

FileStore 将数据保存到与Posix 兼容的文件系统(例如Btrfs、XFS、Ext4)。在Ceph 后端使用传统的Linux 文件系统尽管提供了一些好处,但也有代价,如性能、对象属性与磁盘本地文件系统属性匹配存在限制等。

在这里插入图片描述

2.6.2.2 bluestore 与rocksdb

由于levelDB 依然需要需要磁盘文件系统的支持,后期facebok 对levelDB 进行改进为RocksDB https://github.com/facebook/rocksdb,RocksDB 将对象数据的元数据保存在RocksDB,但是RocksDB 的数据又放在哪里呢?放在内存怕丢失,放在本地磁盘但是解决不了高可用,ceph对象数据放在了每个OSD 中,那么就在在当前OSD 中划分出一部分空间,格式化为BlueFS文件系统用于保存RocksDB 中的元数据信息(称为BlueStore),并实现元数据的高可用,BlueStore 最大的特点是构建在裸磁盘设备之上,并且对诸如SSD 等新的存储设备做了很多优化工作。

对全SSD 及全NVMe SSD 闪存适配
绕过本地文件系统层,直接管理裸设备,缩短IO 路径
严格分离元数据和数据,提高索引效率
使用KV 索引,解决文件系统目录结构遍历效率低的问题
支持多种设备类型
解决日志“双写”问题
期望带来至少2 倍的写性能提升和同等读性能
增加数据校验及数据压缩等功能

RocksDB 通过中间层BlueRocksDB 访问文件系统的接口。这个文件系统与传统的Linux 文件系统(例如Ext4 和XFS)是不同的,它不是在VFS 下面的通用文件系统,而是一个用户态的逻辑。BlueFS 通过函数接口(API,非POSIX)的方式为BlueRocksDB 提供类似文件系统的能力

RocksDB 通过中间层BlueRocksDB 访问文件系统的接口。这个文件系统与传统的Linux 文件系统(例如Ext4 和XFS)是不同的,它不是在VFS 下面的通用文件系统,而是一个用户态的逻辑。BlueFS 通过函数接口(API,非POSIX)的方式为BlueRocksDB 提供类似文件系统的能力

在这里插入图片描述

BlueStore 的逻辑架构如上图所示,模块的划分都还比较清晰,我们来看下各模块的作用:

Allocator:负责裸设备的空间管理分配。

RocksDB:rocksdb 是facebook 基于leveldb 开发的一款kv 数据库,BlueStore 将元数据全部存放至RocksDB 中,这些元数据包括存储预写式日志、数据对象元数据、Ceph 的omap 数据信息、以及分配器的元数据。

BlueRocksEnv : 这是RocksDB 与BlueFS 交互的接口; RocksDB 提供了文件操作的接口EnvWrapper(Env 封装器),可以通过继承实现该接口来自定义底层的读写操作,BlueRocksEnv就是继承自EnvWrapper 实现对BlueFS 的读写。

BlueFS:BlueFS 是BlueStore 针对RocksDB 开发的轻量级文件系统,用于存放RocksDB 产生的.sst和.log 等文件。

BlockDecive:BlueStore 抛弃了传统的ext4、xfs 文件系统,使用直接管理裸盘的方式;BlueStore支持同时使用多种不同类型的设备,在逻辑上BlueStore 将存储空间划分为三层:慢速(Slow)空间、高速(DB)空间、超高速(WAL)空间,不同的空间可以指定使用不同的设备类型,当然也可使用同一块设备。

BlueStore 的设计考虑了FileStore 中存在的一些硬伤,抛弃了传统的文件系统直接管理裸设备,缩短了IO 路径,同时采用ROW 的方式,避免了日志双写的问题,在写入性能上有了极大的提高。

在这里插入图片描述

2.7 Ceph CRUSH 算法简介

Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性hash 算法。

Ceph 使用CURSH 算法来存放和管理数据,它是Ceph 的智能数据分发机制。Ceph 使用CRUSH算法来准确计算数据应该被保存到哪里,以及应该从哪里读取,和保存元数据不同的是,CRUSH 按需计算出元数据,因此它就消除了对中心式的服务器/网关的需求,它使得Ceph客户端能够计算出元数据,该过程也称为CRUSH 查找,然后和OSD 直接通信。

1.如果是把对象直接映射到OSD 之上会导致对象与OSD 的对应关系过于紧密和耦合,当OSD由于故障发生变更时将会对整个ceph 集群产生影响。

2.于是ceph 将一个对象映射到RADOS 集群的时候分为两步走:
  首先使用一致性hash 算法将对象名称映射到PG 2.7
  然后将PG ID 基于CRUSH 算法映射到OSD 即可查到对象

3.以上两个过程都是以”实时计算”的方式完成,而没有使用传统的查询数据与块设备的对应表的方式,这样有效避免了组件的”中心化”问题,也解决了查询性能和冗余问题。使得ceph集群扩展不再受查询的性能限制。

4.这个实时计算操作使用的就是CRUSH 算法
  Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性hash 算法。
  CRUSH 是一种分布式算法,类似于一致性hash 算法,用于为RADOS 存储集群控制数据的分配。

3.部署ceph 集群

https://github.com/ceph/ceph
http://docs.ceph.org.cn/install/manual-deployment/ #简要部署过程

版本历史:
https://docs.ceph.com/en/latest/releases/index.html
https://docs.ceph.com/en/latest/releases/octopus/ #ceph 15 即octopus 版本支持的系统:
在这里插入图片描述
https://docs.ceph.com/en/latest/releases/pacific/ #ceph 16 即Pacific 版本支持的系统:
在这里插入图片描述

3.1 部署方式

ceph-ansible:https://github.com/ceph/ceph-ansible #python
ceph-salt:https://github.com/ceph/ceph-salt #python
ceph-container:https://github.com/ceph/ceph-container #shell
ceph-chef:https://github.com/ceph/ceph-chef #Ruby
cephadm: https://docs.ceph.com/en/latest/cephadm/ #ceph 官方在ceph 15 版本加入的ceph部署工具

ceph-deploy:https://github.com/ceph/ceph-deploy #python
是一个ceph 官方维护的基于ceph-deploy 命令行部署ceph 集群的工具,基于ssh 执行可以sudo 权限的shell 命令以及一些python 脚本实现ceph 集群的部署和管理维护。

Ceph-deploy 只用于部署和管理ceph 集群,客户端需要访问ceph,需要部署客户端工具。

3.2 服务器准备

在这里插入图片描述

http://docs.ceph.org.cn/start/hardware-recommendations/ #硬件推荐

https://docs.ceph.com/en/latest/start/hardware-recommendations/#

企业生产推荐配置:

硬件推荐:
	mon:
		16c 16g 200G
	mgr:
		16c 16g 200G
	存储服务器osd:
		ssd #https://item.jd.com/49620677951.html#crumb-wrap
	网卡:
		万兆网卡 #https://item.jd.com/100006004537.html

实验环境:

1.四台服务器作为ceph 集群OSD 存储服务器,每台服务器支持两个网络,public 网络针对客户端访问,cluster 网络用于集群管理及数据同步,每台三块或以上的磁盘

172.31.6.106/10.0.6.106
172.31.6.107/10.0.6.107
172.31.6.108/10.0.6.108
172.31.6.109/10.0.6.109

各存储服务器磁盘划分:
/dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf #100G

2.三台服务器作为ceph 集群Mon 监视服务器,每台服务器可以和ceph 集群的cluster 网络通信。

172.31.6.101/10.0.6.101
172.31.6.102/10.0.6.102
172.31.6.103/10.0.6.103

3.两个ceph-mgr 管理服务器,可以和ceph 集群的cluster 网络通信。

172.31.6.104/10.0.6.104
172.31.6.105/10.0.6.105

4.一个服务器用于部署ceph 集群即安装Ceph-deploy,也可以和ceph-mgr 等复用。

集群即安装Ceph-deploy,也可以和ceph-mgr 等复用。
172.31.6.100/10.0.6.100

5.创建一个普通用户,能够通过sudo 执行特权命令,配置主机名解析,ceph 集群部署过程中需要对各主机配置不通的主机名,另外如果是centos 系统则需要关闭各服务器的防火墙和selinux。
6.网络环境:

http://docs.ceph.org.cn/rados/configuration/network-config-ref/

在这里插入图片描述

在这里插入图片描述

3.3 系统环境准备

集群规划:

角色 机器名 机器配置 public-network ip地址(eth0) cluster-network IP地址(eth1) 磁盘 安装软件
ceph-deploy ceph-deploy.example.local 2C2G 172.31.6.100 10.0.6.100 系统50G chrony-client、ceph-deploy、ceph-common
ceph-mon1 ceph-mon1.example.local 2C2G 172.31.6.101 10.0.6.101 系统50G chrony-client、ceph-mon
ceph-mon2 ceph-mon2.example.local 2C2G 172.31.6.102 10.0.6.102 系统50G chrony-client、ceph-mon
ceph-mon3 ceph-mon3.example.local 2C2G 172.31.6.103 10.0.6.103 系统50G chrony-client、ceph-mon
ceph-mgr1 ceph-mgr1.example.local 2C2G 172.31.6.104 10.0.6.104 系统50G chrony-server、ceph-mgr
ceph-mgr2 ceph-mgr2.example.local 2C2G 172.31.6.105 10.0.6.105 系统50G chrony-server、ceph-mgr
ceph-node1 ceph-node1.example.local 2C2G 172.31.6.106 10.0.6.106 系统50G、100G(/dev/sdb、/dev/sdc、/dev/sdd、 /dev/sde、/dev/sdf) chrony-client、ceph-common
ceph-node2 ceph-node2.example.local 2C2G 172.31.6.107 10.0.6.107 系统50G、100G(/dev/sdb、/dev/sdc、/dev/sdd、 /dev/sde、/dev/sdf) chrony-client、ceph-common
ceph-node3 ceph-node3.example.local 2C2G 172.31.6.108 10.0.6.108 系统50G、100G(/dev/sdb、/dev/sdc、/dev/sdd、 /dev/sde、/dev/sdf) chrony-client、ceph-common
ceph-node4 ceph-node4.example.local 2C2G 172.31.6.109 10.0.6.109 系统50G、100G(/dev/sdb、/dev/sdc、/dev/sdd、 /dev/sde、/dev/sdf) chrony-client、ceph-common

更改网卡名

#两张⽹卡
public 172.31.6.0/21
cluster 10.0.6.0/21

#Ubuntu
root@ubuntu1804:~# sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"[email protected]=0 biosdevname=0"@' /etc/default/grub
root@ubuntu1804:~# grub-mkconfig -o /boot/grub/grub.cfg

#CentOS
[root@172 ~]# sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0 biosdevname=0"@' /etc/default/grub
[root@172 ~]# mv /etc/sysconfig/network-scripts/ifcfg-ens160 /etc/sysconfig/network-scripts/ifcfg-eth0
#ifcfg-ens160网卡名根据实际情况修改

[root@172 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

修改IP地址

#Ubuntu
root@ubuntu1804:~# vim /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [172.31.6.100/21] 
      gateway4: 172.31.0.2
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [10.0.6.100/21]

root@ubuntu1804:~# netplan apply 
root@ubuntu1804:~# reboot

#CentOS
[root@172 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=172.31.6.100
PREFIX=21
GATEWAY=172.31.0.2
DNS1=223.5.5.5
DNS2=180.76.76.76
[root@172 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=none
ONBOOT=yes
IPADDR=10.0.6.100
PREFIX=21

#每台主机都有2个网卡
root@ubuntu1804:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:ab:3b:05 brd ff:ff:ff:ff:ff:ff
    inet 172.31.6.108/21 brd 172.31.7.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feab:3b05/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:ab:3b:0f brd ff:ff:ff:ff:ff:ff
    inet 10.0.6.108/21 brd 10.0.7.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feab:3b0f/64 scope link 
       valid_lft forever preferred_lft forever

#其中osd有5个100G硬盘
root@ubuntu1804:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  200G  0 disk 
├─sda1   8:1    0  953M  0 part /boot
├─sda2   8:2    0 93.1G  0 part /
├─sda3   8:3    0 46.6G  0 part /data
└─sda4   8:4    0  3.7G  0 part [SWAP]
sdb      8:16   0  100G  0 disk 
sdc      8:32   0  100G  0 disk 
sdd      8:48   0  100G  0 disk 
sde      8:64   0  100G  0 disk 
sdf      8:80   0  100G  0 disk 
sr0     11:0    1  964M  0 rom 

在这里插入图片描述

配置基础镜像仓库

#Ubuntu
root@ubuntu1804:~# cat /etc/apt/sources.list
deb http://mirrors.cloud.tencent.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.cloud.tencent.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.cloud.tencent.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.cloud.tencent.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.cloud.tencent.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ bionic-backports main restricted universe multiverse

#CentOS
#CentOS 7所有节点配置 yum源如下:
[root@172 ~]# rm -f /etc/yum.repos.d/*.repo
[root@172 ~]# cat > /etc/yum.repos.d/base.repo <<EOF
[base]
name=base
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever

[extras]
name=extras
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever

[updates]
name=updates
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever

[centosplus]
name=centosplus
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever

#Rocky 8所有节点配置 yum源如下:
[root@172 ~]# cat /etc/yum.repos.d/base.repo 
[BaseOS]
name=BaseOS
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/BaseOS/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[AppStream]
name=AppStream
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/AppStream/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[extras]
name=extras
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/extras/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
enabled=1

[plus]
name=plus
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/plus/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[PowerTools]
name=PowerTools
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/PowerTools/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

#CentOS stream 8所有节点配置 yum源如下:
[root@172 ~]#  cat /etc/yum.repos.d/base.repo 
[BaseOS]
name=BaseOS
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever-stream/BaseOS/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[AppStream]
name=AppStream
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever-stream/AppStream/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[extras]
name=extras
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever-stream/extras/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[centosplus]
name=centosplus
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever-stream/centosplus/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[PowerTools]
name=PowerTools
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever-stream/PowerTools/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

关闭selinux 和防火墙

#Ubuntu关闭防火墙
root@ubuntu1804:~# systemctl disable --now ufw

#CentOS
#关闭selinux
[root@172 ~]# sed -ri.bak 's/^(SELINUX=).*/\1disabled/' /etc/selinux/config

#关闭防火墙
[root@172 ~]# systemctl disable --now firewalld

各节点设置主机名

hostnamectl set-hostname ceph-deploy.example.local
hostnamectl set-hostname ceph-mon1.example.local
hostnamectl set-hostname ceph-mon2.example.local
hostnamectl set-hostname ceph-mon3.example.local
hostnamectl set-hostname ceph-mgr1.example.local
hostnamectl set-hostname ceph-mgr2.example.local
hostnamectl set-hostname ceph-node1.example.local
hostnamectl set-hostname ceph-node2.example.local
hostnamectl set-hostname ceph-node3.example.local
hostnamectl set-hostname ceph-node4.example.local

时间同步

root@ceph-mgr1:~# cat install_chrony_server.sh 
#!/bin/bash
#
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-11-22
#FileName:      install_chrony_server.sh
#URL:           raymond.blog.csdn.net
#Description:   install_chrony_server for CentOS 7/8 & Ubuntu 18.04/20.04 & Rocky 8
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
COLOR="echo -e \\033[01;31m"
END='\033[0m'

os(){
    
    
    OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
}

install_chrony(){
    
    
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ] &> /dev/null;then
        yum -y install chrony &> /dev/null
        sed -i -e '/^pool.*/d' -e '/^server.*/d' -e '/^# Please consider .*/a\server ntp.aliyun.com iburst\nserver time1.cloud.tencent.com iburst\nserver ntp.tuna.tsinghua.edu.cn iburst' -e 's@^#allow.*@allow 0.0.0.0/0@' -e 's@^#local.*@local stratum 10@' /etc/chrony.conf
        systemctl enable --now chronyd &> /dev/null
        systemctl is-active chronyd &> /dev/null ||  {
    
     ${COLOR}"chrony 启动失败,退出!"${END} ; exit; }
        ${COLOR}"chrony安装完成"${END}
    else
        apt -y install chrony &> /dev/null
        sed -i -e '/^pool.*/d' -e '/^# See http:.*/a\server ntp.aliyun.com iburst\nserver time1.cloud.tencent.com iburst\nserver ntp.tuna.tsinghua.edu.cn iburst' /etc/chrony/chrony.conf
        echo "allow 0.0.0.0/0" >> /etc/chrony/chrony.conf
        echo "local stratum 10" >> /etc/chrony/chrony.conf
        systemctl enable --now chronyd &> /dev/null
        systemctl is-active chronyd &> /dev/null ||  {
    
     ${COLOR}"chrony 启动失败,退出!"${END} ; exit; }
        ${COLOR}"chrony安装完成"${END}
    fi
}

main(){
    
    
    os
    install_chrony
}

main

#mgr1和mgr2安装chrony server
root@ceph-mgr1:~# bash install_chrony_server.sh
root@ceph-mgr2:~# bash install_chrony_server.sh

root@ceph-mgr1:~# systemctl restart chronyd

root@ceph-mgr1:~# chronyc sources -nv
210 Number of sources = 3
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^+ 203.107.6.88                  2   6     7     1  -9178us[  +10ms] +/-   40ms
^* 139.199.215.251               2   6     7     1   +272us[  +19ms] +/-   43ms
^? 101.6.6.172                   0   6     0     -     +0ns[   +0ns] +/-    0ns


root@ceph-deploy:~# cat install_chrony_client.sh 
#!/bin/bash
#
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-11-22
#FileName:      install_chrony_client.sh
#URL:           raymond.blog.csdn.net
#Description:   install_chrony_client for CentOS 7/8 & Ubuntu 18.04/20.04 & Rocky 8
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
COLOR="echo -e \\033[01;31m"
END='\033[0m'
SERVER1=172.31.6.104
SERVER2=172.31.6.105

os(){
    
    
    OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
}

install_chrony(){
    
    
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ] &> /dev/null;then
        yum -y install chrony &> /dev/null
        sed -i -e '/^pool.*/d' -e '/^server.*/d' -e '/^# Please consider .*/a\server '${SERVER1}' iburst\nserver '${SERVER2}' iburst' /etc/chrony.conf
        systemctl enable --now chronyd &> /dev/null
        systemctl is-active chronyd &> /dev/null ||  {
    
     ${COLOR}"chrony 启动失败,退出!"${END} ; exit; }
        ${COLOR}"chrony安装完成"${END}
    else
        apt -y install chrony &> /dev/null
        sed -i -e '/^pool.*/d' -e '/^# See http:.*/a\server '${SERVER1}' iburst\nserver '${SERVER2}' iburst' /etc/chrony/chrony.conf
        systemctl enable --now chronyd &> /dev/null
        systemctl is-active chronyd &> /dev/null ||  {
    
     ${COLOR}"chrony 启动失败,退出!"${END} ; exit; }
        systemctl restart chronyd
        ${COLOR}"chrony安装完成"${END}
    fi
}

main(){
    
    
    os
    install_chrony
}

main

#其余安装chrony client
root@ceph-deploy:~# bash install_chrony_client.sh
root@ceph-mon1:~# bash install_chrony_client.sh
root@ceph-mon2:~# bash install_chrony_client.sh
root@ceph-mon3:~# bash install_chrony_client.sh
root@ceph-node1:~# bash install_chrony_client.sh
root@ceph-node2:~# bash install_chrony_client.sh
root@ceph-node3:~# bash install_chrony_client.sh
root@ceph-node4:~# bash install_chrony_client.sh

root@ceph-deploy:~# chronyc sources -nv
210 Number of sources = 2
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^+ 172.31.6.104                  3   6    17     6  +3697us[+3697us] +/-   55ms
^* 172.31.6.105                  3   6    17     6  -2180us[-2193us] +/-   33ms

猜你喜欢

转载自blog.csdn.net/qq_25599925/article/details/123828460