рдПрдХ рдЬрд╛рд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЯрд╛рд░рдирдЯреВрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЯрд╛рд░рдирдЯреВрд▓ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХреБрдЫ рдЯреВрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ xlog рдлрд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╕реЗ рд╕реНрдиреИрдк рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рд░рдирдЯреВрд▓ рдХреНрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдЯрд╛рд░рдирдЯреВрд▓ рдПрдХ рдбрд╛рдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдЯрдкрд▓ рдХреБрдВрдЬреА рд╣реИред рд╕рднреА рдбреЗрдЯрд╛ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рд░реИрдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред рдорд╛рди рдПрдХ tuple рдмрдирд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ tuple , tuples - space, рдлрд┐рд░ space , space - data modelред 3 рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ: 32 рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ, 64 рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдлрд┐рд░ рдХреНрд░рдорд╢рдГ NUM , NUM64 рдФрд░ STR ред рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдердорд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЦреЗрддреЛрдВ рдореЗрдВ 1,2 рдПрдЪрдПрдПрдЪ рдЬрд╣рд╛рдВ 1 рдПрдирдпреВрдПрдо рд╣реИ рдФрд░ 2 рдПрдирдпреВрдПрдо 64 рд╣реИред рдорд╛рдзреНрдпрдорд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдердорд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдбреАрдПрдордПрд▓ рд╕рдВрдЪрд╛рд▓рди рдЯрдкрд▓ рд╕реНрддрд░ рдкрд░ рдкрд░рдорд╛рдгреБ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдкреНрд░рд╛рдердорд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рд╣реА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХрдИ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднрд╛рд╖рд╛ рд▓реБрдЖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рд╕рд╣реЗрдЬрдХрд░ рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдФрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рд▓реЙрдЧ, рдлрд┐рд░ xlog ред рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд▓реИрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдЬрд╛рд╡рд╛ рдХрдиреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, dgreenru.github.com/tarantool-java рджреЗрдЦреЗрдВред рд▓реЗрдЦрди рдХреЗ рд╕рдордп рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг 0.1.2 рд╣реИ ред рдиреАрдЪреЗ рдореИрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЯреИрд░рдирдЯреВрд▓ рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ MySQL рддрд╛рд▓рд┐рдХрд╛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:



mysql> desc user; +------------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+-------------------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | username | varchar(255) | NO | UNI | NULL | | | email | varchar(255) | NO | UNI | NULL | | | enabled | tinyint(1) | NO | | 1 | | | registered | timestamp | NO | | CURRENT_TIMESTAMP | | +------------+--------------+------+-----+-------------------+----------------+ 5 rows in set 


рдкреНрд░рд╛рдердорд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдЖрдИрдбреА рдФрд░ 2 рджреНрд╡рд┐рддреАрдпрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕реВрдЪрдХрд╛рдВрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдИрдореЗрд▓ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ, рдЖрдк auto_increment рдФрд░ timestamp рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдХреЗ рд▓рд┐рдП, рдЖрдк box.auto_increment рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдбреЗрдЯрд╛ рдХреЛ yyyMMddhhmmss рдкреНрд░рд╛рд░реВрдк рдпрд╛ рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛рдлреА рдЫреЛрдЯреА рд╣реИ, рддреЛ рдЖрдк рдмрд╕ mysql рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЯрд╛рд░реЗрдВрдЯреВрд▓ рдмреЙрдХреНрд╕ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдкрд░ рдирд╣реАрдВ рд░реБрдХреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИ, рдЕрд░реНрдерд╛рддред рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЫреЛрдЯрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрдзрд┐рдорд╛рдирддрдГ рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

 mysql> select * into outfile '/tmp/user' from user; Query OK, 73890541 rows affected $ head -1 /tmp/user 1 username email@domain.tld 1 2012-10-14 01:27:05 


рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рд░реНрд╡рд░ рдпрд╛ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХреЙрдкреА рдХрд░рдХреЗ, рдЖрдк рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдЯрд╛рд░реЗрдВрдЯреВрд▓ рдмреЙрдХреНрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рднрд╛рдЧрдиреЗ рдХреЗ рджреГрд╢реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЯреИрдм, рд▓рд╛рдЗрди рдмреНрд░реЗрдХ, рдХреИрд░рд┐рдЬ рд░рд┐рдЯрд░реНрди, рдмреИрдХрд╕реНрд▓реИрд╢ рдпрд╛ рдлрд╝реАрд▓реНрдбреНрд╕ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ NULL рдорд╛рди рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдирдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 BufferedReader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream("/tmp/user.gz")), "utf-8")); SnapshotWriter writer = new SnapshotWriter(new FileOutputStream("/tmp/user.snap").getChannel()); String line = null; DateFormat indf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); DateFormat outdf = new SimpleDateFormat("yyyyMMddhhmmss"); Pattern pattern = Pattern.compile("\t"); while ((line = reader.readLine()) != null) { try { String[] values = pattern.split(line); if (values.length == 5) { Integer id = Integer.parseInt(values[0]); String username = values[1]; String email = values[2]; byte[] enabled = { Byte.valueOf(values[3]) }; Long registered = Long.parseLong(outdf.format(indf.parse(values[4]))); Tuple tuple = new Tuple(5).setInt(0, id).setString(1, username, "UTF-8") .setString(2, email, "UTF-8").setBytes(3, enabled).setLong(4, registered); writer.writeRow(0, tuple); } else { System.err.println("Line should be splited in 5 parts, but has " + values.length + " for " + line); } } catch (Exception e) { System.err.println("Can't parse line " + line); e.printStackTrace(); } } writer.close(); reader.close(); 


рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ

 $ ls -sh /tmp/user.snap 16.1G /tmp/user.snap 


рдЕрдм рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдкреЗрд╕ 0 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 #         slab . #        slab, #        2 . #       24 . slab_alloc_arena = 24 #          xlog . rows_per_wal = 500000 #      space 0 space[0].enabled = 1 # id.   box.auto_increment     TREE. space[0].index[0].type = "TREE" space[0].index[0].unique = 1 space[0].index[0].key_field[0].fieldno = 0 space[0].index[0].key_field[0].type = "NUM" #username space[0].index[1].type = "HASH" space[0].index[1].unique = 1 space[0].index[1].key_field[0].fieldno = 1 space[0].index[1].key_field[0].type = "STR" #password space[0].index[2].type = "HASH" space[0].index[2].unique = 1 space[0].index[2].key_field[0].fieldno = 2 space[0].index[2].key_field[0].type = "STR" 


рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ 000000_00000000000001.snap рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рд╣рдордиреЗ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХрд╛рд░реНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред

 $ mv /tmp/user.snap /var/lib/tarantool/00000000000000000001.snap 


рдФрд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

 $ tarantool_box --background $ ps -C tarantool_box -o pid=,cmd= 8853 tarantool_box: primary pri: 33013 sec: 33014 adm: 33015 


рдЯрд╛рд░рдирдЯреВрд▓.рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рднреА рджреЗрдЦреЗрдВ, рдпрджрд┐ рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рддреБрд░рдВрдд рдХрд╛рд░рдг рджреЗрдЦреЗрдВрдЧреЗред

 1350504007.249 7127 1/sched _ I> Space 0: done 1350504007.249 7127 101/33013/primary _ I> bound to port 33013 1350504007.249 7127 101/33013/primary _ I> I am primary 1350504007.249 7127 102/33014/secondary _ I> bound to port 33014 1350504007.250 7127 103/33015/admin _ I> bound to port 33015 1350504007.251 7127 1/sched _ C> log level 4 1350504007.251 7127 1/sched _ C> entering event loop 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 $ tarantool -a 127.0.0.1 127.0.0.1> select * from t0 where k0 = 1 Select OK, 1 rows affected [1, 'username', 'email@domain.tld', '\x01', '\x21\x8b\xe4\xc9\x4c\x12'] 127.0.0.1> select * from t0 where k1 = 'username' Select OK, 1 rows affected [1, 'username', 'email@domain.tld', '\x01', '\x21\x8b\xe4\xc9\x4c\x12'] 127.0.0.1> select * from t0 where k2 = 'email@domain.tld' Select OK, 1 rows affected [1, 'username', 'email@domain.tld', '\x01', '\x21\x8b\xe4\xc9\x4c\x12'] 


рдпрд╛рдиреА рд╣рдордиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ 3 рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рд╕реНрдерд╛рди рдЬрд╛рдВрдЪрд╛ред рдЕрдЧрд▓рд╛, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЦрдкрдд рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдФрд░ рдЯреИрд░реЗрдВрдЯ рдмреЙрдХреНрд╕ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╢реЛ рд╕реНрд▓реИрдм рдХрдорд╛рдВрдб рдХреА рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЯрд╛рд░рдирдЯреВрд▓ рдмреЙрдХреНрд╕ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдм рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрдиреЗ рдФрд░ MySQL рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрджреНрдпрддрд┐рдд рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХреБрдЫ рдкреНрд░рд╢реНрди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд░реЗрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд▓рд┐рдПрдВрдЯ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдкреВрд░реНрдг-рджрд╛рд╕ рд╕реНрд▓реЗрд╡ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд▓рдЧрднрдЧ рдкреВрд░реНрдг xlog рдмреИрдХрдЕрдк рд░рдЦрдиреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рд╕рдордп рдХреА рд▓рд╛рдЧрдд рдХреЗ рдмрд┐рдирд╛ MySQL рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП config рдореЗрдВ replication_port рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧ, рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рд▓реЙрдЧ рдХреЛ 50 рд╣рдЬрд╛рд░ рд░рд┐рдХреЙрд░реНрдб рдХреА рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдСрдкрд░реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
1. рдореМрдЬреВрджрд╛ рд▓реЙрдЧ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВ
2. рдЕрдзрд┐рдХрддрдо lsn рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг
3. рдкреНрд░рддрд┐рдХреГрддрд┐ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди
4. рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ
рдЗрд╕ рдХреЛрдб рдореЗрдВ MySQL рдЕрдкрдбреЗрдЯ рддрд░реНрдХ рдЧрд╛рдпрдм рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓реВрдк рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХрдард┐рди рд╕реНрдерд╛рди рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕рдВрдХреЗрдд рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ рдЬреЛ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдЗрдирд░реА рд▓реЙрдЧ рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕реЗ xlog рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рд░реБрдХ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрд╕рд░реНрдЧ рд╣реИред

 public class Backup { protected DecimalFormat xlogNameFormat = new DecimalFormat("00000000000000000000"); protected String folder; protected FileChannel xlogChannel; protected int row; protected int limit = 50000; protected long lsn = 0L; protected ReplicationClient client; protected XLogWriter writer; public void setLimit(int limit) { this.limit = limit; } public Backup(String folder, String host, int port) throws IOException { this.folder = folder; } protected void getLatestLSN(String folder) throws IOException, FileNotFoundException { final File backupFolder = new File(folder); String[] xlogs = backupFolder.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".xlog"); } }); boolean hasLogs = xlogs != null && xlogs.length > 0; if (hasLogs) { Arrays.sort(xlogs); XLogReader reader = new XLogReader(new FileInputStream(folder + "/" + xlogs[xlogs.length - 1]).getChannel()); XLogEntry xlogEntry = null; while ((xlogEntry = reader.nextEntry()) != null) { lsn = xlogEntry.header.lsn; } reader.close(); } } public void start() throws IOException { getLatestLSN(folder); System.out.println("Planning to start from lsn: " + lsn); Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { try { synchronized (this) { close(); } } catch (IOException e) { throw new IllegalStateException("Can't close xlog", e); } } })); final ByteBuffer rowStartMarker = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(Const.ROW_START_MARKER); client = new ReplicationClient(SocketChannel.open(new InetSocketAddress("127.0.0.1", 33016)), lsn + 1L) { @Override protected ByteBuffer readBody(Header header) throws IOException { if (Backup.this.xlogChannel == null) { Backup.this.xlogChannel = nextFile(folder); } ByteBuffer body = super.readBody(header); this.header.flip(); rowStartMarker.flip(); synchronized (Backup.this) { while (rowStartMarker.hasRemaining()) Backup.this.xlogChannel.write(rowStartMarker); while (this.header.hasRemaining()) Backup.this.xlogChannel.write(this.header); while (body.hasRemaining()) Backup.this.xlogChannel.write(body); Backup.this.xlogChannel.force(false); body.flip(); } return body; } }; } public XLogEntry nextEntry() throws IOException { XLogEntry entry = client.nextEntry(); lsn = entry.header.lsn; if (++row >= limit) { close(); xlogChannel = nextFile(folder); row = 0; } return entry; } protected FileChannel nextFile(String folder) throws IOException { String fileName = folder + "/" + xlogNameFormat.format(lsn + 1L) + ".xlog"; new File(fileName).createNewFile(); FileChannel channel = new FileOutputStream(fileName, true).getChannel(); writer = new XLogWriter(channel); return channel; } public void close() throws IOException { if (writer != null) { writer.close(); } } public static void main(String[] args) throws IOException { final Backup backup = new Backup("/home/dgreen/backup", "localhost", 33016); backup.start(); XLogEntry entry = null; while ((entry = backup.nextEntry()) != null) { StringBuilder pk = new StringBuilder(); for (int i = 0; i < entry.tuple.size(); i++) { if (pk.length() > 0) { pk.append(" - "); } switch (entry.tuple.getBytes(i).length) { case 4: pk.append(String.valueOf(entry.tuple.getInt(i))); break; case 8: pk.append(String.valueOf(entry.tuple.getLong(i))); break; default: pk.append(entry.tuple.getString(i, "UTF-8")); } } switch (entry.op) { case Update.OP_CODE: System.out.println("Got update on #" + pk.toString()); break; case Insert.OP_CODE: System.out.println("Got insert " + pk.toString()); break; case Delete.OP_CODE: System.out.println("Got delete of #" + pk.toString()); break; default: System.out.println("Got unknown op " + entry.op + " " + pk.toString()); break; } } } } 


рдореИрдВ рдпрд╣ рднреА рдЕрд▓рдЧ рд╕реЗ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЬрдм xlog рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдЦреЛрдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдкрдиреЗ рдЧрд▓рддреА рд╕реЗ XLogReader рдФрд░ XLogWriter рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЯрдкрд▓ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реЛ , рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ xlog рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рднреА рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк dgreenru.github.com/tarantool-java рдкрд░ рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдЬреАрдердм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

Source: https://habr.com/ru/post/In155575/


All Articles