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. Then, execute the results of this query as another query. This will make room for Postgres encoded UUID’s (with four dashes inside).
    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 queries on MySQL database. This will enable MySQL to store users and groups names in case-sensitive manner.
    ALTER TABLE auth_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;
    ALTER TABLE auth_group CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;
  6. Using DBeaver export the data from the PostgreSQL database into MySQL one.
  7. Execute the query on MySQL database. Then, execute its results. This will convert the Postgres encoded UUID’s (with dashes) into what Django expects to be in the MySQL database (UUID’s with no dashes inside).
    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)';
  8. Execute the query on MySQL database. Then, execute the results of this query. This will remove the space needed for four unnecessary dashes from the UUID fields.
    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)';
  9. Enable key checks on MySQL server:
    SET GLOBAL FOREIGN_KEY_CHECKS = 1;
  10. Start the Django app and check is everything working.