Skip to content

Index

ceph

分布式文件系统

优点:高可靠,高性能 提供一个存储池,如果不够用,可进行线性扩展

分类

  • ceph 块设备 读取速度快,但只支持单设备挂载

  • ceph 文件系统 读取速度慢,但支持多个设备访问

  • ceph 对象网关 集合以上2个优点

ceph 组件

在ceph集群中,不管你是想要提供对象存储,块设备存储,还是文件系统存储,所有Ceph 存储集群部署都是从设置每个Ceph节点,网络和Ceph存储开始 的。 Ceph存储集群至少需 要一个Ceph Monitor,Ceph Manager和Ceph OSD(对象存储守护进程)。 运行Ceph Filesystem客户端时也需要Ceph元数据服务器。

  • Monitors:Ceph监视器(ceph-mon)维护集群状态的映射,包括监视器映射,管理器映 射,OSD映射和CRUSH映射。这些映射是Ceph守护进程相互协调所需的关键集群状态。监 视器还负责管理守护进程和客户端之间的身份验证。冗余和高可用性通常至少需要三个监视 器。

  • Managers:Ceph Manager守护程序(ceph-mgr)负责跟踪运行时指标和Ceph集群的 当前状态,包括存储利用率,当前性能指标和系统负载。 Ceph Manager守护进程还托管 基于python的模块来管理和公开Ceph集群信息,包括基于Web的Ceph Dashboard和 REST API。高可用性通常至少需要两名Managers。

  • Ceph OSD:Ceph OSD(对象存储守护进程,ceph-osd)存储数据,处理数据复制,恢 复,重新平衡,并通过检查其他Ceph OSD守护进程来获取心跳,为Ceph监视器和管理器 提供一些监视信息。冗余和高可用性通常至少需要3个Ceph OSD。

  • MDS:Ceph元数据服务器(MDS,ceph-mds)代表Ceph文件系统存储元数据(即, Ceph块设备和Ceph对象存储不使用MDS)。 Ceph元数据服务器允许POSIX文件系统用户 执行基本命令(如ls,find等),而不会给Ceph存储集群带来巨大负担。

安装 ceph 集群

准备条件:

准备三台机器,每台机器需要三个硬盘,配置 2GiB/4vCPU/60G 60G 分3个硬盘 master1-admin 是管理节点 :192.168.3.31 node1-monitor 是监控节点:192.168.3.32 node2-osd 是对象存储节点:192.168.3.33

系统安装

以centos7 7为例

配置阿里源

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

设置固定IP

vi /etc/sysconfig/network-scripts/ifcfg-ens33

增加以下,主要是IPADDR

IPADDR=<你的IP地址>
NETMASK=<子网掩码>
GATEWAY=<默认网关>
DNS1=<首选DNS服务器>
DNS2=<备用DNS服务器>
  • 重启网络
systemctl restart network

设置主机名

# 在 master1-admin 上操作:
hostnamectl set-hostname master1-admin
# 在 node1-monitor 上操作:
hostnamectl set-hostname node1-monitor
# 在 node2-osd 上操作:
hostnamectl set-hostname node2-osd

修改 host 文件

三个主机上 /etc/hosts 文件如下

192.168.3.31 master1-admin
192.168.3.32 node1-monitor
192.168.3.33 node2-osd

配置 master1-admin 到三个节点无密码登陆

保证各服务器以装 openssh-server

# 生成密钥对
ssh-keygen -t rsa
# 分发公钥
ssh-copy-id node1-monitor
ssh-copy-id node2-osd

初始化机器(三个几点操作)

yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release lrzsz openssh-server
yum install deltarpm -y

关闭 firewalld 防火墙(三个节点操作)

停止 firewalld 服务 停止防火墙,并禁用这个服务

systemctl stop firewalld.service && systemctl disable firewalld.service

安装 iptables 如果你要改用 iptables 的话,需要安装 iptables 服务,未使用则不管

yum install iptables-services -y
禁用 iptables
service iptables stop && systemctl disable iptables

时间同步

在 master1-admin 上

ntpdate cn.pool.ntp.org
systemctl start ntpd && systemctl enable ntpd
在 node1-monitor 上
ntpdate master1-admin
计划任务:
* */1 * * * /usr/sbin/ntpdate master1-admin
在 node2-osd 上
ntpdate master1-admin
计划任务:
* */1 * * * /usr/sbin/ntpdate master1-admin
三、安装 ceph-deploy 1.安装 epel 源,在 master1-admin,node1-monitor,node2-osd 上操作
yum install -y yum-utils && sudo yum-config-manager --add-repo https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/archives.fedoraproject.org*
2.配置 ceph 的 yum 源,在 master1-admin,node1-monitor,node2-osd 上操作
cat /etc/yum.repos.d/ceph.repo

[Ceph] 
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ 
enabled=1
gpgcheck=0 
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc 
priority=1
[Ceph-noarch] 
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/ 
enabled=1
gpgcheck=0 
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc 
priority=1
[ceph-source] 
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/ 
enabled=1
gpgcheck=0 
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc 
priority=1

3.安装 ceph-deploy

yum update -y #在 master1-admin,node1-monitor,node2-osd 上操作
yum install ceph-deploy -y #在 master1-admin 上操作
yum install yum-plugin-priorities -y #在 master1-admin 上操作
在 node1-monitor 和 node2-osd 上操作
yum install ceph -y
4.搭建集群,在 master1-admin 上操作

(1)创建一个目录,用于保存 ceph-deploy 生成的配置文件信息的

mkdir /root/ceph-deploy && cd /root/ceph-deploy
(2) 创建集群和 monitor 节点
ceph-deploy new node1-monitor
ls 可发现在 ceph-deploy 目录下多了几个文件,如下这些
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
(3)修改 ceph 配置文件
cat ceph.conf
[global]
fsid = 588994cf-aafb-4e97-b40b-0abb80dcf49b
mon_initial_members = node1-monitor
mon_host = 192.168.3.32
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd pool default size = 1
把 Ceph 配置文件里的默认副本数从 3 改成 1 。把 osd pool default size = 1 加入 [global] 段: sed -i '$a\osd pool default size = 1' ceph.conf (4)安装 ceph 集群
ceph-deploy install master1-admin node1-monitor node2-osd
(5)配置初始 monitor,并收集所有的密钥
ceph-deploy mon create-initial

ll /root/ceph-deploy 会看到生成很多密钥
ceph.bootstrap-mds.keyring
ceph.bootstrap-mgr.keyring
ceph.bootstrap-osd.keyring
ceph.bootstrap-rgw.keyring
ceph.client.admin.keyring

5.给 ceph 添加 osd,并完成激活 Ceph OSD: OSD 的全称是 Object Storage Device,它的主要功能是存储数据、复制数据、平衡数据、恢复数据等, 与其它 OSD 间进行心跳检查等,并将一些变化情况上报给 Ceph Monitor。一般情况下一块硬盘对应一 个 OSD,一个分区也可以成为一个 OSD。 在 osd 节点 node2-osd 上操作

mkdir /var/local/osd1
chmod 777 /var/local/osd1/
回到 master1-admin 上操作,准备 osd
ceph-deploy osd prepare node2-osd:/var/local/osd1
在 master1-admin 上操作,激活 osd
ceph-deploy osd activate node2-osd:/var/local/osd1
6.把配置文件拷贝到管理节点和 ceph 节点,在 master1-admin 上操作
ceph-deploy admin master1-admin node1-monitor node2-osd
chmod +r /etc/ceph/ceph.client.admin.keyring 在三个节点操作
ceph health # 查看集群健康状态
如果显示 ok,说明 ceph osd 添加成功,可以正常使用 7.扩容,添加两个 osd,在 master1-admin 和 node1-monitor 上操作 (1)在 master1-admin,node1-monitor 上在创建一个目录
mkdir /var/local/osd1
chmod 777 /var/local/osd1/
(2)回到 master1-admin,准备 osd
ceph-deploy osd prepare master1-admin:/var/local/osd1 node1-monitor:/var/local/osd1
(3)在 master1-admin 上激活 osd
ceph-deploy osd activate master1-admin:/var/local/osd1 node1-monitor:/var/local/osd1
(4)ceph health 8.删除 osd (1)停掉 osd 进程 systemctl stop ceph-osd@1 systemctl stop ceph-osd@2 (2)将节点标记成 out,down ceph osd out 1 ceph osd out 2 ceph osd down 1 ceph osd down 2 这个一步是告诉 mon,这个节点已经不能服务了,需要在其他的 osd 上进行数据的恢复了 (3)从 crush 移除节点 ceph osd crush remove osd.1 ceph osd crush remove osd.2 (4)删除节点 ceph osd rm 1 ceph osd rm 2 (5)删除节点认证 ceph auth del 1 ceph auth del 2 这个是从认证当中去删除这个节点的信息

解决linux内存不足引起的问题

线上linux内存不足导致无法ssh连接

  • 线上linux服务器未配置虚拟内存,之后运行 pnpm i 都会直接卡死

解决方式: 1. 配置虚拟内存 2. 调整内核参数

调整内核参数解决

在 Linux 系统中,可以通过调整内核参数来加快内存回收,从而提高系统的性能和响应速度。以下是一些常用的内核参数及其调整方法:

  1. vm.swappiness vm.swappiness 参数控制系统使用 Swap 的倾向。值越低,系统越倾向于保留内存而不是将数据换出到 Swap。

默认值:60 调整建议: 降低值:如果希望系统尽量减少使用 Swap,可以将 vm.swappiness 设置为较低的值,例如 10 或 20。 提高值:如果希望系统更积极地使用 Swap,可以将 vm.swappiness 设置为较高的值,例如 80 或 100。

# 临时调整
sudo sysctl vm.swappiness=10

# 永久调整(编辑 /etc/sysctl.conf)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
  1. vm.vfs_cache_pressure vm.vfs_cache_pressure 参数控制文件系统缓存的回收压力。值越高,系统越倾向于回收文件系统缓存。

默认值:100 调整建议: 降低值:如果希望系统保留更多的文件系统缓存,可以将 vm.vfs_cache_pressure 设置为较低的值,例如 50。 提高值:如果希望系统更积极地回收文件系统缓存,可以将 vm.vfs_cache_pressure 设置为较高的值,例如 150。

# 临时调整
sudo sysctl vm.vfs_cache_pressure=50

# 永久调整(编辑 /etc/sysctl.conf)
echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
  1. vm.dirty_ratio 和 vm.dirty_background_ratio 这两个参数控制脏页(未同步到磁盘的缓存数据)的数量。

vm.dirty_ratio:脏页占总内存的最大百分比。超过此值时,系统会开始同步脏页到磁盘。

vm.dirty_background_ratio:脏页占总内存的背景阈值。超过此值时,系统会开始异步同步脏页到磁盘。

默认值:

vm.dirty_ratio:20 vm.dirty_background_ratio:10 调整建议:

降低值:如果希望系统更频繁地同步脏页,可以将这两个值设置为较低的值,例如 10 和 5。 提高值:如果希望系统减少同步频率,可以将这两个值设置为较高的值,但需谨慎,以免影响系统稳定性。

# 临时调整
sudo sysctl vm.dirty_ratio=10
sudo sysctl vm.dirty_background_ratio=5

# 永久调整(编辑 /etc/sysctl.conf)
echo "vm.dirty_ratio=10" | sudo tee -a /etc/sysctl.conf
echo "vm.dirty_background_ratio=5" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
  1. vm.drop_caches vm.drop_caches 参数可以手动清除各种类型的缓存,包括页面缓存、目录项缓存和inode缓存。

值: 1:清除页面缓存 2:清除目录项和inode缓存 3:清除所有缓存

# 清除所有缓存
sudo sync
echo 3 | sudo tee /proc/sys/vm/drop_caches
  1. vm.overcommit_memory 和 vm.overcommit_ratio 这两个参数控制内存过量分配的行为。

vm.overcommit_memory:

0:内核根据可用内存和当前使用情况决定是否允许内存过量分配(默认值)。 1:内核总是允许内存过量分配。 2:内核根据 vm.overcommit_ratio 计算允许的最大内存分配量。 vm.overcommit_ratio:当 vm.overcommit_memory 设置为 2 时,此参数表示允许的最大内存分配量占物理内存的百分比。

默认值:

vm.overcommit_memory:0 vm.overcommit_ratio:50 调整建议:

设置为 2:如果希望严格控制内存分配,可以将 vm.overcommit_memory 设置为 2,并调整 vm.overcommit_ratio。

# 临时调整
sudo sysctl vm.overcommit_memory=2
sudo sysctl vm.overcommit_ratio=70

# 永久调整(编辑 /etc/sysctl.conf)
echo "vm.overcommit_memory=2" | sudo tee -a /etc/sysctl.conf
echo "vm.overcommit_ratio=70" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

vscode 配置

绕过编译检测

一些文件或文件夹如果不需要检测,可以如下配置,避免golang启用检测浪费内存和时间

{
    "gopls": {
        "build.directoryFilters": [
            "-**/node_modules",
            "-**/model_src"
        ]
    }
}

xmind常用配置

xind 不能默认打开对应文件问题

在xmind文件中新建 xmind.bat 文件

E:
cd E:\{xmind dir}
start XMind.exe %1%

右键打开方式,使用该bat文件打开

vscode 打开xmind文件

试过vscode 几个 Open 插件均无效,但我测试可以使用task去打开

添加tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "xmind",
            "type": "process",
            "command": "E:/{XMind dir}/XMind.bat",
            "args": [
                "${file}"
            ],
            "problemMatcher": [],
        }
    ]
}

type 一定要使用 process 否则只能打开 XMind, 这样点开 对应xmind文件 运行 run task 即可

进一步方便打开

如果嫌运行命令行太麻烦,只需如下配置,

下载以下插件

Task Buttons
v1.1.3
spencerwmiles

setting配置

"VsCodeTaskButtons.showCounter": false,
"VsCodeTaskButtons.tasks": [
    {
        "label": "🔥 open xmind",
        "task": "xmind"
    }
]

这下可使用左下任务栏打开任务了,happy

挂载

挂载新硬盘

1.查看硬盘

root@ubuntu:~# fdisk -lu
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x3c78b7a1

Device     Boot    Start      End  Sectors Size Id Type
/dev/sda1  *        2048 16777215 16775168   8G 83 Linux
/dev/sda2       16779262 20969471  4190210   2G  5 Extended
/dev/sda5       16779264 20969471  4190208   2G 82 Linux swap / Solaris

Partition 2 does not start on physical sector boundary.


Disk /dev/sdb: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

2.创建分区

root@ubuntu:~# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xdf96fde2.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-104857599, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-104857599, default 104857599):

Created a new partition 1 of type 'Linux' and of size 50 GiB.

Command (m for help): p
Disk /dev/sdb: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xdf96fde2

Device     Boot Start       End   Sectors Size Id Type
/dev/sdb1        2048 104857599 104855552  50G 83 Linux

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

3.格式化分区

root@ubuntu:~# mkfs.ext4 /dev/sdb1
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: 完成
Creating filesystem with 13106944 4k blocks and 3276800 inodes
Filesystem UUID: c0887faa-eed2-4f38-9f18-6e3059261202
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

4.挂载和查看分区表

root@ubuntu:~# mount /dev/sdb1 /data
root@ubuntu:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  5.5M  389M   2% /run
/dev/sda1       7.8G  1.2G  6.2G  16% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           395M     0  395M   0% /run/user/0
/dev/sdb1        50G   52M   47G   1% /data

5.永久挂载

# 执行前一定要进行备份,以免误操作
echo '/dev/sdb1       /data   ext4    defaults        0       0' >> /etc/fstab

映射硬盘

eg: 将 docker lib 目录映射到 /data/lib/docker

echo '/data/lib/docker /var/lib/docker none defaults,bind 0 0'>>/etc/fstab

fstab 立即生效

mount -a

windows常用脚本

程序后台运行

之前 alist 挂载网盘后台运行

Set ws = CreateObject("Wscript.Shell")
ws.run "D:\alist-windows-amd64\alist.exe server",vbhide

命名为 alist.VBS 加入到 shell:startup 中运行

golang超实用技巧

拉取私有库

比如我私有库为 github.com/gofulljs/private

1.配置ssh密钥用以拉取代码

ssh -T git@github.com
Hi gofulljs! You've successfully authenticated, but GitHub does not provide shell access.

2.配置https替换为ssh

git config --global url."git@github.com:gofulljs".insteadOf "https://github.com/gofulljs"

这样针对自己写的库都会走ssh,不会弹出

 fatal: could not read Username for 'https://github.com': terminal prompts disabled
  1. 配置自己库路径为私有,这样避免校验
go env -w GOPRIVATE=github.com/gofulljs
  1. 享受成果
go get github.com/gofulljs/private@latest

可自行打 tag 来实用自己项目了,非常happy

linux信息

查看系统版本

# 打印系统信息
$ uname -a
Linux LAPTOP-2181LTT2 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

# 获取发行版信息
$ cat /etc/issue
Ubuntu 18.04.6 LTS \n \l

$ cat /etc/issue.net 
Ubuntu 18.04.6 LTS

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# 根据上面 ID_LIKE 来获取version
$ cat /etc/debian_version
9.3

# 也可直接通过system 获取(如果有)
$ cat /etc/system-release
9.3

# 获取内核版本
$ cat /proc/version 
Linux version 5.4.72-microsoft-standard-WSL2 (oe-user@oe-host) (gcc version 8.2.0 (GCC)) #1 SMP Wed Oct 28 23:40:43 UTC 2020

# dmesg 命令
$ dmesg | grep "Linux"
[    0.000000] Linux version 5.4.72-microsoft-standard-WSL2 (oe-user@oe-host) (gcc version 8.2.0 (GCC)) #1 SMP Wed Oct 28 23:40:43 UTC 2020
[    3.522133] ACPI: Added _OSI(Linux-Dell-Video)
[    3.527064] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
[    3.531431] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)

# 其他 Yum/Dnf
$ yum info nano
$ yum repolist
$ dnf info nano
$ apt-cache policy nano
nano:
  Installed: 2.9.3-2
  Candidate: 2.9.3-2
  Version table:
 *** 2.9.3-2 500
        500 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages
        100 /var/lib/dpkg/status

golang技巧

Go语言中的数值溢出检测

package main

import (
    "fmt"
    "math"
)

func addInt8WithOverflowCheck(a, b int8) (int8, bool) {
    result := a + b
    // 使用异或运算检测溢出
    overflow := (a^result)&(b^result) < 0
    return result, overflow
}

func main() {
    a := int8(-127)
    b := int8(-1)
    result, overflowed := addInt8WithOverflowCheck(a, b)
    if overflowed {
        fmt.Println("溢出发生,结果:", result)
    } else {
        fmt.Println("结果:", result)
    }
}