首页 文章 精选 留言 我的

精选列表

搜索[虚拟化平台],共10000篇文章
优秀的个人博客,低调大师

自动化运维工具Ansible-playbook详解和案例实战(四)

1、playbook-剧本介绍 playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。 1.1、核心元素 hosts:执行的远程主机列表 tasks:任务,由模板定义的操作列表 variables:变量,内置变量或者自定义变量在playboook中调用 templates:模板,即 使用模板语法的文件;可替换模板中的变量并实现一些简单逻辑的而文件 handlers:处理器,和notify结合使用 ;当某条件满足时,触发执行的操作 tags:标签,指定某条件下,用于选择运行playbook中的部分代码。Ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常的长。此时,如果确信其没有变化,就可以通过tags跳过这些代码片段 roles:角色 1.2、基础组件 hosts:playbook中的每个play的目的都是为了让某个或者某些主机在某个指定的用户身份执行任务。hosts用于指定任务的主机,须事先定义在主机清单中形式如下: hosts: websrvs remote_user:可用于hosts和tasks中,也可以通过指定sudo的方式在远程主机上执行,其可用于paly全局或某任务;此外甚至可以在sudo时使用sudo_user指定sudo时切换的用户形式如下: hosts: 192.168.16.10 remote_user: root tasks:name: test connectionping:remote_user: rootsudo: yessudo_user: root 3. tasks:任务列表;格式有两种: action: module argument module: argument 建议使用 注意:shell和command模块后面跟命令,而非key=value 某任务的状态在运行后changed时,可通过‘notify’通知给相应的handlers 任务可以通过‘tags’打标签,而后可在absible-playbook命令上使用-t指定进行调用 示例: ```bash tasks: - name: disable selinux command: /sbin/setenforce 0 如果命令或者脚本的退出码不为零,可以使用一下方式替代 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true 或者 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True 1.3、yaml语法 YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构,其结构通过空格来展示。(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对)YAML文件扩展名通常为.yaml或者.yml。下面为示例一定要对齐,只能使用空格 name: wkx #冒号后有空格 age: 28 gender: male spouse: name: rlt age: 27 gender: female children: - name: dabao #横杠后有空格 age: 4 gender: femle - name: xiaobao age: 1 gender: male 1.4、playbook的运行方式 ansible-playbook <filename.yaml> ... [options]常用选项:--check 只检测可能会发生的改变,但不真正执行操作--list-hosts 列出运行任务的主机--limit 主机列表,只针对主机列表中的主机执行-v 显示过程 -vv -vvv 更详细ansible-playbook file.yaml --check 只检测Ansible-playbook file.yaml 执行Ansible-playbook file.yaml --limit websevs 仅websevs主机执行 1.5、Playbook VS shellscript Shell脚本 #!/bin/bash # install apache yum -y install httpd #copy conf file cp /tmp/http.conf /etc/httpd/conf/httpd.conf #start service systemctl enable httpd systemctl start httpd Palybook - hosts: wensevs remote_user: root tasks: - name: install apache yum: name=httpd - name: copy conf file copy: src=/tmp/http.conf dest=/etc/httpd/conf/httpd.conf - name: start service service: name=httpd state=started enabled=yes 2、handles和notify结合条件使用 Handlers:是task列表,这些task与前述的task并没有本质的区别,用于当关注的资源发生变化时,才会采取一定的操作Notify:此action被用于每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,尽在所有变化发生后完成一次性的执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。示例:Handles和notify的使用: - hosts: websrvs remote_user: root tasks: - name: add group nginx tags: user user: name=nginx state=present - name: add user nginx group: name=nginx state=present group=nginx - name: install nginx yum: name=nginx state=present - name: copy file copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf notify: - restart nginx - check nginx process handlers: - name: restart nginx #必须和notify中定义的名字一致 service: name=nginx status=restarted enabled=yes - check nginx process shell: killall -0 nginx > /tmp/nginx.log Tags的使用 1. hosts: wensrvs remote_user: root tasks: 2. name: install httpd yum: name=httpd status=present 3. name: copy conf file copy: src=files/httpd.conf dest=/etc/httpd/conf/httpd.conf tags: conf 4. name: start service tags: service service: name=httpd state=started enabled=yes 3、playbook中变量使用 3.1、变量 变量名:仅能由字母、数字和下划线组成,且只能以字母开头变量来源: ansible setup 模块下的变量都可以使用 /etc/ansible/hosts中定义的普通变量:主机组中主机单独定义,优先级高于公共变量公共组变量:针对主机组中所有的主机定义统一变量 通过命令行指定变量,优先级最好ansible-playbook -e varname=value 在playbook中定义var:var1: value1var2: value2 在role中定义 3.2、变量的调用方式 通过{{ variable_name }}调用变量,且变量名前后必须有空格,有时候使用”{{ variable_name }}”才能生效 anible-playbook -e 选项指定ansible-playbook -e "hosts=www user=wkx" test.yaml 3.3、使用变量 使用变量文件 cat vars.yaml var1: httpd var2: nginx cat var.yaml - hosts: 192.168.16.115 remote_user: root vars_files: - vars.yaml tasks: - name: touch httpd.txt file: name={{var1}}.txt state=touch #默认创建在当前用户下 - name: touch nginx.log file: name={{var2}}.log state=touch 使用setup变量 cat var.yaml - hosts: 192.168.16.115 remote_user: root tasks: - name: create log file file: name=/root/ansible-test/{{ ansible_fqdn }} state=touch #{{ ansible_fqdn }}为setup模块中域名的一个内置变量 命令行使用变量 cat var.yaml - hosts: 192.168.16.115 remote_user: root tasks: - name: create log file file: name=/root/ansible-test/{{ pkg }} state=touch ansible-playbook -e pkg=haha var.yaml hosts中的变量(/etc/asible/hosts) [websrvs:vars] #公共(组)变量 mark="-" [websrvs] #普通变量 192.168.16.115 hname=wg sname=115 192.168.16.118 hname=wg sname=118 ansible websrvs -m hostname -a 'name= {{ hname }}{{ mark }}16{{ mark }}{{sname}}' 3.4、模板文件templetes 文本文件,嵌套有脚本(使用模板编程语言编写)Jinja2语音,使用 字面量,有下面形式字符串:使用单引号或者双引号数字:整数、浮点数列表:[haha,xixi,hehe,lele]元组:(haha,xixi,hehe,lele)字典:{name:wkx,gender:male}布尔型:true、false算术运算:+、-、*、/、//、%、** 分别是加减乘除整除求余幂比较操作:==,!=,>,<,>=,<=逻辑运算:and,or,not流表达式:for,if,when When条件测试:如果需要根据变量、facts或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式示例: cat var.yaml - hosts: 192.168.16.115 remote_user: root tasks: - name: "create file" file: name="/root/ansible-test/xixi" state=touch when: ansible_os_family == "RedHat" 迭代嵌套自变量示例1: - hosts: 192.168.16.115 remote_user: root tasks: - name: "create some file" file: name=/root/ansible-test/{{ item }} state=touch #创建文件,嵌套变量在下面 when: ansible_distribution_major_version == "7" #匹配条件,条件满足时执行 with_items: - haha - xixi - lele - name: install some packages yum: name={{ item }} with_items: - lrzsz - net-tools 示例2: cat user.yaml - hosts: 192.168.16.115 remote_user: root tasks: - name: "create some group" group: name={{ item }} when: ansible_distribution_major_version == "7" with_items: - g1 - g2 - g3 - name: cerate user user: name={{ item.name }} group={{ item.group }} with_items: - { name: "user1",group: "g1"} - { name: "user2",group: "g2"} - { name: "user3",group: "g3"} Playbook中template for if {% for vhost in nginx_vhosts %} server{ listen {{ vhost.listen | default(‘80 default_server’)}}; {% if vhost.server_name is defined %} Server_name{{ vhost.server_name }}; {% endif %} {% if vhost.root is defined %} root {{ vhost.root }} {% endif %} 示例1: cat temnginx.yaml --- - hosts: websrvs remote_user: root vars: nginx_hosts: - 80 - 8088 - tasks: - name: templete config template: src=/root/ansible-test/nginx.conf.j2 dest=/root/nginx.conf cat nginx.conf.j2 {% for vhost in nginx_hosts %} server { listen {{ vhost }} } {% endfor %} 生成为文件为 cat /root/nginx.conf server { listen 80 } server { listen 8088 } 示例2: cat temnginx.yaml --- - hosts: websrvs remote_user: root vars: nginx_hosts: - web1: listen: 8080 root: "/var/www/nginx/web1/" - web2: listen: 8080 server_name: "www.wkx.com" root: "/var/www/nginx/web2/" tasks: - name: templete config template: src=/root/ansible-test/nginx.conf.j2 dest=/root/nginx.conf cat nginx.conf.j2 {% for vhost in nginx_hosts %} server { listen {{ vhost.listen }} {% if vhost.server_name is defined %} server_name {{ vhost.server_name }} {% endif %} root {{ vhost.root }} } {% endfor %} 4、通过ansible-playbook实现对zabbix-agent批量安装 cat zabbix-agent.yml - hosts: agent remote_user: root tasks: - name: copy zabbix-agent copy: src=/mnt/zabbix-agent-4.4.0-1.el7.x86_64.rpm dest=/tmp - name: install zabbix-agent yum: name=/tmp/zabbix-agent-4.4.0-1.el7.x86_64.rpm - name: copy config copy: src=/etc/zabbix/zabbix_agentd.conf dest=/etc/zabbix/zabbix_agentd.conf - name: modify conf hostname lineinfile: path: /etc/zabbix/zabbix_agentd.conf regexp: "^Hostname" line: "Hostname={{ansible_hostname}}" - name: start zabbix-agent service: name=zabbix-agent state=started enabled=yes 5、role ansible自1.2版本后引入的新特性。用于层次性、结构性的组织playbook。Roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来说,roles就是通过分别将变量、文件、任务、模板以及处理器放置于单独的目录中,并可以便捷的include他们的一种机制。角色一般基于主机结构构建服务的场景中,但也可以是用于构建守护进程等场景中。 复杂场景:建议使用roles,代码复用度高变更主机及主机组如命名不规范维护或传承成本高某些功能需要多个playbook,通过include实现Ansible的roles目录结构每个角色,以特定的层级目录结构进行组织 Roles目录结构: playbook.yaml roles/ project/ 项目名称,有以下子目录 tasks/ 定义task、role的基本元素,至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含 files/ 存放由copy或者script模块调用的文件 vars/ 不常用,定义变量;至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含 default/ 不常用,设定默认变量时使用此目录中的main.yaml templates/ template模块查找所需要的模板问文件的目录 handlers/ meta/ 不常用,定义当前角色的特殊设定以及依赖关系;至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含

优秀的个人博客,低调大师

可视化搭建系统码良 v1.0.6 发布,支持组件商城

Bug Fixes element-ui 降级,解决 codepanel 标题栏数据不更新问题 (ea0f350) vue-router 路由以后,页面适配错误 (63ad4b2) 不上传psd源文件 (cb835c1) 不上传psd源文件 (25e78b8) 修护psd导入资源动画设置失效bug (4a64a73) 修护编辑器在保存的时候,保存失败的bug (715266d) 修护预览页面没提前保存,以及保存过程截图性能慢的问题 (230d39d) 修改动画功能描述图片 (45f0661) 修改数据熟悉外部修改数据,不能同步到编辑器中的bug (9de8893) 修改点击按钮前往商城的逻辑 (f276d18) 删除无用代码 (35a812e) 动画编辑器禁止状态切换失败bug (23561fc) 升级vue版本到最新2.6.11 (b577ca5) 去除默认组件,添加添加组件的引导 (c6ba88c) 对tip添加最大宽度 (ab33be0) 引入vue最新版本 (fa809db) 比例调整 (a0e05ea) 添加商城文档更新 (3698035) 组件不可见时,不必重新计算尺寸;点击保存,mouse事件冒泡,引发组件位置错误计算 (0377aab) 适配Array取值#22(2198461) 颜色实时更新 (9f472b3) Features 属性编辑面板显示组件版本 (512cd75) 新添加动画编辑器,可实时预览 (af816ab) 样式设置添加文字大小控制面板 (3582df7) 添加图片裁剪功能 (bfb8401)

优秀的个人博客,低调大师

Ceph持久化存储为k8s应用提供存储方案(3)

一、CephFs介绍二、CephFS架构三、配置CephFS MDS1、创建一个Ceph文件系统1.1、以kernel client 形式挂载CephFS1.2、以FUSE client 形式挂载CephFS四、MDS主备与主主切换1、配置主主模式2、还原单主MDS 一、CephFs介绍 Ceph File System (CephFS) 是与 POSIX 标准兼容的文件系统, 能够提供对 Ceph 存储集群上的文件访问. Jewel 版本 (10.2.0) 是第一个包含稳定 CephFS 的 Ceph 版本. CephFS 需要至少一个元数据服务器 (Metadata Server - MDS) daemon (ceph-mds) 运行, MDS daemon 管理着与存储在 CephFS 上的文件相关的元数据, 并且协调着对 Ceph 存储系统的访问。 说在前面的话,cephfs其实是为用户提供的一个文件系统,把ceph这个软件把里面的空间,模拟一个文件系统的格式来提供服务,它有posix标准的文件系统的接口能够为ceph集群存储文件,能够提供访问,目前在大多数公司用cephfs也是比较少的,也是由于性能原因,但是也有一些场景也会用到。 对象存储的成本比起普通的文件存储还是较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。 二、CephFS 架构 底层是核心集群所依赖的, 包括:OSDs (ceph-osd): CephFS 的数据和元数据就存储在 OSDs 上MDS (ceph-mds): Metadata Servers, 管理着 CephFS 的元数据Mons (ceph-mon): Monitors 管理着集群 Map 的主副本 因为这个map里面维护着很多数据的信息索引,所有的数据都要从mons中map里获取去osd里找这个数据,其实获取这个数据的流程大概都是一样的,只不过它存在的是不同的库,不同的map Ceph 存储集群的协议层是 Ceph 原生的 librados 库, 与核心集群交互.CephFS 库层包括 CephFS 库 libcephfs, 工作在 librados 的顶层, 代表着 Ceph文件系统.最上层是能够访问 Ceph文件系统的两类客户端,由于有这个libcephfs这个库,cephfs才能对外提供服务,因为底层是不能提供服务的,都得通过它这个第三方的lib库才能去提供访问, 元数据:文件的名字和属性信息叫元数据,和数据是隔离开的 CephFs的数据是怎么访问的?首先客户端通过RPC协议到达MDS,从MDS获取到元数据的信息,客户端与RADOS获取文件的一个IO操作,那么有了这两份信息,用户就能得到了想要的那份文件,MDS和RADOS之间通过journal metadate,这个Journal是记录文件写入日志的,这个也是存放到OSD当中的,MDS和rados之间也是由交互的,因为所有最终的数据都会存到rados当中 ! 三、配置 CephFS MDS 要使用 CephFS, 至少就需要一个 metadata server 进程。可以手动创建一个 MDS, 也可以使用 ceph-deploy 或者 ceph-ansible 来部署 MDS。 登录到ceph-deploy工作目录执行hostname指定ceph集群的主机名#ceph-deploy mds create $hostname 四、部署Ceph文件系统 部署一个 CephFS, 步骤如下:在一个 Mon 节点上创建 Ceph文件系统.若使用 CephX 认证,需要创建一个访问 CephFS 的客户端 挂载 CephFS 到一个专用的节点.以 kernel client 形式挂载 CephFS以 FUSE client 形式挂载 CephFS 1、创建一个 Ceph 文件系统1、首先要创建两个pool,一个是cephfs-data,一个是cephfs-metadate,分别存储文件数据和文件元数据,这个pg也可以设置小一点,这个根据OSD去配置 #ceph osd pool create cephfs-data 256 256 #ceph osd pool create cephfs-metadata 64 64 查看已经创建成功 [root@cephnode01 my-cluster]# ceph osd lspools 1 .rgw.root 2 default.rgw.control 3 default.rgw.meta 4 default.rgw.log 5 rbd 6 cephfs-data 7 cephfs-metadata 关于ceph的日志,可以在/var/log/ceph下可以查看到相关信息 [root@cephnode01 my-cluster]# tail -f /var/log/ceph/ceph ceph.audit.log ceph.log ceph-mgr.cephnode01.log ceph-osd.0.log ceph-client.rgw.cephnode01.log ceph-mds.cephnode01.log ceph-mon.cephnode01.log ceph-volume.log 注:一般 metadata pool 可以从相对较少的 PGs 启动, 之后可以根据需要增加 PGs. 因为 metadata pool 存储着 CephFS文件的元数据, 为了保证安全, 最好有较多的副本数. 为了能有较低的延迟, 可以考虑将 metadata 存储在 SSDs 上.2、创建一个 CephFS, 名字为 cephfs:需要指定两个创建的pool的名字 #ceph fs new cephfs cephfs-metadata cephfs-data new fs with metadata pool 7 and data pool 6 3、验证至少有一个 MDS 已经进入 Active 状态,也就是活跃另外可以看到两个备用的是cephnode01,和cephnode03 #ceph fs status cephfs cephfs - 0 clients +------+--------+------------+---------------+-------+-------+ | Rank | State | MDS | Activity | dns | inos | +------+--------+------------+---------------+-------+-------+ | 0 | active | cephnode02 | Reqs: 0 /s | 10 | 13 | +------+--------+------------+---------------+-------+-------+ +-----------------+----------+-------+-------+ | Pool | type | used | avail | +-----------------+----------+-------+-------+ | cephfs-metadata | metadata | 1536k | 17.0G | | cephfs-data | data | 0 | 17.0G | +-----------------+----------+-------+-------+ +-------------+ | Standby MDS | +-------------+ | cephnode01 | | cephnode03 | +-------------+ MDS version: ceph version 14.2.7 (3d58626ebeec02d8385a4cefb92c6cbc3a45bfe8) nautilus (stable) 4、在 Monitor 上, 创建一个叫client.cephfs的用户,用于访问CephFs #ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs-data, allow rw pool=cephfs-metadata' 这里会生成一个key,用户需要拿这个key去访问 [client.cephfs] key = AQA5IV5eNCwMGRAAy4dIZ8+ISfBcwZegFTYD6Q== 查看权限列表,有哪些用户创建了权限 [root@cephnode01 my-cluster]# ceph auth list client.cephfs key: AQA5IV5eNCwMGRAAy4dIZ8+ISfBcwZegFTYD6Q== caps: [mds] allow rw caps: [mon] allow r caps: [osd] allow rw pool=cephfs-data, allow rw pool=cephfs-metadata client.rgw.cephnode01 key: AQBOAl5eGVL/HBAAYH93c4wPiBlD7YhuPY0u7Q== caps: [mon] allow rw caps: [osd] allow r 5、验证key是否生效 #ceph auth get client.cephfs 可以看到这个用户是拥有访问cephfs的读写权限的 exported keyring for client.cephfs [client.cephfs] key = AQA5IV5eNCwMGRAAy4dIZ8+ISfBcwZegFTYD6Q== caps mds = "allow rw" caps mon = "allow r" caps osd = "allow rw pool=cephfs-data, allow rw pool=cephfs-metadata" 6、检查CephFs和mds状态 #ceph -s 查看集群已经增加mds配置 cluster: id: 75aade75-8a3a-47d5-ae44-ec3a84394033 health: HEALTH_OK services: mon: 3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 2h) mgr: cephnode01(active, since 2h), standbys: cephnode02, cephnode03 mds: cephfs:1 {0=cephnode02=up:active} 2 up:standby osd: 3 osds: 3 up (since 2h), 3 in (since 2h) rgw: 1 daemon active (cephnode01) data: pools: 7 pools, 96 pgs objects: 263 objects, 29 MiB usage: 3.1 GiB used, 54 GiB / 57 GiB avail pgs: 96 active+clean #ceph mds stat 这里显示1个是active状态,2个备用状态 cephfs:1 {0=cephnode02=up:active} 2 up:standby #ceph fs ls 这里有两个pool name: cephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ] #ceph fs status 1.1 以 kernel client 形式挂载 CephFS 这里使用其他的机器进行挂载,这里是是以prometheus主机挂载,不过这个在哪挂载都可以,kernel主要联系系统内核,和系统内核进行做相互,用这种方式进行挂载文件系统1、创建挂载目录 cephfs#mkdir /cephfs 2、挂载目录,这里写集群ceph节点的地址,后面跟创建用户访问集群的key #mount -t ceph 192.168.1.10:6789,192.168.1.11:6789,192.168.1.12:6789:/ /cephfs/ -o name=cephfs,secret=AQDHjeddHlktJhAAxDClZh9mvBxRea5EI2xD9w== 3、自动挂载#echo "mon1:6789,mon2:6789,mon3:6789:/ /cephfs ceph name=cephfs,secretfile=/etc/ceph/cephfs.key,_netdev,noatime 0 0" | sudo tee -a /etc/fstab 4、验证是否挂载成功 #stat -f /cephfs 文件:"/cephfs" ID:4f32eedbe607030e 文件名长度:255 类型:ceph 块大小:4194304 基本块大小:4194304 块:总计:4357 空闲:4357 可用:4357 Inodes: 总计:0 空闲:-1 1.2 以 FUSE client 形式挂载 CephFS 1、安装ceph-common,安装好可以使用rbd,ceph相关命令这里还是使用我们的内网yum源来安装这些依赖包 yum -y install epel-release yum install -y ceph-common 2、安装ceph-fuse,ceph的客户端工具,也就是用ceph的方式把这个文件系统挂上yum install -y ceph-fuse 3、将集群的ceph.conf拷贝到客户端 scp root@192.168.1.10:/etc/ceph/ceph.conf /etc/ceph/ chmod 644 /etc/ceph/ceph.conf 4、使用 ceph-fuse 挂载 CephFS如果是在其他主机挂载的话,需要这个使用cephfs的key,这个是刚才我们创建好的直接拿这台服务器上用就可以 [root@prometheus ~]# more /etc/ceph/ceph.client.cephfs.keyring exported keyring for client.cephfs [client.cephfs] key = AQA5IV5eNCwMGRAAy4dIZ8+ISfBcwZegFTYD6Q== caps mds = "allow rw" caps mon = "allow r" caps osd = "allow rw pool=cephfs-data, allow rw pool=cephfs-metadata" #ceph-fuse --keyring /etc/ceph/ceph.client.cephfs.keyring --name client.cephfs -m 192.168.1.10:6789,192.168.1.11:6789,192.168.1.12:6789 /cephfs/ 5、验证 CephFS 已经成功挂载 #df -h ceph-fuse 18G 0 18G 0% /cephfs #stat -f /cephfs 文件:"/cephfs/" ID:0 文件名长度:255 类型:fuseblk 块大小:4194304 基本块大小:4194304 块:总计:4357 空闲:4357 可用:4357 Inodes: 总计:1 空闲:0 6、自动挂载 #echo "none /cephfs fuse.ceph ceph.id=cephfs[,ceph.conf=/etc/ceph/ceph.conf],_netdev,defaults 0 0"| sudo tee -a /etc/fstab 或 #echo "id=cephfs,conf=/etc/ceph/ceph.conf /mnt/ceph2 fuse.ceph _netdev,defaults 0 0"| sudo tee -a /etc/fstab 7、卸载#fusermount -u /cephfs 五、MDS主备与主主切换 1、配置主主模式当cephfs的性能出现在MDS上时,就应该配置多个活动的MDS。通常是多个客户机应用程序并行的执行大量元数据操作,并且它们分别有自己单独的工作目录。这种情况下很适合使用多主MDS模式。 配置MDS多主模式 每个cephfs文件系统都有一个max_mds设置,可以理解为它将控制创建多少个主MDS。注意只有当实际的MDS个数大于或等于max_mds设置的值时,mdx_mds设置才会生效。例如,如果只有一个MDS守护进程在运行,并且max_mds被设置为两个,则不会创建第二个主MDS。 添加设置max_mds 2,也就是成2个activity,1个standby,称为主主备模式 #ceph fs set cephfs max_mds 2 [root@cephnode01 ceph]# ceph fs status cephfs - 1 clients +------+--------+------------+---------------+-------+-------+ | Rank | State | MDS | Activity | dns | inos | +------+--------+------------+---------------+-------+-------+ | 0 | active | cephnode02 | Reqs: 0 /s | 11 | 14 | | 1 | active | cephnode01 | Reqs: 0 /s | 10 | 13 | +------+--------+------------+---------------+-------+-------+ +-----------------+----------+-------+-------+ | Pool | type | used | avail | +-----------------+----------+-------+-------+ | cephfs-metadata | metadata | 2688k | 16.8G | | cephfs-data | data | 521M | 16.8G | +-----------------+----------+-------+-------+ +-------------+ | Standby MDS | +-------------+ | cephnode03 | +-------------+ 也就是当你cephfs用的多的话,数据量大的话,就会出现性能的问题,也就是当配置多个avtive的mds的时候会遇到系统瓶颈,这个时候就需要配置主主模式,把这个数据做一个类似的负载均衡,多主的话也就是这些主会同时提供服务 # 1.3、配置备用MDS即使有多个活动的MDS,如果其中一个MDS出现故障,仍然需要备用守护进程来接管。因此,对于高可用性系统,实际配置max_mds时,最好比系统中MDS的总数少一个。但如果你确信你的MDS不会出现故障,可以通过以下设置来通知ceph不需要备用MDS,否则会出现insufficient standby daemons available告警信息:#ceph fs set <fs> standby_count_wanted 0 2、还原单主MDS 2.1、设置max_mds要是还原的话,直接设置为max_mds 1也就是一个activity两个standby #ceph fs set max_mds 1 [root@cephnode01 ceph]# ceph fs status cephfs - 1 clients ====== +------+--------+------------+---------------+-------+-------+ | Rank | State | MDS | Activity | dns | inos | +------+--------+------------+---------------+-------+-------+ | 0 | active | cephnode02 | Reqs: 0 /s | 11 | 14 | +------+--------+------------+---------------+-------+-------+ +-----------------+----------+-------+-------+ | Pool | type | used | avail | +-----------------+----------+-------+-------+ | cephfs-metadata | metadata | 2688k | 16.8G | | cephfs-data | data | 521M | 16.8G | +-----------------+----------+-------+-------+ +-------------+ | Standby MDS | +-------------+ | cephnode03 | | cephnode01 | +-------------+ 如果想在客户端去执行相关的ceph命令的话,需要安装ceph-common以及ceph-fuse客户端工具将这个ceph.client.admin.keyring以及ceph.conf文件拷到相应的客户端也可以执行ceph命令了 [root@cephnode01 ceph]# scp ceph.client.admin.keyring root@192.168.1.14:/etc/ceph root@192.168.1.14's password: ceph.client.admin.keyring [root@prometheus ceph]# ceph -s cluster: id: 75aade75-8a3a-47d5-ae44-ec3a84394033 health: HEALTH_OK services: mon: 3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 4h) mgr: cephnode01(active, since 4h), standbys: cephnode02, cephnode03 mds: cephfs:2 {0=cephnode02=up:active,1=cephnode03=up:active} 1 up:standby osd: 3 osds: 3 up (since 4h), 3 in (since 4h) rgw: 1 daemon active (cephnode01) data: pools: 7 pools, 96 pgs objects: 345 objects, 203 MiB usage: 3.6 GiB used, 53 GiB / 57 GiB avail pgs: 96 active+clean

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册