0%

动态 PV 使用步骤

  1. 创建存储池并启用 RBD 功能。
  2. 创建 Ceph 用户,提供给k8s 使用。
  3. 在k8s 上安装ceph-common客户端。
  4. 复制ceph.conf以及admin用户的keyring文件到k8s节点(master and node)。
  5. 创建 Secret 资源,以 keyring 的key 为 data。
  6. 动态 PV使用
    1. 创建 StorageClass
    2. 创建PVC
    3. 创建POD
阅读全文 »

静态 PV 使用步骤

  1. 创建存储池并启用 RBD 功能。
  2. 创建 Ceph 用户,提供给k8s 使用。
  3. 在k8s 上安装ceph-common客户端。
  4. 复制ceph.conf以及admin用户的keyring文件到k8s节点(master and node)。
  5. 创建 Secret 资源,以 keyring 的key 为 data。
  6. 静态 PV 使用:
    1. 创建PV
    2. 创建PVC
    3. 在 Ceph 存储池里创建对应的 RBDImage
    4. 创建 POD
阅读全文 »

通过 Arthas 中的 trace/monitor/watch/stack/tt 等命令,可以查看方法内部调用信息,从而定位定位方法调用问题。

sc(已加载的类信息)

方法介绍

“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息。

官方文档:

https://arthas.aliyun.com/doc/sc.html

参数说明

使用 sc --help 获取 sc 命令的帮助信息:

[arthas@32344]$ sc -help
 USAGE:
   sc [-c <value>] [-d] [-x <value>] [-f] [-h] [-E] class-pattern

 SUMMARY:
   Search all the classes loaded by JVM

 EXAMPLES:
   sc -d org.apache.commons.lang.StringUtils
   sc -d org/apache/commons/lang/StringUtils
   sc -d *StringUtils
   sc -d -f org.apache.commons.lang.StringUtils
   sc -E org\\.apache\\.commons\\.lang\\.StringUtils

 WIKI:
   https://alibaba.github.io/arthas/sc

 OPTIONS:
 -c, --classloader <value>               The hash code of the special class's classLoader
 -d, --details                           Display the details of class
 -x, --expand <value>                    Expand level of object (0 by default)
 -f, --field                             Display all the member variables
 -h, --help                              this help
 -E, --regex                             Enable regular expression to match (wildcard matching by default)
 <class-pattern>                         Class name pattern, use either '.' or '/' as separator

主要参数说明如下:

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。 如果一个类被多个 ClassLoader 所加载,则会出现多次
[E] 开启正则表达式匹配,默认为通配符匹配
[f] 输出当前类的成员变量信息(需要配合参数 - d 一起使用)
[x:] 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出
[c:] 指定 class 的 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[n:] 具有详细信息的匹配类的最大数量(默认为 100)

查看已加载的类信息

模糊搜索:

[arthas@32344]$ sc sample.*
sample.demo.ServerDemoApplication
sample.demo.ServerDemoApplication$$EnhancerBySpringCGLIB$$1a055512
sample.demo.controller.UserController
sample.demo.service.UserService
Affect(row-cnt:4) cost in 7 ms.

打印类的详细信息:

[arthas@32344]$ sc -d sample.demo.controller.UserController
 class-info        sample.demo.controller.UserController
 code-source       /C:/Codes/JavaWorkSpace/workspace48/arthas-demo/target/classes/
 name              sample.demo.controller.UserController
 isInterface       false
 isAnnotation      false
 isEnum            false
 isAnonymousClass  false
 isArray           false
 isLocalClass      false
 isMemberClass     false
 isPrimitive       false
 isSynthetic       false
 simple-name       UserController
 modifier          public
 annotation        org.springframework.scheduling.annotation.EnableScheduling,org.springframework.web.bind.annotation.
                   RestController
 interfaces
 super-class       +-java.lang.Object
 class-loader      +-sun.misc.Launcher$AppClassLoader@73d16e93
                     +-sun.misc.Launcher$ExtClassLoader@2752f6e2
 classLoaderHash   73d16e93

Affect(row-cnt:1) cost in 19 ms.

打印出类的 Field 信息:

[arthas@32344]$ sc -d -f sample.demo.controller.UserController
 class-info        sample.demo.controller.UserController
 code-source       /C:/Codes/JavaWorkSpace/workspace48/arthas-demo/target/classes/
 name              sample.demo.controller.UserController
 isInterface       false
 isAnnotation      false
 isEnum            false
 isAnonymousClass  false
 isArray           false
 isLocalClass      false
 isMemberClass     false
 isPrimitive       false
 isSynthetic       false
 simple-name       UserController
 modifier          public
 annotation        org.springframework.scheduling.annotation.EnableScheduling,org.springframework.web.bind.annotation.
                   RestController
 interfaces
 super-class       +-java.lang.Object
 class-loader      +-sun.misc.Launcher$AppClassLoader@73d16e93
                     +-sun.misc.Launcher$ExtClassLoader@2752f6e2
 classLoaderHash   73d16e93
 fields            name     log
                   type     org.slf4j.Logger
                   modifier final,private,static
                   value    Logger[sample.demo.controller.UserController]

                   name       userService
                   type       sample.demo.service.UserService
                   modifier   private
                   annotation org.springframework.beans.factory.annotation.Autowired


Affect(row-cnt:1) cost in 6 ms.

sm(已加载类的方法信息)

方法介绍

“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。

官方文档:

https://arthas.aliyun.com/doc/sm.html

参数说明

使用 sm --help 获取 thread 命令的帮助信息:

[arthas@32344]$ sm --help
 USAGE:
   sm [-c <value>] [-d] [-h] [-E] class-pattern [method-pattern]

 SUMMARY:
   Search the method of classes loaded by JVM

 EXAMPLES:
   sm java.lang.String
   sm -d org.apache.commons.lang.StringUtils
   sm -d org/apache/commons/lang/StringUtils
   sm *StringUtils *
   sm -Ed org\\.apache\\.commons\\.lang\.StringUtils .*

 WIKI:
   https://alibaba.github.io/arthas/sm

 OPTIONS:
 -c, --classloader <value>               The hash code of the special class's classLoader
 -d, --details                           Display the details of method
 -h, --help                              this help
 -E, --regex                             Enable regular expression to match (wildcard matching by default)
 <class-pattern>                         Class name pattern, use either '.' or '/' as separator
 <method-pattern>                        Method name pattern

主要参数说明如下:

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 展示每个方法的详细信息
[E] 开启正则表达式匹配,默认为通配符匹配
[c:] 指定 class 的 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[n:] 具有详细信息的匹配类的最大数量(默认为 100)

查看方法信息

展示类的所有方法:

[arthas@32344]$ sm  sample.demo.controller.UserController
sample.demo.controller.UserController <init>()V
sample.demo.controller.UserController getUser(Ljava/lang/Integer;)Ljava/util/HashMap;
sample.demo.controller.UserController sample()V
Affect(row-cnt:3) cost in 33 ms.

展示方法的详细信息:

[arthas@32344]$ sm -d sample.demo.controller.UserController getUser
 declaring-class  sample.demo.controller.UserController
 method-name      getUser
 modifier         public
 annotation       org.springframework.web.bind.annotation.GetMapping
 parameters       java.lang.Integer
 return           java.util.HashMap
 exceptions       java.lang.Exception
 classLoaderHash  73d16e93

Affect(row-cnt:1) cost in 4 ms.

块设备相关文档

http://docs.ceph.org.cn/rbd/rbd/

rbd 命令

创建 rbd

$ rbd create --size 10240 kcha/mysqldata

查看 rbd

$ rbd list kcha
mysqldata

调整块设备映像大小:

$ rbd resize --size 10240 kcha/mysqldata
Resizing image: 100% complete...done.

查看信息:

$ rbd info kcha/mysqldata
rbd image 'mysqldata':
        size 10240 MB in 2560 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.b21066b8b4567
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        flags:

移除 features

$ rbd feature disable kcha/mysqldata exclusive-lock, object-map, fast-diff, deep-flatten

rbd 占用

查看 rbd 实际占用:

$ rbd diff kcha/mysqldata | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
860.449 MB
$ rbd diff kcha/mysqldata | awk '{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }'
0.840282 GB

删除 rbd

直接删除:

$ rbd rm kcha/mysqldata
Removing image: 100% complete...done.

若 rbd 被占用,则需要先将占用加入黑名单,后再删除。

# 加入黑名单
$ ceph osd blacklist add 10.105.136.63:0/1081512968
blacklisting 10.105.136.63:0/1081512968 until 2020-09-01T10:46:28.920245+0000 (3600 sec)
# 删除
$ rbd rm kcha/mysqldata
Removing image: 100% complete...done.
# 查看黑名单
$ ceph osd blacklist ls
listed 1 entries
10.105.136.63:0/1081512968 2020-09-01T10:46:28.920245+0000
# 移除黑名单
$ ceph osd blacklist rm 10.105.136.63:0/1081512968
un-blacklisting 10.105.136.63:0/1081512968

导入导出

$ rbd export kcha/mysqldata ~/mysqldata
Exporting image: 100% complete...done.
$ rbd import ~/mysqldata  mantidata/mysqldata --image-format 2
Importing image: 100% complete...done.

RBD 特性解析

特性一览表

RBD 支持的特性,及具体 BIT 值的计算如下

属性 功能 BIT 码
layering 支持分层 1
striping 支持条带化 v2 2
exclusive-lock 支持独占锁 4
object-map 支持对象映射(依赖 exclusive-lock ) 8
fast-diff 快速计算差异(依赖 object-map ) 16
deep-flatten 支持快照扁平化操作 32
journaling 支持记录 IO 操作(依赖独占锁) 64

默认属性值

ceph kraken 版本默认属性值

# ceph --show-config|grep rbd|grep featuresrbd_default_features = 61

为啥是 61?我们创建一个默认配置的 rbd 看看

# rbd create test-feature --size 64# rbd info rbd/test-featurerbd image 'test-feature':	size 65536 kB in 16 objects	order 22 (4096 kB objects)	block_name_prefix: rbd_data.107d238e1f29	format: 2	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten	flags:

1+4+8+16+32 = 61

就是说除了特性:striping 和 journaling 外都开启了。

控制属性

有三种方法来开启需要的特性

1、在创建 image 时,通过 --image-feature 来指定需要开启的特性

2、对已存在的 image 可以通过如下命令开启和关闭

rbd feature enable <pool-name>/<image-name> <feature-name>rbd feature disable <pool-name>/<image-name> <feature-name>

3、当然,每次通过 enable 和 disable 来不是很便捷,可以通过修改配置文件来解决

vim /etc/ceph/ceph.conf...rbd_default_features = 1...

具体该设为多少可以通过上面 BIT 值查表计算得出。