【云原生】Kubernetes之持久化

Kubernetes 持久化存储

文章目录

  • Kubernetes 持久化存储
    • 一、为什么要做持久化存储
    • 二、都有哪些存储
      • 2.1、emptyDir
        • 2.1.1、什么是emptyDir
        • 2.1.2、emptyDir作用
        • 2.1.3、emptyDir的应用场景
        • 2.1.4、emptyDir优缺点
        • 2.1.5、emptyDir的使用方式
      • 2.2、hostPath
        • 2.2.1、什么是hostPath
        • 2.2.2、hostPath应用场景
        • 2.2.3、hostPath优缺点
        • 2.2.4、hostPath的使用方式
      • 2.3、PV以及PVC
        • 2.3.1、什么是PV
        • 2.3.2、什么是PVC
        • 2.3.3、PV的供应方式
        • 2.3.4、绑定
        • 2.3.5、使用流程
        • 2.3.6、回收策略
        • 2.3.7、访问模式
        • 2.3.8 示例
          • 2.3.8.1、资源列表
          • 2.3.8.2、部署NFS
            • 2.3.8.2.1、关闭防火墙
            • 2.3.8.2.2、关闭内核安全机制
            • 2.3.8.2.3、安装
          • 2.3.8.3、PV、PVC应用示例

一、为什么要做持久化存储

  • 在k8s中部署的应用都是以Pod容器的形式运行的,假如我们部署的MySQL、Redis等数据库,需要对这些数据库产生的数据做备份。因为Pod是有生命周期的,如果Pod不挂在数据卷,那Pod删除或重启后这些数据会随之消失,如果想要长久的保留这些数据就要用到Pod数据持久化存储。

二、都有哪些存储

2.1、emptyDir

2.1.1、什么是emptyDir
  • emptyDir是一个临时存储卷,与Pod的声明周期绑定在一起,如果Pod被删除了,这意味着数据也被随之删除。
2.1.2、emptyDir作用
  • 可以实现持久化
  • 同一个Pod的多个容器可以实现数据共享,多个不同的Pod之间不能进行数据通信
  • 随着Pod的生命周期而存在,当我们删除Pod时,其数据也会被随之删除
2.1.3、emptyDir的应用场景
  • 临时缓存空间,比如基于磁盘的归并排序
  • 为较耗时计算任务提供检查点,以便任务能方便的从崩溃前状态恢复执行
  • 存储Web访问日志及错误日志等信息
2.1.4、emptyDir优缺点

优点

  • 可以实现同一个Pod内多个容器之间数据共享
  • 当Pod内的某个容器被强制删除时,数据并不会丢失,因为Pod没有删除

缺点

  • 当Pod被删除时,数据也会随之删除
  • 不同的Pod之间无法实现数据共享
2.1.5、emptyDir的使用方式
[root@master ~]# cat emptyDir.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: test-pod
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    # 定义容器内的挂载点
    volumeMounts:
    # 挂载的卷名称未data
    - name: data
    # 将data数据卷挂载到内容内部的/opt目录下
      mountPath: /opt/
    command: ["sh","-c","sleep 1000"]
  # 创建一个卷
  volumes:
  # 卷名字叫data,刚好与容器挂载的卷名字一致
  - name: data
  # emptyDir是一个空目录,用于临时存储数据。{}表示使用默认配置
    emptyDir: {}
# 查看临时目录存在的位置,可用如下方法
[root@master ~]# kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
test   1/1     Running   0          32s   10.244.2.2   node1   <none>           <none>


# 查看 Pod 的 uid,指定的机器指定目录下会生成带有 uid 号的目录
[root@master ~]# kubectl get pod test -o yaml | grep uid
  uid: b6b8a98d-9324-4869-a443-4e7dbe24f232


# 登录 node1 机器
[root@node1 ~]# tree /var/lib/kubelet/pods/b6b8a98d-9324-4869-a443-4e7dbe24f232/
/var/lib/kubelet/pods/b6b8a98d-9324-4869-a443-4e7dbe24f232/
├── containers
│   └── test-pod
│       └── 2e82889a
├── etc-hosts
├── plugins
│   └── kubernetes.io~empty-dir
│       ├── data
│       │   └── ready
│       └── wrapped_kube-api-access-n7cgv
│           └── ready
└── volumes
    ├── kubernetes.io~empty-dir
    │   └── data
    └── kubernetes.io~projected
        └── kube-api-access-n7cgv
            ├── ca.crt -> ..data/ca.crt
            ├── namespace -> ..data/namespace
            └── token -> ..data/token

11 directories, 7 files
# 在容器里面写文件,对应的emptyDir目录会有相应文件
[root@master ~]# kubectl exec -it test -- sh -c 'date > /opt/time.txt'
[root@master ~]# kubectl exec -it test -- ls /opt/time.txt
/opt/time.txt
[root@master ~]# kubectl exec -it test -- cat /opt/time.txt
Fri Jul  5 00:25:52 UTC 2024


# 登录到node1机器查看
[root@node1 ~]# cat /var/lib/kubelet/pods/b6b8a98d-9324-4869-a443-4e7dbe24f232/volumes/kubernetes.io~empty-dir/data/time.txt 
Fri Jul  5 00:25:52 UTC 2024

2.2、hostPath

2.2.1、什么是hostPath
  • hostPath Volume是指Pod挂载宿主机上的目录或文件。hostPath Volume使得容器可以使用宿主机的文件系统进行存储,hostpath(宿主机路径):节点级别的存储卷,在Pod被删除,这个存储卷还是存在的,不会被删除,所以只要同一个Pod被调度到同一个节点上来,在Pod被删除重新被调度到这个节点之后,对应的数据依然存在的
2.2.2、hostPath应用场景
  • Pod中容器想要访问宿主机文件
2.2.3、hostPath优缺点

优点

  • 可以实现同一个Pod不同容器之间的数据共享
  • 可以实现同一个Node节点不同Pod之间的数据共享

缺点

  • 无法满足跨节点Pod之间的数据共享
2.2.4、hostPath的使用方式
[root@master ~]# cat hostPath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: test-pod
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    # 定义容器内部的挂载点
    volumeMounts:
    # 挂载卷的名字叫 data
    - name: data
    # 叫 data 卷挂载到容器中/opt
      mountPath: /opt
    # 容器执行的命令,主要是让容器运行
    command: ["sh","-c","sleep 1000"]
  # 定义了Pod中挂载的卷
  volumes:
  # 卷的名称
  - name: data
  # 指定宿主机的卷存储路径
    hostPath: 
  # 宿主机上的路径,这个Pod被分配到什么Node节点,那么就会自动在该Node节点/下面创建data目录
      path: "/data"
  # 卷类型,意味着如果宿主机上/data目录不存在Kubernetes会自动创建它
      type: DirectoryOrCreate
# 在容器当中写入数据,对应Node节点/data目录下就会出现数据,最终实现持久化存储
[root@master ~]# kubectl exec -it test -- sh -c 'date > /opt/time.txt'
[root@master ~]# kubectl exec -it test -- cat /opt/time.txt
Fri Jul  5 00:39:34 UTC 2024
[root@master ~]# kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
test   1/1     Running   0          5m54s   10.244.1.4   node2   <none>           <none>


# 登录 node2 机器查看
[root@node2 ~]# ls /data/
time.txt
[root@node2 ~]# cat /data/time.txt 
Fri Jul  5 00:39:34 UTC 2024

2.3、PV以及PVC

  • 前面和大家一起学习了一些基本的资源对象的使用方法,前面我们也和大家降到了有状态的应用和数据有持久化的应用,我们有通过hostPath 或者 emptyDir的方式来持久化我们的数据,但是显然我们还需要更加可靠的存储保存应用持久化数据,这样的容器在重建后,依赖可以使用之前的数据。但是显然存储资源和CPU资源以及内存资源有很多大不同,为了屏蔽底层的技术实现细节,让用户更加方便的使用,Kubernetes便引入了PV和PVC两个重要的资源对象来实现对存储的管理。这也是我们这节课和大家讲解的核心:PV 和 PVC
2.3.1、什么是PV
  • PV的全称是:PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如Ceph、GlusterFS、NFS等,都是通过插件机制完成与共享存储的对接。
  • PersistentVolume(PV)是集群中的一块存储,由管理员配置或使用存储类动态配置。它是集群中的资源,就像Pod是K8S集群资源一样。PV是容量插件,入Volumes,其声明周期独立于使用PV的任务单个Pod
2.3.2、什么是PVC
  • PersistentVolumeClaim(PVC)是一个持久化存储卷,我们在创建Pod时可以定义这个类型的存储卷。它类似于一个Pod。Pod消耗节点的资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。pvc在申请pv的时候也可以请求特定大小和访问模式(例如,可以依次读写或多次只读)
2.3.3、PV的供应方式

可以通过两种方式配置PV:静态或动态

  • 静态的:

​ 集群管理员创建了许多PV,它们包含可供集群用户使用的实际存储的详细信息。它们存在于Kubernetes API中,可供使用

  • 动态的:

​ 当管理员创建PV都不匹配用户的PersistentVolumeClaim(PVC)时,集群可能会尝试为PVC专门动态配置卷。此配置基于StorageClasses,PVC必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。

2.3.4、绑定
  • 用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态

  • 每个持久卷会处于以下阶段(Phase)之一:

    Available

    卷是一个空闲资源,尚未绑定到任何申领

    Bound

    该卷已经绑定到某申领

    Released

​ 所绑定的申领已被删除,但是关联存储资源尚未被集群回收

Failed

​ 卷的自动回收操作失败

2.3.5、使用流程
  • 需要主调一个存储服务器,把它划分成多个存储空间

  • K8S管理员可以把这些存储空间定义成多个PV

  • 在Pod中使用PVC类型的存储卷之前需要先创建PVC,通过定义需要使用的PV的大小和对应的访问模式,找到合适的PV

  • PVC被创建之后,就可以当成存储卷来使用了,我们在定义Pod时就可以使用这个PVC的存储卷

  • PVC和PV它们时一一对应的关系,PV如果被PVC绑定了,就不能被其他PVC使用了

  • 我们在创建PVC的时候,应该确保和底下的PV能绑定,如果没有合适的PV,那么PVC就会处于pending(等待)状态

2.3.6、回收策略
  • 我们创建Pod时如果使用PVC做为存储卷,那么它会和PV绑定,当删除Pod,PVC和PV绑定就会解除,解除之后和PVC绑定的PV卷里的数据需要怎么处理,目前,卷可以保留,回收或删除:

Retain

​ 当删除PVC的时候,PV仍然存在,处于released状态,但是它不能被其他PVC绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的,这个是默认的回收策略

Recycle 简单擦除(rm -rf /thevolume/*)

Delete

​ 删除PVC时即会从Kubernetes中移除PV,也会从相关的外部设施中删除存储资产

2.3.7、访问模式
  • PersistentVolume(PV)卷可以用资源提供者所支持的任何方式挂载到宿主系统上。如下表所示,提供者(驱动)的能力不同,每个PV卷的访问模式都会设置为对应卷所支持的模式值。例如,NFS可以支持多个读写客户,但是某个特定的NFS PV卷可能在服务器上以只读的方式导出。每个PV卷都会获得自身的访问模式集合,描述的是特定PV卷的能力

  • 访问模式有:

ReadWriteOnce

​ 卷可以被一个节点以读写方式挂载。ReadWriteOnce访问模式也允许运行在同一节点上的多个Pod访问卷

ReadOnlyMant

​ 卷可以被多个节点以只读方式挂载

ReadWriteMany

​ 卷可以被多个节点以读写方式挂载

ReadWriteOncePod

​ 特性状态:Kubernetes v1.27[beat]

​ 卷可以被单个Pod以读写方式挂载。如果你想确保整个集群中只有一个Pod可以读取或写入该PVC,请使用 ReadWriteOncePod访问模式。这只支持CSI卷以及需要kubernetes 1.22以上版本

在命令行接口(CLI)中,访问模式也使用以下缩写形式:

  • RWO -ReadWriteOnce

  • ROX -ReadOnlyMany

  • RWX -ReadWriteMany

  • RWOP -ReadWriteOncePod

2.3.8 示例
  • 这里面为了方便演示,决定使用相对简单的NFS这种存储资源
2.3.8.1、资源列表
  • 这里面Kubernetes集群由Master、Node1、Node2节点组成,本节课不在演示Kubernetes的部署了,只解释NFS的部署,以及配置PV、PVC相关内容
操作系统主机名配置IP
CentOS 7.9master2C4G192.168.93.101
CentOS 7.9node12C4G192.168.93.102
CentOS 7.9node22C4G192.168.93.103
CentOS 7.9nfs2C4G192.168.93.104
2.3.8.2、部署NFS
  • NFS节点操作
2.3.8.2.1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
2.3.8.2.2、关闭内核安全机制
setenforce 0
sed -i "s/.*SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
2.3.8.2.3、安装
[root@nfs ~]# yum -y install nfs-utils rpcbind
[root@nfs ~]# mkdir -p /data/volumes
[root@nfs ~]# cat > /etc/exports << EOF
/data/volumes 192.168.93.0/24(rw,no_root_squash)
EOF
[root@nfs ~]# systemctl enable nfs --now
# 所有Kubernetes集群中的节点需要安装以下软件包用以支持NFS
yum -y install nfs-utils rpcbind
2.3.8.3、PV、PVC应用示例
  • 该yaml文件一共创建了3个资源,分别是PV、PVC、Pod
  • 启动PV的名字叫test-pv,指定的存储大小是1G(从NFS的/data/volumes分配的空间),回收策略是Delete,访问模式是ReadWriteMany
  • PVC叫test-pvc,请求的存储是1G,访问模式是ReadWriteMany
  • Pod挂载test-pvc这个PVC到/opt目录
[root@master ~]# cat pv-pvc-test.yaml 
apiVersion: v1
# 定义资源对象(PV)
kind: PersistentVolume
metadata:
# PV的名字
  name: test-pv
spec:
# 定义持久卷的存储容量,这里是1G
  capacity:
    storage: 1G
  # 定义回收策略
  persistentVolumeReclaimPolicy: Delete
  # 定义访问模式
  accessModes: ["ReadWriteMany"]
  # 指定持久卷的后端存储是NFS
  nfs:
  # NFS服务器上的路径
    path: /data/volumes
  # NFS服务器的IP地址
    server: 192.168.93.104
---
apiVersion: v1
# 定义资源对象(PVC)
kind: PersistentVolumeClaim
metadata:
# PVC的名字
  name: test-pvc
spec:
  # ReadWriteMany表示PVC期望的访问模式与PV匹配
  accessModes: ["ReadWriteMany"]
  # 定义PVC所需的存储资源
  resources:
  # PVC请求的最小存储容量
    requests:
      storage: 1G
   # PVC促成农户资源上限(不能超过1G)
    limits:
      storage: 1G
---
apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: test-pod
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: data
      mountPath: /opt
    command: ["sh","-c","sleep 1000"]
  volumes:
  # 定义存储卷的名字
  - name: data
    persistentVolumeClaim:
    # claimName:test-pvc表明这个卷使用名为test-pvc的持久化声明
      claimName: test-pvc
[root@master ~]# kubectl apply -f pv-pvc-test.yaml 
persistentvolume/test-pv created
persistentvolumeclaim/test-pvc created
pod/test created
# 查看Pod
[root@master ~]# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          15s


# 查看PVC
[root@master ~]# kubectl get pvc
NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-pvc   Bound    test-pv   1G         RWX                           27s


# 查看PV
[root@master ~]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS   REASON   AGE
test-pv   1G         RWX            Delete           Bound    default/test-pvc                           56s
# 查看PVC相关信息
[root@master ~]# kubectl describe pvc test-pvc
Name:          test-pvc
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        test-pv
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1G
Access Modes:  RWX
VolumeMode:    Filesystem
Used By:       test
Events:        <none>


# 查看PV相关信息
[root@master ~]# kubectl describe pvc test-pv
Name:          test-pvc
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        test-pv
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1G
Access Modes:  RWX
VolumeMode:    Filesystem
Used By:       test
Events:        <none>
# 写入数据进行验证
[root@master ~]# kubectl exec -it test -- sh -c 'date > /opt/time.txt'

[root@master ~]# kubectl exec -it test -- cat /opt/time.txt
Fri Jul  5 01:55:08 UTC 2024
# 查看Pod被被配到那个node节点上
[root@master ~]# kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE    IP           NODE    NOMINATED NODE   READINESS GATES
test   1/1     Running   0          4m3s   10.244.1.5   node2   <none>           <none>


# 登录到node2
[root@nfs ~]# cat /data/volumes/time.txt 
Fri Jul  5 01:55:08 UTC 2024

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

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

相关文章

离线安装arm架构Firefox

离线安装Firefox浏览器及其插件在ARM架构的设备上&#xff08;如树莓派、部分Android设备或其他采用ARM处理器的Linux系统&#xff09;可能需要一些特殊步骤&#xff0c;因为默认情况下&#xff0c;大多数浏览器和插件都是为x86架构设计的。对于ARM架构&#xff0c;你需要找到特…

深圳航空顶象验证码逆向,和百度验证码训练思路

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

Java项目:基于SSM框架实现的校园快递代取管理系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的校园快递代取管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

Windows系统下载安装ngnix

一 nginx下载安装 nginx是HTTP服务器和反向代理服务器&#xff0c;功能非常丰富&#xff0c;在nginx官网首页&#xff0c;点击download 在download页面下&#xff0c;可以选择Stable version稳定版本&#xff0c;点击下载 将下载完成的zip解压即可&#xff0c;然乎在nginx所在…

Spring Boot 中的监视器是什么?有什么作用?

前言&#xff1a; 监听器相信熟悉 Spring、Spring Boot 的都知道&#xff0c;但是监视器又是什么&#xff1f;估计很多人一脸懵的状态&#xff0c;本篇分享一下 Spring Boot 的监视器。 Spring Boot 系列文章传送门 Spring Boot 启动流程源码分析&#xff08;2&#xff09; …

《数字图像处理-OpenCV/Python》第17章:图像的特征描述

《数字图像处理-OpenCV/Python》第17章&#xff1a;图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第17章&#xff1a;图像的特征描述 特征检测与匹配是计算机视觉的…

opencv概念以及安装方法

#opencv相关概念介绍 Open Source Computer Vision Library 缩写 opencv 翻译&#xff1a;开源的计算机视觉库 &#xff0c;英特尔公司发起并开发&#xff0c;支持多种编程语言&#xff08;如C、Python、Java等&#xff09;&#xff0c;支持计算机视觉和机器学习等众多算法&a…

【C++】开源:nlohmann/json数据解析库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍nlohmann/json数据解析库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…

conda环境变量+常用操作+配置镜像源

、1、conda环境变量配置 根据我的上篇文章&#xff0c;应该都已经安装了conda和pycharm&#xff0c;然后可能会出现conda的没有配置到系统的环境变量上&#xff0c;这里首先教大家如何配置系统的环境变量&#xff0c;在进行后续操作&#xff0c;如果环境变量已经配置完毕可以自…

【C语言】指针(1)--入门理解

目录 一、内存和地址 二、指针变量和地址 三、指针变量类型的意义 一、内存和地址 只要讲指针就离不开内存 因为指针就是访问内存的 计算上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数 据也会放…

一款强大且免费开源的多连接数据库管理工具

大家好&#xff0c;今天给大家分享一款免费开源的跨平台数据库管理工具DbGate。 DbGate是一款免费开源的跨平台数据库管理工具&#xff0c;支持多种数据库&#xff0c;包括MySQL、PostgreSQL、SQL Server、MongoDB、SQLite等。它可以在Windows、Linux、Mac操作系统上运行&#…

亚信安全:《2024云安全技术发展白皮书》

标签 云计算 安全威胁 云安全技术 网络攻击 数据保护 一句话总结 《云安全技术发展白皮书》全面分析了云计算安全威胁的演进&#xff0c;探讨了云安全技术的发展历程、当前应用和未来趋势&#xff0c;强调了构建全面云安全防护体系的重要性。 摘要 云安全威胁演进&#xff…

刷题之合并两个有序数组(leetcode)

因为换了手机号码&#xff0c;之前leetcode的账号登不上去了&#xff0c;正好太久不刷题&#xff0c;很多思路都没了&#xff0c;所以重新开始刷leetcode&#xff01; 这道题很简单&#xff0c;指针模拟一下&#xff0c;从后往前考虑&#xff0c;先看最大值。 class Solution…

昇思25天学习打卡营第13天|linchenfengxue

Diffusion扩散模型 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;本文的介绍是基于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;&#xff0c;DDPM已经在&#xff08;无&#xff09;条件图像/音频/视频生成领域取得…

Qt json和xml操作

学习目标&#xff1a; 认识json和xml读写操作 前置环境 运行环境:qt creator 4.12 学习内容 XML XML&#xff08;Extensible Markup Language&#xff09;是一种标记语言,是一种用于描述数据结构的语言。它非常适合用于存储和传输数据。 XML 的主要特点如下: 可扩展性:XM…

【MySQL系列】VARCHAR 类型详解及其使用策略

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中英双语介绍伦敦大学学院(University College London,UCL)

中文版 伦敦大学学院&#xff08;UCL&#xff09;简介 位置和周边环境 伦敦大学学院&#xff08;University College London&#xff0c;简称UCL&#xff09;位于英国伦敦市中心的布卢姆斯伯里&#xff08;Bloomsbury&#xff09;区。具体地址为&#xff1a; Gower Street, …

Python 游戏服务器架构优化

优化 Python 游戏服务器的架构涉及多个方面&#xff0c;包括性能、可伸缩性、并发处理和网络通信。下面是一些优化建议&#xff1a; 1、问题背景 在设计 Python 游戏服务器时&#xff0c;如何实现服务器的横向扩展&#xff0c;以利用多核处理器的资源&#xff0c;并确保服务器…

更新GCC版本问题处理(Could not resolve host: mirrorlist.centos.org;)更换SCL配置源/SCL后yum使用不了

SCL&#xff1a; 在 Linux 系统中&#xff0c;更新 GCC&#xff08;GNU Compiler Collection&#xff09;编译器需要使用 Software Collections (SCL) 库的原因主要有以下几点&#xff1a; https://wiki.centos.org/AdditionalResources/Repositories/SCLhttps://wiki.centos…

【算法】(C语言):快速排序(递归)、归并排序(递归)、希尔排序

快速排序&#xff08;递归&#xff09; 左指针指向第一个数据&#xff0c;右指针指向最后一个数据。取第一个数据作为中间值。右指针指向的数据 循环与中间值比对&#xff0c;若大于中间值&#xff0c;右指针往左移动一位&#xff0c;若小于中间值&#xff0c;右指针停住。右…