import * as preact from 'preact'; /** @jsx preact.h */ import { cluster_afr } from './afr.js'; class Calc extends preact.Component { state = { hosts: 10, drives: 10, afr_drive: 3, afr_host: 5, capacity: 8, speed: 20, ec: false, replicas: 2, ec_data: 2, ec_parity: 1, eager: false, result: 0, } calc(st) { st = { ...this.state, ...st }; st.result = 100*cluster_afr({ n_hosts: st.hosts, n_drives: st.drives, afr_drive: st.afr_drive/100, afr_host: st.afr_host/100, capacity: st.capacity*1000, speed: st.speed/1000, ec: st.ec ? [ st.ec_data, st.ec_parity ] : null, replicas: st.replicas, pgs: 50, degraded_replacement: st.eager, }); this.setState(st); } setter(field) { if (!this.setter[field]) { this.setter[field] = (event) => { this.calc({ [field]: event.target.value }); }; } return this.setter[field]; } setRepl = () => { this.calc({ ec: false }); } setEC = () => { this.calc({ ec: true }); } setEager = (event) => { this.calc({ eager: event.target.checked }); } format4 = (n) => { let p = Math.abs(n-(n|0)), m = 10000; while (p != 0 && p < 0.1) { p = p*10; m = m*10; } return Math.round(n*m)/m; } componentDidMount() { this.calc({}); } render(props, state) { return (

Калькулятор вероятности отказа кластера Ceph/Vitastor

Вероятность полного отказа кластера зависит от числа серверов и дисков (чем их больше, тем вероятность больше), от схемы избыточности, скорости ребаланса (восстановления), и, конечно, непосредственно вероятности выхода из строя самих дисков и серверов.

Расчёт ведётся в простом предположении, что отказы распределены равномерно во времени.

{state.ec ? null : } {state.ec ? : null} {state.ec ? : null}
Число серверов
Число дисков в сервере
Ёмкость дисков ТБ
Схема избыточности
Число реплик
Число дисков данных
Число дисков чётности
Оценочная скорость
восстановления на 1 OSD
МБ/с
AFR диска %
AFR сервера %

Вероятность потери данных в течение года:
{this.format4(state.result)} %
© Виталий Филиппов 2020+ (исходники)
); } } preact.render(, document.body);