Porównanie baz NoSQL

Bazy klucz-wartość

Bazy klucz-wartość to proste hashmapy, pozwalające zapisać i odczytać umieszczone pod określonym kluczem – identyfikatorem, dowolne dane, często poświęcające trwałość w celu uzyskania wyższej szybkości (potwierdzenie zapisu danych po zapisie do pamięci operacyjnej, przed zapisem do pamięci masowej). Wykorzystywane są one głównie do przechowywania danych tymczasowych – cache obiektów z właściwej bazy danych, przechowywanie sesji zalogowanych użytkowników, czy zawartości ich koszyków zakupowych.

Riak

  • Zawartość: Typowy key-value store – nie wnika w wartość, jest to dla niego blob, aczkolwiek istnieją rozszerzenia (Riak Search) pozwalające na przeszukiwanie wartości. Biblioteki klienckie zajmują się serializacją i deserializacją danych. Najczęściej pojedynczy bucket odpowiada pojedynczej serializowanej klasie. Poszczególne wartości mogą wygasać po zadanym czasie.
  • Komunikacja: REST API (CRUD)
  • Dostęp: Baza danych ➔ Bucket ➔ Klucz ➔ Wartość
  • Skalowanie/architektura klastra: Istnieje klaster z automatyczną replikacją i shardingiem. Przestrzeń wszystkich możliwych hashy kluczy dzielona jest na X partycji, następnie partycje te przydzielane są w cyklu round-robin kolejnym węzłom klastra, tak, że każdy węzeł odpowiada za przechowywanie danych z co X-tej partycji. np. klaster może być podzielony na 32 partycje i składać się z 4 węzłów – wtedy każdy z nich obsługuje po 8 “ułożonych naprzemiennie” partycji (ilustracja nr 1). W trakcie zapisu dane umieszczane są na N kolejnych partycjach (obsługiwanych przez N kolejnych węzłów, ilustracja nr 2). Użytkownik w celu zapisu lub odczytu, może połączyć się z dowolnym węzłem klastra. Więcej informacji tutaj.
  • Spójność: Tworząc bucket decydujemy ile ma mieć replik [N] (na ilu kolejnych partycjach ma być zapisany każdy klucz) oraz na ile potwierdzeń zapisu oczekujemy [W], z ilu replik [R] odczytujemy dane (j/w) oraz co ma się stać, jeśli w trakcie zapisu nastąpi inny zapis do tego samego klucza na innym serwerze (wygrywa najnowszy po synchronizacji lub zapisywane są obie wersie klucza ze znacznikiem czasowym).
  • Trwałość: Konfigurując bucket, oprócz ustawienia parametru [W] mówiącego nam o tym, na ile potwierdzeń zapisu oczekujemy, możemy także ustawić parametr [DW], mówiący o tym, ile replik ma potwierdzić zapis danych do pamięci masowej, zanim uznamy zapis za wykonany. Więcej informacji tutaj.
  • Transakcje: Brak. Atomowe zmiany w obrębie jednego dokumentu.

Czytaj dalej Porównanie baz NoSQL

Migration of Django project from PostgreSQL to MySQL

  1. Create new MySQL database.
  2. Run Django migrations on the new database. This will require you to change settings of the project.
    python3 manage.py migrate
  3. Disable key checks on MySQL server.
    SET GLOBAL FOREIGN_KEY_CHECKS = 0;
  4. Execute the query on MySQL database.
    SELECT CONCAT('ALTER TABLE ', a.table_name, ' MODIFY COLUMN ' , a.column_name, ' CHAR (36);')
    FROM information_schema.columns a
    WHERE a.table_schema = 'DB_NAME'
    AND a.column_type = 'char(32)';
  5. Execute the results of the query above on the MySQL database. This will make room for Postgres encoded UUID’s (with four “-” char inside).
  6. Execute the query on MySQL database.
    SELECT CONCAT('ALTER TABLE ', a.table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;')
    FROM information_schema.tables a
    WHERE a.table_schema = 'DB_NAME';
  7. Execute the results of the query above on the MySQL database. This will enable MySQL to store auth_groups names in case-sensitive manner.
  8. Using DBeaver export the data from the PostgreSQL database into MySQL one.
  9. Execute the query on MySQL database.
  10. SELECT CONCAT('UPDATE ', a.table_name, ' SET ' , a.column_name, ' = REPLACE(' , a.column_name, ', "-", "");')
    FROM information_schema.columns a
    WHERE a.table_schema = 'DB_NAME'
    AND a.column_type = 'char(36)';
  11. Execute the results of the query above on the MySQL database. This will convert the Postgres encoded UUID into what Django expects to be in the MySQL database.
  12. Execute the query on MySQL database.
    SELECT CONCAT('ALTER TABLE ', a.table_name, ' MODIFY COLUMN ' , a.column_name, ' CHAR (32);')
    FROM information_schema.columns a
    WHERE a.table_schema = 'DB_NAME'
    AND a.column_type = 'char(36)';
  13. Execute the results of the query above on the MySQL database. This will remove four unnecessary characters from the UUID fields.
  14. Enable key checks on MySQL server:
    SET GLOBAL FOREIGN_KEY_CHECKS = 1;
  15. Start the Django app and check is everything working.