FastDFS-支持双IP特性介绍
FastDFS V6.0支持双IP特性介绍
参考URL: https://www.nuomiphp.com/Article/detail/id/87.html
FastDFS6.0.6搭建集群
参考URL: http://www.luyixian.cn/news_show_381479.aspx
v6.0支持双IP,tracker server和storage server均支持双IP。
v6.0新增特性说明如下:
支持双IP,一个内网IP,一个外网IP,支持NAT方式的内网和外网双IP,解决跨机房或混合云部署问题。双ip特性可以解决这个外网和跨云的问题。
tracker server 和 storage server均可支持双IP,一个内网IP,一个外网IP。
FastDFS支持双IP特性后,将完全兼容以前单IP的设计和逻辑。对于storage server要使用双IP特性,必须使用FastDFS V4.0引入的storage server id特性,也就是把双IP配置到 storage_ids.conf 中。
双ip连接规则
-
storage 连接storage server,优先尝试连接内网IP,失败了再尝试连接外网IP。
-
client向tracker server获取storage server IP,tracker server采用规则如下:
外网过来的请求,返回外网IP;
内网过来的请求,返回内网IP。
内网IP地址段为:10. 打头,192.168. 打头以及 172.[16-32). 打头的IP地址。注:[10-32)为范围表示方式,表示大于等于10且小于32的整数。
双ip配置
-
配置 tracker
vim /etc/fdfs/tracker.conf
# 需要修改的内容如下 # 注意服务器是 NAT 方式所以此处绑定的是内网 IP 可以在阿里云后台看到 # 可以使用命令查看 ifconfig -a 没有公网的IP bind_addr = 172.xxx.xxx.xxx # tracker 服务器端口(默认22122,一般不修改) port=22122 # 存储日志和数据的根目录 base_path=/home/dfs # use_storage_id 设置为 true 后需要在 storage_ids.conf 设置双 IP # 原注释如下: # if use storage server ID instead of IP address # if you want to use dual IPs for storage server, you MUST set # this parameter to true, and configure the dual IPs in the file # configured by following item "storage_ids_filename", such as storage_ids.conf # default value is false # since V4.00 use_storage_id = true
use_storage_id 设置为 true 后需要在 storage_ids.conf 设置双 IP
-
配置 storage_ids.conf
# <id> <group_name> <ip_or_hostname[:port]> # # id is a natural number (1, 2, 3 etc.), # 6 bits of the id length is enough, such as 100001 # # storage ip or hostname can be dual IPs seperated by comma, # one is an inner (intranet) IP and another is an outer (extranet) IP, # or two different types of inner (intranet) IPs # for example: 192.168.2.100,122.244.141.46 # another eg.: 192.168.1.10,172.17.4.21 # # the port is optional. if you run more than one storaged instances # in a server, you must specified the port to distinguish different instances. # 一个内网 IP 一个公网 IP 100001 group1 172.XXX.XXX.XXX,123.XXX.XXX.XXX 100002 group1 172.XXX.XXX.XXX,123.XXX.XXX.XXX
-
配置 storage
vim /etc/fdfs/storage.conf
# 需要修改的内容如下 # storage服务端口(默认23000,一般不修改) port=23000 # 数据和日志文件存储根目录 base_path=/home/dfs # 第一个存储目录 store_path0=/home/dfs # 重点是这个,一定注意格式 内网,外网:端口号 # 重点是这个,一定注意格式 内网,外网:端口号 # 重点是这个,一定注意格式 内网,外网:端口号 # tracker_server can ocur more than once for multi tracker servers. # the value format of tracker_server is "HOST:PORT", # the HOST can be hostname or ip address, # and the HOST can be dual IPs or hostnames seperated by comma, # the dual IPS must be an inner (intranet) IP and an outer (extranet) IP, # or two different types of inner (intranet) IPs. # for example: 192.168.2.100,122.244.141.46:22122 # another eg.: 192.168.1.10,172.17.4.21:22122 tracker_server = 192.168.2.100,122.244.111.111:22122 tracker_server = 192.158.2.100,123.244.222.222:22122 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致) http.server_port=8888
storage server要使用双IP的话,需要启动storage server id特性,在tracker.conf中将use_storage_id设置为true,需要将storage server双IP配置到storage_ids.conf中。
FastDFS-支持IPV6
官方HISTORY 关键字 IPv6
Version 1.41 2019-09-30
- change CIDR network_bits range from [16, 32) to [10, 32)
- ini_file_reader.c: fix empty string compare
- multi_socket_client.c: code refine
- sockopt.[hc] support IPv6
查看源码 sockopt.c,可以看到 加入ipv6的判断,使用的函数都是支持ipv6的函数,如:
inet_pton 函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表表达(presentation)和数值(numeric)。
typedef struct sockaddr_convert_s {
socklen_t len;
union {
struct sockaddr addr;
struct sockaddr_in addr4;
struct sockaddr_in6 addr6;
} sa;
} sockaddr_convert_t;
...
int setsockaddrbyip(const char *ip, const short port, sockaddr_convert_t *convert)
{
int af;
void *dest;
if (is_ipv6_addr(ip))
{
convert->len = sizeof(convert->sa.addr6);
dest = &convert->sa.addr6.sin6_addr;
af = AF_INET6;
convert->sa.addr6.sin6_family = PF_INET6;
convert->sa.addr6.sin6_port = htons(port);
}
else //ipv4
{
convert->len = sizeof(convert->sa.addr4);
dest = &convert->sa.addr4.sin_addr;
af = AF_INET;
convert->sa.addr4.sin_family = PF_INET;
convert->sa.addr4.sin_port = htons(port);
}
if (inet_pton(af, ip, dest) == 0)
{
logError("file: "__FILE__", line: %d, "
"invalid %s ip address: %s", __LINE__,
(af == AF_INET ? "IPv4" : "IPv6"), ip);
return EINVAL;
}
return 0;
}
参考
FastDFS6.0.6搭建集群
参考URL: http://www.luyixian.cn/news_show_381479.aspx