Mikroserwis a Cloud DB

K8
  • Rejestracja:ponad 5 lat
  • Ostatnio:około rok
  • Postów:30
0

Mamy, dajmy na to, 3 dobrze wydzielone mikroserwisy. 1 potrzebuje storagu w SQL, drugi w bazie documentowej - nosql, 3 - nie potrzebuje storagu.

Normalnie każdy mikroserwis powinien mieć fizycznie wydzieloną bazę danych, ale załóżmy że jesteśmy 'nowocześni' i chcemy mieć Google Clouda...

Rozumiem, że 'po staremu' każdy mikroserwis wewnątrz będzie miał 'logikę' odpowiedzialną za connection do bazy i obsługę tabelek, jsonów itp.

Ale czy musimy mieć instancje Cloud SQL, Cloud Datastore per każdy mikroserwis (i środowisko - Dev, stage...). Czy może wystarczy jedna współdzielona instacja Cloud SQL/Datastore per środowisko (tj. stage, prod) i każdy mikroserwis 'wali' do prywatnego schematu na bazie...

99xmarcin
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:2420
4

Klasycznie często się robiło w gołym SQL tak że jeden serwer obsługiwał wiele apek. Po prostu każda apka miała użytkownika + własną bazę, więc nie mogły nawzajem do siebie zaglądać.

Cloud SQL od Googla to po prostu hostowany serwer bazy danych np. MySQL więc działa to tak samo jak wcześniej, tylko że teraz oni robią za ciebie fixy security czy martwią się o RAM. Tak samo możesz tworzyć bazy danych i użytkowników (loginy).

Do setna, wylicz ile mocy obliczeniowej potrzebujesz. Zdecyduj jakie mają być wymagania reliability (najlepiej brać serwer + follower replikę, tak żeby zrobić safe failover jakby się coś z serwerem stało). Wybierz typ instancji (np. 4 core'y czy 64 core'y, przy bazie danych najważniejsze to dysk i RAM). Przelicz koszta. Zrób PowerPointa z porównaniem kilku opcji i niech szef zaklepie.

Do tego wybierz też plan backupów. Generalnie dopóki jest izolacja między aplikacjami nie ma znaczenia czy te bazy siedzą na jednym serwerze czy na kilku.


Holy sh*t, with every month serenityos.org gets better & better...
K8
  • Rejestracja:ponad 5 lat
  • Ostatnio:około rok
  • Postów:30
0

czyli generalnie logiczne wydzielenie baz danych nie łamie koncepcji czystych mikroserwisów?
Wydaje mi się, że idealnie gdyby każdy mikroserwis miał fizycznie wydzieloną instancje db z repliką.

Jedna współdzielona fizycznie (a rozdzielona logicznie), nawet od wspanialego Googla może być przeciażona przez jakis jeden mikroserwis, co rzutuje na kolejne. Failover replica załatwi pewnie problem z dostepnoscia, ale czy dalej nie bedzie to waskie gardlo przy skalowaniu systemu?

99xmarcin
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:2420
1

Dobre pytanie, na które ja Ci nie odpowiem. Jako inżynier musisz wyliczyć ile zasobów będziesz potrzebował, i jaki będzie koszt. Czasami okaże się że faktycznie powinno być jak piszesz ale koszt będzie nie do zaakceptowania. Generalnie jak masz dużo danych to raczej unikałbym SQLa lub szedł w rozwiązanie SQL + Cache (np. Redis). Za tego typu porady ludzie kasują po 25k na fakturę...

Podstawowa sprawa to to ile danych chcesz tam trzymać. SQLe skalują się tylko wertykalnie (mocniejszy serwer). Bazy rozproszone typu Cassandra skalują się horyzontalnie, ale nie jest to automatyczne. Dodanie node do Cassandry to ciężka operacja która wiąże się z przesłaniem sporej ilości danych. W sumie byłem świadkiem sytuacji gdzie dodanie nowego node'a (węzła) do mocno obciążonej bazy zabiło Cassandre.

CAP Theorem ogranicza to co jest możliwe.

Chmurowe "produkty bazodanowe" są bardziej ciekawe pod tym względem. Przykładowo https://cloud.google.com/spanner mówi że ma infinite scaling. Niestety nigdy z nim nie pracowałem.

Generalnie zawsze możesz wykupić support od dostawcy chmury i tam już Ci doradzą i podpowiedzą jakie są rozwiązania.


Holy sh*t, with every month serenityos.org gets better & better...
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
2

SQLe skalują się tylko wertykalnie (mocniejszy serwer). Bazy rozproszone typu Cassandra skalują się horyzontalnie, ale nie jest to automatyczne.

No chyba nie do końca


VA
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
2
konradino898 napisał(a):

czyli generalnie logiczne wydzielenie baz danych nie łamie koncepcji czystych mikroserwisów?

Wydaje mi się, że idealnie gdyby każdy mikroserwis miał fizycznie wydzieloną instancje db z repliką.

Jedna współdzielona fizycznie (a rozdzielona logicznie), nawet od wspanialego Googla może być przeciażona przez jakis jeden mikroserwis, co rzutuje na kolejne. Failover replica załatwi pewnie problem z dostepnoscia, ale czy dalej nie bedzie to waskie gardlo przy skalowaniu systemu

Jeśli serwisy odizolujesz od siebie w taki sposób, że każdy będzie wiedział tylko o swojej bazie i żadna nie będzie współdzielona to gdzie widzisz problem w tym czy one znajdują się fizycznie na jednym serwerze czy nie? Jeśli któryś z nich będzie zbyt mocno obciążać serwer to możesz jego bazę postawić na osobnym serwerze lub wyskalować jak tylko chcesz.

edytowany 1x, ostatnio: var
K8
@var: odpowiedz na pierwsze twoje zdanie - z punktu widzenia aplkacji i separacji, spójności i sprzężeń, wszystko wygląda ok @var: odpowiedz na drugie twoje zdanie: jeśli mam dajmy na to 1 instacje CloudSQL, to tunować mogę chyba tylko całą instancje (a nie poszczególne bazy na tej instancji). Postawienie na osobnym serwerze == nowa instacja CloudSQL (czyli osobny serwis - osobna fizyczna baza), wiąże sie tez to z migracjami
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 godzin
  • Postów:3277
0
konradino898 napisał(a):

Normalnie każdy mikroserwis powinien mieć fizycznie wydzieloną bazę danych, ale załóżmy że jesteśmy 'nowocześni' i chcemy mieć Google Clouda...

Nie do końca moim zdaniem. Każdy micro service powinien mieć swoje dane na wyłączność. Czy użyjesz do tego osobnych maszyn, osobnych baz danych, schematów itd. - dla mnie ok. Jak chcesz mieć jedną instancję serwera, to dobrym pomysłem jest podział na osobne bazy danych w jego ramach. W razie czego łatwiej przenieść na inną maszynę

Rozumiem, że 'po staremu' każdy mikroserwis wewnątrz będzie miał 'logikę' odpowiedzialną za connection do bazy i obsługę tabelek, jsonów itp.

Część serwisów może korzystać wyłącznie z API innych serwisów.

Ale czy musimy mieć instancje Cloud SQL, Cloud Datastore per każdy mikroserwis (i środowisko - Dev, stage...). Czy może wystarczy jedna współdzielona instacja Cloud SQL/Datastore per środowisko (tj. stage, prod) i każdy mikroserwis 'wali' do prywatnego schematu na bazie...

Środowiska powinny być moim zdaniem izolowane w 100%:

  • Połączenia pomiędzy środowiskami obniżają bezpieczeństwo (dodatkowe wektory ataku)
  • Łatwo o pomyłkę chciałam napisać select a napisałam delete i on nie zapytał, albo "wyłączę ten serwer, będzie taniej".
  • Infrastruktura obecnie to również część deploymentu (Infastructure as a Code).

Zwiększanie liczby serwerów baz zwiększa ci izolację serwisów, ale sprawia, że monitoring, serwisowanie, replikacje itd. robią się bardziej upierdliwe. Oczywiście dochodzą do tego koszty.

MA
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 2 lata
  • Postów:337
0

A po co Tobie cloud sql? Masz jakiś szczególny powód, oprócz tego, że znam?

Jak już jesteś w GCP'ie i wdrażasz serwisy w GCP'ie i rozważasz datastore / firestore - to świetny wybór bo obsługuje za Ciebie multitenancy (dla mikroserwisów), skalowanie, skonfigurowanie całego monitoringu, autentykacje, zasady bezpieczeństwa - nie będziesz musiał sam tego ręcznie robić.

Bez konkretnych powodów nie pchałbym się z gcpowskich zarządzalnych usług w kierunku cloud sql'a.

@0xmarcin Spanner to jest enterprise kombajn, który jest niesamowicie drogi w GCP'ie w porównaniu do innych baz danych. Bez wymogów "system critical" to będzie przerost formy nad treścią.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)