FastDFS-支持双IP、IPV6

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连接规则

  1. storage 连接storage server,优先尝试连接内网IP,失败了再尝试连接外网IP。

  2. client向tracker server获取storage server IP,tracker server采用规则如下:
    外网过来的请求,返回外网IP;
    内网过来的请求,返回内网IP。

内网IP地址段为:10. 打头,192.168. 打头以及 172.[16-32). 打头的IP地址。注:[10-32)为范围表示方式,表示大于等于10且小于32的整数。

双ip配置

  1. 配置 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

  2. 配置 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
    
  3. 配置 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

猜你喜欢

转载自blog.csdn.net/inthat/article/details/106139228