glusterFS

在这里插入图片描述

一. 概念

1. 介绍

gluster是一个横向扩展的分布式文件系统,可将来自多个服务器的磁盘存储资源整合到一个全局名称空间中,可以根据存储消耗需求快速调配额外的存储。它将自动故障转移作为主要功能.

  • 分布式存储系统.集群式NAS存储.
  • 无集中式元数据服务,采用Hash算法定位.
    • 一致性哈希DHT.
    • Hash值落在哪个范围内,数据就存储在哪里.
  • 弹性卷管理.
  • 自动做了raid.

2. 优点

  • 缩放到几PB.处理数千个客户.开源.
  • POSIX兼容
  • 可以使用任何支持扩展属性的ondisk文件系统.使用NFS和SMB等行业标准协议访问
  • 提供复制,配额,地理复制,快照和bitrot检测
  • 允许优化不同的工作量 开源

3. 缺点

  • 不适用于存储大量小文件的场景,因为GlusterFS的设计之初就是用于存储大数据的,对小文件的优化不是很好,推荐保存单个文件至少1MB以上的环境,如果是大量小文件的场景建议使用FastDFSMFS

4. 卷

  • 分布卷(默认模式):即DHT, 也叫 分布卷: 将文件以hash算法随机分布到 一台服务器节点中存储
  • 复制模式:即AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中
  • 条带模式:即Striped, 创建volume 时带 stripe x 数量: 将文件切割成数据块,分别存储到 stripe x 个节点中 ( 类似raid 0 )
  • 分布式条带模式:最少需要4台服务器才能创建。 创建volume 时 stripe 2 server = 4 个节点: 是DHT 与 Striped 的组合型
  • 分布式复制模式:最少需要4台服务器才能创建。 创建volume 时 replica 2 server = 4 个节点:是DHT 与 AFR 的组合型
  • 条带复制卷模式:最少需要4台服务器才能创建。 创建volume 时 stripe 2 replica 2 server = 4 个节点: 是 Striped 与 AFR 的组合型
  • 三种模式混合: 至少需要8台 服务器才能创建。 stripe 2 replica 2 , 每4个节点 组成一个组

二. 部署

1. 配置

  • 若干brick组成1个复制卷,另外若干brick组成其他复制卷;单个文件在复制卷内数据保持副本,不同文件在不同复制卷之间进行哈希分布;即分布式卷跨复制卷集(replicated sets )
  • brick server数量是副本数量的倍数,且>=2倍,即最少需要4台brick server,同时组建复制卷集的brick容量相等
IPhostname配置说明
192.168.100.155g1CentOS 7 1C2G额外一块硬盘
192.168.100.156g2CentOS 7 1C2G额外一块硬盘
192.168.100.157g3CentOS 7 1C2G额外一块硬盘
192.168.100.154k8sCentOS 7 2C4G部署的heketi, 因资源问题,上面有个小型k8s
192.168.100.158/CentOS 7 2C4G资源充足可将k8s部署在这上面

2. 部署

  • 以下三个节点都需要操作
# 关闭防火墙和selinux

vim /etchosts
192.168.100.155 g1
192.168.100.156 g2
192.168.100.157 g3

# repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo
yum -y install centos-release-gluster

# 安装并启动
yum -y install glusterfs-server
systemctl enable glusterd.service --now

# 磁盘格式化
[root@g1 ~]# lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   10G  0 disk 
└─sda1   8:1    0   10G  0 part /
sdb      8:16   0   20G  0 disk 
sr0     11:0    1  4.3G  0 rom  

# 三个节点创建目录
mkdir -p /data/brick1

#
fdisk /dev/sdb

# 格式化文件系统
mkfs.xfs -i size=512 /dev/sdb1

# 开机挂载
echo '/dev/sdb1 /data/brick1 xfs defaults 0 0 ' >> /etc/fstab

mount -a

# 验证
df -h

# 设置glusterfs卷创建的目录, 创建分布式卷
mkdir /data/brick1/gv0
  • 以下在g1节点上操作
ssh-keygen
ssh-copy-id g1
ssh-copy-id g2
ssh-copy-id g3

# 配置受信任池
gluster peer probe g2
gluster peer probe g3

# 可在任意节点上查看节点状态
gluster peer status

# 设置glusterfs分布式卷, 必须指定类型, 默认是分布式卷, 必须指定副本数,不需要指出分布式卷类型,只要副本数量与 brick server 数量不等且符合倍数关系,即是分布式复制卷
gluster volume create gv0 replica 3 g1:/data/brick1/gv0 g2:/data/brick1/gv0  g3:/data/brick1/gv0

# 启动创建的卷
gluster volume start gv0

## 停止卷
gluster volume stop gv0
## 删除卷
gluster volume delete gv0

# 查看信息
[root@g1 ~]# gluster volume info
 
Volume Name: gv0
Type: Replicate
Volume ID: c5f0bbe3-afae-4a4a-9ab6-4cfa284897ed
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: g1:/data/brick1/gv0
Brick2: g2:/data/brick1/gv0
Brick3: g3:/data/brick1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

# 查看卷状态
gluster volume status

# 测试
mkdir /seek
mount -t glusterfs g1:/gv0  /seek
for i in `seq -w 1 10`; do cp -rp /var/log/messages /mnt/copy-test-$i; done

# 因为是三副本存储,所以每个节点上的文件数量都是10, 都可以查看到该文件

三. k8s与GlusterFS

1. 概念

  • Kubernetes中使用GlusterFS作为持久化存储,要提供storageClass使用需要依赖Heketi工具
    • Heketi是一个具有resetful接口的glusterfs管理程序,作为kubernetes的Storage存储的external provisioner
    • 提供基于RESTful接口管理glusterfs的功能,可以方便的创建集群管理glusterfs的node,device,volume
    • 与k8s结合可以创建动态的PV,扩展glusterfs存储的动态管理功能。主要用来管理glusterFS volume的生命周期,初始化时候就要分配好裸磁盘(未格式化)设备
  • 每个kubernetes集群的节点需要安装gulsterfs的客户端,如glusterfs-cli, glusterfs-fuse, 主要用于在每个node节点挂载volume
  • 每个kubernetes集群的节点运行 modprobe dm_thin_pool,加载内核模块
  • kube-apiserver中添加 –allow-privileged=true 参数以开启此功能,默认此版本的kubeadm已开启

2. Heketi

  • 可单独部署在一台服务器上, 我这里是部署在k8s的master节点上的
  • heketi 仅支持使用裸分区或裸磁盘(未格式化)添加为device,不支持文件系统
# hosts
vim /etc/hosts
192.168.100.155 g1
192.168.100.156 g2
192.168.100.157 g3

yum -y install centos-release-gluster
yum -y install heketi heketi-client

# 配置heketi.json
cd /etc/heketi/
cp heketi.json heketi.json.bak


# 修改后
[root@master01 heketi]# cat heketi.json
{
  "_port_comment": "Heketi Server Port Number",
  "port": "18080",  	# 默认端口号8080, 

  "_use_auth": "Enable JWT authorization. Please enable for deployment",
  "use_auth": true,  	# 默认flase,可以改为true

  "_jwt": "Private keys for access",
  "jwt": {
    "_admin": "Admin has access to all APIs",
    "admin": {
      "key": "admin"  	# 修改
    },
    "_user": "User only has access to /volumes endpoint",
    "user": {
      "key": "admin"  	# 修改
    }
  },

  "_glusterfs_comment": "GlusterFS Configuration",
  "glusterfs": {
    "_executor_comment": [
      "Execute plugin. Possible choices: mock, ssh",
      "mock: This setting is used for testing and development.",
      "      It will not send commands to any node.",
      "ssh:  This setting will notify Heketi to ssh to the nodes.",
      "      It will need the values in sshexec to be configured.",
      "kubernetes: Communicate with GlusterFS containers over",
      "            Kubernetes exec api."
    ],
    # 三种模式:
    # mock:测试环境下创建的volume无法挂载;
    # kubernetes:在GlusterFS由kubernetes创建时采用
    "executor": "ssh",    # 生产环境使用 ssh 或 Kubernetes,这里用 ssh,改为ssh

    "_sshexec_comment": "SSH username and private key file information",
    "sshexec": {
      "keyfile": "/etc/heketi/heketi_key",  # 密钥路径
      "user": "root",     					# 用户为root
      "port": "22",      
      "fstab": "/etc/fstab"
    },

    "_kubeexec_comment": "Kubernetes configuration",
    "kubeexec": {
      "host" :"https://kubernetes.host:8443",
      "cert" : "/path/to/crt.file",
      "insecure": false,
      "user": "kubernetes username",
      "password": "password for kubernetes user",
      "namespace": "OpenShift project or Kubernetes namespace",
      "fstab": "Optional: Specify fstab file on node.  Default is /etc/fstab"
    },

    "_db_comment": "Database file name",
    "db": "/var/lib/heketi/heketi.db",

    "_loglevel_comment": [
      "Set log level. Choices are:",
      "  none, critical, error, warning, info, debug",
      "Default is warning"
    ],
   # 默认设置为debug,不设置时的默认值即是warning;
   # 日志信息输出在/var/log/message
    "loglevel" : "warning"
  }
}
# 使用ssh的方式需要创建秘钥, 用于免密连接glusterfs的所有节点
ssh-keygen -f heketi_key  -t rsa -N ''

ssh-copy-id  -i heketi_key.pub g1
ssh-copy-id  -i heketi_key.pub g2
ssh-copy-id  -i heketi_key.pub g3

# 启动
systemctl enable heketi.service;systemctl start heketi.service

# 验证
curl 192.168.100.154:18080/hello
Hello from Heketi

# 添加cluster, 两个admin分别是上面的 heketi.json 文件中的认证信息,需要改为自己的, 会生成如下信息
heketi-cli --user admin --server http://192.168.100.154:18080 --secret admin --json cluster create

{"id":"5ff98e26472e3e1db21742bf5cd3ce46","nodes":[],"volumes":[],"block":true,"file":true,"blockvolumes":[]}
# 创建 topology.json 文件,其中 /dev/sdb 为我们未格式化的分区
cd /etc/heketi
vim topology.json

{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "g1"
              ],
              "storage": [
                "192.168.100.155"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "g2"
              ],
              "storage": [
                "192.168.100.156"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "g3"
              ],
              "storage": [
                "192.168.100.157"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        }        
      ]
    }
  ]
}
# 因为 heketi 需要裸设备,我们部署glusterfs验证时候已经格式化了,现在需要还原
gluster volume delete gv0

# 三个节点都要做 
umount /data/brick1

# 还原裸设备三个节点都需要做 mklabel msdos
[root@g1 ~]# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel msdos                                                    
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes                                                               
(parted) quit                                                             
Information: You may need to update /etc/fstab.

# 三个节点都需要执行
mkfs.xfs -f /dev/sdb
pvcreate -ff --metadatasize=128M --dataalignment=256K /dev/sdb

# heketi初始化
[root@k8s /etc/heketi]# heketi-cli --server http://192.168.100.154:18080  --user admin --secret admin topology load --json=/etc/heketi/topology.json
	Found node g1 on cluster 2d8a5e1a487250410d393e8bbefd43a7
		Adding device /dev/sdb ... OK
	Found node g2 on cluster 2d8a5e1a487250410d393e8bbefd43a7
		Adding device /dev/sdb ... OK
	Found node g3 on cluster 2d8a5e1a487250410d393e8bbefd43a7
		Adding device /dev/sdb ... OK

# 查看数据
heketi-cli --server http://192.168.100.154:18080 --user admin --secret admin cluster list
Clusters:
Id:2d8a5e1a487250410d393e8bbefd43a7 [file][block]
Id:5ff98e26472e3e1db21742bf5cd3ce46 [file][block]

# 节点信息
heketi-cli --server http://192.168.100.154:18080 --user admin --secret admin  node list
Id:8d2f3e7fa8542db11f1e64f37fe94cac	Cluster:2d8a5e1a487250410d393e8bbefd43a7
Id:ac85f20ff1dfd9e1c9f436f820ac193f	Cluster:2d8a5e1a487250410d393e8bbefd43a7
Id:f7c789945e0afc0c51bff0b4944925c1	Cluster:2d8a5e1a487250410d393e8bbefd43a7


# 可查看Cluster Id, 接下来就需要在k8s中调用它
heketi-cli --user admin --secret admin topology info --server http://192.168.100.154:18080

Cluster Id: 2d8a5e1a487250410d393e8bbefd43a7

    File:  true
    Block: true

    Volumes:

3. k8s中调用

  • 所有的k8s节点都需要部署glusterfs的客户端
yum -y install glusterfs-fuse
# 创建secret和storageclass,我的heketi和k8s在同一节点,最好是分开
[root@k8s /etc/heketi]# echo -n "admin"|base64
YWRtaW4=
  • heketi认证的secret
  • vim heketi-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: heketi-secret
  namespace: default
data:
  # base64 encoded password. E.g.: echo -n "mypassword" | base64
  key: YWRtaW4=
type: kubernetes.io/glusterfs
  • vim heketi-sc.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: gluster-heketi-storageclass
provisioner: kubernetes.io/glusterfs
reclaimPolicy: Delete
parameters:
  resturl: "http://192.168.100.154:18080"
  restauthenabled: "true"
  restuser: "admin"
  secretNamespace: "default"
  secretName: "heketi-secret"
  volumetype: "replicate:3"
  
  
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: gluster-heketi-storageclass
provisioner: kubernetes.io/glusterfs
reclaimPolicy: Delete
parameters:
  resturl: "http://192.168.100.154:18080"
  clusterid: "2d8a5e1a487250410d393e8bbefd43a7"
  restauthenabled: "true"
  restuser: "admin"
  secretNamespace: "default"
  secretName: "heketi-secret"
  volumetype: "replicate:3"
  • 验证
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: gluster-heketi-storageclass
      resources:
        requests:
          storage: 1G
  • zookeeper集群, 比较费资源
apiVersion: v1
kind: Service
metadata:
  name: zk-hs
  labels:
    app: zk
spec:
  ports:
  - port: 2888
    name: server
  - port: 3888
    name: leader-election
  clusterIP: None
  selector:
    app: zk
---
apiVersion: v1
kind: Service
metadata:
  name: zk-cs
  labels:
    app: zk
spec:
  ports:
  - port: 2181
    name: client
  selector:
    app: zk
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  selector:
    matchLabels:
      app: zk
  maxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zk
spec:
  selector:
    matchLabels:
      app: zk
  serviceName: zk-hs
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  podManagementPolicy: Parallel
  template:
    metadata:
      labels:
        app: zk
    spec:
      tolerations:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - zk
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: kubernetes-zookeeper
        imagePullPolicy: IfNotPresent
        image: mirrorgooglecontainers/kubernetes-zookeeper:1.0-3.4.10
        resources:
          requests:
            memory: "1G"
            cpu: "0.5"
        ports:
        - containerPort: 2181
          name: client
        - containerPort: 2888
          name: server
        - containerPort: 3888
          name: leader-election
        command:
        - sh
        - -c
        - "start-zookeeper \
          --servers=3 \
          --data_dir=/var/lib/zookeeper/data \
          --data_log_dir=/var/lib/zookeeper/data/log \
          --conf_dir=/opt/zookeeper/conf \
          --client_port=2181 \
          --election_port=3888 \
          --server_port=2888 \
          --tick_time=2000 \
          --init_limit=10 \
          --sync_limit=5 \
          --heap=512M \
          --max_client_cnxns=60 \
          --snap_retain_count=3 \
          --purge_interval=12 \
          --max_session_timeout=40000 \
          --min_session_timeout=4000 \
          --log_level=INFO"
        readinessProbe:
          exec:
            command:
            - sh
            - -c
            - "zookeeper-ready 2181"
          initialDelaySeconds: 10
          timeoutSeconds: 5
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - "zookeeper-ready 2181"
          initialDelaySeconds: 10
          timeoutSeconds: 5
        volumeMounts:
        - name: datadir
          mountPath: /var/lib/zookeeper
      securityContext:
        runAsUser: 1000
        fsGroup: 1000
  volumeClaimTemplates:
  - metadata:
      name: datadir
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: gluster-heketi-storageclass
      resources:
        requests:
          storage: 5G
# 以上面的nginx为例
[root@k8s ~/glusterfs]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
nginx-0   1/1     Running   0          62s
nginx-1   1/1     Running   0          50s
nginx-2   1/1     Running   0          43s
[root@k8s ~/glusterfs]# kubectl exec -ti nginx-0 -- df -h
Filesystem                                            Size  Used Avail Use% Mounted on
overlay                                                20G  4.5G   16G  23% /
tmpfs                                                  64M     0   64M   0% /dev
tmpfs                                                 2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda1                                              20G  4.5G   16G  23% /etc/hosts
shm                                                    64M     0   64M   0% /dev/shm
192.168.100.157:vol_0a072c68764078d2389be28ee4598bb9 1014M   43M  972M   5% /usr/share/nginx/html
tmpfs                                                 2.0G   12K  2.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                 2.0G     0  2.0G   0% /proc/acpi
tmpfs                                                 2.0G     0  2.0G   0% /proc/scsi
tmpfs                                                 2.0G     0  2.0G   0% /sys/firmware


# 随便在glusterfs节点上查看,根据提示可以可知道分别在各个节点的存储的路径位置
[root@g1 ~]#  gluster volume status vol_0a072c68764078d2389be28ee4598bb9
Status of volume: vol_0a072c68764078d2389be28ee4598bb9
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick 192.168.100.155:/var/lib/heketi/mount
s/vg_6571d6295a5dfedffe38e8277715a0f0/brick
_13692d64dc8f7debbaaf1ca4692fc81d/brick     49156     0          Y       38860
Brick 192.168.100.157:/var/lib/heketi/mount
s/vg_16efa0044cb89c7a94af43632e4ad883/brick
_7468d1b2b30f56026a9f8352903c6998/brick     49156     0          Y       37814
Brick 192.168.100.156:/var/lib/heketi/mount
s/vg_f2c7e0d58b71681158503e0266892ef7/brick
_d8d641412d91d7059fc6ac539ce47362/brick     49156     0          Y       38692
Self-heal Daemon on localhost               N/A       N/A        Y       38877
Self-heal Daemon on g2                      N/A       N/A        Y       38717
Self-heal Daemon on g3                      N/A       N/A        Y       37831
 
Task Status of Volume vol_0a072c68764078d2389be28ee4598bb9
------------------------------------------------------------------------------
There are no active volume tasks

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔记本摄像头模拟监控推送RTSP流

使用笔记本摄像头模拟监控推送RTSP流 一、基础安装软件准备 本文使用软件下载链接:下载地址 FFmpeg软件: Download ffmpeg 选择Windows builds by BtbN 一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。 EasyDarwin软件:Download Easy…

激活函数整理

sigmoid函数 import torch from d2l import torch as d2l %matplotlib inline ​ xtorch.arange(-10,10,0.1,requires_gradTrue) sigmoidtorch.nn.Sigmoid() ysigmoid(x) ​ d2l.plot(x.detach(),y.detach(),x,sigmoid(x),figsize(5,2.5)) sigmoid函数连续、光滑、单调递增&am…

java数据结构与算法刷题-----LeetCode343. 整数拆分(TODO)

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只…

C++力扣题目226--翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]示例 3&#x…

【算法与数据结构】746、LeetCode使用最小花费爬楼梯

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题可以从0阶或者1阶台阶开始,每次爬楼梯所需的花费是之前的花费dp[i]从本层向上爬所需的…

入门实战丨Python小游戏经典案例

文章目录 写在前面判断与循环小游戏猜数游戏龙的世界 写在后面 写在前面 本期内容:两个个简单的Python小游戏入门案例。 实验需求:python 实验目标:掌握基本的判断与循环语句。 判断与循环 判断与循环是编程中非常重要的两个概念&#x…

机器学习顶会ICML 2024今日开放投稿,CCF A类,中稿率27.94%(附ICML23杰出论文+18篇高分论文)

ICML 2024今天开放投稿了!距离截稿还有24天,想冲ICML的同学速度! ICML 全称 International Conference on Machine Learning,由国际机器学习学会(IMLS)举办,与NIPS一同被认为是人工智能、机器学…

面试宝典进阶之redis缓存面试题

R1、【初级】Redis常用的数据类型有哪些? (1)String(字符串) (2)Hash(哈希) (3)List(列表) (4)Se…

程序员面试技巧:成为HR心动的程序猿

文章目录 程序员必备的面试技巧导语一、准备充分二、突出亮点三、展示解决问题的能力四、良好的沟通能力五、积极展示学习态度示例结语😶 写在结尾 程序员必备的面试技巧 “程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上&#…

vue3 +TS 安装使用pinia状态管理

目录 一.安装 1.下载安装依赖 2.创建src/stores/index.ts文件 3.创建src/stores/states.ts文件 4.创建src/stores/interface/index.ts文件 5.修改main.ts 6.目录结构如下 7.测试使用 8.去到首页点击按钮,打开控制台查看 一.安装 1.下载安装依赖 npm insta…

人类认知中的等价机理与机器智能中等价机理

人类认知中的等价机理是指人们在认知过程中,通过将不同的概念、事物或情境进行等价替代,从而实现思维的连贯和理解的补充。例如,当人们看到一个陌生的动物时,可以将它与已知的动物进行等价对应,从而理解其特征和行为。…

基于SpringBoot的毕业生实习与就业管理系统(系统+数据库+文档)

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目 希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一、绪论 1. 研究背景 现在大家…

私域流量转化差,这些问题你都解决了吗?

一、流量不精准 这是一个常见而又经常被忽视的问题。许多企业在私域运营中面临转化率低下的问题,但有没有想过,这可能只是因为你吸引的流量与你的产品不匹配? 从公域引流到私域,数量并非唯一关键,精准度更是重中之重…

如何在移动应用程序的 POC、原型和 MVP 之间做出选择?

许多企业家、企业和行业在决定是否将移动应用程序开发理念作为概念验证 (POC)、最小可行产品 (MVP)、原型或组合来推进时面临着挑战。 由于这三种方法对其利用都有各自的影响,因此正确理解每个方面并选择合适的方法将有助于利益相关者最大限度地提高其想法在用户和所…

送货单打印要用什么打印机和软件

在打印送货单时,打印机和软件的选择都是非常重要的。根据需求,可以选择喷墨打印机、激光打印机或针式打印机等类型,而软件我们可以选择专业的送货单打印软件,例如:方可销售送货单软件(推荐)就是…

Banner设计专家详细解释和使用技巧!

一、banner的作用 宝安在运营工作中具有吸引注意力、提高转化率、传达信息、提升品牌形象、引导用户行为、营造活动氛围等多种功能。因此,在运营工作中,需要根据具体需要和目标精心设计和合理使用宝安,才能达到更好的运营效果。 二、banner…

生信 R语言

11.芯片表达矩阵下游分析 ​rm(list ls())#清除所有变量 options(stringsAsFactors F) #BiocManager::install("CLL") suppressPackageStartupMessages(library(CLL)) data("sCLLex") sCLLex ## ExpressionSet (storageMode: lockedEnvironment) ## as…

RHCE9学习指南 第17章 进程管理

17.1 进程介绍 在Windows下打开任务管理器就可以查看到系统所有进程,如图17-1所示。 图17-1 Windows下的任务管理器 这里列出了系统中所有的进程。不过也可以使用命令行工具来查看进程。每个进程都会有一个process ID,简称为pid。 17.2 查看进程 也可…

解决录制的 mp4 视频文件在 windows 无法播放的问题

解决录制的 mp4 视频文件在 windows 无法播放的问题 kazam 默认录制保存下来的 mp4 视频文件在 windows 中是无法直接使用的,这是由于视频编码方式的问题。解决办法: 首先安装 ffmeg 编码工具: sudo apt-get install ffmpeg 然后改变视频的…

鸿鹄云商B2B2C:JAVA实现的商家间直播带货商城系统概览

【saas云平台】打造全行业全渠道全场景的saas产品,为经营场景提供一体化解决方案;门店经营区域化、网店经营一体化,本地化、全方位、一站式服务,为多门店提供统一运营解决方案;提供丰富多样的营销玩法覆盖所有经营场景…