Compare commits

...

208 Commits

Author SHA1 Message Date
Vitaliy Filippov 3bbc46543d Fix vitastor-cli create syntax 1 week ago
Vitaliy Filippov 2fb0c85618 Allow to start OSDs without local store (only for tests) 2 weeks ago
Vitaliy Filippov d81a6c04fc Update cmake min version so it does not complain about deprecation 2 weeks ago
Vitaliy Filippov 7b35801647 Fix possible bad realloc in disk_tool_meta for non-standard metadata block sizes 2 weeks ago
Vitaliy Filippov f3228d5c07 Fix typo (did not affect execution though) 2 weeks ago
Vitaliy Filippov 18366f5055 Fix read/write return type in rw_blocking 2 weeks ago
Vitaliy Filippov 851507c147 Add missing close() in test stubs 2 weeks ago
Vitaliy Filippov 9aaad28488 Fix "null pointer exception" for unhandled OSD_OP_DELETEs (when pool is not loaded yet) 3 weeks ago
Vitaliy Filippov dd57d086fe Add a missing part of the "theoretical performance" to the Russian version 4 weeks ago
Vitaliy Filippov 8810eae8fb Release 0.8.6 4 weeks ago
Vitaliy Filippov c1365f46c9 Use vitastor-cli instead of direct etcd interaction in the CSI driver 4 weeks ago
Vitaliy Filippov 14d6acbcba Set default rdma_max_recv/send to 16/8, fix documentation 4 weeks ago
Vitaliy Filippov 1e307069bc Fix missing parity chunk calculation for EC n+k, k > 1 and first parity chunk missing 4 weeks ago
Vitaliy Filippov c3e80abad7 Allow to send more than 1 operation at a time 4 weeks ago
Vitaliy Filippov 138ffe4032 Reuse incoming RDMA buffers 4 weeks ago
Vitaliy Filippov 8139a34e97 Fix json11: allow trailing comma 1 month ago
Vitaliy Filippov 4ab630b44d Use just sfdisk --json, --dump is not needed 1 month ago
Vitaliy Filippov 2c8241b7db Remove PG "peered" state 1 month ago
Vitaliy Filippov 36a7dd3671 Move tests to "make test" 1 month ago
Vitaliy Filippov 936122bbcf Initialize msgr lazily in client to speedup vitastor-cli with RDMA enabled 1 month ago
Vitaliy Filippov 1a1ba0d1e7 Add set_immediate to ringloop and use it for bs/osd ops to prevent reenterability issues 1 month ago
Vitaliy Filippov 3d09c9cec7 Remove unused wait_sqe() from ringloop 1 month ago
Vitaliy Filippov 3d08a1ad6c Fix cluster_client test after last reenterability fixes 2 months ago
Vitaliy Filippov 499881d81c Fix typo 2 months ago
Vitaliy Filippov aba93b951b Fix incorrect EC free space statistics in vitastor-cli df output 2 months ago
Vitaliy Filippov d125fb1f30 Release 0.8.5 2 months ago
Vitaliy Filippov 9d3fd72298 Require liburing < 2 in rpm specs 2 months ago
Vitaliy Filippov 8b552a01f9 Do not retry successful operation parts in client (could lead to "double free" bugs) 2 months ago
Vitaliy Filippov 0385b2f9e8 Fix write hangs on PG epoch update - always set pg.history_changed to true 2 months ago
Vitaliy Filippov 749c837045 Replace non-existing local.target with multi-user.target 2 months ago
Vitaliy Filippov 98001d845b Remove version from vitastor-release.rpm links 2 months ago
Vitaliy Filippov c96bcae74b Allow "content" option in PVE storage plugin to allow to enable containers 2 months ago
Vitaliy Filippov 9f4e34a8cc Build client library without tcmalloc 2 months ago
Vitaliy Filippov 81fc8bb94c Release 0.8.4 2 months ago
Vitaliy Filippov bc465c16de Fix arithmetic on void* for clang 2 months ago
Vitaliy Filippov 8763e9211c Fix qemu driver compilation warning/error 2 months ago
Vitaliy Filippov 9e1a80bd17 Replace apt-key with trusted.gpg.d 2 months ago
Vitaliy Filippov 3e280f2f08 Mark vitastor as shared storage in PVE driver 2 months ago
Vitaliy Filippov fe87b4076b Fix backwards compatibility in cluster_client 2 months ago
Vitaliy Filippov a38957c1a7 Skip empty hosts in lp-optimizer 2 months ago
Vitaliy Filippov 137309cf29 Implement bdrv_co_block_status for snapshot export support 3 months ago
Vitaliy Filippov 373f9d0387 Try to re-peer PGs on history change 3 months ago
Vitaliy Filippov c4516ea971 Also remove deleted OSD from PG configuration and last_clean_pgs 3 months ago
Vitaliy Filippov 91065c80fc Try to prevent left_on_dead when deleting OSDs by removing them from PG history 3 months ago
Vitaliy Filippov 0f6b946add Time changes with every stat change, do not schedule checks based on it 3 months ago
Vitaliy Filippov 465cbf0b2f Do not re-schedule recheck indefinitely, run it after mon_change_timeout in any case 3 months ago
Vitaliy Filippov 41add50e4e Track last_clean_pgs on a per-pool basis 3 months ago
Vitaliy Filippov 02e7be7dc9 Prevent reenterability side effects during PG history operation resume 3 months ago
Vitaliy Filippov 73940adf07 Prioritize EC (non-instantly-stable) operations under journal pressure 3 months ago
Vitaliy Filippov e950c024d3 Do not sync peer OSDs before listing 3 months ago
Vitaliy Filippov 71d6d9f868 Fix possible crash on ENOSPC during operation cancel in blockstore 3 months ago
Vitaliy Filippov a4dfa519af Report PG history synchronously during write 3 months ago
Vitaliy Filippov 37a6aff2fa Write OSD numbers always as numbers in mon 3 months ago
Vitaliy Filippov 67019f5b02 Make OSD sort & sanitize PG history items 3 months ago
Vitaliy Filippov 0593e5c21c Fix OSD peer config safety check 3 months ago
Vitaliy Filippov 998e24adf8 Add a new recovery_pg_switch setting to mix all PGs during recovery 3 months ago
Vitaliy Filippov d7bd36dc32 Fix another rare journal flush stall 3 months ago
Vitaliy Filippov cf5c562800 Log all object locations when peering PGs 3 months ago
Vitaliy Filippov 629200b0cc Return ENOSPC as the primary OSD 3 months ago
Vitaliy Filippov 3589ccec22 Do not disconnect peer on ENOSPC during write 3 months ago
Vitaliy Filippov 8d55a1e780 Build osd_rmw_test both with and without ISA-L 3 months ago
Vitaliy Filippov 65f6b3a4eb Fix jerasure crashing on bitmap calculation/restoration due to the lack of 16-byte alignment 3 months ago
Vitaliy Filippov fd216eac77 Add a test for missing parity chunk calculation 3 months ago
Vitaliy Filippov 61fca7c426 Fix crash when calculating a parity chunk with previous parity chunk missing (test coming shortly) 3 months ago
Vitaliy Filippov 1c29ed80b9 Fix quote in docs :) 3 months ago
Vitaliy Filippov 68f3fb795e Suppress warnings in vitastor-disk purge correctly 3 months ago
Vitaliy Filippov fa90f287da Release 0.8.3 3 months ago
Vitaliy Filippov 795020674d Loop journal flusher when the queue is empty but there is a trim request 3 months ago
Vitaliy Filippov 8e12285629 Fix vitastor-disk purge (now it works) 3 months ago
Vitaliy Filippov b9b50ab4cc Implement vitastor-disk purge command 3 months ago
Vitaliy Filippov 0d8625f92d Make vitastor-cli print help on missing command 3 months ago
Vitaliy Filippov 2f3c2c5140 Implement safety check for OSD removal, translate all '-' to '_' in cli options 3 months ago
Vitaliy Filippov 4ebdd02b0f Remove LIST op limiter 3 months ago
Vitaliy Filippov bf6fdc4141 Check add/rm osd with 2048 PGs 3 months ago
Vitaliy Filippov c2244331e6 Add vitastor-cli rm-osd command 3 months ago
Vitaliy Filippov 3de57e87b1 Recheck OSD tree in monitor on /osd/stats changes 3 months ago
Vitaliy Filippov 2d4cc688b2 Add a remove-osd test 3 months ago
Vitaliy Filippov 31bd1ec145 Fix object creation check for statistics 3 months ago
Vitaliy Filippov c08d1f2dfe Add missing offset&len into big_writes journal dump, fix commas again 3 months ago
Vitaliy Filippov 1d80bcc8d0 Fix blockstore returning garbage for unstable reads if there is an in-flight version 3 months ago
Vitaliy Filippov 5ef8bed75f Release 0.8.2 3 months ago
Vitaliy Filippov 8669998e5e Fix discard_list_subop() for local ops 3 months ago
Vitaliy Filippov b457327e77 Oops. Fix metadata read after fixes :-) 3 months ago
Vitaliy Filippov f7fa9d5e34 Fix SCSI device cache type check 3 months ago
Vitaliy Filippov 49b88b01f9 Fix clang build 3 months ago
Vitaliy Filippov 71688bcb59 Disable HDD autodetection in non-hybrid mode 3 months ago
Vitaliy Filippov 552e207d2b Explicitly print errors about -EAGAIN in io_uring 3 months ago
Vitaliy Filippov 5464821fa5 Final fix for the lack of zeroing out of old metadata entries 3 months ago
Vitaliy Filippov 6917a32ca8 Add --force to vitastor-disk read-sb 3 months ago
Vitaliy Filippov f8722a8bd5 Dump meta in hex 3 months ago
Vitaliy Filippov 9c2f69c9fa Add forgotten commas to vitastor-disk dump-journal 3 months ago
Vitaliy Filippov 1a93e3f33a Wait for data writes before fsyncing data if data fsync is enabled 3 months ago
Vitaliy Filippov 3f35744052 Fix compatibility with QEMU aio_set_fd_handler signatures in 7.0 and < 2.9 3 months ago
Vitaliy Filippov 66f14ac019 Update notes about Proxmox 7.1-7.3 3 months ago
Vitaliy Filippov 1364009931 Add patches for pve-qemu-kvm 7.1 (PVE 7.3) and pve-qemu-kvm 6.2 (PVE 7.2) 3 months ago
Vitaliy Filippov d7e30b8353 Fix pve-storage-vitastor filename 3 months ago
Vitaliy Filippov cb437913d3 Never try to wait for free space inside blockstore 3 months ago
Vitaliy Filippov 472bce58ab Fix rare crash in osd_peering due to callback ordering 3 months ago
Vitaliy Filippov 7a71e7ef01 Fix possible duplication of ping & op message IDs 4 months ago
Vitaliy Filippov c71e5e7bbd Fix possible use-after-free during pings 4 months ago
Vitaliy Filippov 8fdf30b21f Release 0.8.1 4 months ago
Vitaliy Filippov 238037ae31 Make journal trimmer wait until reads are completed when inmemory_journal is false 4 months ago
Vitaliy Filippov 09a8864686 Fix degraded parity writes for EC N+K when K>1 4 months ago
Vitaliy Filippov 6e6f6ecbb0 Add missing journal space check for big_writes 4 months ago
Vitaliy Filippov 9491f81419 Add missing documentation for OSD tags 4 months ago
Vitaliy Filippov 44c2b30167 Take newest packages every time when rebuilding CSI 4 months ago
Vitaliy Filippov bf8a0581cd Fix possible "assertion failed: next->prev_wait >= 0" in client 4 months ago
Vitaliy Filippov 5953942042 Add crc32c test utility 4 months ago
Vitaliy Filippov a276a1f737 Do not copy journal data additional time when flushing 4 months ago
Vitaliy Filippov cc24e5796e Add a FIXME 4 months ago
Vitaliy Filippov 6e26732e6a Fix skipped "len" field in vitastor-disk write-journal big_writes 4 months ago
Vitaliy Filippov b4edc79449 Fix possible segfault on ENOSPC 4 months ago
Vitaliy Filippov 5f26887d32 Fix csi endpoint in liveness probe 4 months ago
Vitaliy Filippov 11ec9ad874 Release 0.8.0 7 months ago
Vitaliy Filippov 83bb6598dc Fix fsync autodetection for the single-device mode 7 months ago
Vitaliy Filippov 150f369346 Hotfixes for vitastor-disk prepare: max_other, get device size, older sfdisk 7 months ago
Vitaliy Filippov 8d9a5fde15 Fix docs (block_size vs object_size) 7 months ago
Vitaliy Filippov 9ccc607ab9 Fix parse_size 7 months ago
Vitaliy Filippov 8972878c77 Fix make-etcd for ip:port 7 months ago
Vitaliy Filippov 2a1da88253 Create /etc/vitastor during package installation 7 months ago
Vitaliy Filippov 2f13f347b0 Fix space stats in mon 7 months ago
Vitaliy Filippov 9453db0e99 Add a newer make-etcd.js 7 months ago
Vitaliy Filippov a828a1233d Remove old make-osd scripts 7 months ago
Vitaliy Filippov 9481456dfe Automatically check whether to disable cache during prepare 7 months ago
Vitaliy Filippov bd11db5d0a Add vitastor-mon.service, vitastor.target, create user and log directory during package installation 7 months ago
Vitaliy Filippov 68ebe5993a Fix partition reuse 7 months ago
Vitaliy Filippov eecbfb66ce Remove the old make-osd.sh script from packages 7 months ago
Vitaliy Filippov a537db8909 Add documentation for the new "vitastor-disk" tool 7 months ago
Vitaliy Filippov 54ef2c389f Followup to the "tried to overwrite" fix: also handle it in case of inmemory_meta == false 7 months ago
Vitaliy Filippov 153c73574a Refactor blockstore_init_meta into slightly more obvious code 7 months ago
Vitaliy Filippov d83580bd68 Fix "tried to overwrite non-zero metadata entry" when during a previous metadata 7 months ago
Vitaliy Filippov 29b40aba93 Add write-meta command (for debug) 7 months ago
Vitaliy Filippov a52f2b0e8f Add write-journal command (for debug) 7 months ago
Vitaliy Filippov 1407db9c08 Fix vitastor-disk prepare bugs 7 months ago
Vitaliy Filippov c0d5e83fb8 Run partprobe when partitions do not appear 7 months ago
Vitaliy Filippov 40d8d65188 Rewrite upgrade-simple to C++ 7 months ago
Vitaliy Filippov a16263e88c Fix bugs in the upgrade script and in the udev startup script 7 months ago
Vitaliy Filippov e62bab1b39 Add systemd unit for udev deployments 7 months ago
Vitaliy Filippov cb4e3a118d Fix warning 7 months ago
Vitaliy Filippov b1e39b5dea Split disk_tool.cpp into separate files 7 months ago
Vitaliy Filippov 1170319431 Finish vitastor-disk prepare in theory 7 months ago
Vitaliy Filippov 2e0a2221eb vitastor-disk prepare: WIP second form command of the command 8 months ago
Vitaliy Filippov 5a10d135f3 Allow to configure block_size, bitmap_granularity and immediate_commit per-pool 8 months ago
Vitaliy Filippov 4c9aaa8a86 vitastor-disk prepare: implement first form of the command 8 months ago
Vitaliy Filippov ae99ee6266 Rename base64.{cpp.h} to str_util 8 months ago
Vitaliy Filippov 5af75f7d78 Implement vitastor-cli and vitastor-disk --help <command> 8 months ago
Vitaliy Filippov 7dc6f10ea1 Add read-sb command 8 months ago
Vitaliy Filippov 6fde9950d6 Implement upgrade tool from "simple" units to superblock+udev deployments 8 months ago
Vitaliy Filippov 76dd0fdcea Implement pre-exec command with on-start OSD checks 8 months ago
Vitaliy Filippov 5acc19bbd5 Implement systemctl start/stop and other commands 8 months ago
Vitaliy Filippov d5ca4e1f90 Add exec-osd command 8 months ago
Vitaliy Filippov 67e04f789f Add write-sb (superblock) command 8 months ago
Vitaliy Filippov 837407a84c Add udev import command 8 months ago
Vitaliy Filippov 1fe5908899 WIP OSD activation from superblock 8 months ago
Vitaliy Filippov dcc6d546be Move simple-offsets into vitastor-disk, too 8 months ago
Vitaliy Filippov 85fa389557 Add a test for disk-tool resize 8 months ago
Vitaliy Filippov dfa433c63b Add JSON format to dump-journal 8 months ago
Vitaliy Filippov cf487c95aa Fix resizer 8 months ago
Vitaliy Filippov b10656ca09 Parse new disk params in disk_tool resizer 8 months ago
Vitaliy Filippov ea632367e9 Do not alter dsk.meta_offset/len to skip superblock 8 months ago
Vitaliy Filippov 4d777c6729 Set journal/meta devices to data device explicitly instead of "" 8 months ago
Vitaliy Filippov 0c404c5074 Use blockstore_disk in disk_tool 8 months ago
Vitaliy Filippov dfd80626bd Extract disk opening functions to separate module 8 months ago
Vitaliy Filippov 30907852c2 Use simple std::map for the config 8 months ago
Vitaliy Filippov 078ed5b116 WIP Data area resize tool 8 months ago
Vitaliy Filippov 73a363bf92 Rename some variables and constants 8 months ago
Vitaliy Filippov b0e86ca643 Merge dump-journal and dump-meta into the new "vitastor-disk" tool 8 months ago
Vitaliy Filippov 8800afb649 Fix void* arithmetic again 8 months ago
Vitaliy Filippov c10c90f620 Swap cli.en.md and cli.ru.md contents O_o 8 months ago
Vitaliy Filippov e20cdd13b6 Fix simple-offsets return value 8 months ago
Vitaliy Filippov d29b5d2d04 Add Russian translation of VNPL-1.1 9 months ago
Vitaliy Filippov 65b0e8e940 Fix typo in VNPL-1.1 9 months ago
Vitaliy Filippov bce357e2a5 Do not read all metadata into memory when dumping 10 months ago
Vitaliy Filippov 0876ca09cd Fix dumper includes and print format 10 months ago
Vitaliy Filippov dac12d8a4c Implement metadata dump tool 10 months ago
Vitaliy Filippov 1eec4407ab Fix inode creation when /index/maxid is out of sync 10 months ago
huy 3b7c6dcac2 Fix volume creation from snapshots in Cinder driver 10 months ago
Vitaliy Filippov 342517d126 Fix typo 10 months ago
Vitaliy Filippov 675bc12a13 Add extern "C" for systems like Gentoo which miss it in jerasure includes 10 months ago
Vitaliy Filippov 101592bbff Release 0.7.1 10 months ago
Vitaliy Filippov be4087d9d2 Add a FIXME to test_interrupted_rebalance 10 months ago
Vitaliy Filippov 404e43dd2d Note that ISA-L does not need to be enabled separately 10 months ago
Vitaliy Filippov 87613ed590 Add ISA-L into RPM specs 10 months ago
Vitaliy Filippov 2a2e914ef9 Show no_recovery, no_rebalance and readonly flags in status 10 months ago
Vitaliy Filippov 0cdc9292c8 Fix true/false parsing in json configs like no_recovery/no_rebalance 10 months ago
Vitaliy Filippov 3e1b03bb5c Show all etcd addresses in the "reporting to..." message 10 months ago
Vitaliy Filippov 36e851505a Make monitor delete pool statistics when the pool is deleted 10 months ago
Vitaliy Filippov 1efbbb0c36 Make deleted inodes vanish from statistics after 60 seconds 10 months ago
Vitaliy Filippov 088dd15449 Exclude empty inodes from stats 10 months ago
Vitaliy Filippov 4a531d7b8b Fix listings sending too many parallel requests to OSDs, fix rm-data crashing with --wait-list 10 months ago
Vitaliy Filippov a0cae4c180 Rename "jerasure" to "ec" in pool configuration, function names, fix documentation and Debian build scripts 10 months ago
Vitaliy Filippov c4eb46600d Merge run_3osds and run_7osds scripts 10 months ago
Vitaliy Filippov 21b306e25f Add ISA-L support 10 months ago
Vitaliy Filippov d8313e939a Release 0.7.0 10 months ago
huynnp911 3e92c3f082 Add patch for libvirt 6.0 10 months ago
Vitaliy Filippov 82b9f4c52d Add a test with OSD kills 10 months ago
Vitaliy Filippov 2bdf415eb3 Fix unknown OSD numbers on error 10 months ago
Vitaliy Filippov f826831282 Describe OSD placement tree and reweights 10 months ago
Vitaliy Filippov 5d47bbe04c Add documentation 10 months ago
Vitaliy Filippov 93a9f1ef89 Fix NFS socket read hangs 11 months ago
Vitaliy Filippov 2697aae909 Fix free_down_raw in cli status 11 months ago
Vitaliy Filippov 6b69db73ac Remove getrandom() usage 11 months ago
Vitaliy Filippov d48a824846 Fix some warnings 11 months ago
Vitaliy Filippov 40985282ff Fix build under GCC 8 11 months ago
Vitaliy Filippov acf403e886 Add install target for NFS proxy 11 months ago
Vitaliy Filippov cf03b9c84d Implement "primary affinity tags" 11 months ago
Vitaliy Filippov 7c2379d458 Simplified NFS proxy based on own NFS/XDR implementation 11 months ago
Vitaliy Filippov a2189100dd Make CLI functions usable in library form 11 months ago
  1. 4
      CMakeLists.txt
  2. 684
      README-ru.md
  3. 642
      README.md
  4. 680
      VNPL-1.1-RU.txt
  5. 4
      VNPL-1.1.txt
  6. 2
      cpp-btree
  7. 10
      csi/Dockerfile
  8. 2
      csi/Makefile
  9. 4
      csi/deploy/004-csi-nodeplugin.yaml
  10. 2
      csi/deploy/007-csi-provisioner.yaml
  11. 2
      csi/src/config.go
  12. 236
      csi/src/controllerserver.go
  13. 16
      debian/changelog
  14. 4
      debian/control
  15. 11
      debian/libisal.pc
  16. 2
      debian/pve-storage-vitastor.install
  17. 2
      debian/vitastor-client.install
  18. 1
      debian/vitastor-mon.install
  19. 9
      debian/vitastor-mon.postinst
  20. 4
      debian/vitastor-osd.install
  21. 10
      debian/vitastor-osd.postinst
  22. 11
      debian/vitastor.Dockerfile
  23. 37
      docs/config.en.md
  24. 39
      docs/config.ru.md
  25. 46
      docs/config/common.en.md
  26. 45
      docs/config/common.ru.md
  27. 32
      docs/config/inode.en.md
  28. 34
      docs/config/inode.ru.md
  29. 105
      docs/config/layout-cluster.en.md
  30. 114
      docs/config/layout-cluster.ru.md
  31. 176
      docs/config/layout-osd.en.md
  32. 185
      docs/config/layout-osd.ru.md
  33. 79
      docs/config/monitor.en.md
  34. 80
      docs/config/monitor.ru.md
  35. 245
      docs/config/network.en.md
  36. 256
      docs/config/network.ru.md
  37. 316
      docs/config/osd.en.md
  38. 330
      docs/config/osd.ru.md
  39. 306
      docs/config/pool.en.md
  40. 310
      docs/config/pool.ru.md
  41. 3
      docs/config/src/common.en.md
  42. 3
      docs/config/src/common.ru.md
  43. 0
      docs/config/src/common.yml
  44. 14
      docs/config/src/layout-cluster.en.md
  45. 14
      docs/config/src/layout-cluster.ru.md
  46. 76
      docs/config/src/layout-cluster.yml
  47. 4
      docs/config/src/layout-osd.en.md
  48. 5
      docs/config/src/layout-osd.ru.md
  49. 19
      docs/config/src/layout-osd.yml
  50. 120
      docs/config/src/make.js
  51. 3
      docs/config/src/monitor.en.md
  52. 3
      docs/config/src/monitor.ru.md
  53. 0
      docs/config/src/monitor.yml
  54. 4
      docs/config/src/network.en.md
  55. 4
      docs/config/src/network.ru.md
  56. 85
      docs/config/src/network.yml
  57. 4
      docs/config/src/osd.en.md
  58. 5
      docs/config/src/osd.ru.md
  59. 25
      docs/config/src/osd.yml
  60. 20
      docs/installation/kubernetes.en.md
  61. 20
      docs/installation/kubernetes.ru.md
  62. 40
      docs/installation/openstack.en.md
  63. 40
      docs/installation/openstack.ru.md
  64. 44
      docs/installation/packages.en.md
  65. 43
      docs/installation/packages.ru.md
  66. 39
      docs/installation/proxmox.en.md
  67. 39
      docs/installation/proxmox.ru.md
  68. 66
      docs/installation/source.en.md
  69. 69
      docs/installation/source.ru.md
  70. 91
      docs/intro/architecture.en.md
  71. 208
      docs/intro/architecture.ru.md
  72. 37
      docs/intro/author.en.md
  73. 37
      docs/intro/author.ru.md
  74. 62
      docs/intro/features.en.md
  75. 62
      docs/intro/features.ru.md
  76. 98
      docs/intro/quickstart.en.md
  77. 99
      docs/intro/quickstart.ru.md
  78. 108
      docs/performance/comparison1.en.md
  79. 113
      docs/performance/comparison1.ru.md
  80. 58
      docs/performance/theoretical.en.md
  81. 60
      docs/performance/theoretical.ru.md
  82. 57
      docs/performance/understanding.en.md
  83. 65
      docs/performance/understanding.ru.md
  84. 192
      docs/usage/cli.en.md
  85. 203
      docs/usage/cli.ru.md
  86. 257
      docs/usage/disk.en.md
  87. 262
      docs/usage/disk.ru.md
  88. 23
      docs/usage/fio.en.md
  89. 23
      docs/usage/fio.ru.md
  90. 34
      docs/usage/nbd.en.md
  91. 39
      docs/usage/nbd.ru.md
  92. 45
      docs/usage/nfs.en.md
  93. 44
      docs/usage/nfs.ru.md
  94. 85
      docs/usage/qemu.en.md
  95. 89
      docs/usage/qemu.ru.md
  96. 2
      json11
  97. 7
      mon/90-vitastor.rules
  98. 2
      mon/PGUtil.js
  99. 2
      mon/lp-optimizer.js
  100. 110
      mon/make-etcd
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 2.8)
cmake_minimum_required(VERSION 2.8.12)
project(vitastor)
set(VERSION "0.6.17")
set(VERSION "0.8.6")
add_subdirectory(src)

@ -4,635 +4,69 @@
## Идея
Я всего лишь хочу сделать качественную блочную SDS!
Вернём былую скорость кластерному блочному хранилищу!
Vitastor - распределённая блочная SDS, прямой аналог Ceph RBD и внутренних СХД популярных
облачных провайдеров. Однако, в отличие от них, Vitastor быстрый и при этом простой.
Только пока маленький :-).
Vitastor - распределённая блочная SDS (программная СХД), прямой аналог Ceph RBD и
внутренних СХД популярных облачных провайдеров. Однако, в отличие от них, Vitastor
быстрый и при этом простой. Только пока маленький :-).
Архитектурная схожесть с Ceph означает заложенную на уровне алгоритмов записи строгую консистентность,
Vitastor архитектурно похож на Ceph, что означает атомарность и строгую консистентность,
репликацию через первичный OSD, симметричную кластеризацию без единой точки отказа
и автоматическое распределение данных по любому числу дисков любого размера с настраиваемыми схемами
избыточности - репликацией или с произвольными кодами коррекции ошибок.
## Возможности
Vitastor на данный момент находится в статусе предварительного выпуска, расширенные
возможности пока отсутствуют, а в будущих версиях вероятны "ломающие" изменения.
Однако следующее уже реализовано:
- Базовая часть - надёжное кластерное блочное хранилище без единой точки отказа
- Производительность ;-D
- Несколько схем отказоустойчивости: репликация, XOR n+1 (1 диск чётности), коды коррекции ошибок
Рида-Соломона на основе библиотеки jerasure с любым числом дисков данных и чётности в группе
- Конфигурация через простые человекочитаемые JSON-структуры в etcd
- Автоматическое распределение данных по OSD, с поддержкой:
- Математической оптимизации для лучшей равномерности распределения и минимизации перемещений данных
- Нескольких пулов с разными схемами избыточности
- Дерева распределения, выбора OSD по тегам / классам устройств (только SSD, только HDD) и по поддереву
- Настраиваемых доменов отказа (диск/сервер/стойка и т.п.)
- Восстановление деградированных блоков
- Ребаланс, то есть перемещение данных между OSD (дисками)
- Поддержка "ленивого" fsync (fsync не на каждую операцию)
- Сбор статистики ввода/вывода в etcd
- Клиентская библиотека режима пользователя для ввода/вывода
- Драйвер диска для QEMU (собирается вне дерева исходников QEMU)
- Драйвер диска для утилиты тестирования производительности fio (также собирается вне дерева исходников fio)
- NBD-прокси для монтирования образов ядром ("блочное устройство в режиме пользователя")
- Утилита для удаления образов/инодов (vitastor-cli rm-data)
- Пакеты для Debian и CentOS
- Статистика операций ввода/вывода и занятого места в разрезе инодов
- Именование инодов через хранение их метаданных в etcd
- Снапшоты и copy-on-write клоны
- Сглаживание производительности случайной записи в SSD+HDD конфигурациях
- Поддержка RDMA/RoCEv2 через libibverbs
- CSI-плагин для Kubernetes
- Базовая поддержка OpenStack: драйвер Cinder, патчи для Nova и libvirt
- Слияние снапшотов (vitastor-cli {snap-rm,flatten,merge})
- Консольный интерфейс для управления образами (vitastor-cli {ls,create,modify})
- Плагин для Proxmox
## Планы развития
- Более корректные скрипты разметки дисков и автоматического запуска OSD
- Другие инструменты администрирования
- Плагины для OpenNebula и других облачных систем
- iSCSI-прокси
- Упрощённый NFS прокси
- Более быстрое переключение при отказах
- Фоновая проверка целостности без контрольных сумм (сверка реплик)
- Контрольные суммы
- Поддержка SSD-кэширования (tiered storage)
- Поддержка 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 расшифровывается как "сетевое блочное устройство", но на самом деле оно также
работает просто как аналог FUSE для блочных устройств, то есть, представляет собой
"блочное устройство в пространстве пользователя".
NBD - на данный момент единственный способ монтировать Vitastor ядром Linux.
NBD немного снижает производительность, так как приводит к дополнительным копированиям
данных между ядром и пространством пользователя. Тем не менее, способ достаточно оптимален,
а производительность случайного доступа вообще затрагивается слабо.
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.
См `patches/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`
- Создайте юниты systemd для etcd и мониторов: `/usr/lib/vitastor/mon/make-units.sh`
- Запустите etcd и мониторы: `systemctl start etcd vitastor-mon`
- Пропишите etcd_address и osd_network в `/etc/vitastor/vitastor.conf`. Например:
```
{
"etcd_address": ["10.200.1.10:2379","10.200.1.11:2379","10.200.1.12:2379"],
"osd_network": "10.200.1.0/24"
}
```
- Инициализуйте OSD:
- SSD: `/usr/lib/vitastor/make-osd.sh /dev/disk/by-partuuid/XXX [/dev/disk/by-partuuid/YYY ...]`
- Гибридные, HDD+SSD: `/usr/lib/vitastor/mon/make-osd-hybrid.js /dev/sda /dev/sdb ...` - передайте
все ваши SSD и HDD скрипту в командной строке подряд, скрипт автоматически выделит разделы под
журналы на SSD и данные на HDD. Скрипт пропускает HDD, на которых уже есть разделы
или вообще какие-то данные, поэтому если диски непустые, сначала очистите их с помощью
`wipefs -a`. SSD с таблицей разделов не пропускаются, но так как скрипт создаёт новые разделы
для журналов, на SSD должно быть доступно свободное нераспределённое место.
- Вы можете менять параметры OSD в юнитах systemd или в `vitastor.conf`. Смысл некоторых параметров:
- `disable_data_fsync 1` - отключает fsync, используется с SSD с конденсаторами.
- `immediate_commit all` - используется с SSD с конденсаторами.
Внимание: если установлено, также нужно установить его в то же значение в etcd в /vitastor/config/global
- `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: `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'.
### Задать имя образу
```
etcdctl --endpoints=<etcd> put /vitastor/config/inode/<pool>/<inode> '{"name":"<name>","size":<size>[,"parent_id":<parent_inode_number>][,"readonly":true]}'
```
Например:
```
etcdctl --endpoints=http://10.115.0.10:2379/v3 put /vitastor/config/inode/1/1 '{"name":"testimg","size":2147483648}'
```
Если вы зададите parent_id, то образ станет CoW-клоном, т.е. все новые запросы записи пойдут в новый инод, а запросы
чтения будут проверять сначала его, а потом родительские слои по цепочке вверх. Чтобы случайно не перезаписать данные
в родительском слое, вы можете переключить его в режим "только чтение", добавив флаг `"readonly":true` в его запись
метаданных. В таком случае родительский образ становится просто снапшотом.
Таким образом, для создания снапшота вам нужно просто переименовать предыдущий inode (например, из testimg в testimg@0),
сделать его readonly и создать новый слой с исходным именем образа (testimg), ссылающийся на только что переименованный
в качестве родительского.
### Запуск тестов с fio
Пример команды для запуска тестов:
```
fio -thread -ioengine=libfio_vitastor.so -name=test -bs=4M -direct=1 -iodepth=16 -rw=write -etcd=10.115.0.10:2379/v3 -image=testimg
```
Если вы не хотите обращаться к образу по имени, вместо `-image=testimg` можно указать номер пула, номер инода и размер:
`-pool=1 -inode=1 -size=400G`.
### Загрузить образ диска ВМ в/из Vitastor
Используйте qemu-img и строку `vitastor:etcd_host=<HOST>:image=<IMAGE>` в качестве имени файла диска. Например:
```
qemu-img convert -f qcow2 debian10.qcow2 -p -O raw 'vitastor:etcd_host=10.115.0.10\:2379/v3:image=testimg'
```
Обратите внимание, что если вы используете немодифицированный QEMU, потребуется установить переменную окружения
`LD_PRELOAD=/usr/lib/x86_64-linux-gnu/qemu/block-vitastor.so`.
Если вы не хотите обращаться к образу по имени, вместо `:image=<IMAGE>` можно указать номер пула, номер инода и размер:
`:pool=<POOL>:inode=<INODE>:size=<SIZE>`.
### Запустить ВМ
Для запуска QEMU используйте опцию `-drive file=vitastor:etcd_host=<HOST>:image=<IMAGE>` (аналогично qemu-img)
и физический размер блока 4 KB.
Например:
```
qemu-system-x86_64 -enable-kvm -m 1024
-drive 'file=vitastor:etcd_host=10.115.0.10\:2379/v3:image=testimg',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
```
Обращение по номерам (`:pool=<POOL>:inode=<INODE>:size=<SIZE>` вместо `:image=<IMAGE>`) работает аналогично qemu-img.
### Удалить образ
Используйте утилиту vitastor-cli rm-data. Например:
```
vitastor-cli rm-data --etcd_address 10.115.0.10:2379/v3 --pool 1 --inode 1 --parallel_osds 16 --iodepth 32
```
### NBD
Чтобы создать локальное блочное устройство, используйте NBD. Например:
```
vitastor-nbd map --etcd_address 10.115.0.10:2379/v3 --image testimg
```
Команда напечатает название устройства вида /dev/nbd0, которое потом можно будет форматировать
и использовать как обычное блочное устройство.
Для обращения по номеру инода, аналогично другим командам, можно использовать опции
`--pool <POOL> --inode <INODE> --size <SIZE>` вместо `--image testimg`.
### Kubernetes
У Vitastor есть CSI-плагин для Kubernetes, поддерживающий RWO-тома.
Для установки возьмите манифесты из директории [csi/deploy/](csi/deploy/), поместите
вашу конфигурацию подключения к Vitastor в [csi/deploy/001-csi-config-map.yaml](001-csi-config-map.yaml),
настройте StorageClass в [csi/deploy/009-storage-class.yaml](009-storage-class.yaml)
и примените все `NNN-*.yaml` к вашей инсталляции Kubernetes.
```
for i in ./???-*.yaml; do kubectl apply -f $i; done
```
После этого вы сможете создавать PersistentVolume. Пример смотрите в файле [csi/deploy/example-pvc.yaml](csi/deploy/example-pvc.yaml).
### OpenStack
Чтобы подключить Vitastor к OpenStack:
- Установите пакеты vitastor-client, libvirt и QEMU из DEB или RPM репозитория Vitastor
- Примените патч `patches/nova-21.diff` или `patches/nova-23.diff` к вашей инсталляции Nova.
nova-21.diff подходит для Nova 21-22, nova-23.diff подходит для Nova 23-24.
- Скопируйте `patches/cinder-vitastor.py` в инсталляцию Cinder как `cinder/volume/drivers/vitastor.py`
- Создайте тип томов в cinder.conf (см. ниже)
- Обязательно заблокируйте доступ от виртуальных машин к сети Vitastor (OSD и etcd), т.к. Vitastor (пока) не поддерживает аутентификацию
- Перезапустите Cinder и Nova
Пример конфигурации Cinder:
```
[DEFAULT]
enabled_backends = lvmdriver-1, vitastor-testcluster
# ...
[vitastor-testcluster]
volume_driver = cinder.volume.drivers.vitastor.VitastorDriver
volume_backend_name = vitastor-testcluster
image_volume_cache_enabled = True
volume_clear = none
vitastor_etcd_address = 192.168.7.2:2379
vitastor_etcd_prefix =
vitastor_config_path = /etc/vitastor/vitastor.conf
vitastor_pool_id = 1
image_upload_use_cinder_backend = True
```
Чтобы помещать в Vitastor Glance-образы, нужно использовать
[https://docs.openstack.org/cinder/pike/admin/blockstorage-volume-backed-image.html](образы на основе томов Cinder),
однако, поддержка этой функции ещё не проверялась.
### Proxmox
Чтобы подключить Vitastor к Proxmox Virtual Environment (поддерживаются версии 6.4 и 7.1):
- Добавьте соответствующий Debian-репозиторий Vitastor в sources.list на хостах Proxmox
(buster для 6.4, bullseye для 7.1)
- Установите пакеты vitastor-client, pve-qemu-kvm, pve-storage-vitastor (* или см. сноску) из репозитория Vitastor
- Определите тип хранилища в `/etc/pve/storage.cfg` (см. ниже)
- Обязательно заблокируйте доступ от виртуальных машин к сети Vitastor (OSD и etcd), т.к. Vitastor (пока) не поддерживает аутентификацию
- Перезапустите демон Proxmox: `systemctl restart pvedaemon`
Пример `/etc/pve/storage.cfg` (единственная обязательная опция - vitastor_pool, все остальные
перечислены внизу для понимания значений по умолчанию):
```
vitastor: vitastor
# Пул, в который будут помещаться образы дисков
vitastor_pool testpool
# Путь к файлу конфигурации
vitastor_config_path /etc/vitastor/vitastor.conf
# Адрес(а) etcd, нужны, только если не указаны в vitastor.conf
vitastor_etcd_address 192.168.7.2:2379/v3
# Префикс ключей метаданных в etcd
vitastor_etcd_prefix /vitastor
# Префикс имён образов
vitastor_prefix pve/
# Монтировать образы через NBD прокси, через ядро (нужно только для контейнеров)
vitastor_nbd 0
```
\* Примечание: вместо установки пакета pve-storage-vitastor вы можете вручную скопировать файл
[patches/PVE_VitastorPlugin.pm](patches/PVE_VitastorPlugin.pm) на хосты Proxmox как
`/usr/share/perl5/PVE/Storage/Custom/VitastorPlugin.pm`.
## Известные проблемы
- Запросы удаления объектов могут в данный момент приводить к "неполным" объектам в 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) (консольный интерфейс)
- [vitastor-disk](docs/usage/disk.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)
## Автор и лицензия
@ -663,5 +97,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).

@ -1,586 +1,72 @@
## 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:
- 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-cli rm-data)
- Packaging for Debian and CentOS
- 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
- RDMA/RoCEv2 support via libibverbs
- CSI plugin for Kubernetes
- Basic OpenStack support: Cinder driver, Nova and libvirt patches
- Snapshot merge tool (vitastor-cli {snap-rm,flatten,merge})
- Image management CLI (vitastor-cli {ls,create,modify})
- Proxmox storage plugin
## Roadmap
- Better OSD creation and auto-start tools
- Other administrative tools
- Plugins for OpenNebula and other cloud systems
- iSCSI proxy
- Simplified NFS proxy
- Faster failover
- Scrubbing without checksums (verification of replicas)
- Checksums
- Tiered storage
- 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).