- CDC File Transfer é uma ferramenta de código aberto desenvolvida pelo Google que oferece sincronização e streaming de arquivos entre Windows e Linux
- Usa a tecnologia Content Defined Chunking (CDC), que transmite apenas as partes alteradas do arquivo, alcançando velocidade até 30 vezes maior que o rsync tradicional
- Fornece duas ferramentas principais, cdc_rsync e cdc_stream, responsáveis respectivamente por sincronização de arquivos e streaming em tempo real
- Foi projetada para que desenvolvedores baseados em Windows possam implantar e testar arquivos com eficiência em ambientes Linux, sendo excelente para desenvolvimento remoto e ambientes de desenvolvimento de jogos
- Oferece suporte a autenticação baseada em ssh e sftp, tem uso intuitivo e disponibiliza binários para várias plataformas
Visão geral e importância do projeto
- CDC File Transfer é um conjunto de ferramentas de transferência de arquivos de código aberto lançado pelo Google, que processa de forma rápida e eficiente a sincronização e o streaming de arquivos entre Windows e Linux ou entre máquinas Windows
- O projeto foi criado para o ambiente de desenvolvimento de jogos do Stadia e surgiu para resolver as limitações de ferramentas como scp e rsync (transferência lenta, cópia de arquivos inteiros, ausência de modo delta)
- A tecnologia central é o algoritmo FastCDC, um tipo de Content Defined Chunking, otimizado para grandes sincronizações repetidas por transmitir apenas os dados realmente alterados quando um arquivo muda
- Mesmo sendo open source, oferece desempenho em nível comercial (por exemplo, velocidade de sincronização de 1500 MB/s e streaming de 2 a 5 vezes mais rápido que sshfs), com eficiência claramente superior à de serviços concorrentes em ambientes de desenvolvimento remoto e em nuvem
Explicação das principais ferramentas
cdc_rsync
- É uma ferramenta para sincronizar arquivos do Windows para o Linux e supera as limitações do rsync tradicional no Linux
- Arquivos com horário e tamanho correspondentes são rapidamente ignorados, e apenas os arquivos alterados são transmitidos com eficiência
- Usando FastCDC, detecta e transmite apenas a posição dos dados modificados, oferecendo tráfego mínimo e transferência rápida
- Em testes de sincronização, apresentou desempenho cerca de 3 vezes superior ao rsync executado no Cygwin e muito mais rápido que o rsync padrão no Linux
- Oferece suporte a compressão de alta velocidade e uma estrutura de algoritmo simples, porém eficiente, que verifica os arquivos até o nível de byte
cdc_stream
- Permite acessar pastas e arquivos do Windows no Linux por streaming em tempo real, como se fossem arquivos locais
- Tem estrutura semelhante ao sshfs, mas com velocidade de leitura de arquivos e desempenho de cache otimizados
- Por meio de detecção de mudanças e streaming diferencial, retransmite apenas os dados alterados e também processa metadados rapidamente
- Os diretórios Linux são disponibilizados como readonly, e arquivos alterados no Windows são refletidos no Linux quase imediatamente (em no máximo alguns segundos)
- Em ambientes de desenvolvimento que exigem acesso a arquivos grandes, como dados de jogos, mostrou na prática ganho de desempenho de 2 a 5 vezes em relação ao sshfs
Plataformas compatíveis
- cdc_rsync: suporte principal entre Windows x86_64 ↔ Ubuntu 22.04 x86_64, com suporte gradual a sincronização remota e sincronização local
- cdc_stream: suporte a streaming de Windows x86_64 para Ubuntu 22.04 x86_64; a direção inversa e outras plataformas não são suportadas
Métodos de autenticação/configuração
- Método de autenticação sem senha por meio de ssh.exe e sftp.exe (recomenda-se autenticação baseada em chave)
- No Windows, é possível especificar caminhos detalhados dos comandos pela linha de comando ou por variáveis de ambiente
- É possível usar opções adicionais de comandos SSH e arquivos de configuração por usuário (
%USERPROFILE%\\.ssh\\config)
- Usuários internos do Google contam com variáveis de ambiente específicas para autenticação baseada em chave de segurança
Exemplos de uso
Exemplos de uso do cdc_rsync
- Sincronização de arquivo:
cdc_rsync C:\path\to\file.txt user@linux.device.com:~
- Suporte a curingas e sincronização recursiva de diretórios inteiros:
cdc_rsync C:\path\to\assets\* user@linux.device.com:~/assets -r
- É possível verificar o status da sincronização em tempo real (opção
-v) e também sincronizar entre arquivos locais
Exemplos de uso do cdc_stream
- Iniciar streaming de diretório:
cdc_stream start C:\path\to\assets user@linux.device.com:~/assets
- Encerrar sessão de streaming:
cdc_stream stop user@linux.device.com:~/assets
- É possível gerenciar várias sessões com curingas
Solução de problemas e logs
- O cdc_stream funciona com base em um serviço em segundo plano, e os logs são armazenados por padrão em
%APPDATA%\cdc-file-transfer\logs
- Fornece opções de logs detalhados e depuração (configuração JSON de nível de verbosidade)
- O cdc_rsync exibe logs no console, e é possível obter logs detalhados com
-vvv e -vvvv
- Facilita rastrear comandos SSH/SFTP que falharam e executá-los diretamente para analisar a causa do problema
Stack técnico e informações operacionais
- A principal linguagem de desenvolvimento é C++, com algum uso de Python/Starlark para build e gerenciamento
- Licença Apache-2.0, mais de 8 contribuidores e 3.3k stars no GitHub
- Desde 2023, está em estado Archived, sem desenvolvimento adicional
Resumo
- CDC File Transfer oferece eficiência e velocidade de nível líder do setor para transferências repetidas de arquivos e diretórios grandes entre Windows e Linux
- Traz grandes ganhos ao encurtar os processos de sincronização e streaming em ambientes de trabalho multiplataforma, como desenvolvimento remoto, jogos, mídia e análise de dados
- Em comparação com outras ferramentas de sincronização/streaming, tem forte competitividade por sua simplicidade, rápida detecção de alterações parciais e excelente cache
- Com autenticação SSH/SFTP e configuração flexível via linha de comando ou arquivos de configuração, pode ser adotado e operado com facilidade por engenheiros
- O código-fonte pode ser consultado e customizado, e o projeto já registra alta reputação e uso na comunidade open source
1 comentários
Comentários do Hacker News
Desde o ano passado venho fazendo vários experimentos com Content Defined Chunking (especialmente no bonanza.build). Descobri que até o algoritmo FastCDC, o mais amplamente usado, ainda tem espaço para melhorias, e que usar uma abordagem de lookahead aumenta bastante o desempenho. Para uma implementação disso, veja buildbarn/go-cdc
O rsync já não usa limites de chunk definidos por conteúdo com base em condições de rolling hash? (link da wiki 1, link da wiki 2). Suspeito que a melhora de velocidade em relação ao rsync venha da eficiência do rolling hash e do uso de executáveis nativos no Windows (o sistema de arquivos do Windows é lento). De todo modo, o ganho de desempenho é interessante, e o fato de ter virado open source também é positivo. Espero que esse método acabe entrando no próprio rsync
É bom ver que o Stadia deixou mais um benefício de longo prazo desse tipo. Pena que não saiu uma versão self-hosted; no mundo atual de DRM, se saísse, provavelmente seria tratada como pirataria imediatamente
Para quem tinha curiosidade sobre como o Content Defined Chunking realmente gera os chunks, este blog e este blog explicam o conceito de forma bem fácil
Frase principal: "Este algoritmo de diff remoto é baseado em CDC (Content Defined Chunking) e, nos testes, foi até 30 vezes mais rápido que o rsync (1500MB/s contra 50MB/s)"
Alguém sabe se há algum trabalho em andamento para integrar isso à ferramenta padrão do rsync? Gostaria que esse recurso fosse amplamente usado, mas só de olhar o site oficial já desanima ver que não há suporte nenhum entre Linux e Linux
Também acho esse projeto bem legal. Já implementei algo parecido por conta própria para adaptar ao meu trabalho, e isso pode ser bem importante quando as restrições são complicadas. Ainda assim, fico pensando se não teria sido mais fácil começar a partir do rsync
Fico imaginando se essa técnica poderia ser aplicada ao git. O blob do git gera o hash incluindo informação de tamanho, então se você muda só uma parte dos dados, precisa recalcular o hash desde o começo. Com CDC, isso parece que seria bem mais eficiente
Achei interessante a explicação: “Basta baixar e descompactar o binário precompiled da versão mais recente no Windows. O binário Linux é implantado automaticamente pela ferramenta do Windows em ~/.cache/cdc-file-transfer. Não é necessária instalação separada”. Gosto do fato de que, diferente do rsync, isso funciona sem instalar um serviço separado no destino Linux. Esse aspecto do rsync sempre foi um pouco incômodo
Será que o IBM Aspera funciona de forma parecida? Quando eu trabalhava como QA em uma publicadora de jogos, usávamos Aspera para subir gravações de tela, e ele entregava velocidades muito acima do upload normal da internet do escritório (introdução ao IBM Aspera)