当前位置: 首页 > news >正文

【存储中间件之 Ceph 进阶】文件存储/块存储/对象存储/项目实战部署

三大存储访问方式

  • RBD 块存储:rbd map → 裸磁盘 → mkfs 格式化 → mount 挂载
  • CephFS 文件存储:mount -t ceph 直接挂载为共享文件夹
  • RGW 对象存储:客户端(s3cmd)通过 HTTP S3 接口,依靠 access/secret 密钥访问,没有 “挂载” 概念,操作桶、对象。

Ceph文件存储

在所有操作系统中,文件通常分为两部分:① 数据(文件具体内容) ② 元数据(文件目录结构、权限、属性)


在 Ceph 集群中,MDS(MetaData Server)是负责管理 Ceph 文件系统(CephFS)元数据的服务,负责处理文件系统的目录结构、文件操作等元数据相关的任务。要部署 MDS 服务,以下是使用 cephadm 部署 MDS 的步骤。

创建文件存储并使用

第1步: 准备 Ceph 集群

【ceph分布式存储】集群搭建,原生数据存取演示-CSDN博客

ceph -s

第2步: 为了运行 Ceph 文件系统(CephFS),需要至少两个 RADOS 池,一个用于数据(data pool),另一个用于元数据(metadata pool)

创建数据池和元数据池

实际数据 与 元数据,对应的PG数量对比,一般建议2/1、4/1、8/1

数据仓库:128个

元数据仓库:32 或 16个

比如一个文件128MB,元数据(文件目录结构、权限、属性)=> 16MB

ceph osd pool create cephfs_data 128 ceph osd pool create cephfs_metadata 16 ceph osd pool ls

第3步: 创建Ceph文件系统,部署MDS

FS = CephFS(Ceph 文件系统)

基本语法:

ceph fs new <文件系统名称> cephfs_metadata cephfs_data

ceph fs new绑定池子,生成 CephFS 文件系统;

如果遇到以下异常情况,暂时先不用管,按照后续操作,Ceph集群会自动修复。

CephFS 会自动绑定 MDS,不需要先启动 MDS。 只是“先创建 FS 再启动 MDS”会让中间短暂出现HEALTH_ERR,这是正常的。

#查看文件系统列表 ceph fs ls #创建 CephFS 文件系统 ceph fs new cephfs cephfs_metadata cephfs_data #指定三台节点部署 3 个 MDS ceph orch apply mds cephfs --placement="node1,node2,node3" ceph fs ls #查看集群健康详情 ceph health detail #退出容器,宿主机查看服务 exit systemctl list-units --type=service | grep ceph # 重新进入容器查看集群状态 cephadm shell ceph -s #刷新MDS配置 ceph orch apply mds cephfs # 查看MDS主备 ceph mds stat

现在是node1 node2 node3都拉起了mds容器进程 集群自动选取了一个主MDS

拉起 MDS 容器 = 激活 Ceph 文件系统,让集群具备「多机器共享文件夹」的能力;多节点部署 MDS = 防止单台服务器故障导致共享文件功能瘫痪

三台 MDS 1 主 2 备的意义(高可用)

  • active 主 MDS:当前正在干活,处理所有客户端的文件操作请求;
  • standby 备用 MDS:全程待命,不处理业务,只同步元数据;如果运行主 MDS 的 node1 关机 / 宕机:集群几秒内自动把 node2 或 node3 的备用 MDS 升级为主服务,所有人读写文件不会中断、不会报错,数据不丢失。

第4步:MDS优化参数

# 1. 设置最大同时活跃MDS数量 ceph fs set cephfs max_mds 3 # 2. 设置集群期望备用MDS数量 ceph fs set cephfs standby_count_wanted 1 # 刷新MDS服务配置 ceph orch apply mds cephfs # 查看最终MDS状态 ceph mds stat

CephFS 现在是双主 MDS 多活模式:node1、node3 的 MDS 同时对外提供文件系统服务,两个都在干活、分担压力,没有闲置备用 MDS

  • cephfs你创建的 Ceph 文件系统名称。
  • :2代表max_mds = 2,当前文件系统允许最多 2 个 MDS 同时处于 active 活跃工作状态。

{0=cephfs.node3.crvznw=up:active}

  • 0:MDS 实例编号 0
  • cephfs.node3.crvznw:这个 MDS 运行在 node3 节点
  • up:进程正常在线、容器正常运行
  • active:活跃主 MDS,正在处理客户端文件操作(创建文件夹、读写、权限查询)

1=cephfs.node1.szpccx=up:activeMDS 编号 1,跑在 node1,同样是 active 主节点。

第5步: 客户端准备验证key文件

  • 说明: ceph默认启用了cephx认证, 所以客户端的挂载必须要验证

在集群节点(node1,node4)上任意一台查看密钥字符串

cat /etc/ceph/ceph.client.admin.keyring

在客户端(node4)上创建一个文件记录密钥字符串

#创建一个密钥文件,复制粘贴上面得到的字符串 vim /etc/ceph/admin.key

第6步: 客户端挂载(挂载ceph集群中跑了mon监控的节点, mon监控为6789端口)

这一步是客户端实操:在 node4 机器把 Ceph 集群的共享文件系统挂载成本地目录,实现:

  1. node4 可以像操作本地文件夹一样读写分布式文件;
  2. node1/node2/node3/node4 多台机器同时挂载/mnt,共享同一套文件、目录,数据统一存在底层 OSD 硬盘
ls /mnt #清理旧挂载目录(谨慎操作) umount /mnt && rm -rf /mnt/* #node4 客户端挂载 Ceph 分布式文件系统 mount -t ceph node1:6789:/ /mnt -o name=admin,secretfile=/etc/ceph/admin.key df -h
  • -t ceph:指定挂载类型是 CephFS 分布式文件系统;
  • node1:6789:/:Ceph 集群访问地址
    • node1:任意一个 mon 节点 IP / 主机名
    • 6789:Ceph MON 默认端口
    • /:CephFS 文件系统的根目录
  • /mnt:本地宿主机 node4 上的挂载点,访问 /mnt 就等于访问分布式共享文件夹;
  • -o挂载参数:
    • name=admin:使用 admin 管理员账号访问集群;
    • secretfile=/etc/ceph/admin.key:读取密钥文件做 cephx 身份认证,没有密钥无法挂载。

第7步:验证

df -h | tail -1 echo "Ceph 666" > /mnt/Ceph.txt cat /mnt/Ceph.txt

删除文件存储方法

如果需要删除文件存储,请按下面操作过程来操作

第1步: 在客户端上删除数据,并umount所有挂载

rm -rf /mnt/* umount /mnt/

第2步: 按照以下命令来执行删除操作(node4操作)

ceph config set mon mon_allow_pool_delete true ceph fs fail cephfs ceph fs rm cephfs --yes-i-really-mean-it

ceph fs fail cephfs 和 ceph fs rm cephfs 的目的是确保文件系统不再被使用,并且从 Ceph 集群中移除文件系统的配置。如果直接删除存储池,而文件系统仍然处于活动状态,可能会导致数据不一致或其他问题。

ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it ceph osd pool ls

Ceph块存储

创建块存储并使用

第1步: 在node1上同步配置文件到node4节点

# 如果ls能看见ceph.conf ceph.client.admin.keyring 下一行的操作跳过 ls /etc/ceph/ #ls没看见关键文件,操作这个 scp /etc/ceph/{*.conf,*.keyring} root@node4:/etc/ceph

第2步:创建存储池,并初始化

注意:在客户端操作(node4)

ceph osd pool create rbd_pool 128 rbd pool init rbd_pool

第3步:创建一个存储卷(我们这里存储卷名为volume1,大小为5000M)

注意: volume1的专业术语为image, 我们这里叫存储卷方便理解

  • node4 / 其他机器可以把这块 volume1 映射成本地/dev/rbd0磁盘;
  • 分区、格式化、挂载,用来存放数据库、业务数据;
  • 数据分散存放在 node1/node2/node3 的所有 OSD 硬盘,多副本高可用,单台机器坏了数据不丢。
rbd create volume1 --pool rbd_pool --size 5000 rbd ls rbd_pool rbd info volume1 -p rbd_pool

第4步: 将创建的卷映射成块设备

rbd map rbd_pool/volume1

第5步: 查看映射(如果要取消映射, 可以使用rbd unmap /dev/rbd0)

rbd showmapped

第6步: 格式化,挂载

  • 刚映射出来的 RBD 只是裸磁盘,系统无法直接使用;
  • 通过mkfs.xfs格式化,赋予磁盘文件系统;
  • 挂载到本地目录,实现像本地硬盘一样读写分布式块存储;
blkid /dev/rbd0 mkfs.xfs /dev/rbd0 blkid /dev/rbd0 mount /dev/rbd0 /mnt/ df -h | tail -1

验证读写

echo "Gain skills through learning, and gain a sense of achievement through skills!" > /mnt/skills.txt cat /mnt/skills.txt

注意: 块存储是不能实现同读同写的,请不要在两个客户端同时挂载进行读写!

块存储扩容与缩容

在线扩容(node4操作)

经测试,分区后/dev/rbd0p1不能在线扩容,直接使用/dev/rbd0才可以

#扩容到8000M rbd info rbd_pool/volume1 | grep size rbd resize --size 8000 rbd_pool/volume1 rbd info rbd_pool/volume1 | grep size df -h | tail -1 xfs_growfs -d /mnt/ df -h | tail -1

块存储缩容

不能在线缩容,缩容后需重新格式化再挂载,所以请提前备份好数据!

cp /mnt/skills.txt /tmp rbd resize --size 5000 rbd_pool/volume1 --allow-shrink df -h | tail -1 ls /mnt xfs_growfs -d /mnt/ df -h | tail -1 cat /mnt/skills.txt #重新格式化再挂载 umount /mnt/ mkfs.xfs -f /dev/rbd0 mount /dev/rbd0 /mnt/ df -h | tail -1 ls /mnt cp /tmp/skills.txt /mnt ls /mnt cat /mnt/skills.txt

删除块存储方法

df -h umount /mnt/ df -h rbd showmapped rbd unmap /dev/rbd0 rbd showmapped ceph osd pool ls #允许删除 ceph config set mon mon_allow_pool_delete true ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it ceph osd pool ls #禁止删除 操作可选 ceph config set mon mon_allow_pool_delete false
  • umount /mnt/卸载挂载点,断开本地对 RBD 块存储的读写通道。哪怕已经 umount 卸载目录,只要还处于 mapped 映射状态,存储池依然被占用,删池会报错 EBUSY
  • rbd unmap /dev/rbd0解除本地内核与 RBD 镜像的映射关系,释放/dev/rbd0设备。
  • rbd showmapped无任何输出,代表映射解绑成功,本地不再占用块镜像
  • ceph config set mon mon_allow_pool_delete true 这条临时放开 mon 节点删除池权限,否则执行 delete 会报错拒绝删除。
  • ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it 彻底删除存放 RBD 块设备的存储池,两个相同参数是池名校验,--yes-i-really-really-mean-it强制确认高危删除操作
  • ceph config set mon mon_allow_pool_delete false(可选)关闭删除池权限,恢复集群默认安全策略,防止后续误删存储池,不执行也不影响集群运行

Ceph对象存储

Ceph对象网关的连接

第1步: 在node1上创建对象网关(RGW)

#向 cephadm 下发调度指令,准备在 node1 部署对象网关 RGW。 ceph orch apply rgw myrealm myzone --placement="node1" #默认监听 80 端口 netstat -pantul|grep -w 80

注:默认端口为80,如果需要修改可以参考如下方式

ceph orch apply rgw myrealm myzone --placement="node1" --port 8080 myrealm

(领域) 就像是一个大范围的名字,代表一套对象存储的大环境,比如整个公司或者整个项目的存储系统。 myzone(区域) 是这个大环境里面的一个小区域,比如某个具体的数据中心或者机房,用来实际放 RGW 的地方。

  1. myrealm(域 realm)可以理解为对象存储全局命名空间,一套集群可以存在多个 realm;多用于多区域容灾、跨区域同步。
  2. myzone(区域 zone)realm 下的可用区域,一个 realm 包含多个 zone。日常单机房部署,就 1 个 realm+1 个 zone。

RGW = Rados Gateway作用:对外提供S3 兼容对象存储接口(阿里云 OSS、AWS S3 同类服务),客户端可以通过 http/https 上传下载文件、图片、视频。

ceph -s ceph osd pool ls

❗重点:部署 RGW 不需要手动创建存储池!

注意:如果node1节点有问题,可以考虑换一个节点来创建对象网关

# 查看所有节点在线状态 ceph orch host ls # 删除之前部署在node1的rgw调度任务 ceph orch rm rgw.myrealm # 检查rgw是否删除干净 ceph orch ls | grep rgw # 在node2部署rgw网关,监听8080端口 ceph orch apply rgw myrealm myzone --placement="node2" --port 8080

第2步: 创建一个新的用户,以便通过 Ceph 对象网关(RGW)访问 Ceph 对象存储。

在 RGW 对象存储里创建一个S3 系统用户,后续客户端(s3cmd、awscli、minio 客户端)凭借access_key / secret_key访问对象存储、创建桶、上传文件

radosgw-admin user create --uid=s3 --display-name="object_storage" --system
  • --uid=s3:用户唯一 ID s3
  • --display-name="object_storage":用户显示名称
  • --system:标记为系统用户,拥有更高权限,方便管理桶、数据

access_key与secret_key,用于连接对象存储网关

S3连接Ceph对象网关

Amazon S3(Simple Storage Service)是一种面向Internet的对象存储服务,我们这里可以使用s3工具连接ceph的对象存储进行操作

1, 在客户端node4安装s3cmd工具,并编写ceph连接配置文件

yum install s3cmd -y

2. 提前准备信息(配置时要填入,不是可执行命令!)

access_key = W11YST2U87CKHWVZWPC9 secret_key = gVMN1EyDS1roEPIK8owLL5PQAWnH1zUDRSuZc93V RGW地址:192.168.88.101:80 bucket域名模板:%(bucket)s.192.168.88.101:80 自定义密码:123456

3,启动交互式配置向导,生成配置文件/root/.s3cfg,保存所有连接 RGW 的参数。

s3cmd --configure

下面逐行解释交互输入含义:

  1. Access Key填入 RGW 用户的 access_key,相当于账号。
  2. Secret Key填入 secret_key,相当于密码。
  3. Default Region [US]直接回车。Ceph RGW 单 zone 场景不需要修改 region。
  4. S3 Endpoint192.168.88.101:80S3 网关地址,指向 node1 上运行的 RGW 服务;默认是亚马逊 AWS 地址,必须改成你的 Ceph RGW 地址。
  5. DNS-style bucket 模板%(bucket)s.192.168.88.101:80虚拟主机风格访问桶格式。例如桶名叫testbucket,访问域名就是testbucket.192.168.88.101:80
  6. Encryption password: S3-test可选配置:文件上传时本地加密的密码;只是 s3cmd 客户端加密,不是 Ceph 集群侧加密。
  7. Path to GPG program 回车默认使用系统 gpg 程序做文件加密,保持默认即可。
  8. Use HTTPS protocol [Yes]: No重点!你的 RGW 只开启了 HTTP 80 端口,没有 HTTPS 证书,必须选 No,否则连接失败。
  9. HTTP Proxy 直接回车,不配置代理

第2步: 测试

#列出bucket s3cmd ls #新建一个bucket桶 s3cmd mb s3://test_bucket s3cmd ls #上传文件到桶 s3cmd put /etc/fstab s3://test_bucket #下载到当前目录 s3cmd get s3://test_bucket/fstab ls cat fstab #下载到指定目录 s3cmd get s3://test_bucket/fstab /tmp/fstab cat /tmp/fstab #更多命令请见参考命令帮助 s3cmd --help

官方:https://s3tools.org/s3cmd

Bucket(桶):对象存储最顶层容器,所有文件 (对象) 必须存放在桶内。

项目部署实战:Ceph+Nextcloud打造私有云盘

查看Ceph集群的状态

cephadm shell ceph -s ceph osd tree

前期规划

创建bucket

在ceph的客户端node4上创建好bucket和确认/root/.s3cfg配置

创建 next_cloud bucket

s3cmd mb s3://next_cloud

确保以下配置正确

cat /root/.s3cfg
[default] access_key = QGA7P2XEXI91X8UH2Y8B access_token = add_encoding_exts = add_headers = bucket_location = US ca_certs_file = cache_file = check_ssl_certificate = True check_ssl_hostname = True cloudfront_host = cloudfront.amazonaws.com connection_max_age = 5 connection_pooling = True content_disposition = content_type = default_mime_type = binary/octet-stream delay_updates = False delete_after = False delete_after_fetch = False delete_removed = False dry_run = False enable_multipart = True encoding = UTF-8 encrypt = False expiry_date = expiry_days = expiry_prefix = follow_symlinks = False force = False get_continue = False gpg_command = /usr/bin/gpg gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s gpg_passphrase = S3-test guess_mime_type = True host_base = 192.168.88.101:80 host_bucket = %(bucket)s.192.168.88.101:80 human_readable_sizes = False invalidate_default_index_on_cf = False invalidate_default_index_root_on_cf = True invalidate_on_cf = False keep_dirs = False kms_key = limit = -1 limitrate = 0 list_allow_unordered = False list_md5 = False log_target_prefix = long_listing = False max_delete = -1 max_retries = 5 mime_type = multipart_chunk_size_mb = 15 multipart_copy_chunk_size_mb = 1024 multipart_max_chunks = 10000 preserve_attrs = True progress_meter = True proxy_host = proxy_port = 0 public_url_use_https = False put_continue = False recursive = False recv_chunk = 65536 reduced_redundancy = False requester_pays = False restore_days = 1 restore_priority = Standard secret_key = LqbwAN2CB7tYaTyiyOyaGyPzsqah79Op2sWZKSY0 send_chunk = 65536 server_side_encryption = False signature_v2 = False signurl_use_https = False simpledb_host = sdb.amazonaws.com skip_destination_validation = False skip_existing = False socket_timeout = 300 ssl_client_cert_file = ssl_client_key_file = stats = False stop_on_error = False storage_class = throttle_max = 100 upload_id = urlencoding_mode = normal use_http_expect = False use_https = False use_mime_magic = True verbosity = WARNING website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/ website_error = website_index = index.html

Nextcloud环境准备

node4端安装nextcloud云盘运行所需要的web环境

nextcloud需要web服务器和php支持,目前最新版本nextcloud需要php8.2版本

在这里我们为了节省时间,使用dnf/yum安装

dnf module reset php -y dnf module enable php:8.2 -y yum install httpd mod_ssl php-mysqlnd php php-gd php-xml php-mbstring php-pecl-zip php-intl php-process -y mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak systemctl enable httpd --now systemctl status httpd systemctl restart httpd systemctl status httpd php -v

安装 MySQL 8

CentOS Stream 9 默认用MariaDB,这里我们安装官方 MySQL 8。

下载 MySQL 官方源

dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm

安装 MySQL

sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/*.repo dnf install -y mysql-community-server

启动 MySQL

systemctl start mysqld systemctl status mysqld systemctl enable mysqld

获取临时密码

grep 'temporary password' /var/log/mysqld.log

初始化

mysql_secure_installation 输入临时密码 设置新密码(如 P@ssword123456) 删除匿名用户 禁止 root 远程登录(生产环境建议) 删除测试数据库 重新加载权限

授权

mysql -uroot -pP@ssword123456 show databases; CREATE DATABASE IF NOT EXISTS nextcloud_db; show databases; CREATE USER IF NOT EXISTS 'nextcloud_user'@'localhost' IDENTIFIED BY 'Nextcloud@666'; GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud_user'@'localhost'; FLUSH PRIVILEGES;

部署Nextcloud

客户端(node4操作)

下载或者上传nextcloud.bz2源码包,解压到/var/www/html

rm -rf /var/www/html/* yum install -y wget wget https://download.nextcloud.com/server/releases/latest.tar.bz2 tar xvf latest.tar.bz2 -C /var/www/html/ #或者通过本地上传nextcloud.bz2源码包 tar xvf nextcloud.bz2 -C /var/www/html/ #需要修改为运行web服务器的用户owner,group,否则后面写入会出现权限问题 chown apache:apache -Rf /var/www/html/
tree /var/www/html/nextcloud/

4, 通过浏览器访问 http://192.168.88.104/nextcloud 进行配置

admin的密码可以自定义

数据库这里我们首选MySQL

nextcloud_user Nextcloud@666 nextcloud_db localhost

SQLite和MySQL的适用场景

  • SQLite:

    • 小型应用:适用于小型桌面应用、移动应用、嵌入式系统等。

    • 原型开发:在开发初期,SQLite 可以快速搭建原型,方便开发和测试。

  • MySQL:

    • 大型应用:适用于大型企业级应用、高流量网站、电子商务系统等。

    • 多用户环境:适合需要高并发和多用户访问的场景。

官方源码存在bug,遇到以下无法访问的页面,可以不用管!

按照以下地址登录Nextcloud云盘即可

http://192.168.88.104/nextcloud/index.php/apps/dashboard/

文件上传下载测试

上传一个文件再下载回来,看看对不对

闭环验证:确认文件能成功存入 Ceph 对象存储,并且取回来文件完好无损

我这里偷懒,只上传

删库跑路?

建议提前备份数据!

mysqldump -uroot -pP@ssword123456 -B nextcloud_db > nextcloud_db.sql

思路

创建目录 mkdir /mysql-data 备份数据 mysqldump -uroot -pRoot@123456 -B nextcloud_db > /mysql-data/nextcloud_db.sql 还原数据 mysql -uroot -pRoot@123456 < /mysql-data/nextcloud_db.sql

将 /var/www/html 的数据拷贝到 s3://next_cloud

使用s3cmd同步现有数据(node4操作)

/var/www/html中的现有数据迁移到s3://next_cloud

s3cmd ls|grep cloud s3cmd ls s3://next_cloud/ ls /var/www/html/ ls /var/www/html/nextcloud/ s3cmd sync /var/www/html/ s3://next_cloud/

数据迁移耗时比较久,估计10分钟左右!

查看S3存储桶上的数据(node4操作)

s3cmd ls s3://next_cloud/ s3cmd du --human-readable s3://next_cloud/ s3cmd du --human-readable s3://next_cloud/ s3cmd ls s3://next_cloud/nextcloud/

删除数据:s3cmd rm s3://next_cloud/nextcloud/ --recursive --force

补充epel源

yum install -y epel-release 或者 dnf install -y https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-9.noarch.rpm 或者 dnf install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm

安装s3fs-fuse

dnf install -y s3fs-fuse which s3fs

挂载 S3 存储桶(node4操作)

cat /root/.s3cfg|grep key access_key = QGA7P2XEXI91X8UH2Y8B kms_key = secret_key = LqbwAN2CB7tYaTyiyOyaGyPzsqah79Op2sWZKSY0 ssl_client_key_file =

QGA7P2XEXI91X8UH2Y8B:LqbwAN2CB7tYaTyiyOyaGyPzsqah79Op2sWZKSY0是Access Key和Secret Key的组合

echo "QGA7P2XEXI91X8UH2Y8B:LqbwAN2CB7tYaTyiyOyaGyPzsqah79Op2sWZKSY0" > /etc/passwd-s3fs # Access Key:Secret Key chmod 640 /etc/passwd-s3fs ll /etc/passwd-s3fs cat /etc/passwd-s3fs QGA7P2XEXI91X8UH2Y8B:LqbwAN2CB7tYaTyiyOyaGyPzsqah79Op2sWZKSY0
mkdir -p /data/s3 s3fs next_cloud /data/s3 -o use_path_request_style -o url=http://192.168.88.101:80 -o passwd_file=/etc/passwd-s3fs -o enable_noobj_cache -o use_cache=/tmp df -h ls /data/s3/ ls /data/s3/nextcloud/ ls /var/www/html/ ls /var/www/html/nextcloud/

将Nextcloud项目数据挂载到Ceph块存储

rbd showmapped ceph osd pool create rbd_pool 128 rbd pool init rbd_pool rbd create volume1 --pool rbd_pool --size 8000 rbd ls rbd_pool rbd info volume1 -p rbd_pool rbd map rbd_pool/volume1 mkfs.xfs /dev/rbd0 mkfs.xfs -f /dev/rbd0 blkid /dev/rbd0 mkdir /Nextcloud mount /dev/rbd0 /Nextcloud/ df -h

修改Apache Web服务httpd的网站根目录为/Nextcloud

vim /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd" Listen 80 Include conf.modules.d/*.conf User apache Group apache ServerAdmin root@localhost <Directory /> AllowOverride none Require all denied </Directory> DocumentRoot "/Nextcloud" #<Directory "/var/www"> # AllowOverride None # Require all granted #</Directory> <Directory "/Nextcloud"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> <IfModule dir_module> DirectoryIndex index.html </IfModule> <Files ".ht*"> Require all denied </Files> ErrorLog "logs/error_log" LogLevel warn <IfModule log_config_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> CustomLog "logs/access_log" combined </IfModule> <IfModule alias_module> ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" </IfModule> <Directory "/var/www/cgi-bin"> AllowOverride None Options None Require all granted </Directory> <IfModule mime_module> TypesConfig /etc/mime.types AddType application/x-compress .Z AddType application/x-gzip .gz .tgz AddType text/html .shtml AddOutputFilter INCLUDES .shtml </IfModule> AddDefaultCharset UTF-8 <IfModule mime_magic_module> MIMEMagicFile conf/magic </IfModule> EnableSendfile on IncludeOptional conf.d/*.conf

说明: AllowOverride All # 允许 .htaccess 覆盖配置(Nextcloud 依赖此功能)改PHP的配置,把数据目录指向/Nextcloud/nextcloud/data

vim /var/www/html/nextcloud/config/config.php cat /var/www/html/nextcloud/config/config.php
<?php $CONFIG = array ( 'instanceid' => 'ocrdw207tvtp', 'passwordsalt' => 'vQcNYynV3ZMRcr7yaIqda4hrnjFUzh', 'secret' => 'YDEzR0EZd0NF6iBTDDXKj6CjFdX3Ic+4KwihtRe5+AoCxjih', 'trusted_domains' => array ( 0 => '192.168.88.104', ), 'datadirectory' => '/Nextcloud/nextcloud/data', 'dbtype' => 'mysql', 'version' => '31.0.6.2', 'overwrite.cli.url' => 'http://192.168.88.104/nextcloud', 'dbname' => 'nextcloud_db', 'dbhost' => 'localhost', 'dbport' => '', 'dbtableprefix' => 'oc_', 'mysql.utf8mb4' => true, 'dbuser' => 'nextcloud_user', 'dbpassword' => 'Nextcloud@666', 'installed' => true, );
vim /var/www/html/nextcloud/config/config.php <?php $CONFIG = array ( 'instanceid' => 'oc8pec1df1fq', 'passwordsalt' => 'b0WZ/TURkGucvRKLhlKnG8Gh8IdPRe', 'secret' => 'cWGIp4OrQ0WCIJJrHl/ZGUskIGBTymmGlNZXtwM9a9XvOUKF', 'trusted_domains' => array ( 0 => '192.168.88.104', ), 'datadirectory' => '/Nextcloud/nextcloud/data', 'dbtype' => 'sqlite3', 'version' => '31.0.6.2', 'overwrite.cli.url' => 'http://192.168.88.104/nextcloud', 'installed' => true, );
cp -ra /var/www/html/* /Nextcloud/ chown -Rf apache:apache /Nextcloud chmod -Rf 755 /Nextcloud systemctl restart httpd php-fpm systemctl status httpd php-fpm

Nextcloud 的.htaccess文件

Nextcloud 使用.htaccess文件来实现多种功能,例如:

  • URL 重写:将请求重写到index.php,以便 Nextcloud 的路由系统可以处理。

  • 安全设置:禁止访问某些敏感文件,如.htaccess.htpasswd等。

  • 缓存控制:设置静态文件的缓存策略,提高性能。

总结

一、Ceph 数据存储应用

  1. Ceph 文件存储

    1. 创建数据池和元数据池。

    2. 创建 Ceph 文件系统(CephFS),并启动 MDS 服务。

    3. 客户端挂载 CephFS,验证读写功能。

  2. Ceph 块存储

    1. 创建存储池,初始化 RBD(Rados Block Device)。

    2. 创建存储卷(image),映射为块设备。

    3. 格式化并挂载块设备,验证读写功能。

    4. 支持在线扩容和缩容。

  3. Ceph 对象存储

    1. 创建 RGW(Rados Gateway)服务,配置 S3 兼容接口。

    2. 创建用户,获取访问密钥(access key 和 secret key)。

    3. 使用s3cmd工具连接 Ceph 对象存储,创建 bucket,上传和下载文件。

二、Nextcloud 私有云盘部署

  1. 环境准备

    1. 在 node4 上安装 Nextcloud 所需的 Web 环境(Apache、PHP、MySQL)。

    2. 配置 MySQL 数据库,创建 Nextcloud 数据库和用户。

  2. Nextcloud 安装

    1. 上传并解压 Nextcloud 软件包到 Web 目录。

    2. 通过浏览器访问 Nextcloud,完成初始配置。

  3. 数据存储配置

    1. 使用 S3 兼容接口将 Nextcloud 数据存储到 Ceph 对象存储中。

    2. 配置 Nextcloud 数据目录指向 Ceph 对象存储桶。

  4. 性能优化

    1. 调整 Nextcloud 的上传文件大小限制。

    2. 配置 Apache 和 PHP 的相关参数,提升性能。

  5. 安全性配置

    1. 配置.htaccess文件,增强安全性。

    2. 看情况启用 HTTPS,确保数据传输安全。

三、后续优化与维护

  1. 监控与日志

    1. 使用 Ceph Dashboard 监控集群状态。

    2. 定期检查日志,及时发现并解决问题。

  2. 备份与恢复

    1. 定期备份 Nextcloud 数据和配置文件。

    2. 测试备份的恢复流程,确保数据安全。

  3. 性能调优

    1. 根据实际使用情况,调整 Ceph 集群的配置参数。

    2. 优化 Nextcloud 的性能,提升用户体验。

  4. 安全加固

    1. 定期更新系统和软件,修复安全漏洞。

    2. 配置防火墙和安全组,限制不必要的访问。

通过以上步骤,成功搭建了一个基于 Ceph 的分布式存储集群,并实现了 Nextcloud 私有云盘的部署。整个系统具备高可用性、高性能和可扩展性,能够满足企业级数据存储和共享的需求。

http://www.cnnetsun.cn/news/3582108.html

相关文章:

  • 《郑州考研机构如何用3个策略吸引职场考生》
  • 字节开源 DeerFlow 2.0:让 AI 不止于聊天
  • TM4C1294NCPDT I2C总线协议深度解析与驱动开发实战
  • 《心癌》动画技术解析:独立短片制作流程与渲染优化
  • Unity转盘抽奖开发指南:从数据驱动到流畅动画实现
  • 超8万家面包店关停,为啥大家不去面包店买面包了?
  • AI如何变革科研写作:文献管理与期刊匹配实战
  • Kafka+Zookeeper+MongoDB分布式数据管道部署指南
  • AI大模型算力瓶颈解析:从Kimi暂停会员看Token成本与优化策略
  • 无限流跑团平台技术实现:从规则引擎到实时通信系统
  • OpenClaw与飞书集成:企业自动化办公实战指南
  • TI ISS ISP中断与DMA机制解析:嵌入式视觉系统核心驱动开发指南
  • AI设计辅助插件:提升UI设计效率的智能工具
  • C++实现农历转换:从算法原理到工程实践
  • 创建64位远线程调用所需ASM函数
  • MibSPI多缓冲串行接口:解放CPU,实现高效嵌入式数据通信
  • C++ std::any性能瓶颈分析与五种优化方案深度对比
  • 问题现象与原因
  • RHCSA简单实用Linux
  • C++继承机制深度解析:从概念到实践,掌握面向对象设计核心
  • 木材烘干房用什么高温风机?看过这三点再决定
  • 新终端流量风口:努比亚豆包 AI 手机,GEO 优化新增流量阵地深度解读
  • 李白游山水有感
  • 基础设施成本优化实战:从资源闲置率40%到5%的FinOps落地策略与自动化工具链
  • 游戏推荐系统的特征存储:用户行为序列的向量化与实时检索
  • HDMI色彩空间转换与中断控制:寄存器配置与驱动开发实战
  • TM4C129XNCZAD USB与LCD控制器电气特性详解与设计实践
  • 语言、思想与意识的投影关系
  • “捏脸“背后的工程逻辑:3D数字人全维度DIY定制系统
  • 智能眼镜技术解析:从AI架构到用户体验的设计挑战