Wydanie FerretDB 0.1, implementacja MongoDB oparta na systemie DBMS PostgreSQL

Opublikowano wydanie projektu FerretDB 0.1 (dawniej MangoDB), umożliwiającego zastąpienie zorientowanego dokumentowo DBMS MongoDB na PostgreSQL bez wprowadzania zmian w kodzie aplikacji. FerretDB jest zaimplementowany jako serwer proxy, który tłumaczy wywołania MangoDB na zapytania SQL do PostgreSQL, umożliwiając wykorzystanie PostgreSQL jako rzeczywistej pamięci. Kod napisany jest w Go i rozpowszechniany na licencji Apache 2.0.

Konieczność migracji może powstać w związku z przejściem MongoDB na zastrzeżoną licencję SSPL, która opiera się na licencji AGPLv3, ale nie ma charakteru otwartego, gdyż zawiera dyskryminujący wymóg dostarczania w ramach licencji SSPL nie tylko samego kodu aplikacji, ale także kod źródłowy wszystkich komponentów zaangażowanych w świadczenie usługi w chmurze.

Docelową grupą odbiorców FerretDB są użytkownicy, którzy nie korzystają z zaawansowanych możliwości MongoDB w swoich aplikacjach, ale chcą korzystać z całkowicie otwartego stosu oprogramowania. Na obecnym etapie rozwoju FerretDB nadal obsługuje tylko część możliwości MongoDB, które są najczęściej wykorzystywane w typowych aplikacjach. W przyszłości planują osiągnąć pełną kompatybilność ze sterownikami dla MongoDB i zapewnić możliwość wykorzystania FerretDB jako przejrzystego zamiennika MongoDB.

Przypomnijmy, że MongoDB zajmuje niszę pomiędzy szybkimi i skalowalnymi systemami obsługującymi dane w formacie klucz/wartość, a relacyjnymi systemami DBMS, które są funkcjonalne i łatwe w formułowaniu zapytań. MongoDB obsługuje przechowywanie dokumentów w formacie podobnym do JSON, posiada dość elastyczny język generowania zapytań, potrafi tworzyć indeksy dla różnych przechowywanych atrybutów, sprawnie zapewnia przechowywanie dużych obiektów binarnych, obsługuje logowanie operacji zmiany i dodawania danych do bazy danych, potrafi działa zgodnie z paradygmatem Map/Reduce, wspiera replikację i budowę konfiguracji odpornych na błędy.

Wydanie FerretDB 0.1.0 całkowicie przeprojektowało metodę pobierania danych z PostgreSQL. Wcześniej dla każdego przychodzącego żądania MongoDB generowano jedno zapytanie SQL do PostgreSQL, wykorzystując funkcje do pracy z formatem JSON i filtrowania wyników po stronie PostgreSQL. Ze względu na różnice w semantyce funkcji json PostgreSQL i MongoDB wystąpiły rozbieżności w zachowaniu podczas porównywania i sortowania różnych typów. Aby rozwiązać ten problem, dane są teraz redundantnie pobierane z PostgreSQL, a wynik jest filtrowany po stronie FerretDB, co umożliwiło replikację zachowania MongoDB w większości sytuacji.

Ceną zwiększonej kompatybilności był spadek wydajności, który w przyszłych wersjach mają zrekompensować poprzez selektywne filtrowanie po stronie FerretDB tylko zapytań, w przypadku których występują rozbieżności w zachowaniu. Na przykład zapytanie „db.collection.find({_id: 'some-id-value'})” może zostać przetworzone w całości w PostgreSQL. Podstawowym celem projektu na tym etapie rozwoju jest osiągnięcie kompatybilności z MongoDB, a wydajność jest na razie zepchnięta na drugi plan. Wśród zmian funkcjonalnych w nowej wersji zauważono obsługę wszystkich operatorów bitowych, operatora porównania „$eq”, a także operatorów „$elemMatch” i „$bitsAllClear”.

Źródło: opennet.ru

Dodaj komentarz