【存储中间件之 Ceph 进阶】文件存储/块存储/对象存储/项目实战部署 三大存储访问方式RBD 块存储rbd map → 裸磁盘 → mkfs 格式化 → mount 挂载CephFS 文件存储mount -t ceph 直接挂载为共享文件夹RGW 对象存储客户端s3cmd通过 HTTP S3 接口依靠 access/secret 密钥访问没有 “挂载” 概念操作桶、对象。Ceph文件存储在所有操作系统中文件通常分为两部分① 数据文件具体内容 ② 元数据文件目录结构、权限、属性在 Ceph 集群中MDSMetaData 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元数据文件目录结构、权限、属性 16MBceph osd pool create cephfs_data 128 ceph osd pool create cephfs_metadata 16 ceph osd pool ls第3步: 创建Ceph文件系统,部署MDSFS CephFSCeph 文件系统基本语法ceph fs new 文件系统名称 cephfs_metadata cephfs_dataceph 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 --placementnode1,node2,node3 ceph fs ls #查看集群健康详情 ceph health detail #退出容器宿主机查看服务 exit systemctl list-units --typeservice | 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 statCephFS 现在是双主 MDS 多活模式node1、node3 的 MDS 同时对外提供文件系统服务两个都在干活、分担压力没有闲置备用 MDScephfs你创建的 Ceph 文件系统名称。:2代表max_mds 2当前文件系统允许最多 2 个 MDS 同时处于 active 活跃工作状态。{0cephfs.node3.crvznwup:active}0MDS 实例编号 0cephfs.node3.crvznw这个 MDS 运行在 node3 节点up进程正常在线、容器正常运行active活跃主 MDS正在处理客户端文件操作创建文件夹、读写、权限查询1cephfs.node1.szpccxup: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 集群的共享文件系统挂载成本地目录实现node4 可以像操作本地文件夹一样读写分布式文件node1/node2/node3/node4 多台机器同时挂载/mnt共享同一套文件、目录数据统一存在底层 OSD 硬盘ls /mnt #清理旧挂载目录谨慎操作 umount /mnt rm -rf /mnt/* #node4 客户端挂载 Ceph 分布式文件系统 mount -t ceph node1:6789:/ /mnt -o nameadmin,secretfile/etc/ceph/admin.key df -h-t ceph指定挂载类型是 CephFS 分布式文件系统node1:6789:/Ceph 集群访问地址node1任意一个 mon 节点 IP / 主机名6789Ceph MON 默认端口/CephFS 文件系统的根目录/mnt本地宿主机 node4 上的挂载点访问 /mnt 就等于访问分布式共享文件夹-o挂载参数nameadmin使用 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-itceph 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 lsCeph块存储创建块存储并使用第1步: 在node1上同步配置文件到node4节点# 如果ls能看见ceph.conf ceph.client.admin.keyring 下一行的操作跳过 ls /etc/ceph/ #ls没看见关键文件操作这个 scp /etc/ceph/{*.conf,*.keyring} rootnode4:/etc/ceph第2步:创建存储池,并初始化注意:在客户端操作node4ceph 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 falseumount /mnt/卸载挂载点断开本地对 RBD 块存储的读写通道。哪怕已经 umount 卸载目录只要还处于 mapped 映射状态存储池依然被占用删池会报错 EBUSYrbd 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 --placementnode1 #默认监听 80 端口 netstat -pantul|grep -w 80注默认端口为80如果需要修改可以参考如下方式ceph orch apply rgw myrealm myzone --placementnode1 --port 8080 myrealm领域 就像是一个大范围的名字代表一套对象存储的大环境比如整个公司或者整个项目的存储系统。 myzone区域 是这个大环境里面的一个小区域比如某个具体的数据中心或者机房用来实际放 RGW 的地方。myrealm域 realm可以理解为对象存储全局命名空间一套集群可以存在多个 realm多用于多区域容灾、跨区域同步。myzone区域 zonerealm 下的可用区域一个 realm 包含多个 zone。日常单机房部署就 1 个 realm1 个 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 --placementnode2 --port 8080第2步: 创建一个新的用户以便通过 Ceph 对象网关RGW访问 Ceph 对象存储。在 RGW 对象存储里创建一个S3 系统用户后续客户端s3cmd、awscli、minio 客户端凭借access_key / secret_key访问对象存储、创建桶、上传文件radosgw-admin user create --uids3 --display-nameobject_storage --system--uids3用户唯一 ID s3--display-nameobject_storage用户显示名称--system标记为系统用户拥有更高权限方便管理桶、数据access_key与secret_key用于连接对象存储网关S3连接Ceph对象网关Amazon S3(Simple Storage Service)是一种面向Internet的对象存储服务我们这里可以使用s3工具连接ceph的对象存储进行操作1, 在客户端node4安装s3cmd工具,并编写ceph连接配置文件yum install s3cmd -y2. 提前准备信息配置时要填入不是可执行命令access_key W11YST2U87CKHWVZWPC9 secret_key gVMN1EyDS1roEPIK8owLL5PQAWnH1zUDRSuZc93V RGW地址192.168.88.101:80 bucket域名模板%(bucket)s.192.168.88.101:80 自定义密码1234563,启动交互式配置向导生成配置文件/root/.s3cfg保存所有连接 RGW 的参数。s3cmd --configure下面逐行解释交互输入含义Access Key填入 RGW 用户的 access_key相当于账号。Secret Key填入 secret_key相当于密码。Default Region [US]直接回车。Ceph RGW 单 zone 场景不需要修改 region。S3 Endpoint192.168.88.101:80S3 网关地址指向 node1 上运行的 RGW 服务默认是亚马逊 AWS 地址必须改成你的 Ceph RGW 地址。DNS-style bucket 模板%(bucket)s.192.168.88.101:80虚拟主机风格访问桶格式。例如桶名叫testbucket访问域名就是testbucket.192.168.88.101:80。Encryption password: S3-test可选配置文件上传时本地加密的密码只是 s3cmd 客户端加密不是 Ceph 集群侧加密。Path to GPG program 回车默认使用系统 gpg 程序做文件加密保持默认即可。Use HTTPS protocol [Yes]: No重点你的 RGW 只开启了 HTTP 80 端口没有 HTTPS 证书必须选 No否则连接失败。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/s3cmdBucket桶对象存储最顶层容器所有文件 (对象) 必须存放在桶内。项目部署实战CephNextcloud打造私有云盘查看Ceph集群的状态cephadm shell ceph -s ceph osd tree前期规划创建bucket在ceph的客户端node4上创建好bucket和确认/root/.s3cfg配置创建 next_cloud buckets3cmd 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.htmlNextcloud环境准备在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 8CentOS Stream 9 默认用MariaDB这里我们安装官方 MySQL 8。下载 MySQL 官方源dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm安装 MySQLsed -i s/gpgcheck1/gpgcheck0/g /etc/yum.repos.d/*.repo dnf install -y mysql-community-server启动 MySQLsystemctl start mysqld systemctl status mysqld systemctl enable mysqld获取临时密码grep temporary password /var/log/mysqld.log初始化mysql_secure_installation 输入临时密码 设置新密码如 Pssword123456 删除匿名用户 禁止 root 远程登录生产环境建议 删除测试数据库 重新加载权限授权mysql -uroot -pPssword123456 show databases; CREATE DATABASE IF NOT EXISTS nextcloud_db; show databases; CREATE USER IF NOT EXISTS nextcloud_userlocalhost IDENTIFIED BY Nextcloud666; GRANT ALL PRIVILEGES ON nextcloud_db.* TO nextcloud_userlocalhost; FLUSH PRIVILEGES;部署Nextcloud客户端node4操作下载或者上传nextcloud.bz2源码包解压到/var/www/htmlrm -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的密码可以自定义数据库这里我们首选MySQLnextcloud_user Nextcloud666 nextcloud_db localhostSQLite和MySQL的适用场景SQLite小型应用适用于小型桌面应用、移动应用、嵌入式系统等。原型开发在开发初期SQLite 可以快速搭建原型方便开发和测试。MySQL大型应用适用于大型企业级应用、高流量网站、电子商务系统等。多用户环境适合需要高并发和多用户访问的场景。官方源码存在bug遇到以下无法访问的页面可以不用管按照以下地址登录Nextcloud云盘即可http://192.168.88.104/nextcloud/index.php/apps/dashboard/文件上传下载测试上传一个文件再下载回来看看对不对闭环验证确认文件能成功存入 Ceph 对象存储并且取回来文件完好无损我这里偷懒只上传删库跑路建议提前备份数据mysqldump -uroot -pPssword123456 -B nextcloud_db nextcloud_db.sql思路创建目录 mkdir /mysql-data 备份数据 mysqldump -uroot -pRoot123456 -B nextcloud_db /mysql-data/nextcloud_db.sql 还原数据 mysql -uroot -pRoot123456 /mysql-data/nextcloud_db.sql将 /var/www/html 的数据拷贝到 s3://next_cloud使用s3cmd同步现有数据node4操作将/var/www/html中的现有数据迁移到s3://next_clouds3cmd 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-fusednf 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:LqbwAN2CB7tYaTyiyOyaGyPzsqah79Op2sWZKSY0mkdir -p /data/s3 s3fs next_cloud /data/s3 -o use_path_request_style -o urlhttp://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的网站根目录为/Nextcloudvim /etc/httpd/conf/httpd.confServerRoot /etc/httpd Listen 80 Include conf.modules.d/*.conf User apache Group apache ServerAdmin rootlocalhost 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/datavim /var/www/html/nextcloud/config/config.php cat /var/www/html/nextcloud/config/config.php?php $CONFIG array ( instanceid ocrdw207tvtp, passwordsalt vQcNYynV3ZMRcr7yaIqda4hrnjFUzh, secret YDEzR0EZd0NF6iBTDDXKj6CjFdX3Ic4KwihtRe5AoCxjih, 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 Nextcloud666, 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-fpmNextcloud 的.htaccess文件Nextcloud 使用.htaccess文件来实现多种功能例如URL 重写将请求重写到index.php以便 Nextcloud 的路由系统可以处理。安全设置禁止访问某些敏感文件如.htaccess、.htpasswd等。缓存控制设置静态文件的缓存策略提高性能。总结一、Ceph 数据存储应用Ceph 文件存储创建数据池和元数据池。创建 Ceph 文件系统CephFS并启动 MDS 服务。客户端挂载 CephFS验证读写功能。Ceph 块存储创建存储池初始化 RBDRados Block Device。创建存储卷image映射为块设备。格式化并挂载块设备验证读写功能。支持在线扩容和缩容。Ceph 对象存储创建 RGWRados Gateway服务配置 S3 兼容接口。创建用户获取访问密钥access key 和 secret key。使用s3cmd工具连接 Ceph 对象存储创建 bucket上传和下载文件。二、Nextcloud 私有云盘部署环境准备在 node4 上安装 Nextcloud 所需的 Web 环境Apache、PHP、MySQL。配置 MySQL 数据库创建 Nextcloud 数据库和用户。Nextcloud 安装上传并解压 Nextcloud 软件包到 Web 目录。通过浏览器访问 Nextcloud完成初始配置。数据存储配置使用 S3 兼容接口将 Nextcloud 数据存储到 Ceph 对象存储中。配置 Nextcloud 数据目录指向 Ceph 对象存储桶。性能优化调整 Nextcloud 的上传文件大小限制。配置 Apache 和 PHP 的相关参数提升性能。安全性配置配置.htaccess文件增强安全性。看情况启用 HTTPS确保数据传输安全。三、后续优化与维护监控与日志使用 Ceph Dashboard 监控集群状态。定期检查日志及时发现并解决问题。备份与恢复定期备份 Nextcloud 数据和配置文件。测试备份的恢复流程确保数据安全。性能调优根据实际使用情况调整 Ceph 集群的配置参数。优化 Nextcloud 的性能提升用户体验。安全加固定期更新系统和软件修复安全漏洞。配置防火墙和安全组限制不必要的访问。通过以上步骤成功搭建了一个基于 Ceph 的分布式存储集群并实现了 Nextcloud 私有云盘的部署。整个系统具备高可用性、高性能和可扩展性能够满足企业级数据存储和共享的需求。