Skip to content

Commit

Permalink
Docs: check image alt text (#3998)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaogaozi authored Aug 15, 2023
1 parent 7633e70 commit 05176f1
Show file tree
Hide file tree
Showing 38 changed files with 143 additions and 136 deletions.
9 changes: 8 additions & 1 deletion .markdownlint-cli2.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
},
"fenced-code-language": false,
"first-line-heading": false,
"no-alt-text": false,
"no-alt-text": true,
"code-block-style": {
"style": "fenced"
},
Expand Down Expand Up @@ -77,6 +77,7 @@
"Consul",
"Debian",
"DevOps",
"DigitalOcean",
"DistCp",
"Docker Compose",
"Docker",
Expand Down Expand Up @@ -117,9 +118,11 @@
"JuiceFS",
"JuiceFSRuntime",
"Juicedata",
"K3s",
"K8s",
"Kerberos",
"KeyDB",
"KubeSphere",
"Kubernetes",
"LDAP",
"LZ4",
Expand All @@ -130,6 +133,7 @@
"MinIO",
"MySQL",
"NFS",
"NGINX",
"POSIX",
"PV",
"PVC",
Expand All @@ -145,9 +149,11 @@
"RGW",
"RPC",
"Raft",
"Rancher",
"Ranger",
"Redis",
"S3",
"S3QL",
"SDK",
"SFTP",
"SID",
Expand All @@ -167,6 +173,7 @@
"Ubuntu",
"Unix",
"VFS",
"WSL",
"WebDAV",
"WinFsp",
"Windows",
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ JuiceFS consists of three parts:

JuiceFS can store the metadata of file system on different metadata engines, like Redis, which is a fast, open-source, in-memory key-value data storage, particularly suitable for storing metadata; meanwhile, all the data will be stored in Object Storage through JuiceFS client. [Learn more](https://juicefs.com/docs/community/architecture)

![](docs/en/images/data-structure-diagram.svg)
![data-structure-diagram](docs/en/images/data-structure-diagram.svg)

Each file stored in JuiceFS is split into **"Chunk"** s at a fixed size with the default upper limit of 64 MiB. Each Chunk is composed of one or more **"Slice"**(s), and the length of the slice varies depending on how the file is written. Each slice is composed of size-fixed **"Block"** s, which are 4 MiB by default. These blocks will be stored in Object Storage in the end; at the same time, the metadata information of the file and its Chunks, Slices, and Blocks will be stored in metadata engines via JuiceFS. [Learn more](https://juicefs.com/docs/community/architecture/#how-juicefs-store-files)

Expand Down
4 changes: 2 additions & 2 deletions docs/en/administration/fault_diagnosis_and_analysis.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ JuiceFS provides the `profile` and `stats` subcommands to visualize real-time pe

[`juicefs profile`](../reference/command_reference.md#profile) will collect data from [file system access log](#access-log), run the `juicefs profile MOUNTPOINT` command, you can see the real-time statistics of each file system operation based on the latest access log:

![](../images/juicefs-profiling.gif)
![JuiceFS-profiling](../images/juicefs-profiling.gif)

Apart from real-time mode, this command also provides a play-back mode, which performs the same visualization on existing access log files:

Expand All @@ -203,7 +203,7 @@ juicefs profile /tmp/juicefs.accesslog --uid 12345

The [`juicefs stats`](../reference/command_reference.md#stats) command reads JuiceFS Client internal metrics data, and output performance data in a format similar to `dstat`:

![](../images/juicefs_stats_watcher.png)
![juicefs_stats_watcher](../images/juicefs_stats_watcher.png)

Metrics description:

Expand Down
2 changes: 1 addition & 1 deletion docs/en/administration/metadata_dump_load.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Starting with JuiceFS v1.0.0, the client automatically backs up metadata and cop

The backup files are stored in the `meta` directory of the object storage. It is a separate directory from the data store and not visible in the mount point and does not interact with the data store, and the directory can be viewed and managed using the file browser of the object storage.

![](../images/meta-auto-backup-list.png)
![meta-auto-backup-list](../images/meta-auto-backup-list.png)

By default, the JuiceFS client backs up metadata once an hour. The frequency of automatic backups can be adjusted by the `--backup-meta` option when mounting the filesystem, for example, to set the auto-backup to be performed every 8 hours.

Expand Down
6 changes: 3 additions & 3 deletions docs/en/administration/monitoring.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ The JuiceFS client exposes real-time metrics in [Prometheus](https://prometheus.

After JuiceFS is mounted on a host, you can access its metrics using `http://localhost:9567/metrics`, other types of JuiceFS Client (CSI Driver, S3 Gateway, Hadoop SDK) is slightly different in this regard, see [Collecting metrics data](#collect-metrics).

![](../images/prometheus-client-data.jpg)
![Prometheus-client-data](../images/prometheus-client-data.jpg)

Here, taking collect metrics of the mount point as an example, edit [`prometheus.yml`](https://prometheus.io/docs/prometheus/latest/configuration/configuration) to add a new scrape config (`scrape_configs`):

Expand Down Expand Up @@ -54,7 +54,7 @@ Create a new Prometheus-type data source in Grafana:
- **Name**: For identification purposes, you can fill it in with the name of the file system.
- **URL**: Data interface for Prometheus, which defaults to `http://localhost:9090`.

![](../images/grafana-data-source.jpg)
![Grafana-data-source](../images/grafana-data-source.jpg)

JuiceFS provides some dashboard templates for Grafana, which can be imported to show the collected metrics in Prometheus:

Expand All @@ -65,7 +65,7 @@ JuiceFS provides some dashboard templates for Grafana, which can be imported to

Our Grafana dashboard looks like this:

![](../images/grafana_dashboard.png)
![grafana_dashboard](../images/grafana_dashboard.png)

## Collecting metrics data {#collect-metrics}

Expand Down
2 changes: 1 addition & 1 deletion docs/en/benchmark/performance_evaluation_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ juicefs stats /mnt/jfs --verbosity 1

The results are shown below, which would be easier to understand when combing with the `bench` performance test flows described above.

![](../images/bench-guide-stats.png)
![bench-guide-stats](../images/bench-guide-stats.png)

Learn the meaning of indicators in [`juicefs stats`](../administration/fault_diagnosis_and_analysis.md#stats).

Expand Down
6 changes: 3 additions & 3 deletions docs/en/deployment/s3_gateway.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ JuiceFS has introduced S3 gateway since v0.11. The feature is implemented based

Since JuiceFS stores files in chunks, the files cannot be accessed directly through the interfaces of the underlying object storage. The S3 gateway accesses the underlying object storage in a similar way, shown in the following architecture diagram.

![](../images/juicefs-s3-gateway-arch.png)
![JuiceFS-S3-gateway-arch](../images/juicefs-s3-gateway-arch.png)

## Prerequisites

Expand Down Expand Up @@ -39,7 +39,7 @@ juicefs gateway --cache-size 20480 redis://localhost:6379 localhost:9000

In this example, we assume that the JuiceFS file system is using a local Redis database. When the S3 gateway is enabled, the administrative interface of the S3 gateway can be accessed from the **current host** using the address `http://localhost:9000`.

![](../images/s3-gateway-file-manager.jpg)
![S3-gateway-file-manager](../images/s3-gateway-file-manager.jpg)

If you want to access the S3 gateway from other hosts on the LAN or over the Internet, you need to change the listening address, e.g.

Expand Down Expand Up @@ -333,4 +333,4 @@ export MINIO_ROOT_PASSWORD=12345678

The port number of the S3 gateway console is explicitly specified here as 59001. If not specified, a port will be randomly assigned. According to the command line prompt, open the address [http://127.0.0.1:59001](http://127.0.0.1:59001) in the browser to access the console, as shown in the following snapshot:

![](../images/s3-gateway-console.png)
![S3-gateway-console](../images/s3-gateway-console.png)
4 changes: 2 additions & 2 deletions docs/en/getting-started/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ An output similar to the following will return if the file system creation is co

As you can see from the output, the file system uses SQLite as the metadata storage engine. The database file is located in the current directory with the file name `myjfs.db`, which creates a table to store all the metadata of the file system `myjfs`.

![](../images/sqlite-info.png)
![SQLite-info](../images/sqlite-info.png)

Since no storage-related options are specified in this example, the local disk is used as the storage medium by default. According to the output, the file system storage path is `file:///Users/herald/.juicefs/local/myjfs/`.

Expand Down Expand Up @@ -97,7 +97,7 @@ The following command mounts the `myjfs` file system to the `~/jfs` folder:
juicefs mount sqlite3://myjfs.db ~/jfs
```

![](../images/sqlite-mount-local.png)
![SQLite-mount-local](../images/sqlite-mount-local.png)

The client mounts the file system in the foreground by default. As you can see in the above image, the program keeps running in the current terminal. To unmount the file system, press <kbd>Ctrl</kbd> + <kbd>C</kbd> or close the terminal window.

Expand Down
2 changes: 1 addition & 1 deletion docs/en/guide/cache_management.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ In comparison, JuiceFS Enterprise Edition provides richer functionalities around

To improve performance, JuiceFS also provides various caching mechanisms for data, including page cache in the kernel, local file system cache in client host, and read/write buffer in client process itself. Read requests will try the kernel page cache, the client process buffer, and the local disk cache in turn. If the data requested is not found in any level of the cache, it will be read from the object storage, and also be written into every level of the cache asynchronously to improve the performance of the next access.

![](../images/juicefs-cache.png)
![JuiceFS-cache](../images/juicefs-cache.png)

### Read/Write buffer {#buffer-size}

Expand Down
4 changes: 2 additions & 2 deletions docs/en/guide/sync.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,11 +208,11 @@ For example, if you're dealing with a object storage bucket used by JuiceFS, dir

Synchronizing between two object storages is essentially pulling data from one and pushing it to the other. The efficiency of the synchronization will depend on the bandwidth between the client and the cloud.

![](../images/juicefs-sync-single.png)
![JuiceFS-sync-single](../images/juicefs-sync-single.png)

When copying large scale data, node bandwidth can easily bottleneck the synchronization process. For this scenario, `juicefs sync` provides a multi-machine concurrent solution, as shown in the figure below.

![](../images/juicefs-sync-worker.png)
![JuiceFS-sync-worker](../images/juicefs-sync-worker.png)

Manager node executes `sync` command as the master, and defines multiple worker nodes by setting option `--worker` (manager node itself also serve as a worker node). JuiceFS will split the workload distribute to Workers for distributed synchronization. This increases the amount of data that can be processed per unit time, and the total bandwidth is also multiplied.

Expand Down
2 changes: 1 addition & 1 deletion docs/en/introduction/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ description: This article introduces the technical architecture of JuiceFS and i

The JuiceFS file system consists of three parts:

![](../images/juicefs-arch.svg)
![JuiceFS-arch](../images/juicefs-arch.svg)

**JuiceFS Client**: The JuiceFS client handles all file I/O operations, including background tasks like data compaction and trash file expiration. It communicates with both the object storage and metadata engine. The client supports multiple access methods:

Expand Down
2 changes: 1 addition & 1 deletion docs/en/introduction/comparison/juicefs_vs_s3ql.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ S3QL is developed in Python and requires `python-devel` 3.7 or higher to be inst

S3QL will install 12 binary programs in the system, and each program provides an independent function, as shown in the figure below.

![](../../images/s3ql-bin.jpg)
![S3QL-bin](../../images/s3ql-bin.jpg)

#### JuiceFS

Expand Down
6 changes: 3 additions & 3 deletions docs/en/introduction/io_processing.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ JuiceFS splits large files at multiple levels to improve I/O performance. See [h

Sequential writes are optimized, requiring only one continuously growing slice and one final flush. This maximizes object storage write performance. A simple [JuiceFS benchmark](../benchmark/performance_evaluation_guide.md) below shows sequentially writing a 1 GiB file with a 1 MiB I/O size at its first stage. The following figure shows the data flow in each component of the system.

![](../images/internals-write.png)
![internals-write](../images/internals-write.png)

Use [`juicefs stats`](../reference/command_reference.md#stats) to obtain real-time performance monitoring metrics.

![](../images/internals-stats.png)
![internals-stats](../images/internals-stats.png)

The first highlighted section in the above figure shows:

Expand Down Expand Up @@ -54,7 +54,7 @@ Learn more in [Client Write Cache](../guide/cache_management.md#writeback).

JuiceFS supports sequential reads and random reads (including mmap-based random reads). During read requests, the object corresponding to the block is completely read through the `GetObject` API of the object storage, or only a certain range of data in the object may be read (e.g., the read range is limited by the `Range` parameter of [S3 API](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)). Meanwhile, prefetching is performed (controlled by the [`--prefetch`](../reference/command_reference.md#mount) option) to download the complete data block into the local cache directory, as shown in the `blockcache` write speed in the second stage of the above metrics figure. This is very good for sequential reads as all cached data is utilized, maximizing the object storage access efficiency. The dataflow is illustrated in the figure below:

![](../images/internals-read.png)
![internals-read](../images/internals-read.png)

Although prefetching works well for sequential reads, it might not be so effective for random reads on large files. It can cause read amplification and frequent cache eviction. Consider disabling prefetching using `--prefetch=0`. It is always hard to design cache strategy for random read scenarios. Two possible solutions are increasing the cache size to store all data locally or completely disabling the cache (`--cache-size=0`) and relying on a high-performance object storage service.

Expand Down
2 changes: 1 addition & 1 deletion docs/en/tutorials/aliyun.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ The metadata is stored completely independently, and the retrieval and processin

This design can effectively reduce the cost of the object storage in terms of the number of requests, but also allows us to significantly experience the performance improvement brought by JuiceFS.

![](../images/juicefs-arch-new.png)
![JuiceFS-arch-new](../images/juicefs-arch-new.png)

## Preparation

Expand Down
4 changes: 2 additions & 2 deletions docs/en/tutorials/digitalocean.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Don't worry about the choice of database, the JuiceFS client provides a metadata

For this article, we use DigitalOcean's Redis 6 database hosting service, choose `Singapore`, and select the same VPC private network as the existing Droplet. It takes about 5 minutes to create the Redis, and we follow the setup wizard to initialize the database.

![](../images/digitalocean-redis-guide.png)
![DigitalOcean-Redis-guide](../images/digitalocean-redis-guide.png)

By default, the Redis allows all inbound connections. For security reasons, you should select the Droplet that have access to the Redis in the security setting section of the setup wizard in the `Add trusted sources`, that is, only allow the selected host to access the Redis.

Expand All @@ -54,7 +54,7 @@ In the setting of the eviction policy, it is recommended to select `noeviction`,
The access address of the Redis can be found in the `Connection Details` of the console. If all computing resources are in DigitalOcean, it is recommended to use the VPC private network for connection first, which can maximize security.

![](../images/digitalocean-redis-url.png)
![DigitalOcean-Redis-url](../images/digitalocean-redis-url.png)

## Installation and Use

Expand Down
12 changes: 6 additions & 6 deletions docs/en/tutorials/juicefs_on_k3s.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ slug: /juicefs_on_k3s

[K3s](https://k3s.io) is a functionally optimized lightweight Kubernetes distribution that is fully compatible with Kubernetes.In other words, almost all operations performed on Kubernetes can also be executed on K3s. K3s packages the entire container orchestration system into a binary program with a size of less than 100MB, significantly reducing the environment dependencies and installation steps required to deploy Kubernetes production clusters. Compared to Kubernetes, K3s has lower performance requirements for the operating system.

In this article, we will build a K3s cluster with two nodes, install and configure [JuiceFS CSI Driver](https://github.com/juicedata/juicefs-csi-driver) for the cluster, and lastly create an Nginx Pod for verification.
In this article, we will build a K3s cluster with two nodes, install and configure [JuiceFS CSI Driver](https://github.com/juicedata/juicefs-csi-driver) for the cluster, and lastly create an NGINX Pod for verification.

## Deploy a K3s cluster

Expand Down Expand Up @@ -124,9 +124,9 @@ juicefs-sc csi.juicefs.com Retain Immediate

> **Note**: A storage class is associated with a JuiceFS file system. You can create as many storage classes as you need, but be aware of the storage class name in the configuration file as the same name can cause conflicts.

## Use JuiceFS to persist Nginx data
## Use JuiceFS to persist NGINX data

Next, deploy an Nginx Pod using a persistent storage declared by the JuiceFS storage class.
Next, deploy an NGINX Pod using a persistent storage declared by the JuiceFS storage class.

### Deployment

Expand Down Expand Up @@ -206,7 +206,7 @@ sudo kubectl apply -f service.yaml

### Ingress

K3s is pre-installed with traefik-ingress by default. Create an ingress for Nginx through the following configuration. For example: `ingress.yaml`
K3s is pre-installed with traefik-ingress by default. Create an ingress for NGINX through the following configuration. For example: `ingress.yaml`

```yaml
apiVersion: networking.k8s.io/v1
Expand Down Expand Up @@ -236,9 +236,9 @@ sudo kubectl apply -f ingress.yaml

### Visit

After the deployment is completed, use the host on the same LAN to access any cluster node, and then you will see the Nginx welcome page.
After the deployment is completed, use the host on the same LAN to access any cluster node, and then you will see the NGINX welcome page.

![](../images/k3s-nginx-welcome.png)
![K3s-NGINX-welcome](../images/k3s-nginx-welcome.png)

Next, check whether the container has successfully mounted JuiceFS, and execute the following command to check the Pod status:

Expand Down
Loading

0 comments on commit 05176f1

Please sign in to comment.