Skip to content

Commit f1e03d2

Browse files
committed
Add mode
1 parent 137a7c9 commit f1e03d2

File tree

4 files changed

+982
-5
lines changed

4 files changed

+982
-5
lines changed

docs/zh/installation/linux/multiple-node-multiple-disk.md

Lines changed: 344 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,24 @@ description: 在多台服务器的多个磁盘上安装 RustFS, 数据将存储
55

66
# 多机多盘(MNMD, Multiple Node Multiple Disk)
77

8-
> 适用于生产环境中的关键业务,建议在专家指导下进行配置,并且了解并发、吞吐、业务场景、压力等多项指标,对系统进行全面优化。
98

10-
最小需要 4 台服务器,最低每台服务器需要 1 块磁盘,才可以安全的启动分布式象存储集群。
9+
10+
## 一、安装前必读
11+
12+
本页面包含了 RustFS 的三种安装模式的全部文档和说明。其中,多机多盘的模式包含了企业级可用的性能、安全性和扩展性。并且,提供了生产工作负载需要的架构图。请装前请阅读,我们的启动模式与检查清单,如下:
13+
14+
1. 请明确您的三种安装启用模式:
15+
16+
1. 单机单盘模式(SNSD)
17+
2. 单机多盘模式(SNMD)
18+
3. 多机多盘模式(MNMD) (当前文档)
19+
20+
2. [安装前检查](../checklists/index.md),确保各项指标符合生产指导特征,若不需要生产标准可不阅读此指导;
21+
22+
23+
> 当前文档适合于单机多盘模式, 多机多盘适用于生产环境中的关键业务,建议在专家指导下进行配置,并且了解并发、吞吐、业务场景、压力等多项指标,对系统进行全面优化。
24+
25+
最少需要 **4台服务器**,最低每台服务器需要 1 块磁盘,才可以安全的启动分布式象存储集群。
1126

1227
以下架构图例,数据通过负载均衡,随机向任何一台服务器写入数据。以默认 12 + 4 的模式。 一个数据块默认会切分成 12 个数据块 + 4 个校验块,分别存到不同服务器的不同磁盘上。
1328

@@ -16,3 +31,330 @@ description: 在多台服务器的多个磁盘上安装 RustFS, 数据将存储
1631
任何 4 块磁盘以内的数据损坏都不会影响数据安全。
1732

1833
<img src="./images/multiple-node-multiple-disk.jpg" alt="RustFS Multiple Node Multiple Disk Mode" />
34+
35+
36+
37+
## 二、先决条件
38+
39+
1. 操作系统版本;
40+
41+
2. 防火墙;
42+
43+
3. 主机别名或者域名解析;
44+
45+
4. 内存条件;
46+
47+
5. 时间同步;
48+
49+
6. 容量规划;
50+
51+
7. 磁盘规划;
52+
53+
8. 文件系统规划;
54+
55+
56+
### 2.1. 操作系统版本
57+
58+
我们推荐 Linux 内核为 4.x 及以上的版本。因为,5.x / 6.x 的版本可以获得更好的 IO 吞吐和网络性能。
59+
60+
您可以使用 Ubuntu 22.04 和 RHEL8.x 来安装 RustFS。
61+
62+
### 2.2 防火墙
63+
64+
Linux 系统默认开启防火墙,您可以使用以下命令查看防火墙状态:
65+
66+
```bash
67+
systemctl status firewalld
68+
```
69+
70+
如果您的防火墙状态为“active”,您可以使用以下命令禁用防火墙:
71+
72+
```bash
73+
systemctl stop firewalld
74+
systemctl disable firewalld
75+
```
76+
77+
或者放行 RustFS 的 9000 端口:
78+
79+
```bash
80+
firewall-cmd --zone=public --add-port=9000/tcp --permanent
81+
firewall-cmd --reload
82+
```
83+
84+
部署中的所有 RustFS 服务器 **必须** 使用相同的监听端口。如果您使用的是 9000 端口,其他服务器的所有端口均需要为 9000 端口。
85+
86+
### 2.3 主机名(单机单盘和单机多盘可跳过此步骤)
87+
88+
> 单机单盘、单机多盘不设置主机别名,请跳过此步骤。
89+
90+
创建 RustFS 集群必须要使用 **相同的、具备连续性** 的主机名。有两种方式实现连续性的主机名:
91+
92+
**1. DNS 配置:**
93+
94+
请配置你的DNS解析服务器,保障名字的连续性。
95+
96+
**2. HOSTS 配置:**
97+
98+
修改 /etc/hosts中的本地别名设置,具体操作如下:
99+
100+
101+
```bash
102+
vim /etc/hosts
103+
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
104+
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
105+
192.168.1.1 node1
106+
192.168.1.2 node2
107+
192.168.1.3 node3
108+
192.168.1.4 node4
109+
```
110+
111+
### 2.4 内存条件
112+
113+
RustFS 需要至少 2 GB 的内存来运行测试环境,生产的环境最低需要 128 GB 的内存。
114+
115+
### 2.5 时间同步
116+
117+
多节点的一致性必须要使用时间服务器维护时间的一致性,不然可能会出现无法启动服务的情况。相关时间服务器例如使用 `ntp` , `timedatectl` , 或者 `timesyncd`
118+
119+
RustFS 需要时间同步,您可以使用以下命令检查时间同步状态:
120+
121+
```bash
122+
timedatectl status
123+
```
124+
125+
如果状态为“synchronized”,则表示时间同步正常。
126+
127+
128+
### 2.6 容量和EC规划
129+
130+
在规划对象存储容量的时候,我们建议您根据:
131+
132+
- 初始数据量: 您计划一次性迁移或存储多少数据?(例如:500 TB)
133+
- 数据增长量:每天/每周/每月的数据增长容量;
134+
- 规划周期: 您希望这次的硬件规划能支撑多久?(建议:3年)
135+
- 考虑您公司的硬件迭代和更新周期。
136+
137+
EC(纠删码)规划如下:
138+
139+
| 场景 | 推荐校验级别 | 说明 |
140+
| - | - | - |
141+
| 标准生产环境 | EC:4 | 能够容忍最多4块磁盘(或节点)故障,在可靠性和存储效率之间取得了很好的平衡。|
142+
| 高可用性要求 | EC:4 - 8 | 或更高 适用于对数据可用性要求极高的场景,但会牺牲更多的存储空间。|
143+
| 开发测试环境 | EC:2| 提供基本的冗余保护,适用于非关键业务。|
144+
145+
146+
### 2.7 磁盘规划
147+
148+
由于NFS在高IO情况下,会产生幻写和锁的问题,在使用RustFS时 **禁止使用NFS** 作为RustFS的底层存储介质。 官方强烈建议使用**JBOD(Just a Bunch of Disks)**模式,即简单磁盘捆绑。这意味着将物理磁盘直接、独立地暴露给操作系统,由RustFS软件层面负责数据冗余和保护。
149+
150+
151+
原因如下:
152+
153+
- **性能更优:** RustFS 的纠删码(Erasure Coding)引擎经过高度优化,能够直接并发读写多块磁盘,实现比硬件RAID控制器更高的吞吐量。硬件RAID会成为性能瓶颈。
154+
- **成本更低:** 无需昂贵的RAID卡,降低了硬件采购成本。
155+
- **管理更简单:** 由RustFS统一管理磁盘,简化了存储层的运维。
156+
- **故障恢复更快:** RustFS(healing)过程比传统的RAID重建(rebuild)速度更快,且对集群性能影响更小。
157+
158+
官方推荐在磁盘上使用NVMe SSD作为您的存储介质,保障更高的性能和吞吐能力。
159+
160+
### 2.8 文件系统选择
161+
162+
RustFS官方在磁盘文件系统格式上,RustFS官方强烈推荐在所有用于存储的磁盘上使用 XFS 文件系统。RustFS的开发和测试都基于XFS,能够确保最佳的性能和稳定性。不建议使用ext4、BTRFS或ZFS等其他文件系统,因为它们可能会导致性能下降或出现不可预知的问题。
163+
164+
RustFS是一个为高并发、高性能设计的对象存储系统。当客户端上传或下载大对象时,RustFS会将其分片,并以并行的方式同时读写到纠删集(Erasure Set)中的多块磁盘上。
165+
166+
XFS的优势:XFS(eXtents File System)从设计之初就是为了高性能和可扩展性而生。它在大文件处理和高并发I/O场景下表现极其出色。其内部的日志和数据结构(如B+树)能够高效地处理大量的并行读写请求,这与RustFS的工作模式完美契合。相比之下,虽然ext4等文件系统近年来性能有很大提升,但在面对极端并发负载时,XFS通常能提供更稳定、更优越的吞-吐量。
167+
168+
对象存储通常需要处理海量的文件和巨大的单个文件(TB级别), XFS是一个64位的文件系统,能够支持极大的文件大小(高达8 EB)和文件系统规模。它的元数据管理非常高效,即使在单个目录下存放数百万个文件,其性能下降也远小于其他文件系统。这对于RustFS将每个对象(或对象的某个版本)作为一个独立文件存储在后端文件系统上的方式至关重要。
169+
170+
RustFS 在写入新对象或对象的版本时,为了保证写入性能和减少文件碎片,会进行空间预留, XFS提供了名为fallocate的高效API,允许应用程序预留一块连续的磁盘空间。RustFS利用这个特性,在写入文件之前就为其分配好所需的空间,避免了写入过程中因动态扩容和元数据更新带来的性能开销,同时也最大程度地减少了文件碎片的产生,保证了后续读取的性能。
171+
172+
为了更好的发现磁盘,在xfs文件系统格式化时我们建议使用 **Label** 标签,对磁盘进行打标。
173+
174+
首先,需要查看磁盘系统的情况:
175+
176+
```
177+
sudo lsblk
178+
179+
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
180+
sda 8:0 0 465.7G 0 disk
181+
├─sda1 8:1 0 512M 0 part /boot/efi
182+
└─sda2 8:2 0 465.2G 0 part /
183+
nvme0n1 8:16 0 3.7T 0 disk <-- if this is our format new disk
184+
nvme1n1 8:32 0 3.7T 0 disk <-- if this is our format new disk
185+
nvme2n1 8:48 0 3.7T 0 disk
186+
```
187+
188+
具体格式化命令如下:
189+
190+
```
191+
sudo mkfs.xfs -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb
192+
```
193+
194+
我们可以在格式化时加入一些推荐选项来优化性能:
195+
- -L \<label\>: 为文件系统设置一个标签(label),方便后续识别和挂载。
196+
- -i size=512: RustFS官方推荐将inode大小设置为512字节,这对于存储大量小对象(元数据)的场景有性能优势。
197+
- -n ftype=1: 开启ftype功能。这允许文件系统在目录结构中记录文件类型,可以提高类似readdir和unlink操作的性能,对RustFS非常有利。
198+
199+
挂载:
200+
201+
```
202+
# write new line
203+
vim /etc/fstab
204+
LABEL=RUSTFS0 /data/rustfs0 xfs defaults,noatime,nodiratime 0 0
205+
206+
#save & exit
207+
208+
# mount disk
209+
sudo mount -a
210+
```
211+
212+
## 三、配置用户名
213+
214+
RustFS 启动,我们建议您配置一个专门的无登录权限的用户进行启动 RustFS 的服务。在 rustfs.service 启动控制脚本中。
215+
216+
1. **不修改默认启动账户** :默认的用户和用户组是 `root``root` ,若您想使用默认的`root``root`,则不需要进行任何修改。
217+
2. **不修改默认启动账户** :您可以使用 groupadd 和 useradd 命令创建用户和组,添加后修改 systemctl 启动配置文件的用户名和密码。
218+
219+
220+
以下示例是修改创建用户、组并设置权限以访问 RustFS 指定的数据目录(可选):
221+
222+
```
223+
groupadd -r rustfs-user
224+
useradd -M -r -g rustfs-user rustfs-user
225+
chown rustfs-user:rustfs-user /data/rustfs*
226+
```
227+
228+
注意:
229+
- 如果创建了rustfs-user用户和组需要将 `/etc/systemd/system/rustfs.service` 中的User 和Group改为 `rustfs-user` ;
230+
-` /data/rustfs*` 调整为指定的挂载目录。
231+
232+
## 四、下载安装包
233+
234+
请先安装 wge 或者 curl 下载 rustfs 安装包。
235+
236+
```bash
237+
# 下载地址
238+
wget https://dl.rustfs.com/artifacts/rustfs/release/rustfs-linux-x86_64-musl-latest.zip
239+
unzip rustfs-linux-x86_64-musl-latest.zip
240+
chmod +x rustfs
241+
mv rustfs /usr/local/bin/
242+
```
243+
244+
### 五、配置环境变量
245+
246+
1. 创建配置文件
247+
248+
249+
```bash
250+
# 多机多盘模式
251+
sudo tee /etc/default/rustfs <<EOF
252+
RUSTFS_ACCESS_KEY=rustfsadmin
253+
RUSTFS_SECRET_KEY=rustfsadmin
254+
RUSTFS_VOLUMES="http://node{1...4}:9000/data/rustfs{0...3}"
255+
RUSTFS_ADDRESS=":9000"
256+
RUSTFS_CONSOLE_ENABLE=true
257+
RUST_LOG=error
258+
RUSTFS_OBS_LOG_DIRECTORY="/var/logs/rustfs/"
259+
EOF
260+
```
261+
262+
263+
264+
2. 创建存储目录
265+
```bash
266+
sudo mkdir -p /data/rustfs{0..3} /var/logs/rustfs /opt/tls
267+
sudo chmod -R 750 /data/rustfs* /var/logs/rustfs
268+
```
269+
270+
271+
272+
### 七、配置系统服务
273+
1. 创建 systemd 服务文件
274+
275+
```bash
276+
sudo tee /etc/systemd/system/rustfs.service <<EOF
277+
[Unit]
278+
Description=RustFS Object Storage Server
279+
Documentation=https://rustfs.com/docs/
280+
After=network-online.target
281+
Wants=network-online.target
282+
283+
[Service]
284+
Type=notify
285+
NotifyAccess=main
286+
User=root
287+
Group=root
288+
289+
WorkingDirectory=/usr/local
290+
EnvironmentFile=-/etc/default/rustfs
291+
ExecStart=/usr/local/bin/rustfs \$RUSTFS_VOLUMES
292+
293+
LimitNOFILE=1048576
294+
LimitNPROC=32768
295+
TasksMax=infinity
296+
297+
Restart=always
298+
RestartSec=10s
299+
300+
OOMScoreAdjust=-1000
301+
SendSIGKILL=no
302+
303+
TimeoutStartSec=30s
304+
TimeoutStopSec=30s
305+
306+
NoNewPrivileges=true
307+
ProtectSystem=full
308+
ProtectHome=true
309+
PrivateTmp=true
310+
PrivateDevices=true
311+
ProtectClock=true
312+
ProtectKernelTunables=true
313+
ProtectKernelModules=true
314+
ProtectControlGroups=true
315+
RestrictSUIDSGID=true
316+
RestrictRealtime=true
317+
318+
# service log configuration
319+
StandardOutput=append:/var/logs/rustfs/rustfs.log
320+
StandardError=append:/var/logs/rustfs/rustfs-err.log
321+
322+
[Install]
323+
WantedBy=multi-user.target
324+
EOF
325+
```
326+
327+
2. 重新加载服务配置
328+
```bash
329+
sudo systemctl daemon-reload
330+
```
331+
332+
### 八、启动服务与验证
333+
1. 启动服务并设置开机自启
334+
```bash
335+
sudo systemctl enable --now rustfs
336+
```
337+
338+
2. 验证服务状态
339+
```bash
340+
systemctl status rustfs
341+
```
342+
343+
3. 检查服务端口
344+
```bash
345+
netstat -ntpl
346+
```
347+
348+
349+
4. 查看日志文件
350+
```bash
351+
tail -f /var/logs/rustfs/rustfs*.log
352+
```
353+
354+
355+
5. 访问访问控制台
356+
357+
输入服务器的IP地址和端口,尝试访问访问控制台,查看到的界面如下:
358+
359+
![Console](./images/console.jpg)
360+

0 commit comments

Comments
 (0)