xtrabackup
のオプションの--stream-tar
のようにtarで固めたものを
diskに書かず、全体をメモリに読み込んだりせずにRiakCS(S3)
にuploadする
アップロード
put_from_stdin.rb
#!/usr/bin/env ruby
require 'fog'
YOUR_KEY_ID = 'aws_access_key_id'
YOUR_SECRET_KEY = 'aws_secret_access_key'
YOUR_HOST = 'riakcs.localdomain'
YOUR_BUCKET = 'test_bucket'
YOUR_OBJECT_KEY = 'object_key'
MULTIPART_CHUNK_SIZE = 1024 * 1024 * 20
storage = Fog::Storage.new(
:provider => 'AWS',
:aws_access_key_id => 'YOUR_KEY_ID',
:aws_secret_access_key => 'YOUR_SECRET_KEY',
:host => YOUR_HOST, # 今回はローカルのriakcsだったため
:scheme => 'http' # defaultはhttps
)
bucket = storage.directories.get(YOUR_BUCKET)
$stdin.instance_eval { undef :rewind }
file = bucket.files.new(
:key => 'YOUR_OBJECT_KEY',
:body => $stdin
)
file.multipart_chunk_size = MULTIPART_CHUNK_SIZE
file.save()
あとは
tar -cO ./directory - | ./upload_from_stdin.rb
みたいな感じでtarに固めてアップロード完了
ダウンロード
ダウンロードするときも一回tarをとってきてとくとか面倒なので、
get_to_stdout.rb
#!/usr/bin/env ruby
require 'fog'
YOUR_KEY_ID = 'aws_access_key_id'
YOUR_SECRET_KEY = 'aws_secret_access_key'
YOUR_HOST = 'riakcs.localdomain'
YOUR_BUCKET = 'test_bucket'
YOUR_OBJECT_KEY = 'object_key'
storage = Fog::Storage.new(
:provider => 'AWS',
:aws_access_key_id => AWS_KEY_ID,
:aws_secret_access_key => AWS_SECRET_KEY,
:host => YOUR_HOST,
:scheme => 'http'
)
bucket = storage.directories.get(YOUR_BUCKET)
bucket.files.get(YOUR_OBJECT_KEY) do |chunk, remaining_bytes, total_bytes|
print chunk
end
これで標準出力にはかれるので、
bundle exec ./riak_stdout_get.rb | tar xvfi -
みたいな感じでダウンロードしつつ、展開。
間に暗号を挟んだりはCPUと相談。ただし、ファイル全体が必要になる圧縮は...