Compare commits

...

348 Commits

Author SHA1 Message Date
Vitaliy Filippov d29b5d2d04 Add Russian translation of VNPL-1.1 5 days ago
Vitaliy Filippov 65b0e8e940 Fix typo in VNPL-1.1 5 days ago
Vitaliy Filippov bce357e2a5 Do not read all metadata into memory when dumping 2 weeks ago
Vitaliy Filippov 0876ca09cd Fix dumper includes and print format 3 weeks ago
Vitaliy Filippov dac12d8a4c Implement metadata dump tool 3 weeks ago
Vitaliy Filippov 1eec4407ab Fix inode creation when /index/maxid is out of sync 3 weeks ago
huy 3b7c6dcac2 Fix volume creation from snapshots in Cinder driver 6 months ago
Vitaliy Filippov 342517d126 Fix typo 3 weeks ago
Vitaliy Filippov 675bc12a13 Add extern "C" for systems like Gentoo which miss it in jerasure includes 3 weeks ago
Vitaliy Filippov 101592bbff Release 0.7.1 3 weeks ago
Vitaliy Filippov be4087d9d2 Add a FIXME to test_interrupted_rebalance 3 weeks ago
Vitaliy Filippov 404e43dd2d Note that ISA-L does not need to be enabled separately 3 weeks ago
Vitaliy Filippov 87613ed590 Add ISA-L into RPM specs 4 weeks ago
Vitaliy Filippov 2a2e914ef9 Show no_recovery, no_rebalance and readonly flags in status 4 weeks ago
Vitaliy Filippov 0cdc9292c8 Fix true/false parsing in json configs like no_recovery/no_rebalance 4 weeks ago
Vitaliy Filippov 3e1b03bb5c Show all etcd addresses in the "reporting to..." message 4 weeks ago
Vitaliy Filippov 36e851505a Make monitor delete pool statistics when the pool is deleted 4 weeks ago
Vitaliy Filippov 1efbbb0c36 Make deleted inodes vanish from statistics after 60 seconds 4 weeks ago
Vitaliy Filippov 088dd15449 Exclude empty inodes from stats 4 weeks ago
Vitaliy Filippov 4a531d7b8b Fix listings sending too many parallel requests to OSDs, fix rm-data crashing with --wait-list 4 weeks ago
Vitaliy Filippov a0cae4c180 Rename "jerasure" to "ec" in pool configuration, function names, fix documentation and Debian build scripts 4 weeks ago
Vitaliy Filippov c4eb46600d Merge run_3osds and run_7osds scripts 4 weeks ago
Vitaliy Filippov 21b306e25f Add ISA-L support 4 weeks ago
Vitaliy Filippov d8313e939a Release 0.7.0 4 weeks ago
huynnp911 3e92c3f082 Add patch for libvirt 6.0 1 month ago
Vitaliy Filippov 82b9f4c52d Add a test with OSD kills 1 month ago
Vitaliy Filippov 2bdf415eb3 Fix unknown OSD numbers on error 1 month ago
Vitaliy Filippov f826831282 Describe OSD placement tree and reweights 1 month ago
Vitaliy Filippov 5d47bbe04c Add documentation 5 months ago
Vitaliy Filippov 93a9f1ef89 Fix NFS socket read hangs 2 months ago
Vitaliy Filippov 2697aae909 Fix free_down_raw in cli status 2 months ago
Vitaliy Filippov 6b69db73ac Remove getrandom() usage 2 months ago
Vitaliy Filippov d48a824846 Fix some warnings 2 months ago
Vitaliy Filippov 40985282ff Fix build under GCC 8 2 months ago
Vitaliy Filippov acf403e886 Add install target for NFS proxy 2 months ago
Vitaliy Filippov cf03b9c84d Implement "primary affinity tags" 2 months ago
Vitaliy Filippov 7c2379d458 Simplified NFS proxy based on own NFS/XDR implementation 5 months ago
Vitaliy Filippov a2189100dd Make CLI functions usable in library form 3 months ago
Vitaliy Filippov bb84379db6 Release 0.6.17 2 months ago
Vitaliy Filippov 714dda8151 Fix slow connection ramp-up caused by up_wait_retry_interval pausing operations on first connection attempt 2 months ago
Vitaliy Filippov 834554c523 LD_PRELOAD=libasan.so.5 fio in tests fails when vitastor is built with ASan 2 months ago
Vitaliy Filippov e718116f54 Fix incorrect reading of extra metadata block 2 months ago
Vitaliy Filippov 98e3528a14 Add block PVC and pod examples 2 months ago
Vitaliy Filippov 8e88f77101 Fix CSI driver volumeMode: Block support 2 months ago
Vitaliy Filippov caa2cc2e6c Fix 32bit build error 2 months ago
Vitaliy Filippov 842ba8b831 Use (uint64_t)1 instead of 1l / 1ul 2 months ago
Vitaliy Filippov 1493823f9e Note about starting monitors 3 months ago
Vitaliy Filippov c857272f44 Comment: epoch is uint64_t 3 months ago
Vitaliy Filippov 340a4b4f27 Release 0.6.16 3 months ago
Vitaliy Filippov 5118980315 Add a script to run all tests 3 months ago
Vitaliy Filippov d71cc174e3 Implement CLI status command 3 months ago
Vitaliy Filippov 0eb929f1ba Fix change_pg_count test (statistic reporting may take some time) 3 months ago
Vitaliy Filippov 83146fa3e2 Fix the same HUGE bug for regular reads during rebalance 3 months ago
Vitaliy Filippov 15dcaf7903 Add the same "rebalance" test with regular reads 3 months ago
Vitaliy Filippov cd18ef7323 Disconnect NBD proxy correctly without leaving a zombie [vitastor-nbd] process in D state 3 months ago
Vitaliy Filippov 39531ef1a6 Fix incorrect chained reads during rebalance (the bug detected by test_rebalance_verify.sh) 3 months ago
Vitaliy Filippov d334914948 Fix the test so it actually fails indicating a bug :-) 3 months ago
Vitaliy Filippov c373425562 Fix nbd log 3 months ago
Vitaliy Filippov 3615e57879 Register standby monitors in etcd in /mon/member 3 months ago
Vitaliy Filippov 0edc6fe5a6 Add notes about the new script 3 months ago
Vitaliy Filippov 9c30df83e3 Fix a HUGE :) bug in NBD proxy 3 months ago
Vitaliy Filippov a420c77107 Add rebalance-verify test 3 months ago
Vitaliy Filippov 4100d829c7 Allow to override log file for daemonized NBD proxy 3 months ago
Vitaliy Filippov 79ebda933e Fix a write hang with throttling due to timer reenterability / triggerability 3 months ago
Vitaliy Filippov 65d08e067e Add a script for preparing hybrid (HDD+SSD) OSDs 3 months ago
Vitaliy Filippov d289753df4 Implement snapshot deletion for Cinder driver 4 months ago
Vitaliy Filippov 85298ddae2 Release 0.6.15 4 months ago
Vitaliy Filippov e23296a327 Rename cli_rm -> cli_rm_data, cli_snap_rm -> cli_rm 4 months ago
Vitaliy Filippov 839ec9e6e0 Shard clean_db by PGs to speedup listings 4 months ago
Vitaliy Filippov 7cbfdff41a Replace some throws with force_stop 4 months ago
Vitaliy Filippov 951272f27f Try to process PG one after another 4 months ago
Vitaliy Filippov a3fb1d4c98 Fix reenterability around set_timer 4 months ago
Vitaliy Filippov 88402e6eb6 Move next_request to run_cb_and_clear 4 months ago
Vitaliy Filippov 390239c51b Don't terminate HTTP requests with timeouts if response is already available in the socket 4 months ago
Vitaliy Filippov b7b2adfa32 Fix http client not continuing requests in case of failure to connect 4 months ago
Vitaliy Filippov 36c276358b Attempt to fix "head-of-line blocking" by LIST operations 4 months ago
Vitaliy Filippov 117d6f0612 Release 0.6.14 4 months ago
Vitaliy Filippov 7d79c58095 Use the larger sockaddr_storage structure 5 months ago
Vitaliy Filippov 46d2bc100f Add some tolerance to stat calculation so it does not fail on a fresh DB 5 months ago
Vitaliy Filippov 732e2804e9 Fix operation dependency counter underflow for reads without immediate_commit=all mode 5 months ago
Vitaliy Filippov abaec2008c Fix OSDs missing misplaced recovery 5 months ago
Vitaliy Filippov 8129d238a4 Different fio versions have different types for xfer_buflen, but Vitastor anyway does not support 128-bit offsets 5 months ago
Vitaliy Filippov 61ebed144a Fix OSDs possibly dying with "map::at" errors when other OSDs are stopped 5 months ago
Vitaliy Filippov 9d3ba113aa Extract bind socket code into a utility function 5 months ago
Vitaliy Filippov 9788045dc9 Fix division by zero in ls if all pool OSDs are down 5 months ago
Vitaliy Filippov d6b0d29af6 4k MEM_ALIGNMENT 5 months ago
Vitaliy Filippov 36f352f06f Release 0.6.13 5 months ago
Vitaliy Filippov 318cc463c2 Fix warnings 5 months ago
Vitaliy Filippov 145e5cfb86 MCL_ONFAULT is not available under centos 7 5 months ago
Vitaliy Filippov 73ae578981 Add osd_memlock option 5 months ago
Vitaliy Filippov 20ee4ed758 Update some parameter docs 5 months ago
Vitaliy Filippov 63de79d1b2 Change > to | to preserve newlines 5 months ago
Vitaliy Filippov f712967079 And one more sqe starvation fix 5 months ago
Vitaliy Filippov df0cd85352 Fix another part of the "async sqe clear" bug (followup to d9857a5340) 5 months ago
Vitaliy Filippov ebaf4d7a72 Fix compatibility with fio 3.28+ 5 months ago
Vitaliy Filippov d4bc10542c Fix compatibility with liburing >= 2.1 where it only has __pad2[2] 5 months ago
Vitaliy Filippov 140309620a Free recv_buf in nbd_proxy 5 months ago
Vitaliy Filippov 0a610ee943 Destroy the client after completing CLI command 5 months ago
Vitaliy Filippov f3ce166064 Do not print nan% in df when a pool has no available OSDs 5 months ago
Vitaliy Filippov 717d303370 Handle get_sqe failures, don't die with "will fall out of sync" in epoll_manager 5 months ago
Vitaliy Filippov d9857a5340 Check for SQEs, not for completions 5 months ago
Vitaliy Filippov eb5d9153e8 Fix build under centos 7 5 months ago
Vitaliy Filippov ae6d1ed1d5 Remove completed items 5 months ago
Vitaliy Filippov d123e58ea3 Fix yaml syntax - remove ` in default 5 months ago
Vitaliy Filippov d9869d8116 Add parameter documentation 5 months ago
Vitaliy Filippov 4047ca606f Add missing cancel_op(currently being read op) when stopping a client 5 months ago
Vitaliy Filippov 218e294e9c > 0, of course 5 months ago
Vitaliy Filippov c1929cabe0 Release 0.6.12 5 months ago
Vitaliy Filippov cc6b24e03a Allow to configure NBD timeout, max devices and partitions 5 months ago
Vitaliy Filippov 0757ba630a Do not happily NBD "map" non-existing images, do not try to benchmark them too 5 months ago
Vitaliy Filippov 2a0b881685 Respect max_write_iodepth for deletes 5 months ago
Vitaliy Filippov 9a15b843ff Do not set pg_real_size to 0 5 months ago
Vitaliy Filippov 8dc1ffb13b Try to connect with PG peers before deciding it's incomplete :) 5 months ago
Vitaliy Filippov ba63af49b4 Add etcd retries everywhere (they were missing in some places) 5 months ago
Vitaliy Filippov 31b9c683ee Fix flushing of unclean objects 5 months ago
Vitaliy Filippov 3abcac058f Check for double response_callback call more 5 months ago
Vitaliy Filippov e01c4db702 Add paranoic if()s to prevent accidental double free of etcd_watch_ws 5 months ago
Vitaliy Filippov a5cf06acd0 Remove etcd timeout and keepalive interval hardcode 5 months ago
Vitaliy Filippov 9c3653b1e1 Handle EINTR 5 months ago
Vitaliy Filippov 23e578b6a2 Fix common.sh 5 months ago
Vitaliy Filippov 7920414bee Fix build under older gcc (debian buster) 5 months ago
Vitaliy Filippov 098e369a3b Fix rand initialization, add etcd connection/disconnection logging 5 months ago
Vitaliy Filippov a43ef525a2 Remove two last end()s from http_client (should have been removed in the keepalive patch) 5 months ago
Vitaliy Filippov 8a6b07d8f7 Add a 2/5 etcd failure test 5 months ago
Vitaliy Filippov 2c930d55fb
Merge pull request #41 from promobit-bitblaze/1-small-fix 5 months ago
Mikhail Koshel d798e0821e #1 fix deps 5 months ago
Vitaliy Filippov e591a3e9f7 Include sys/stat.h in messenger.cpp 5 months ago
Vitaliy Filippov 77cc18420a Fix leaks detected by clang scan-build (only 1 of 4 may be important though) 5 months ago
Vitaliy Filippov 7bdd92ca4f Fix build under clang and some warnings 5 months ago
Vitaliy Filippov 8f64fc61e7 Ignore empty events in mon 6 months ago
Vitaliy Filippov 4a9f001d9e Make mon also ping etcd websockets regularly 6 months ago
Vitaliy Filippov 8c908316d9 Add a test with an OSD being added 6 months ago
Vitaliy Filippov 515a2e6e33 Only die when detecting a real race condition, not just a CAS failure 6 months ago
Vitaliy Filippov 68b6763ebe Add asserts for lp-optimizer tests, pass `ordered` from the monitor 6 months ago
Vitaliy Filippov 9c6168bf17 Remove fill_parsed_response 6 months ago
Vitaliy Filippov 08e467270a Fix pg_size changing from 3 to 2 6 months ago
Vitaliy Filippov 5473d5b4a2 Rework HTTP client to use keepalive, move getifaddr_list to addr_util 6 months ago
Vitaliy Filippov c3304bce27
Merge pull request #38 from mirrorll/master 6 months ago
Vitaliy Filippov ec2852c598 Add minsize_1 test 6 months ago
Vitaliy Filippov b9f5c2a823 Support zero-copy send in fio_sec_osd to allow testing it 6 months ago
Vitaliy Filippov e9d2f79aa7 Support reading bitmaps in fio_sec_osd 6 months ago
Vitaliy Filippov 0785bdf8b3 Release 0.6.11 6 months ago
Vitaliy Filippov b57e44748b Send 4 byte bitmap in stub_uring_osd 6 months ago
Vitaliy Filippov 1bbe62f29c Fix uninitialized listen_backlog which was leading to REALLY SLOW send speeds!!! 6 months ago
lihai 3061c30132 journal check_available error 6 months ago
Vitaliy Filippov 20a4406acc Support IPv6 OSD addresses 6 months ago
Vitaliy Filippov f93491bc6c Implement journal write batching and slightly refactor journal writes 7 months ago
Vitaliy Filippov 999bed8514 Fix opening regular files as blockstore 7 months ago
Vitaliy Filippov 3f33095fd7 Do not try to initialize client in simple-offsets 7 months ago
Vitaliy Filippov dd74c5ce1b Fix OSDs marking PGs incomplete instead of trying to connect with peers 7 months ago
Vitaliy Filippov c6d104ecd6 Print object version on fatal overwrite 7 months ago
Vitaliy Filippov e544aef7d0 Fix test rw_blocking 7 months ago
Vitaliy Filippov 616c18c786 Fix stub_uring_osd 7 months ago
Vitaliy Filippov fa687d3878 Allow to configure OSD placement in node_placement 7 months ago
Vitaliy Filippov 2c7556e536 Allow to run with 4k sector size. Natural, but it was forbidden 7 months ago
Vitaliy Filippov 2020608a39 Release 0.6.10 7 months ago
Vitaliy Filippov 139b98d80f Exclude block/vitastor.c from patches and add script to easily re-add it 7 months ago
Vitaliy Filippov f54ff6ad5d Do not crash in simple-offsets when some options are empty, too 7 months ago
Vitaliy Filippov b376ef2ed9 Do not crash on empty matched_addrs 7 months ago
Vitaliy Filippov 5a234588b9 Do not die when invoked via `vita` symlink 7 months ago
Vitaliy Filippov b82c30328f Use vitastor-cli df to show pool stats in Proxmox 7 months ago
Vitaliy Filippov 0ee5e0a7fe Implement vitastor-cli df command 7 months ago
Vitaliy Filippov 0a1640d169 Some important fixes for our new Proxmox driver 7 months ago
Vitaliy Filippov 3482bb0860 Fix readonly/readwrite option parsing 7 months ago
Vitaliy Filippov 526995f486 Do not skip empty iops in listings 7 months ago
Vitaliy Filippov 073b505928 Package Proxmox plugin as pve-storage-vitastor 7 months ago
Vitaliy Filippov a8b21a22d0 Add patch for pve-qemu 6.1 7 months ago
Vitaliy Filippov 0b1ffba62b Add Proxmox storage driver 7 months ago
Vitaliy Filippov 8dfbd7943c Use logical block size = 512 bytes by default 7 months ago
Vitaliy Filippov 39e7f98e54 Allow to change etcd IP in tests 7 months ago
Vitaliy Filippov 3a83a32cb7 Aaand now fix create --parent :D 7 months ago
Vitaliy Filippov 20d5ed799a Add glob pattern matching for ls 7 months ago
Vitaliy Filippov b262938bca Fix naggy "Failed to get RDMA device list: Unknown error -38" 7 months ago
Vitaliy Filippov 7e54242251 Add patches for Proxmox QEMU 5.1 and 52 7 months ago
Vitaliy Filippov c3c2e68cc1 Now fix resize command :D 7 months ago
Vitaliy Filippov aa1e21dd99 Release 0.6.9 7 months ago
Vitaliy Filippov f4b57d487f Remove +deb10u1 from libvirt version 7 months ago
Vitaliy Filippov 711ecd2f8e Add a Dockerfile to build libvirt 7 months ago
Vitaliy Filippov 9fca01dc62 Add a forgotten return statement 7 months ago
Vitaliy Filippov 0bd3a94efd Use qdict_get_try_int because qdict_get_int may segfault on a missing key 7 months ago
Vitaliy Filippov 9ffdeef93b Install the built liburing version in el8 dockerfile 7 months ago
Vitaliy Filippov 589892d501 Fix rpm dockerfiles 7 months ago
Vitaliy Filippov 5fe3a40416 More fixes for QEMU 2.x :) 7 months ago
Vitaliy Filippov a453db9c8e An attempt to automatically build patched specs inside Docker is mostly broken for now 7 months ago
Vitaliy Filippov e6498a52ca Rename 4.2 el7 spec patch 7 months ago
Vitaliy Filippov 4bc41aed9d Add patches for QEMU 6.0 and for 6.0 RPM spec 7 months ago
Vitaliy Filippov 4da51f9c4c Update QEMU 3.1 patch 7 months ago
Vitaliy Filippov c6cee6f734 Update QEMU 5.0 patch 7 months ago
Vitaliy Filippov 6fc08f5581 Update CentOS 8 QEMU 4.2 spec patch 7 months ago
Vitaliy Filippov 15957b7d13 Update QEMU 4.2 patch and CentOS 7 QEMU 4.2 spec patch 7 months ago
Vitaliy Filippov 09a3987e83 Remove vitastor-qemu from RPM specs 7 months ago
Vitaliy Filippov cd6820c439 Update QEMU 5.1/5.2 patch to include internal vitastor driver 7 months ago
Vitaliy Filippov dcd8f5e76c Remove qemu shenanigans from vitastor build dockerfile 7 months ago
Vitaliy Filippov 5859f913fc Fix client failover in case of etcd shutdown or crash 7 months ago
Vitaliy Filippov cac6a1d8d1 Don't need to download fio in qemu dockerfile anymore 7 months ago
Vitaliy Filippov a0c32e7de9 Update patch for libvirt 7.6 7 months ago
Vitaliy Filippov 8b37610dd0 Rename patch to Nova 23 because it's actually closer 7 months ago
Vitaliy Filippov ae82ca3b08 Pass config path in <config file="" /> element instead of an attribute 7 months ago
Vitaliy Filippov 92362027a8 Build vitastor driver as part of the QEMU package by default 7 months ago
Vitaliy Filippov c4aeeda143 Fix index removal in vitastor-cli rm 7 months ago
Vitaliy Filippov 24f0f8278a Fix modify --readwrite 7 months ago
Vitaliy Filippov 95496d0845 Implement renaming images in CLI (vitastor-cli modify --rename) 7 months ago
Vitaliy Filippov 94b1f09ef2 Create snapshots in the same pool by default 7 months ago
Vitaliy Filippov 32b1312abb Remove stale deleted inode statistics in monitor 7 months ago
Vitaliy Filippov d5c8fde5de Remove kludgy $IP and $ETCD_MON parsing from make-osd.sh, suggest to use vitastor.conf 7 months ago
Vitaliy Filippov 7a0b5212fe Exit if unable to restart watches 7 months ago
Vitaliy Filippov a8f5c71ae8 Use the same etcd address selection algorithm in the monitor 7 months ago
Vitaliy Filippov ce5b6253ab Make OSDs stick to the last successful etcd address 7 months ago
Vitaliy Filippov 8398ad0117 Fix #36 - Fix old version data sometimes overriding new version data 7 months ago
Vitaliy Filippov fea451b4db Prefer local etcd in OSD 7 months ago
Vitaliy Filippov 6e12aca53b Remove the total PG count restriction in optimize_change which was leading to unfeasible problems sometimes 7 months ago
Vitaliy Filippov 8b007d531f
Merge pull request #33 from moly7x/fix-TypeError 7 months ago
Vitaliy Filippov 7b7f20fb89
Merge pull request #34 from mirrorll/master 7 months ago
Vitaliy Filippov 300d507026 Fix capture of out in alloc_osd 7 months ago
harley 6886171289
report pg state failed 7 months ago
Vitaliy Filippov 43f8ea47a0 Ok, something is not allowed somewhere in C99 7 months ago
Vitaliy Filippov 6e0e172e15 Implement OSD address selection from a specified subnet 7 months ago
Vitaliy Filippov 655a2c871d Move make-osd.sh into vitastor-client package 7 months ago
Vitaliy Filippov 879fe9b2b4 Add a patch for qemu 6.1 and replace _ with - in qemu options 7 months ago
Vitaliy Filippov 660c3f7b0d Change default RDMA settings to 128x 129K buffers 7 months ago
Vitaliy Filippov f0ebfae3b8 Fix vitastor-cli alloc-osd, use vitastor-cli in make-osd.sh 7 months ago
Vitaliy Filippov eb7ad2c114 Fix empty size syntax, use C version of simple-offsets in tests 7 months ago
Tân Lê b4235b4edf
Fixed TypeError 7 months ago
Vitaliy Filippov cd21ff0b6a Rewrite simple-offsets.js in C/C++ 7 months ago
Vitaliy Filippov d3903f039c Implement alloc-osd (allocate a new OSD number) command 7 months ago
Vitaliy Filippov 66fe1a469b Additionally balance parity chunks over OSDs using round-robin when generating initial distribution 7 months ago
Vitaliy Filippov 24409bd4c4 Oops # 2. Fix vitastor-cli create broken due to json11 :D 7 months ago
Vitaliy Filippov c5029961ea Oops. Fix vitastor-cli ls 7 months ago
Vitaliy Filippov 1ca1143d4a Add fio_version and qemu_version variable example files back 7 months ago
Vitaliy Filippov 920345f7b6 Release 0.6.8 8 months ago
Vitaliy Filippov 75b47a6298 Generate pkg-config file 8 months ago
Vitaliy Filippov 6e446653ae Include README 8 months ago
Vitaliy Filippov e51edf2542 Split into multiple rpm packages 8 months ago
Vitaliy Filippov ce170af91f Split into multiple Debian packages 8 months ago
Vitaliy Filippov 7eabc364bf Release 0.6.7 8 months ago
Vitaliy Filippov a346f84c69 Allow to show only specific images in listing 8 months ago
Vitaliy Filippov 71a0c1a7b9 Fix list sorting 8 months ago
Vitaliy Filippov 20e86c7d84 Note about vitastor-cli 8 months ago
Vitaliy Filippov 110b39900b Rename the new "set" command to "modify" 8 months ago
Vitaliy Filippov 697ee30a26 Add ARG REL into build Dockerfiles 8 months ago
Vitaliy Filippov 42479b4590 Fix vitastor-nbd list, add ls alias 8 months ago
Vitaliy Filippov 6e82044e84 Add `vita` symlink 8 months ago
Vitaliy Filippov 2cb3e84882 Implement CLI set (resize, change readonly status) command 8 months ago
Vitaliy Filippov 32614c5bc8 Add a test for the last change ("split-brain avoidance", lol) 8 months ago
Vitaliy Filippov aa436027c8 Report pg/history from OSD on every degraded activation 8 months ago
Vitaliy Filippov 577a563b91 Allow to disable colored output 8 months ago
Vitaliy Filippov e4efa2c08a Improve vitastor-cli ls - show I/O statistics, allow to sort & limit output 8 months ago
Vitaliy Filippov 0f3f0a9d29 Calculate average statistics in mon, remove buggy "fix_stat_overflows" 8 months ago
Vitaliy Filippov 0544a16f95
Merge pull request #30 from moly7x/moly7x-fix-No-weighed-backend-found 8 months ago
Tân Lê 30d8930958
Revert spacing in comment 8 months ago
Tân Lê baf003fbd3
Revert newline in comment 8 months ago
Tân Lê ba39a38dc4
Fix No weighed backend found 8 months ago
Vitaliy Filippov d528cd77f1 Fix install_symlink 8 months ago
Vitaliy Filippov 6e6f407df3 Simplify & fix monitor stats aggregation 8 months ago
Vitaliy Filippov 4d43774cbb Use 5s etcd_report_interval by default 8 months ago
Vitaliy Filippov a1488f7217 Fix qemu_driver to build with QEMU 2.x (previously it was only correct for QEMU 2.0) 8 months ago
Vitaliy Filippov 404e07d365 Implement image/snapshot/clone creation and listing by pool 8 months ago
Vitaliy Filippov b3dcee0d43 Also print "bare" inodes with missing config if they occupy space 8 months ago
Vitaliy Filippov 609bd4eb59 Remove naggy RDMA messages when log level is zero 8 months ago
Vitaliy Filippov 8e445ddc9a Begin to implement CLI: implement listing, add help, add create stub 8 months ago
Vitaliy Filippov ffb06536ff Revoke lease in mon on SIGINT & SIGTERM, fix raw_to_usable calculation 8 months ago
Vitaliy Filippov eeecab20c2
Merge pull request #28 from moly7x/fix 8 months ago
Tân Lê e889ac4209
Fix building QEMU 3.1 8 months ago
Vitaliy Filippov cfe8de9b84 Autosync based on number of unstable ops to prevent journal stalls 8 months ago
Vitaliy Filippov 24b9b19066 Change rm to rm-data as it was renamed 8 months ago
Vitaliy Filippov ef645ee0c2
Merge pull request #26 from moly7x/fix 8 months ago
Tân Lê 8a9bae5216 FIX ERROR cinder.volume.drivers.vitastor KeyError: 'total_raw_tb' 8 months ago
Vitaliy Filippov da99686a15 Correctly aggregate pool statistics for unknown pools 8 months ago
Vitaliy Filippov dcc03ee41f Add go.sum 8 months ago
Vitaliy Filippov fb2f7a0d3c Release 0.6.6 8 months ago
Vitaliy Filippov 38d85da19a Fix build for older gcc 8 months ago
Vitaliy Filippov dc3caee284 Add Dockerfile 8 months ago
Vitaliy Filippov 89dcda1fed Remove "bool" from the C header 8 months ago
Vitaliy Filippov 1526e2055e Do not crash with RDMA when receiving garbage, free RDMA buffers when connection is closed 9 months ago
Vitaliy Filippov 74cb3911db Rebase children of the "inverse" child when it is removed, change /index/image/%s keys during metadata ops 9 months ago
Vitaliy Filippov d5efbbb6b9 Rename commands and add CLI help 9 months ago
Vitaliy Filippov 4319091bd3 Implement "inverse merge" optimisation 9 months ago
Vitaliy Filippov 6d307d5391 Ignore "readonly" flag when merging snapshots 9 months ago
Vitaliy Filippov 065dfef683 Rename vitastor-cmd to vitastor-cli 9 months ago
Vitaliy Filippov 4d6b85fe67 Split one big cmd.cpp into multiple files 9 months ago
Vitaliy Filippov 2dd2f29f46 Move get_inode_cfg to cli_tool_t 9 months ago
Vitaliy Filippov fc3a1e076a Fix minor bugs in snapshot removal, check it in tests 9 months ago
Vitaliy Filippov 3a3e168c42 Implement high-level snapshot flatten and remove commands 9 months ago
Vitaliy Filippov 95c55da0ad Implement merge with CAS 11 months ago
Vitaliy Filippov 5cf1157f16 Return real version on CAS failure 11 months ago
Vitaliy Filippov acf637950c Implement layer merge 11 months ago
Vitaliy Filippov a02b02eb04 Use new listing methods in rm_inode 11 months ago
Vitaliy Filippov 7d3d696110 Implement object listing with controllable parallelism in cluster_client 12 months ago
Vitaliy Filippov 712576ca75
Merge pull request #13 from lnsyyj/wip-vitastor-debug 12 months ago
Vitaliy Filippov 28bd94d2c2 Make diagnostics slightly better 12 months ago
Vitaliy Filippov 148ff04aa8 Do not lose flusher queue entries when an "older object rescan" happens in parallel with flushing of an older version of another object 12 months ago
JiangYu e86df4a2a2 fix BLOCKSTORE_DEBUG, error: ‘dirty_it’ was not declared in this scope 12 months ago
Vitaliy Filippov e74af9745e Print journal flusher diagnostics on slow ops 12 months ago
Vitaliy Filippov 0e0509e3da Dump op states in slow operation log 12 months ago
Vitaliy Filippov cb282d25e0 Release 0.6.5 12 months ago
Vitaliy Filippov 8b2a4c9539 Fix centos builds (yum-builddep stopped working in el7, cmake in el8..) 12 months ago
Vitaliy Filippov b66a079892 State basic OpenStack support 12 months ago
Vitaliy Filippov e90bbe6385 Implement OpenStack Cinder driver for Vitastor 12 months ago
Vitaliy Filippov 4be761254c Move patches to patches/ 12 months ago
Vitaliy Filippov 7a45c5f86c buster-backports has broken mesa 12 months ago
Vitaliy Filippov bff413584d Fix qemuBlockStorageSourceGetVitastorProps 12 months ago
Vitaliy Filippov bb31050ab5 Add missing image, config_path options to QEMU QAPI 12 months ago
Vitaliy Filippov b52dd6843a Rename qemu_rbd_unescape and qemu_rbd_next_tok to *_vitastor_* 1 year ago
Vitaliy Filippov b66160a7ad Aggregate per-pool statistics in mon 1 year ago
Vitaliy Filippov 30bb602681 Add _VITASTOR to missing switches in libvirt 7.0 patch 1 year ago
Vitaliy Filippov eb0a3adafc Patch libvirt schema, add an example to test libvirt 1 year ago
Vitaliy Filippov 24301b116c Add libvirt 5.0 patch 1 year ago
Vitaliy Filippov 1d00c17d68 Add libvirt 7.5 patch 1 year ago
Vitaliy Filippov 24f19c4b80 Add libvirt 7.0 patch 1 year ago
Vitaliy Filippov dfdf5c1f9c Fix comments in mon.js 1 year ago
Vitaliy Filippov aad7792d3f Check for loops in parent inode chains 1 year ago
Vitaliy Filippov 6ca8afffe5 Add CAS version parameter to the C wrapper 1 year ago
Vitaliy Filippov 511a89948b Rework qemu_proxy into a C wrapper library with public header 1 year ago
Vitaliy Filippov 3de553ecd7 Add a test for CAS write operation 1 year ago
Vitaliy Filippov 9c45d43e74 Extract common 3 OSD code from several test scripts 1 year ago
Vitaliy Filippov 891250d355 Implement CAS writes 1 year ago
Vitaliy Filippov f9fe72d40a Release 0.6.4 1 year ago
Vitaliy Filippov 10ee4f7c1d Add notes about CSI to README 1 year ago
Vitaliy Filippov fd8244699b Implement basic CSI driver 1 year ago
Vitaliy Filippov eaac1fc5d1 Log to stderr in etcd_state_client, too 1 year ago
Vitaliy Filippov 57be1923d3 Daemonize NBD_DO_IT process, correctly cleanup unmounted NBD clients 1 year ago
Vitaliy Filippov c467acc388 Fix /v3 appendage to etcd URLs without /v3 1 year ago
Vitaliy Filippov bf591ba3ee Fix nbd module load check 1 year ago
Vitaliy Filippov 699a0fbbc7 Log to stderr instead of stdout in client 1 year ago
Vitaliy Filippov 6b2dd50f27 Fix build without RDMA 1 year ago
Vitaliy Filippov caf2f3c56f Release 0.6.3 1 year ago
Vitaliy Filippov 9174f188b1 Build packages with libibverbs 1 year ago
Vitaliy Filippov d3978c6d0e Do not print RDMA connection messages when log_level=0 1 year ago
Vitaliy Filippov 4a7365660d Do not wait for down OSDs during sync 1 year ago
Vitaliy Filippov 818ae5d61d Some config parsing fixes 1 year ago
Vitaliy Filippov 6810e93c3f Add RDMA options to mon.js list 1 year ago
Vitaliy Filippov f6f35f4127 Pass options correctly to not override /etc/vitastor/vitastor.conf 1 year ago
Vitaliy Filippov 72aa2fd819 Make OSD and client read common configuration from /etc/vitastor/vitastor.conf 1 year ago
Vitaliy Filippov 5010b0dd75 Use json11 instead of blockstore_config_t 1 year ago
Vitaliy Filippov 483c5ab380 Negotiate max_msg instead of max_sge, make buffer settings more conservative :-) 1 year ago
Vitaliy Filippov 6a6fd6544d Add RDMA options to the QEMU driver 1 year ago
Vitaliy Filippov 971aa4ae4f Implement RDMA receive with memory copying (send remains zero-copy) 1 year ago
Vitaliy Filippov 9e6cbc6ebc Negotiate max_sge between RDMA client & server 1 year ago
Vitaliy Filippov ce777319c3 WIP RDMA support 1 year ago
Vitaliy Filippov f8ff39b0ab Rework continue_ops() to remove a CPU hot spot 1 year ago
Vitaliy Filippov d749159585 Linked list experiment 1 year ago
Vitaliy Filippov 9703773a63 Fix has_flushes setting 1 year ago
Vitaliy Filippov 5d8d486f7c Add SOVERSION 1 year ago
Vitaliy Filippov 2b546cdd55 Link vitastor_blk with vitastor_common for timerfd_manager_t 1 year ago
Vitaliy Filippov bd7b177707 Report sensitive configuration values instead of the configuration source 1 year ago
Vitaliy Filippov 33f9d03d22 Update documentation regarding image names and vitastor-nbd 1 year ago
Vitaliy Filippov 82e6aff17b Support mapping NBD by the image name 1 year ago
Vitaliy Filippov 57e2c503f7 Rename osd_t::c_cli to msgr 1 year ago
  1. 2
      CMakeLists.txt
  2. 511
      README-ru.md
  3. 478
      README.md
  4. 680
      VNPL-1.1-RU.txt
  5. 4
      VNPL-1.1.txt
  6. 2
      cpp-btree
  7. 2
      csi/.dockerignore
  8. 32
      csi/Dockerfile
  9. 9
      csi/Makefile
  10. 5
      csi/deploy/000-csi-namespace.yaml
  11. 9
      csi/deploy/001-csi-config-map.yaml
  12. 37
      csi/deploy/002-csi-nodeplugin-rbac.yaml
  13. 72
      csi/deploy/003-csi-nodeplugin-psp.yaml
  14. 140
      csi/deploy/004-csi-nodeplugin.yaml
  15. 102
      csi/deploy/005-csi-provisioner-rbac.yaml
  16. 60
      csi/deploy/006-csi-provisioner-psp.yaml
  17. 159
      csi/deploy/007-csi-provisioner.yaml
  18. 11
      csi/deploy/008-csi-driver.yaml
  19. 19
      csi/deploy/009-storage-class.yaml
  20. 13
      csi/deploy/example-pvc-block.yaml
  21. 12
      csi/deploy/example-pvc.yaml
  22. 17
      csi/deploy/example-test-pod-block.yaml
  23. 17
      csi/deploy/example-test-pod.yaml
  24. 35
      csi/go.mod
  25. 448
      csi/go.sum
  26. 22
      csi/src/config.go
  27. 530
      csi/src/controllerserver.go
  28. 137
      csi/src/grpc.go
  29. 60
      csi/src/identityserver.go
  30. 293
      csi/src/nodeserver.go
  31. 36
      csi/src/server.go
  32. 39
      csi/vitastor-csi.go
  33. 4
      debian/build-vitastor-bullseye.sh
  34. 4
      debian/build-vitastor-buster.sh
  35. 28
      debian/changelog
  36. 42
      debian/control
  37. 1
      debian/fio_version
  38. 3
      debian/install
  39. 11
      debian/libisal.pc
  40. 40
      debian/libvirt.Dockerfile
  41. 39
      debian/patched-qemu.Dockerfile
  42. 1
      debian/pve-storage-vitastor.install
  43. 19
      debian/raw.h
  44. 3
      debian/rules
  45. 2
      debian/substvars
  46. 2
      debian/vitastor-client-dev.install
  47. 7
      debian/vitastor-client.install
  48. 1
      debian/vitastor-fio.install
  49. 1
      debian/vitastor-mon.install
  50. 3
      debian/vitastor-osd.install
  51. 47
      debian/vitastor.Dockerfile
  52. 9
      docker/Dockerfile
  53. 1
      docker/apt.conf
  54. BIN
      docker/vitastor.gpg
  55. 1
      docker/vitastor.list
  56. 3
      docker/vitastor.pref
  57. 37
      docs/config.en.md
  58. 39
      docs/config.ru.md
  59. 46
      docs/config/common.en.md
  60. 45
      docs/config/common.ru.md
  61. 32
      docs/config/inode.en.md
  62. 34
      docs/config/inode.ru.md
  63. 124
      docs/config/layout-cluster.en.md
  64. 134
      docs/config/layout-cluster.ru.md
  65. 176
      docs/config/layout-osd.en.md
  66. 185
      docs/config/layout-osd.ru.md
  67. 79
      docs/config/monitor.en.md
  68. 80
      docs/config/monitor.ru.md
  69. 214
      docs/config/network.en.md
  70. 224
      docs/config/network.ru.md
  71. 305
      docs/config/osd.en.md
  72. 318
      docs/config/osd.ru.md
  73. 257
      docs/config/pool.en.md
  74. 257
      docs/config/pool.ru.md
  75. 3
      docs/config/src/common.en.md
  76. 3
      docs/config/src/common.ru.md
  77. 35
      docs/config/src/common.yml
  78. 4
      docs/config/src/layout-cluster.en.md
  79. 4
      docs/config/src/layout-cluster.ru.md
  80. 200
      docs/config/src/layout-cluster.yml
  81. 4
      docs/config/src/layout-osd.en.md
  82. 5
      docs/config/src/layout-osd.ru.md
  83. 206
      docs/config/src/layout-osd.yml
  84. 120
      docs/config/src/make.js
  85. 3
      docs/config/src/monitor.en.md
  86. 3
      docs/config/src/monitor.ru.md
  87. 65
      docs/config/src/monitor.yml
  88. 4
      docs/config/src/network.en.md
  89. 4
      docs/config/src/network.ru.md
  90. 225
      docs/config/src/network.yml
  91. 4
      docs/config/src/osd.en.md
  92. 5
      docs/config/src/osd.ru.md
  93. 352
      docs/config/src/osd.yml
  94. 20
      docs/installation/kubernetes.en.md
  95. 20
      docs/installation/kubernetes.ru.md
  96. 40
      docs/installation/openstack.en.md
  97. 40
      docs/installation/openstack.ru.md
  98. 44
      docs/installation/packages.en.md
  99. 43
      docs/installation/packages.ru.md
  100. 39
      docs/installation/proxmox.en.md

2
CMakeLists.txt

@ -2,4 +2,6 @@ cmake_minimum_required(VERSION 2.8)
project(vitastor)
set(VERSION "0.7.1")
add_subdirectory(src)

511
README-ru.md

@ -4,463 +4,68 @@
## Идея
Я всего лишь хочу сделать качественную блочную SDS!
Вернём былую скорость кластерному блочному хранилищу!
Vitastor - распределённая блочная SDS, прямой аналог Ceph RBD и внутренних СХД популярных
облачных провайдеров. Однако, в отличие от них, Vitastor быстрый и при этом простой.
Только пока маленький :-).
Vitastor - распределённая блочная SDS (программная СХД), прямой аналог Ceph RBD и
внутренних СХД популярных облачных провайдеров. Однако, в отличие от них, Vitastor
быстрый и при этом простой. Только пока маленький :-).
Архитектурная схожесть с Ceph означает заложенную на уровне алгоритмов записи строгую консистентность,
Vitastor архитектурно похож на Ceph, что означает атомарность и строгую консистентность,
репликацию через первичный OSD, симметричную кластеризацию без единой точки отказа
и автоматическое распределение данных по любому числу дисков любого размера с настраиваемыми схемами
избыточности - репликацией или с произвольными кодами коррекции ошибок.
## Возможности
Vitastor на данный момент находится в статусе предварительного выпуска, расширенные
возможности пока отсутствуют, а в будущих версиях вероятны "ломающие" изменения.
Однако следующее уже реализовано:
0.5.x (стабильная версия):
- Базовая часть - надёжное кластерное блочное хранилище без единой точки отказа
- Производительность ;-D
- Несколько схем отказоустойчивости: репликация, XOR n+1 (1 диск чётности), коды коррекции ошибок
Рида-Соломона на основе библиотеки jerasure с любым числом дисков данных и чётности в группе
- Конфигурация через простые человекочитаемые JSON-структуры в etcd
- Автоматическое распределение данных по OSD, с поддержкой:
- Математической оптимизации для лучшей равномерности распределения и минимизации перемещений данных
- Нескольких пулов с разными схемами избыточности
- Дерева распределения, выбора OSD по тегам / классам устройств (только SSD, только HDD) и по поддереву
- Настраиваемых доменов отказа (диск/сервер/стойка и т.п.)
- Восстановление деградированных блоков
- Ребаланс, то есть перемещение данных между OSD (дисками)
- Поддержка "ленивого" fsync (fsync не на каждую операцию)
- Сбор статистики ввода/вывода в etcd
- Клиентская библиотека режима пользователя для ввода/вывода
- Драйвер диска для QEMU (собирается вне дерева исходников QEMU)
- Драйвер диска для утилиты тестирования производительности fio (также собирается вне дерева исходников fio)
- NBD-прокси для монтирования образов ядром ("блочное устройство в режиме пользователя")
- Утилита удаления образов/инодов (vitastor-rm)
- Пакеты для Debian и CentOS
0.6.x (master-ветка):
- Статистика операций ввода/вывода и занятого места в разрезе инодов
- Именование инодов через хранение их метаданных в etcd
- Снапшоты и copy-on-write клоны
- Сглаживание производительности случайной записи в SSD+HDD конфигурациях
## Планы развития
- Более корректные скрипты разметки дисков и автоматического запуска OSD
- Другие инструменты администрирования
- Плагины для OpenStack, Kubernetes, OpenNebula, Proxmox и других облачных систем
- iSCSI-прокси
- Более быстрое переключение при отказах
- Фоновая проверка целостности без контрольных сумм (сверка реплик)
- Контрольные суммы
- Поддержка SSD-кэширования (tiered storage)
- Поддержка RDMA и NVDIMM
- Web-интерфейс
- Возможно, сжатие
- Возможно, поддержка кэширования данных через системный page cache
## Архитектура
Так же, как и в Ceph, в Vitastor:
- Есть пулы (pools), PG, OSD, мониторы, домены отказа, дерево распределения (аналог crush-дерева).
- Образы делятся на блоки фиксированного размера (объекты), и эти объекты распределяются по OSD.
- У OSD есть журнал и метаданные и они тоже могут размещаться на отдельных быстрых дисках.
- Все операции записи тоже транзакционны. В Vitastor, правда, есть режим отложенного/ленивого fsync
(коммита), в котором fsync не вызывается на каждую операцию записи, что делает его более
пригодным для использования на "плохих" (десктопных) SSD. Однако все операции записи
в любом случае атомарны.
- Клиентская библиотека тоже старается ждать восстановления после любого отказа кластера, то есть,
вы тоже можете перезагрузить хоть весь кластер разом, и клиенты только на время зависнут,
но не отключатся.
Некоторые базовые термины для тех, кто не знаком с Ceph:
- OSD (Object Storage Daemon) - процесс, который хранит данные на одном диске и обрабатывает
запросы чтения/записи от клиентов.
- Пул (Pool) - контейнер для данных, имеющих одну и ту же схему избыточности и правила распределения по OSD.
- PG (Placement Group) - группа объектов, хранимых на одном и том же наборе реплик (OSD).
Несколько PG могут храниться на одном и том же наборе реплик, но объекты одной PG
в норме не хранятся на разных наборах OSD.
- Монитор - демон, хранящий состояние кластера.
- Домен отказа (Failure Domain) - группа OSD, которым вы разрешаете "упасть" всем вместе.
Иными словами, это группа OSD, в которые СХД не помещает разные копии одного и того же
блока данных. Например, если домен отказа - сервер, то на двух дисках одного сервера
никогда не окажется 2 и более копий одного и того же блока данных, а значит, даже
если в этом сервере откажут все диски, это будет равносильно потере только 1 копии
любого блока данных.
- Дерево распределения (Placement Tree / CRUSH Tree) - иерархическая группировка OSD
в узлы, которые далее можно использовать как домены отказа. То есть, диск (OSD) входит в
сервер, сервер входит в стойку, стойка входит в ряд, ряд в датацентр и т.п.
Чем Vitastor отличается от Ceph:
- Vitastor в первую очередь сфокусирован на SSD. Также Vitastor, вероятно, должен неплохо работать
с комбинацией SSD и HDD через bcache, а в будущем, возможно, будут добавлены и нативные способы
оптимизации под SSD+HDD. Однако хранилище на основе одних лишь жёстких дисков, вообще без SSD,
не в приоритете, поэтому оптимизации под этот кейс могут вообще не состояться.
- OSD Vitastor однопоточный и всегда таким останется, так как это самый оптимальный способ работы.
Если вам не хватает 1 ядра на 1 диск, просто делите диск на разделы и запускайте на нём несколько OSD.
Но, скорее всего, вам хватит и 1 ядра - Vitastor не так прожорлив к ресурсам CPU, как Ceph.
- Журнал и метаданные всегда размещаются в памяти, благодаря чему никогда не тратится лишнее время
на чтение метаданных с диска. Размер метаданных линейно зависит от размера диска и блока данных,
который задаётся в конфигурации кластера и по умолчанию составляет 128 КБ. С блоком 128 КБ метаданные
занимают примерно 512 МБ памяти на 1 ТБ дискового пространства (и это всё равно меньше, чем нужно Ceph-у).
Журнал вообще не должен быть большим, например, тесты производительности в данном документе проводились
с журналом размером всего 16 МБ. Большой журнал, вероятно, даже вреден, т.к. "грязные" записи (записи,
не сброшенные из журнала) тоже занимают память и могут немного замедлять работу.
- В Vitastor нет внутреннего copy-on-write. Я считаю, что реализация CoW-хранилища гораздо сложнее,
поэтому сложнее добиться устойчиво хороших результатов. Возможно, в один прекрасный день
я придумаю красивый алгоритм для CoW-хранилища, но пока нет - внутреннего CoW в Vitastor не будет.
Всё это не относится к "внешнему" CoW (снапшотам и клонам).
- Базовый слой Vitastor - простое блочное хранилище с блоками фиксированного размера, а не сложное
объектное хранилище с расширенными возможностями, как в Ceph (RADOS).
- В Vitastor есть режим "ленивых fsync", в котором OSD группирует запросы записи перед сбросом их
на диск, что позволяет получить лучшую производительность с дешёвыми настольными SSD без конденсаторов
("Advanced Power Loss Protection" / "Capacitor-Based Power Loss Protection").
Тем не менее, такой режим всё равно медленнее использования нормальных серверных SSD и мгновенного
fsync, так как приводит к дополнительным операциям передачи данных по сети, поэтому рекомендуется
всё-таки использовать хорошие серверные диски, тем более, стоят они почти так же, как десктопные.
- PG эфемерны. Это означает, что они не хранятся на дисках и существуют только в памяти работающих OSD.
- Процессы восстановления оперируют отдельными объектами, а не целыми PG.
- PGLOG-ов нет.
- "Мониторы" не хранят данные. Конфигурация и состояние кластера хранятся в etcd в простых человекочитаемых
JSON-структурах. Мониторы Vitastor только следят за состоянием кластера и управляют перемещением данных.
В этом смысле монитор Vitastor не является критичным компонентом системы и больше похож на Ceph-овский
менеджер (MGR). Монитор Vitastor написан на node.js.
- Распределение PG не основано на консистентных хешах. Вместо этого все маппинги PG хранятся прямо в etcd
(ибо нет никакой проблемы сохранить несколько сотен-тысяч записей в памяти, а не считать каждый раз хеши).
Перераспределение PG по OSD выполняется через математическую оптимизацию,
а конкретно, сведение задачи к ЛП (задаче линейного программирования) и решение оной с помощью утилиты
lp_solve. Такой подход позволяет обычно выравнивать распределение места почти идеально - равномерность
обычно составляет 96-99%, в отличие от Ceph, где на голом CRUSH-е без балансировщика обычно выходит 80-90%.
Также это позволяет минимизировать объём перемещения данных и случайность связей между OSD, а также менять
распределение вручную, не боясь сломать логику перебалансировки. В таком подходе есть и потенциальный
недостаток - есть предположение, что в очень большом кластере он может сломаться - однако вплоть до
нескольких сотен OSD подход точно работает нормально. Ну и, собственно, при необходимости легко
реализовать и консистентные хеши.
- Отдельный слой, подобный слою "CRUSH-правил", отсутствует. Вы настраиваете схемы отказоустойчивости,
домены отказа и правила выбора OSD напрямую в конфигурации пулов.
## Понимание сути производительности систем хранения
Вкратце: для быстрой хранилки задержки важнее, чем пиковые iops-ы.
Лучшая возможная задержка достигается при тестировании в 1 поток с глубиной очереди 1,
что приблизительно означает минимально нагруженное состояние кластера. В данном случае
IOPS = 1/задержка. Ни числом серверов, ни дисков, ни серверных процессов/потоков
задержка не масштабируется... Она зависит только от того, насколько быстро один
серверный процесс (и клиент) обрабатывают одну операцию.
Почему задержки важны? Потому, что некоторые приложения *не могут* использовать глубину
очереди больше 1, ибо их задача не параллелизуется. Важный пример - это все СУБД
с поддержкой консистентности (ACID), потому что все они обеспечивают её через
журналирование, а журналы пишутся последовательно и с fsync() после каждой операции.
fsync, кстати - это ещё одна очень важная вещь, про которую почти всегда забывают в тестах.
Смысл в том, что все современные диски имеют кэши/буферы записи и не гарантируют, что
данные реально физически записываются на носитель до того, как вы делаете fsync(),
который транслируется в команду сброса кэша операционной системой.
Дешёвые SSD для настольных ПК и ноутбуков очень быстрые без fsync - NVMe диски, например,
могут обработать порядка 80000 операций записи в секунду с глубиной очереди 1 без fsync.
Однако с fsync, когда они реально вынуждены писать каждый блок данных во флеш-память,
они выжимают лишь 1000-2000 операций записи в секунду (число практически постоянное
для всех моделей SSD).
Серверные SSD часто имеют суперконденсаторы, работающие как встроенный источник
бесперебойного питания и дающие дискам успеть сбросить их DRAM-кэш в постоянную
флеш-память при отключении питания. Благодаря этому диски с чистой совестью
*игнорируют fsync*, так как точно знают, что данные из кэша доедут до постоянной
памяти.
Все наиболее известные программные СХД, например, Ceph и внутренние СХД, используемые
такими облачными провайдерами, как Amazon, Google, Яндекс, медленные в смысле задержки.
В лучшем случае они дают задержки от 0.3мс на чтение и 0.6мс на запись 4 КБ блоками
даже при условии использования наилучшего возможного железа.
И это в эпоху SSD, когда вы можете пойти на рынок и купить там SSD, задержка которого
на чтение будет 0.1мс, а на запись - 0.04мс, за 100$ или даже дешевле.
Когда мне нужно быстро протестировать производительность дисковой подсистемы, я
использую следующие 6 команд, с небольшими вариациями:
- Линейная запись:
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4M -iodepth=32 -rw=write -runtime=60 -filename=/dev/sdX`
- Линейное чтение:
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4M -iodepth=32 -rw=read -runtime=60 -filename=/dev/sdX`
- Запись в 1 поток (T1Q1):
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -fsync=1 -rw=randwrite -runtime=60 -filename=/dev/sdX`
- Чтение в 1 поток (T1Q1):
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -rw=randread -runtime=60 -filename=/dev/sdX`
- Параллельная запись (numjobs используется, когда 1 ядро CPU не может насытить диск):
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=128 [-numjobs=4 -group_reporting] -rw=randwrite -runtime=60 -filename=/dev/sdX`
- Параллельное чтение (numjobs - аналогично):
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=128 [-numjobs=4 -group_reporting] -rw=randread -runtime=60 -filename=/dev/sdX`
## Теоретическая максимальная производительность Vitastor
При использовании репликации:
- Задержка чтения в 1 поток (T1Q1): 1 сетевой RTT + 1 чтение с диска.
- Запись+fsync в 1 поток:
- С мгновенным сбросом: 2 RTT + 1 запись.
- С отложенным ("ленивым") сбросом: 4 RTT + 1 запись + 1 fsync.
- Параллельное чтение: сумма IOPS всех дисков либо производительность сети, если в сеть упрётся раньше.
- Параллельная запись: сумма IOPS всех дисков / число реплик / WA либо производительность сети, если в сеть упрётся раньше.
При использовании кодов коррекции ошибок (EC):
- Задержка чтения в 1 поток (T1Q1): 1.5 RTT + 1 чтение.
- Запись+fsync в 1 поток:
- С мгновенным сбросом: 3.5 RTT + 1 чтение + 2 записи.
- С отложенным ("ленивым") сбросом: 5.5 RTT + 1 чтение + 2 записи + 2 fsync.
- Под 0.5 на самом деле подразумевается (k-1)/k, где k - число дисков данных,
что означает, что дополнительное обращение по сети не нужно, когда операция
чтения обслуживается локально.
- Параллельное чтение: сумма IOPS всех дисков либо производительность сети, если в сеть упрётся раньше.
- Параллельная запись: сумма IOPS всех дисков / общее число дисков данных и чётности / WA либо производительность сети, если в сеть упрётся раньше.
Примечание: IOPS дисков в данном случае надо брать в смешанном режиме чтения/записи в пропорции, аналогичной формулам выше.
WA (мультипликатор записи) для 4 КБ блоков в Vitastor обычно составляет 3-5:
1. Запись метаданных в журнал
2. Запись блока данных в журнал
3. Запись метаданных в БД
4. Ещё одна запись метаданных в журнал при использовании EC
5. Запись блока данных на диск данных
Если вы найдёте SSD, хорошо работающий с 512-байтными блоками данных (Optane?),
то 1, 3 и 4 можно снизить до 512 байт (1/8 от размера данных) и получить WA всего 2.375.
Кроме того, WA снижается при использовании отложенного/ленивого сброса при параллельной
нагрузке, т.к. блоки журнала записываются на диск только когда они заполняются или явным
образом запрашивается fsync.
## Пример сравнения с Ceph
Железо - 4 сервера, в каждом:
- 6x SATA SSD Intel D3-4510 3.84 TB
- 2x Xeon Gold 6242 (16 cores @ 2.8 GHz)
- 384 GB RAM
- 1x 25 GbE сетевая карта (Mellanox ConnectX-4 LX), подключённая к свитчу Juniper QFX5200
Экономия энергии CPU отключена. В тестах и Vitastor, и Ceph развёрнуто по 2 OSD на 1 SSD.
Все результаты ниже относятся к случайной нагрузке 4 КБ блоками (если явно не указано обратное).
Производительность голых дисков:
- T1Q1 запись ~27000 iops (задержка ~0.037ms)
- T1Q1 чтение ~9800 iops (задержка ~0.101ms)
- T1Q32 запись ~60000 iops
- T1Q32 чтение ~81700 iops
Ceph 15.2.4 (Bluestore):
- T1Q1 запись ~1000 iops (задержка ~1ms)
- T1Q1 чтение ~1750 iops (задержка ~0.57ms)
- T8Q64 запись ~100000 iops, потребление CPU процессами OSD около 40 ядер на каждом сервере
- T8Q64 чтение ~480000 iops, потребление CPU процессами OSD около 40 ядер на каждом сервере
Тесты в 8 потоков проводились на 8 400GB RBD образах со всех хостов (с каждого хоста запускалось 2 процесса fio).
Это нужно потому, что в Ceph несколько RBD-клиентов, пишущих в 1 образ, очень сильно замедляются.
Настройки RocksDB и Bluestore в Ceph не менялись, единственным изменением было отключение cephx_sign_messages.
На самом деле, результаты теста не такие уж и плохие для Ceph (могло быть хуже).
Собственно говоря, эти серверы как раз хорошо сбалансированы для Ceph - 6 SATA SSD как раз
утилизируют 25-гигабитную сеть, а без 2 мощных процессоров Ceph-у бы не хватило ядер,
чтобы выдать пристойный результат. Собственно, что и показывает жор 40 ядер в процессе
параллельного теста.
Vitastor:
- T1Q1 запись: 7087 iops (задержка 0.14ms)
- T1Q1 чтение: 6838 iops (задержка 0.145ms)
- T2Q64 запись: 162000 iops, потребление CPU - 3 ядра на каждом сервере
- T8Q64 чтение: 895000 iops, потребление CPU - 4 ядра на каждом сервере
- Линейная запись (4M T1Q32): 2800 МБ/с
- Линейное чтение (4M T1Q32): 1500 МБ/с
Тест на чтение в 8 потоков проводился на 1 большом образе (3.2 ТБ) со всех хостов (опять же, по 2 fio с каждого).
В Vitastor никакой разницы между 1 образом и 8-ю нет. Естественно, примерно 1/4 запросов чтения
в такой конфигурации, как и в тестах Ceph выше, обслуживалась с локальной машины. Если проводить
тест так, чтобы все операции всегда обращались к первичным OSD по сети - тест сильнее упирался
в сеть и результат составлял примерно 689000 iops.
Настройки Vitastor: `--disable_data_fsync true --immediate_commit all --flusher_count 8
--disk_alignment 4096 --journal_block_size 4096 --meta_block_size 4096
--journal_no_same_sector_overwrites true --journal_sector_buffer_count 1024
--journal_size 16777216`.
### EC/XOR 2+1
Vitastor:
- T1Q1 запись: 2808 iops (задержка ~0.355ms)
- T1Q1 чтение: 6190 iops (задержка ~0.16ms)
- T2Q64 запись: 85500 iops, потребление CPU - 3.4 ядра на каждом сервере
- T8Q64 чтение: 812000 iops, потребление CPU - 4.7 ядра на каждом сервере
- Линейная запись (4M T1Q32): 3200 МБ/с
- Линейное чтение (4M T1Q32): 1800 МБ/с
Ceph:
- T1Q1 запись: 730 iops (задержка ~1.37ms latency)
- T1Q1 чтение: 1500 iops с холодным кэшем метаданных (задержка ~0.66ms), 2300 iops через 2 минуты прогрева (задержка ~0.435ms)
- T4Q128 запись (4 RBD images): 45300 iops, потребление CPU - 30 ядер на каждом сервере
- T8Q64 чтение (4 RBD images): 278600 iops, потребление CPU - 40 ядер на каждом сервере
- Линейная запись (4M T1Q32): 1950 МБ/с в пустой образ, 2500 МБ/с в заполненный образ
- Линейное чтение (4M T1Q32): 2400 МБ/с
### NBD
NBD - на данный момент единственный способ монтировать Vitastor ядром Linux, но он
приводит к дополнительным копированиям данных, поэтому немного ухудшает производительность,
правда, в основном - линейную, а случайная затрагивается слабо.
NBD расшифровывается как "сетевое блочное устройство", но на самом деле оно также
работает просто как аналог FUSE для блочных устройств, то есть, представляет собой
"блочное устройство в пространстве пользователя".
Vitastor с однопоточной NBD прокси на том же стенде:
- T1Q1 запись: 6000 iops (задержка 0.166ms)
- T1Q1 чтение: 5518 iops (задержка 0.18ms)
- T1Q128 запись: 94400 iops
- T1Q128 чтение: 103000 iops
- Линейная запись (4M T1Q128): 1266 МБ/с (в сравнении с 2800 МБ/с через fio)
- Линейное чтение (4M T1Q128): 975 МБ/с (в сравнении с 1500 МБ/с через fio)
## Установка
### Debian
- Добавьте ключ репозитория Vitastor:
`wget -q -O - https://vitastor.io/debian/pubkey | sudo apt-key add -`
- Добавьте репозиторий Vitastor в /etc/apt/sources.list:
- Debian 11 (Bullseye/Sid): `deb https://vitastor.io/debian bullseye main`
- Debian 10 (Buster): `deb https://vitastor.io/debian buster main`
- Для Debian 10 (Buster) также включите репозиторий backports:
`deb http://deb.debian.org/debian buster-backports main`
- Установите пакеты: `apt update; apt install vitastor lp-solve etcd linux-image-amd64 qemu`
### CentOS
- Добавьте в систему репозиторий Vitastor:
- CentOS 7: `yum install https://vitastor.io/rpms/centos/7/vitastor-release-1.0-1.el7.noarch.rpm`
- CentOS 8: `dnf install https://vitastor.io/rpms/centos/8/vitastor-release-1.0-1.el8.noarch.rpm`
- Включите EPEL: `yum/dnf install epel-release`
- Включите дополнительные репозитории CentOS:
- CentOS 7: `yum install centos-release-scl`
- CentOS 8: `dnf install centos-release-advanced-virtualization`
- Включите elrepo-kernel:
- CentOS 7: `yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm`
- CentOS 8: `dnf install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm`
- Установите пакеты: `yum/dnf install vitastor lpsolve etcd kernel-ml qemu-kvm`
### Установка из исходников
- Установите ядро 5.4 или более новое, для поддержки io_uring. Желательно 5.8 или даже новее,
так как в 5.4 есть как минимум 1 известный баг, ведущий к зависанию с io_uring и контроллером HP SmartArray.
- Установите liburing 0.4 или более новый и его заголовки.
- Установите lp_solve.
- Установите etcd, версии не ниже 3.4.15. Более ранние версии работать не будут из-за различных багов,
например [#12402](https://github.com/etcd-io/etcd/pull/12402). Также вы можете взять версию 3.4.13 с
этим конкретным исправлением из ветки release-3.4 репозитория https://github.com/vitalif/etcd/.
- Установите node.js 10 или новее.
- Установите gcc и g++ 8.x или новее.
- Склонируйте данный репозиторий с подмодулями: `git clone https://yourcmc.ru/git/vitalif/vitastor/`.
- Желательно пересобрать QEMU с патчем, который делает необязательным запуск через LD_PRELOAD.
См `qemu-*.*-vitastor.patch` - выберите версию, наиболее близкую вашей версии QEMU.
- Установите QEMU 3.0 или новее, возьмите исходные коды установленного пакета, начните его пересборку,
через некоторое время остановите её и скопируйте следующие заголовки:
- `<qemu>/include` &rarr; `<vitastor>/qemu/include`
- Debian:
* Берите qemu из основного репозитория
* `<qemu>/b/qemu/config-host.h` &rarr; `<vitastor>/qemu/b/qemu/config-host.h`
* `<qemu>/b/qemu/qapi` &rarr; `<vitastor>/qemu/b/qemu/qapi`
- CentOS 8:
* Берите qemu из репозитория Advanced-Virtualization. Чтобы включить его, запустите
`yum install centos-release-advanced-virtualization.noarch` и далее `yum install qemu`
* `<qemu>/config-host.h` &rarr; `<vitastor>/qemu/b/qemu/config-host.h`
* Для QEMU 3.0+: `<qemu>/qapi` &rarr; `<vitastor>/qemu/b/qemu/qapi`
* Для QEMU 2.0+: `<qemu>/qapi-types.h` &rarr; `<vitastor>/qemu/b/qemu/qapi-types.h`
- `config-host.h` и `qapi` нужны, т.к. в них содержатся автогенерируемые заголовки
- Установите fio 3.7 или новее, возьмите исходники пакета и сделайте на них симлинк с `<vitastor>/fio`.
- Соберите и установите Vitastor командой `mkdir build && cd build && cmake .. && make -j8 && make install`.
Обратите внимание на переменную cmake `QEMU_PLUGINDIR` - под RHEL её нужно установить равной `qemu-kvm`.
## Запуск
Внимание: процедура пока что достаточно нетривиальная, задавать конфигурацию и смещения
на диске нужно почти вручную. Это будет исправлено в ближайшем будущем.
- Желательны SATA SSD или NVMe диски с конденсаторами (серверные SSD). Можно использовать и
десктопные SSD, включив режим отложенного fsync, но производительность однопоточной записи
в этом случае пострадает.
- Быстрая сеть, минимум 10 гбит/с
- Для наилучшей производительности нужно отключить энергосбережение CPU: `cpupower idle-set -D 0 && cpupower frequency-set -g performance`.
- Пропишите нужные вам значения вверху файлов `/usr/lib/vitastor/mon/make-units.sh` и `/usr/lib/vitastor/mon/make-osd.sh`.
- Создайте юниты systemd для etcd и мониторов: `/usr/lib/vitastor/mon/make-units.sh`
- Создайте юниты для OSD: `/usr/lib/vitastor/mon/make-osd.sh /dev/disk/by-partuuid/XXX [/dev/disk/by-partuuid/YYY ...]`
- Вы можете поменять параметры OSD в юнитах systemd. Смысл некоторых параметров:
- `disable_data_fsync 1` - отключает fsync, используется с SSD с конденсаторами.
- `immediate_commit all` - используется с SSD с конденсаторами.
- `disable_device_lock 1` - отключает блокировку файла устройства, нужно, только если вы запускаете
несколько OSD на одном блочном устройстве.
- `flusher_count 256` - "flusher" - микропоток, удаляющий старые данные из журнала.
Не волнуйтесь об этой настройке, 256 теперь достаточно практически всегда.
- `disk_alignment`, `journal_block_size`, `meta_block_size` следует установить равными размеру
внутреннего блока SSD. Это почти всегда 4096.
- `journal_no_same_sector_overwrites true` запрещает перезапись одного и того же сектора журнала подряд
много раз в процессе записи. Большинство (99%) SSD не нуждаются в данной опции. Однако выяснилось, что
диски, используемые на одном из тестовых стендов - Intel D3-S4510 - очень сильно не любят такую
перезапись, и для них была добавлена эта опция. Когда данный режим включён, также нужно поднимать
значение `journal_sector_buffer_count`, так как иначе Vitastor не хватит буферов для записи в журнал.
- Запустите все etcd: `systemctl start etcd`
- Создайте глобальную конфигурацию в etcd: `etcdctl --endpoints=... put /vitastor/config/global '{"immediate_commit":"all"}'`
(если все ваши диски - серверные с конденсаторами).
- Создайте пулы: `etcdctl --endpoints=... put /vitastor/config/pools '{"1":{"name":"testpool","scheme":"replicated","pg_size":2,"pg_minsize":1,"pg_count":256,"failure_domain":"host"}}'`.
Для jerasure EC-пулов конфигурация должна выглядеть так: `2:{"name":"ecpool","scheme":"jerasure","pg_size":4,"parity_chunks":2,"pg_minsize":2,"pg_count":256,"failure_domain":"host"}`.
- Запустите все OSD: `systemctl start vitastor.target`
- Ваш кластер должен быть готов - один из мониторов должен уже сконфигурировать PG, а OSD должны запустить их.
- Вы можете проверить состояние PG прямо в etcd: `etcdctl --endpoints=... get --prefix /vitastor/pg/state`. Все PG должны быть 'active'.
- Пример команды для запуска тестов: `fio -thread -ioengine=libfio_vitastor.so -name=test -bs=4M -direct=1 -iodepth=16 -rw=write -etcd=10.115.0.10:2379/v3 -pool=1 -inode=1 -size=400G`.
- Пример команды для заливки образа ВМ в vitastor через qemu-img:
```
qemu-img convert -f qcow2 debian10.qcow2 -p -O raw 'vitastor:etcd_host=10.115.0.10\:2379/v3:pool=1:inode=1:size=2147483648'
```
Если вы используете немодифицированный QEMU, данной команде потребуется переменная окружения `LD_PRELOAD=/usr/lib/x86_64-linux-gnu/qemu/block-vitastor.so`.
- Пример команды запуска QEMU:
```
qemu-system-x86_64 -enable-kvm -m 1024
-drive 'file=vitastor:etcd_host=10.115.0.10\:2379/v3:pool=1:inode=1:size=2147483648',format=raw,if=none,id=drive-virtio-disk0,cache=none
-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1,write-cache=off,physical_block_size=4096,logical_block_size=512
-vnc 0.0.0.0:0
```
- Пример команды удаления образа (инода) из Vitastor:
```
vitastor-rm --etcd_address 10.115.0.10:2379/v3 --pool 1 --inode 1 --parallel_osds 16 --iodepth 32
```
## Известные проблемы
- Запросы удаления объектов могут в данный момент приводить к "неполным" объектам в EC-пулах,
если в процессе удаления произойдут отказы OSD или серверов, потому что правильная обработка
запросов удаления в кластере должна быть "трёхфазной", а это пока не реализовано. Если вы
столкнётесь с такой ситуацией, просто повторите запрос удаления.
## Принципы реализации
- Я люблю архитектурно простые решения. Vitastor проектируется именно так и я намерен
и далее следовать данному принципу.
- Если вы пришли сюда за идеальным кодом на C++, вы, вероятно, не по адресу. "Общепринятые"
практики написания C++ кода меня не очень волнуют, так как зачастую, опять-таки, ведут к
излишним усложнениям и код получается красивый... но медленный.
- По той же причине в коде иногда можно встретить велосипеды типа собственного упрощённого
HTTP-клиента для работы с etcd. Зато эти велосипеды маленькие и компактные и не требуют
использования десятка внешних библиотек.
- node.js для монитора - не случайный выбор. Он очень быстрый, имеет встроенную событийную
машину, приятный нейтральный C-подобный язык программирования и развитую инфраструктуру.
Vitastor нацелен на SSD и SSD+HDD кластеры с как минимум 10 Гбит/с сетью, поддерживает
TCP и RDMA и на хорошем железе может достигать задержки 4 КБ чтения и записи на уровне ~0.1 мс,
что примерно в 10 раз быстрее, чем Ceph и другие популярные программные СХД.
Vitastor поддерживает QEMU-драйвер, протоколы NBD и NFS, драйверы OpenStack, Proxmox, Kubernetes.
Другие драйверы могут также быть легко реализованы.
Подробности смотрите в документации по ссылкам ниже.
## Презентации и записи докладов
- DevOpsConf'2021: презентация ([на русском](https://vitastor.io/presentation/devopsconf/devopsconf.html),
[на английском](https://vitastor.io/presentation/devopsconf/devopsconf_en.html)),
[видео](https://vitastor.io/presentation/devopsconf/talk.webm)
- Highload'2022: презентация ([на русском](https://vitastor.io/presentation/highload/highload.html)),
[видео](https://vitastor.io/presentation/highload/talk.webm)
## Документация
- Введение
- [Быстрый старт](docs/intro/quickstart.ru.md)
- [Возможности](docs/intro/features.ru.md)
- [Архитектура](docs/intro/architecture.ru.md)
- [Автор и лицензия](docs/intro/author.ru.md)
- Установка
- [Пакеты](docs/installation/packages.ru.md)
- [Proxmox](docs/installation/proxmox.ru.md)
- [OpenStack](docs/installation/openstack.ru.md)
- [Kubernetes CSI](docs/installation/kubernetes.ru.md)
- [Сборка из исходных кодов](docs/installation/source.ru.md)
- Конфигурация
- [Обзор](docs/config.ru.md)
- Параметры
- [Общие](docs/config/common.ru.md)
- [Сетевые](docs/config/network.ru.md)
- [Глобальные дисковые параметры](docs/config/layout-cluster.ru.md)
- [Дисковые параметры OSD](docs/config/layout-osd.ru.md)
- [Прочие параметры OSD](docs/config/osd.ru.md)
- [Параметры мониторов](docs/config/monitor.ru.md)
- [Настройки пулов](docs/config/pool.ru.md)
- [Метаданные образов в etcd](docs/config/inode.ru.md)
- Использование
- [vitastor-cli](docs/usage/cli.ru.md) (консольный интерфейс)
- [fio](docs/usage/fio.ru.md) для тестов производительности
- [NBD](docs/usage/nbd.ru.md) для монтирования ядром
- [QEMU и qemu-img](docs/usage/qemu.ru.md)
- [NFS](docs/usage/nfs.ru.md)-прокси для VMWare и подобных
- Производительность
- [Понимание сути производительности](docs/performance/understanding.ru.md)
- [Теоретический максимум](docs/performance/theoretical.ru.md)
- [Пример сравнения с Ceph](docs/performance/comparison1.ru.md)
## Автор и лицензия
@ -491,5 +96,5 @@ Vitastor Network Public License 1.1, основанная на GNU GPL 3.0 с д
и также на условиях GNU GPL 2.0 или более поздней версии. Так сделано в целях
совместимости с таким ПО, как QEMU и fio.
Вы можете найти полный текст VNPL 1.1 в файле [VNPL-1.1.txt](VNPL-1.1.txt),
а GPL 2.0 в файле [GPL-2.0.txt](GPL-2.0.txt).
Вы можете найти полный текст VNPL 1.1 на английском языке в файле [VNPL-1.1.txt](VNPL-1.1.txt),
VNPL 1.1 на русском языке в файле [VNPL-1.1-RU.txt](VNPL-1.1-RU.txt), а GPL 2.0 в файле [GPL-2.0.txt](GPL-2.0.txt).

478
README.md

@ -1,423 +1,71 @@
## Vitastor
# Vitastor
[Читать на русском](README-ru.md)
## The Idea
Make Software-Defined Block Storage Great Again.
Vitastor is a small, simple and fast clustered block storage (storage for VM drives),
architecturally similar to Ceph which means strong consistency, primary-replication, symmetric
clustering and automatic data distribution over any number of drives of any size
with configurable redundancy (replication or erasure codes/XOR).
## Features
Vitastor is currently a pre-release, a lot of features are missing and you can still expect
breaking changes in the future. However, the following is implemented:
0.5.x (stable):
- Basic part: highly-available block storage with symmetric clustering and no SPOF
- Performance ;-D
- Multiple redundancy schemes: Replication, XOR n+1, Reed-Solomon erasure codes
based on jerasure library with any number of data and parity drives in a group
- Configuration via simple JSON data structures in etcd
- Automatic data distribution over OSDs, with support for:
- Mathematical optimization for better uniformity and less data movement
- Multiple pools
- Placement tree, OSD selection by tags (device classes) and placement root
- Configurable failure domains
- Recovery of degraded blocks
- Rebalancing (data movement between OSDs)
- Lazy fsync support
- I/O statistics reporting to etcd
- Generic user-space client library
- QEMU driver (built out-of-tree)
- Loadable fio engine for benchmarks (also built out-of-tree)
- NBD proxy for kernel mounts
- Inode removal tool (vitastor-rm)
- Packaging for Debian and CentOS
0.6.x (master):
- Per-inode I/O and space usage statistics
- Inode metadata storage in etcd
- Snapshots and copy-on-write image clones
- Write throttling to smooth random write workloads in SSD+HDD configurations
## Roadmap
- Better OSD creation and auto-start tools
- Other administrative tools
- Plugins for OpenStack, Kubernetes, OpenNebula, Proxmox and other cloud systems
- iSCSI proxy
- Faster failover
- Scrubbing without checksums (verification of replicas)
- Checksums
- Tiered storage
- RDMA and NVDIMM support
- Web GUI
- Compression (possibly)
- Read caching using system page cache (possibly)
## Architecture
Similarities:
- Just like Ceph, Vitastor has Pools, PGs, OSDs, Monitors, Failure Domains, Placement Tree.
- Just like Ceph, Vitastor is transactional (even though there's a "lazy fsync mode" which
doesn't implicitly flush every operation to disks).
- OSDs also have journal and metadata and they can also be put on separate drives.
- Just like in Ceph, client library attempts to recover from any cluster failure so
you can basically reboot the whole cluster and only pause, but not crash, your clients
(I consider this a bug if the client crashes in that case).
Some basic terms for people not familiar with Ceph:
- OSD (Object Storage Daemon) is a process that stores data and serves read/write requests.
- PG (Placement Group) is a container for data that (normally) shares the same replicas.
- Pool is a container for data that has the same redundancy scheme and placement rules.
- Monitor is a separate daemon that watches cluster state and handles failures.
- Failure Domain is a group of OSDs that you allow to fail. It's "host" by default.
- Placement Tree groups OSDs in a hierarchy to later split them into Failure Domains.
Architectural differences from Ceph:
- Vitastor's primary focus is on SSDs. Proper SSD+HDD optimizations may be added in the future, though.
- Vitastor OSD is (and will always be) single-threaded. If you want to dedicate more than 1 core
per drive you should run multiple OSDs each on a different partition of the drive.
Vitastor isn't CPU-hungry though (as opposed to Ceph), so 1 core is sufficient in a lot of cases.
- Metadata and journal are always kept in memory. Metadata size depends linearly on drive capacity
and data store block size which is 128 KB by default. With 128 KB blocks metadata should occupy
around 512 MB per 1 TB (which is still less than Ceph wants). Journal doesn't have to be big,
the example test below was conducted with only 16 MB journal. A big journal is probably even
harmful as dirty write metadata also take some memory.
- Vitastor storage layer doesn't have internal copy-on-write or redirect-write. I know that maybe
it's possible to create a good copy-on-write storage, but it's much harder and makes performance
less deterministic, so CoW isn't used in Vitastor.
- The basic layer of Vitastor is block storage with fixed-size blocks, not object storage with
rich semantics like in Ceph (RADOS).
- There's a "lazy fsync" mode which allows to batch writes before flushing them to the disk.
This allows to use Vitastor with desktop SSDs, but still lowers performance due to additional
network roundtrips, so use server SSDs with capacitor-based power loss protection
("Advanced Power Loss Protection") for best performance.
- PGs are ephemeral. This means that they aren't stored on data disks and only exist in memory
while OSDs are running.
- Recovery process is per-object (per-block), not per-PG. Also there are no PGLOGs.
- Monitors don't store data. Cluster configuration and state is stored in etcd in simple human-readable
JSON structures. Monitors only watch cluster state and handle data movement.
Thus Vitastor's Monitor isn't a critical component of the system and is more similar to Ceph's Manager.
Vitastor's Monitor is implemented in node.js.
- PG distribution isn't based on consistent hashes. All PG mappings are stored in etcd.
Rebalancing PGs between OSDs is done by mathematical optimization - data distribution problem
is reduced to a linear programming problem and solved by lp_solve. This allows for almost
perfect (96-99% uniformity compared to Ceph's 80-90%) data distribution in most cases, ability
to map PGs by hand without breaking rebalancing logic, reduced OSD peer-to-peer communication
(on average, OSDs have fewer peers) and less data movement. It also probably has a drawback -
this method may fail in very large clusters, but up to several hundreds of OSDs it's perfectly fine.
It's also easy to add consistent hashes in the future if something proves their necessity.
- There's no separate CRUSH layer. You select pool redundancy scheme, placement root, failure domain
and so on directly in pool configuration.
## Understanding Storage Performance
The most important thing for fast storage is latency, not parallel iops.
The best possible latency is achieved with one thread and queue depth of 1 which basically means
"client load as low as possible". In this case IOPS = 1/latency, and this number doesn't
scale with number of servers, drives, server processes or threads and so on.
Single-threaded IOPS and latency numbers only depend on *how fast a single daemon is*.
Why is it important? It's important because some of the applications *can't* use
queue depth greater than 1 because their task isn't parallelizable. A notable example
is any ACID DBMS because all of them write their WALs sequentially with fsync()s.
fsync, by the way, is another important thing often missing in benchmarks. The point is
that drives have cache buffers and don't guarantee that your data is actually persisted
until you call fsync() which is translated to a FLUSH CACHE command by the OS.
Desktop SSDs are very fast without fsync - NVMes, for example, can process ~80000 write
operations per second with queue depth of 1 without fsync - but they're really slow with
fsync because they have to actually write data to flash chips when you call fsync. Typical
number is around 1000-2000 iops with fsync.
Server SSDs often have supercapacitors that act as a built-in UPS and allow the drive
to flush its DRAM cache to the persistent flash storage when a power loss occurs.
This makes them perform equally well with and without fsync. This feature is called
"Advanced Power Loss Protection" by Intel; other vendors either call it similarly
or directly as "Full Capacitor-Based Power Loss Protection".
All software-defined storages that I currently know are slow in terms of latency.
Notable examples are Ceph and internal SDSes used by cloud providers like Amazon, Google,
Yandex and so on. They're all slow and can only reach ~0.3ms read and ~0.6ms 4 KB write latency
with best-in-slot hardware.
And that's in the SSD era when you can buy an SSD that has ~0.04ms latency for 100 $.
I use the following 6 commands with small variations to benchmark any storage:
- Linear write:
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4M -iodepth=32 -rw=write -runtime=60 -filename=/dev/sdX`
- Linear read:
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4M -iodepth=32 -rw=read -runtime=60 -filename=/dev/sdX`
- Random write latency (T1Q1, this hurts storages the most):
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -fsync=1 -rw=randwrite -runtime=60 -filename=/dev/sdX`
- Random read latency (T1Q1):
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -rw=randread -runtime=60 -filename=/dev/sdX`
- Parallel write iops (use numjobs if a single CPU core is insufficient to saturate the load):
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=128 [-numjobs=4 -group_reporting] -rw=randwrite -runtime=60 -filename=/dev/sdX`
- Parallel read iops (use numjobs if a single CPU core is insufficient to saturate the load):
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=128 [-numjobs=4 -group_reporting] -rw=randread -runtime=60 -filename=/dev/sdX`
## Vitastor's Theoretical Maximum Random Access Performance
Replicated setups:
- Single-threaded (T1Q1) read latency: 1 network roundtrip + 1 disk read.
- Single-threaded write+fsync latency:
- With immediate commit: 2 network roundtrips + 1 disk write.
- With lazy commit: 4 network roundtrips + 1 disk write + 1 disk flush.
- Saturated parallel read iops: min(network bandwidth, sum(disk read iops)).
- Saturated parallel write iops: min(network bandwidth, sum(disk write iops / number of replicas / write amplification)).
EC/XOR setups:
- Single-threaded (T1Q1) read latency: 1.5 network roundtrips + 1 disk read.
- Single-threaded write+fsync latency:
- With immediate commit: 3.5 network roundtrips + 1 disk read + 2 disk writes.
- With lazy commit: 5.5 network roundtrips + 1 disk read + 2 disk writes + 2 disk fsyncs.
- 0.5 in actually (k-1)/k which means that an additional roundtrip doesn't happen when
the read sub-operation can be served locally.
- Saturated parallel read iops: min(network bandwidth, sum(disk read iops)).
- Saturated parallel write iops: min(network bandwidth, sum(disk write iops * number of data drives / (number of data + parity drives) / write amplification)).
In fact, you should put disk write iops under the condition of ~10% reads / ~90% writes in this formula.
Write amplification for 4 KB blocks is usually 3-5 in Vitastor:
1. Journal block write
2. Journal data write
3. Metadata block write
4. Another journal block write for EC/XOR setups
5. Data block write
If you manage to get an SSD which handles 512 byte blocks well (Optane?) you may
lower 1, 3 and 4 to 512 bytes (1/8 of data size) and get WA as low as 2.375.
Lazy fsync also reduces WA for parallel workloads because journal blocks are only
written when they fill up or fsync is requested.
## Example Comparison with Ceph
Hardware configuration: 4 nodes, each with:
- 6x SATA SSD Intel D3-4510 3.84 TB
- 2x Xeon Gold 6242 (16 cores @ 2.8 GHz)
- 384 GB RAM
- 1x 25 GbE network interface (Mellanox ConnectX-4 LX), connected to a Juniper QFX5200 switch
CPU powersaving was disabled. Both Vitastor and Ceph were configured with 2 OSDs per 1 SSD.
All of the results below apply to 4 KB blocks and random access (unless indicated otherwise).
Raw drive performance:
- T1Q1 write ~27000 iops (~0.037ms latency)
- T1Q1 read ~9800 iops (~0.101ms latency)
- T1Q32 write ~60000 iops
- T1Q32 read ~81700 iops
Ceph 15.2.4 (Bluestore):
- T1Q1 write ~1000 iops (~1ms latency)
- T1Q1 read ~1750 iops (~0.57ms latency)
- T8Q64 write ~100000 iops, total CPU usage by OSDs about 40 virtual cores on each node
- T8Q64 read ~480000 iops, total CPU usage by OSDs about 40 virtual cores on each node
T8Q64 tests were conducted over 8 400GB RBD images from all hosts (every host was running 2 instances of fio).
This is because Ceph has performance penalties related to running multiple clients over a single RBD image.
cephx_sign_messages was set to false during tests, RocksDB and Bluestore settings were left at defaults.
In fact, not that bad for Ceph. These servers are an example of well-balanced Ceph nodes.
However, CPU usage and I/O latency were through the roof, as usual.
Vitastor:
- T1Q1 write: 7087 iops (0.14ms latency)
- T1Q1 read: 6838 iops (0.145ms latency)
- T2Q64 write: 162000 iops, total CPU usage by OSDs about 3 virtual cores on each node
- T8Q64 read: 895000 iops, total CPU usage by OSDs about 4 virtual cores on each node
- Linear write (4M T1Q32): 2800 MB/s
- Linear read (4M T1Q32): 1500 MB/s
T8Q64 read test was conducted over 1 larger inode (3.2T) from all hosts (every host was running 2 instances of fio).
Vitastor has no performance penalties related to running multiple clients over a single inode.
If conducted from one node with all primary OSDs moved to other nodes the result was slightly lower (689000 iops),
this is because all operations resulted in network roundtrips between the client and the primary OSD.
When fio was colocated with OSDs (like in Ceph benchmarks above), 1/4 of the read workload actually
used the loopback network.
Vitastor was configured with: `--disable_data_fsync true --immediate_commit all --flusher_count 8
--disk_alignment 4096 --journal_block_size 4096 --meta_block_size 4096
--journal_no_same_sector_overwrites true --journal_sector_buffer_count 1024
--journal_size 16777216`.
### EC/XOR 2+1
Vitastor:
- T1Q1 write: 2808 iops (~0.355ms latency)
- T1Q1 read: 6190 iops (~0.16ms latency)
- T2Q64 write: 85500 iops, total CPU usage by OSDs about 3.4 virtual cores on each node
- T8Q64 read: 812000 iops, total CPU usage by OSDs about 4.7 virtual cores on each node
- Linear write (4M T1Q32): 3200 MB/s
- Linear read (4M T1Q32): 1800 MB/s
Ceph:
- T1Q1 write: 730 iops (~1.37ms latency)
- T1Q1 read: 1500 iops with cold cache (~0.66ms latency), 2300 iops after 2 minute metadata cache warmup (~0.435ms latency)
- T4Q128 write (4 RBD images): 45300 iops, total CPU usage by OSDs about 30 virtual cores on each node
- T8Q64 read (4 RBD images): 278600 iops, total CPU usage by OSDs about 40 virtual cores on each node
- Linear write (4M T1Q32): 1950 MB/s before preallocation, 2500 MB/s after preallocation
- Linear read (4M T1Q32): 2400 MB/s
### NBD
NBD is currently required to mount Vitastor via kernel, but it imposes additional overhead
due to additional copying between the kernel and userspace. This mostly hurts linear
bandwidth, not iops.
Vitastor with single-thread NBD on the same hardware:
- T1Q1 write: 6000 iops (0.166ms latency)
- T1Q1 read: 5518 iops (0.18ms latency)
- T1Q128 write: 94400 iops
- T1Q128 read: 103000 iops
- Linear write (4M T1Q128): 1266 MB/s (compared to 2800 MB/s via fio)
- Linear read (4M T1Q128): 975 MB/s (compared to 1500 MB/s via fio)