# FastDFS集群和配置优化


<!--more-->


## 1. 准备

准备3台服务器, 按之前单机的形式安装好

```properties
例:
192.168.1.1 group1
192.168.1.2 group1
192.168.1.3 group2
```

## 2. 集群架构搭建

### 2.1 配置tracker集群

```shell
vim /etc/fdfs/tracker.conf

store_lookup=0 # 0是轮询，1是指定组,2是剩余存储空间多的group优先
#为便于测试看到效果,设置成轮询
```

### 2.2 配置storage集群

`vim /etc/fdfs/storage.conf`

```properties
tracker_server=192.168.1.1:22122 
tracker_server=192.168.1.2:22122 
tracker_server=192.168.1.3:22122 
group_name=group1 #注意组名 192.168.1.3 配置是 group2 (可自定义不同group机器)
port=23000 #storage 的端口号,同一个组的 storage 端口号必须相同
```

```shell
#启动
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
```

### 2.3 查看storage日志:tracker集群信息

```shell
#注意, 此处为你自定义的日志路径
cat /home/fastdfs/logs/storaged.log

访问FastDFS时可以把Tracker理解成对等的,但实际底层多个Tracker在
运行过程中会选择其中一个作为Leader，由该Leader执行一些唯一性的操作。
在早期版本中Tracker-Leader有两个作用,
分别是：
	为新加入的Storage分配一个源Storage；
  为开启合并存储的Group选择Trunk-Server。
但是在最新的版本中实际上只有第二个作用，也就是选择Trunk-Server。

#查看之后如果连接不上注意防火墙
systemctl stop ﬁrewalld 
```

### 2.4 查看存储集群信息

```shell
/usr/bin/fdfs_monitor  /etc/fdfs/storage.conf
```

### 2.5 测试上传

```shell
vim/etc/fdfs/client.conf 

tracker_server=192.168.1.1:22122 
tracker_server=192.168.1.2:22122 
tracker_server=192.168.1.3:22122 

#测试上传
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf hello1.txt 

group1/M00/00/00/cnOr3GJr-0-AQ39fAAAABiSnR18363.txt
```

##  3. 使用nginx和fastDFS集群结合

```shell
vim /etc/fdfs/mod_fastdfs.conf

tracker_server=192.168.1.1:22122 
tracker_server=192.168.1.2:22122 
tracker_server=192.168.1.3:22122
group_name=group1 #注意组名 如果是group2 则一定要改
```

```nginx
vim /usr/local/nginx/conf/nginx.conf

#添加如下配置 
server {
  listen 8888; 
  server_name localhost; 
  location ~/group[0-9]/ { 
    ngx_fastdfs_module; 
  } 
}

#启动nginx 或重启
/usr/local/nginx/sbin/nginx 
/usr/local/nginx/sbin/nginx -s reload
```

测试,通过任意一台nginx访问: 

```http
http://192.168.1.1:8888/group1/M00/00/00/cnOItmJr-0qASItAAAAABiSnR18929.txt
```

## 4. FastDFS配置优化

### 4.1 最大连接数设置

```
配置文件：tracker.conf 和 storage.conf 
参数名：max_connections 
缺省值：256
```

> 说明：FastDFS为一个连接分配一个task buffer，为了提升分配效率，FastDFS采用内存池的做法。 FastDFS老版本直接事先分配 max_connections 个buffer，这个做法显然不是太合理，在 max_connections 设置过大的情况下太浪费内存。
>
> v5.04对预分配采用增量方式，tracker一次预分配 1024个，storage一次预分配256个。 
>
> - define ALLOC_CONNECTIONS_ONCE 1024 
>
> 总的task buffer初始内存占用情况测算如下 
>
> - 改进前：max_connections * buffer_size 
>
> - 改进后：max_connections和预分配的连接中那个小 * buffer_size 
>
> 使用v5.04及后续版本，可以根据实际需要将 max_connections 设置为一个较大的数值，比如 10240 甚至更大。 
>
> 注意此时需要将一个进程允许打开的最大文件数调大到超过max_connections, 否则FastDFS server启动会报错。 
>
> >  vim /etc/security/limits.conf 重启系统生效 
> >
> > \*      soft    nofile    65535 
> >
> > \*     hard   nofile    65535 
> >
> > 另外，对于32位系统，请注意使用到的内存不要超过3GB 

### 4.2 工作线程数设置

```
配置文件：tracker.conf 和 storage.conf 
参数名： work_threads 
缺省值：4 
```

> 说明：为了避免CPU上下文切换的开销，以及不必要的资源消耗，不建议将本参数设置得过大。为了发挥出 多个CPU的效能，系统中的线程数总和，应等于CPU总数。
>
> - 对于tracker server，公式为： work_threads + 1 = CPU数 
>
> - 对于storage，公式为： work_threads + 1 + (disk_reader_threads + disk_writer_threads) * store_path_count = CPU数

### 4.3 storage目录数设置

```
配置文件： storage.conf 
参数名：subdir_count_per_path 
缺省值：256
```

> 说明：
>
> FastDFS采用二级目录的做法，目录会在FastDFS初始化时自动创建。存储海量小文件，打开了 trunk存储方式的情况下，建议将本参数适当改小，比如设置为32，此时存放文件的目录数为 32 * 32 = 1024。
>
> 假如trunk文件大小采用缺省值64MB，磁盘空间为2TB，那么每个目录下存放的trunk文件数均值 为：2TB/(1024 * 64MB) = 32个

### 4.4  storage磁盘读写线程设置

```
配置文件： storage.conf 
参数名:disk_rw_separated：磁盘读写是否分离 
参数名:disk_reader_threads：单个磁盘读线程数 
参数名:disk_writer_threads：单个磁盘写线程数 

如果磁盘读写混合，单个磁盘读写线程数为读线程数和写线程数之和，
对于单盘挂载方式，磁盘读写线程分 别设置为1即可 
如果磁盘做了RAID，那么需要酌情加大读写线程数，这样才能最大程度地发挥磁盘性能
```

### 4.5 storage同步延迟相关设置

```
配置文件： storage.conf 
参数名:sync_binlog_buff_interval
	将binlog buffer写入磁盘的时间间隔，取值大于0，缺省值 为60s 
参数名:sync_wait_msec
	如果没有需要同步的文件，对binlog进行轮询的时间间隔，取值大于0，缺省值为200ms 
参数名: sync_interval
	同步完一个文件后，休眠的毫秒数，缺省值为0 
	
为了缩短文件同步时间，可以将上述3个参数适当调小即可
```

