动态存储管理
A. Kubernetes 基于GlusterFS+heketi的高可用动态存储管理StorageClass
Kubernetes中使用GlusterFS作为持久化存储,要提供storageClass使用需要依赖Heketi工具。Heketi是一个具有resetful接口的glusterfs管理程序,作为kubernetes的Storage存储的external provisioner。 “Heketi提供了一个RESTful管理界面,可用于管理GlusterFS卷的生命周期。借助Heketi,像OpenStack Manila,Kubernetes和OpenShift这样的云服务可以动态地配置GlusterFS卷和任何支持的持久性类型。Heketi将自动确定整个集群的brick位置,确保将brick及其副本放置在不同的故障域中。Heketi还支持任意数量的GlusterFS集群,允许云服务提供网络文件存储,而不受限于单个GlusterFS集群。
heketi:提供基于RESTful接口管理glusterfs的功能,可以方便的创建集群管理glusterfs的node,device,volume;与k8s结合可以创建动态的PV,扩展glusterfs存储的动态管理功能。主要用来管理glusterFS volume的生命周期,初始化时候就要分配好裸磁盘(未格式化)设备.
注意事项:
安装Glusterfs客户端:每个kubernetes集群的节点需要安装gulsterfs的客户端,如glusterfs-cli,glusterfs-fuse.主要用于在每个node节点挂载volume。
加载内核模块:每个kubernetes集群的节点运行modprobe dm_thin_pool,加载内核模块。
高可用(至少三个节点):至少需要节点用来部署glusterfs集群,并且这3个节点每个节点需要至少一个空余的磁盘。
基础设施要求:
正在运行的glusterfs集群,至少有三个node节点,每个节点至少有一个可用的裸块设备(如EBS卷或本地磁盘,就是没有格式化的).
用于运行GlusterFS节点必须为GlusterFS通信打开相应的端口(如果开启了防火墙的情况下,没开防火墙就不需要这些操作)。
安装依赖及常用工具包:
yum -y install flex bison openssl openssl-devel libxml2-devel gcc lrzsz vim*
查找gluster的最新软件仓库:
yum search centos-release-gluster
安装最新版本的gluster软件仓库:
yum install centos-release-gluster7.noarch -y
安装gluster源,并安装glusterfs及相关软件包
yum install glusterfs glusterfs-server glusterfs-cli glusterfs-geo-replication glusterfs-rdma -y
客户端安装GlusterFS客户端软件
yum install glusterfs-fuse glusterfs-cli
启动Glusterd服务
systemctl start glusterd
systemctl enable glusterd --now //设开机自启,并立即启动服务
在任意一个节点上添加信任节点
gluster peer probe node99
gluster peer probe node110
gluster peer probe node145
gluster peer probe node108
查看节点状态:
gluster peer status //查看节点状态
创建复制卷
mkdir /glusterfs/storage1/rep_vol1
gluster volume create rep_vol1 replica 2 node99:/glusterfs/storage1/rep_vol1 node108:/glusterfs/storage1/rep_vol1
创建分布式卷
gluster volume create vdisk1 node108:/brick1 node110:/brick1 brick node145:/brick1 force
创建分布式复制卷
gluster volume create fbfz replica 2 transport tcp node108:/gluster/fbfz1 node110:/gluster/fbfz1 node145:/gluster/fbfz1 node108:/gluster/fbfz2 node110:/gluster/fbfz2 node145:/gluster/fbfz2 force
启动卷
gluster volume start rep_vol1
查看卷状态
gluster volume status
gluster volume info
客户端测试挂载卷
mount -t glusterfs node108:rep_vol /tmp/aaa
mount -t glusterfs node145:fbfz /mnt/fbfz
客户端测试卷数据存储
for i in `seq -w 1 3`;do cp -rp /var/log/messages /tmp/aaa/test-$i;done
其他备用操作
停止卷:
gluster volume stop vdisk2
删除卷:
gluster volume delete vdisk2
将某个存储节点主机从信任池中删除:
gluster peer detach node2
Heketi是由golang编写,直接静态编译运行二进制即可,也可以通过yum安装以及docker部署,主要会产生db文件存储cluster、node、device、volume等信息。
安装二进制包
wget -c https://github.com/heketi/heketi/releases/download/v8.0.0/heketi-v8.0.0.linux.amd64.tar.gz tar zxvf heketi-v9.0.0.linux.amd64.tar.gz
mkdir -pv /opt/heketi/{bin,conf,data}
cp heketi/heketi.json /opt/heketi/conf/
cp heketi/{heketi,heketi-cli} /opt/heketi/bin/
创建ssh-key
我们glusterFS部署在k8s集群外,所以heketi通过ssh管理glusterFS。需要创建免秘钥登陆到所有glusterFS节点。
ssh-keygen -f /opt/heketi/conf/heketi_key -t rsa -N ''
ssh--id -i /opt/heketi/conf/heketi_key.pub root@node108 -p 2222
ssh--id -i /opt/heketi/conf/heketi_key.pub root@node110 -p 2222
ssh--id -i /opt/heketi/conf/heketi_key.pub root@node145 -p 2222
配置文件修改
注意:
需要说明的是,heketi有三种executor,分别为mock、ssh、kubernetes,建议在测试环境使用mock,生产环境使用ssh,当glusterfs以容器的方式部署在kubernetes上时,才使用kubernetes。我们这里将glusterfs和heketi独立部署,使用ssh的方式。
使用docker部署的时候,还需将/var/lib/heketi/mounts 挂载至容器里面, heketi 会将此目录作为 gluster volume的挂载点。
systemd配置
cat /usr/lib/systemd/system/heketi.service
启动heketi服务
systemctl start heketi
systemctl enable heketi
systemctl status heketi
添加cluster
/opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey --json cluster create
将3个glusterfs节点作为node添加到cluster
添加节点
opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey --json node add --cluster "" --management-host-name node108 --storage-host-name 10.14.151.108 --zone 1
/opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey --json node add --cluster "" --management-host-name node110 --storage-host-name 10.14.151.110 --zone 1
/opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey --json node add --cluster "" --management-host-name node145 --storage-host-name 10.14.151.145 --zone 1
查看节点:
/opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey node list
添加device
机器只是作为gluster的运行单元,volume是基于device创建的。同时需要特别说明的是,目前heketi仅支持使用裸分区或裸磁盘(未格式化)添加为device,不支持文件系统。
/opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey --json device add --name="/dev/sdb" --node ""
/opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey --json device add --name="/dev/sdb" --node ""
/opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey --json device add --name="/dev/sdb" --node ""
注:--node参数给出的id是上一步创建node时生成的,实际配置中,要添加每一个节点的每一块用于存储的硬盘。
生产实际配置
以上ad-hoc命令均可通过配置文件创建然后导入:
$ sudo cat /data/heketi/conf/topology.json
创建:
$ sudo heketi-cli topology load --json topology.json
添加volume
这里仅仅是做一个测试,实际使用中,会由kubernetes自动创建pv.
创建一个大小为3G,副本为2的volume
opt/heketi/bin/heketi-cli --user admin --server http://10.143.143.111:18080 --secret adminkey volume create --size 3 --replica 2
kubernetes storageclass 配置
创建storageclass
添加storageclass-glusterfs.yaml文件,内容如下:
cat storageclass-glusterfs.yaml
kubectl apply -f storageclass-glusterfs.yaml
kubectl get sc
注意:
storageclass.beta.kubernetes.io/is-default-class: "true" #表示此storageClass作为default sc,创建pvc不指定sc时,默认使用此sc.
reclaimPolicy: Retain #表示pv回收策略为保留,删除pvc时将不删除pv。
更详细的用法参考: <u>https://kubernetes.io/docs/concepts/storage/storage-classes/#glusterfs</u>
创建pvc
kubectl create -f glusterfs-pvc.yaml
cat glusterfs-pvc.yaml
kubectl create -f glusterfs-pvc.yaml
kubectl get pv
kubectl get pvc
创建pod,使用pvc
cat mysql-deployment.yaml
kubectl create -f mysql-deployment.yaml
kubectl get deploy
kubectl get pods
kubectl exec -ti mysql-b75b5dcfb-cb7qm sh
df -Th
创建statefulset
kubectl apply -f nginx-statefulset.yml
kubectl get pod,pv,pvc
我们可以看到RECLAIM POLICY: Retain ,经过测试
删除pvc,pv status会变成Released状态,且不会被删除
删除pv, 通过heketi-cli volume list查看,volume不会被删除
kubernetes pv和gluster volume不一致时,可使用heketi来统一管理volume.此文档heketi和glusterfs都在kubernetes集群外部署。对于支持AWS EBS的磁盘,可通过EBS storageClass方式将glusterFS heketi部署在容器中管理.参考 https://github.com/gluster/gluster-kubernetes
参考文档
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
https://kubernetes.io/docs/concepts/storage/storage-classes/#glusterfs
https://github.com/heketi/heketi/blob/master/docs/admin/readme.md
https://www.cnblogs.com/breezey/p/8849466.html
https://www.cnblogs.com/breezey/p/8849466.html )
验证测试:
kubectl exec -ti mysql-b75b5dcfb-cb7qm sh
说明挂掉一个节点是不影响用户使用的。
B. 动态储存分配的特点和优化目标有哪些
动态存储分配即指在目标程序或操作系统运行阶段动态地为源程序中的量分配存储空间。根据查询相关公开信息显示,动态存储分配包括栈式或堆两种分配方式。采用动态存储分配进行处理的量,并非所有的工作全部放在运行时刻做,编译程序在编译阶段要为其设计好运行阶段存储组织形式,并为每一个数据项安排好它在数据区中的相对位置。
C. 动态视频存储器技术总内存容量怎么设置
1、首先打开手机设置界面,点击存储器管理。
2、其次,选择动态视频技术管理方面,点击内存容量选择。
3、最后,在存储器中选择内存的大小赋予给动态视频即可。
D. 动态存储管理系统中,通常可有( )种不同的分配策略. A.2 B.3 C.4 D.5
三种
E. malloc函数实现的功能是什么
malloc 原型:extern void *malloc(unsigned int num_bytes); 用法:#include <malloc.h> 或#include<stdlib.h> 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存块释放。 malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针.malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。 动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。本文简单介绍动态内存分配函数malloc()及几种实现方法。 1. 简介 malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。 2. 函数说明 C语言的动态存储管理由一组标准库函数实现,其原型在标准文件<stdlib.h>里描述,需要用这些功能时应包含这个文件。与动态存储分配有关的函数共有四个,其中就包括存储分配函数malloc()。函数原型是:void *malloc (size_t n);这里的size_t是标准库里定义的一个类型,它是一个无符号整型。这个整型能够满足所有对存储块大小描述的需要,具体相当于哪个整型由具体的C系统确定。malloc的返回值为(void *)类型(这是通用指针的一个重要用途),它分配一片能存放大小为n的数据的存储块,返回对应的指针值;如果不能满足申请(找不到能满足要求的存储块)就返回NULL。在使用时,应该把malloc的返回值转换到特定指针类型,赋给一个指针。 注意,虽然这里的存储块是通过动态分配得到的,但是它的大小也是确定的,同样不允许越界使用。例如上面程序段分配的块里能存n个双精度数据,随后的使用就必须在这个范围内进行。越界使用动态分配的存储块,尤其是越界赋值,可能引起非常严重的后果,通常会破坏程序的运行系统,可能造成本程序或者整个计算机系统垮台。 下例是一个动态分配的例子: #include <stdio.h> #include<stdlib.h> main() { int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/ count=100; if((array=(int *)malloc(10*sizeof(int))) == NULL) { printf("不能成功分配存储空间。"); exit(1); } for(count=0;count<10;count++) /*给数组赋值*/ array[count]=count; for(count=0;count<10;count++) /*打印数组元素*/ printf("%2d",array[count]); } 上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array=(int *) malloc (10*sizeof(int)))==NULL)语句可以分为以下几步: 1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针 2)把此整型指针地址赋给array 3)检测返回值是否为NULL
F. Kubernetes 基于GlusterFS的动态存储管理StorageClass
最近由于需要部署有状态服务,没有云环境的支持,不能很好的通过cloud provider调用云磁盘EBS,所以在node节点部署了一套glusterFS分布式文件存储系统,用来提供非结构化数据存储,存储图片,大文件等等.
Kubernetes中使用GlusterFS作为持久化存储,要提供storageClass使用需要依赖Heketi工具。Heketi是一个具有resetful接口的glusterfs管理程序,作为kubernetes的Storage存储的external provisioner。 “Heketi提供了一个RESTful管理界面,可用于管理GlusterFS卷的生命周期。借助Heketi,像OpenStack Manila,Kubernetes和OpenShift这样的云服务可以动态地配置GlusterFS卷和任何支持的持久性类型。Heketi将自动确定整个集群的brick位置,确保将brick及其副本放置在不同的故障域中。Heketi还支持任意数量的GlusterFS集群,允许云服务提供网络文件存储,而不受限于单个GlusterFS集群。
Heketi是由golang编写,直接静态编译运行二进制即可也可以通过yum安装以及docker部署,主要会产生db文件存储cluster、node、device、volume等信息。
我们glusterFS部署在k8s集群外,所以heketi通过ssh管理glusterFS。需要创建免秘钥登陆到所有glusterFS节点。
参考 https://github.com/heketi/heketi/blob/master/client/cli/go/topology-sample.json
注意:
由于我们开启了heketi认证,所以每次执行heketi-cli操作时,都需要带上一堆的认证字段,比较麻烦,我在这里创建一个别名来避免相关操作:
注意: 如果heketi 运行账号为非root,需要保证有sudo权限。
机器只是作为gluster的运行单元,volume是基于device创建的。同时需要特别说明的是,目前heketi仅支持使用裸分区或裸磁盘(未格式化)添加为device,不支持文件系统。
以上ad-hoc命令均可通过配置文件创建然后导入:
创建:
这里仅仅是做一个测试,实际使用中,会由kubernetes自动创建pv.
创建一个大小为3G,副本为2的volume
添加storageclass-glusterfs.yaml文件,内容如下:
注意:
更详细的用法参考: https://kubernetes.io/docs/concepts/storage/storage-classes/#glusterfs
我们可以看到RECLAIM POLICY: Retain ,经过测试
kubernetes pv和gluster volume不一致时,可使用heketi来统一管理volume.此文档heketi和glusterfs都在kubernetes集群外部署。对于支持AWS EBS的磁盘,可通过EBS storageClass方式将glusterFS heketi部署在容器中管理.参考 https://github.com/gluster/gluster-kubernetes
G. C语言中的动态存储管理的命令的作用是什么
malloc()是动态内存分配函数,用来向系统请求分配内存空间。当无法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数。因为malloc只分配内存空间,并不能对分配的空间进行初始化,所以申请到的内存中的值是随机的,经常会使用memset()进行置0操作后再使用。
