Skip to content

2023年12月

vscode使用docker搭建独立环境编程

前提

vscode

vscode 必备插件:

  1. Dev Containers

docker

docker环境,并含 docker-compose

示例

以一个简单golang 环境做示例

godemo 文件夹中

docker-compose.yml  main.go

cat docker-compose.yml

version: "3"

services:
  app:
    image: golang:1.20.2
    volumes:
      - .:/go/src/app
    working_dir: /go/src/app

cat main.go

package main

import "fmt"

func main() {
    fmt.Println("hello")
}

在容器中打开

vscode 弹出命令,输入

Dev Containers: Open Folder in Container...

打开后会自动初始化

好了,你已经在容器中了,可以在容器中安装各种插件来独立运行这个项目了

nvs环境配置

nvs 详细安装可以去 github:

https://github.com/jasongin/nvs

windows

gitbase 如果找不到 nvs

如果使用 git base 环境, 在 ~/.bash_profile 加入以下命令

export NVS_HOME=$LOCALAPPDATA/nvs
. $NVS_HOME/nvs.sh

linux

wsl 解决与windows中 nvs 冲突

如果为wsl环境, 如果windows中无nvs环境可跳过此步骤

vim ~/.bashrc

在文件末尾加入,排出windows nvs 环境变量, 具体路径参考自己 windows 的 nvs 环境

export PATH=$(echo $PATH | sed -e 's;:/mnt/c/Users/<user>/AppData/Local/nvs/default;;' -e 's;:/mnt/c/Users/<user>/AppData/Local/nvs/;;')

公共配置

解决全局模块在切换版本后需要重装问题

mkdir -p ~/.npm-global
npm config set prefix ~/.npm-global

推荐直接使用 pnpm 替代

pnpm config set prefix ~/.npm-global

配置到环境变量到 ~/.bashrc, windows类似在系统配置中添加

export PATH=~/.npm-global/bin:$PATH

配置镜像地址

查看 remote

nvs remote

配置镜像地址

nvs remote node https://npmmirror.com/mirrors/node/

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"
        ]
    }
}