Help
Таблица переводов
| Величина (бит) | В Битах | В Килобитах (Kb) | В Мегабитах (Mb) | В Гигабитах (Gb) | В Терабитах (Tb) |
|---|---|---|---|---|---|
| 1 бит | 1 | 0,001 Kb | 10^-6 Mb | 10^-9 Gb | 10^-12 Tb |
| 1 Килобит (Kb) | 1_000 бит | 1 | 0,001 Mb | 10^-6 Gb | 10^-9 Tb |
| 1 Мегабит (Mb) | 1_000_000 бит | 1_000 Kb | 1 | 0,001 Gb | 10^-6 Tb |
| 1 Гигабит (Gb) | 10^9 бит | 1_000_000 Kb | 1_000 Mb | 1 | 0,001 Tb |
| 1 Терабит (Tb) | 10^12 бит | 10^9 Kb | 1_000_000 Mb | 1_000 Gb | 1 |
Порядок интервью

Быстрые схемы для SQL / NoSQL

CAP Theorem
According to the CAP Theorem, a distributed system can only achieve two out of the three properties at the same time, but not all three:
-
Consistency + Availability (CA): If the system is designed to be consistent and available, it must forfeit partition tolerance. This means that in the case of a network partition (a communication breakdown between nodes), the system must either become inconsistent or unavailable.
-
Consistency + Partition Tolerance (CP): In a system that prioritizes consistency and partition tolerance, availability is sacrificed. This means that during a network partition, the system may not be able to respond to some or all requests, thus ensuring data consistency across nodes.
-
Availability + Partition Tolerance (AP): A system that is designed to be available and partition-tolerant must sacrifice consistency. This means that during network partitions, the system will continue to operate but might return outdated or inconsistent data.
Why the CAP Theorem is Important
The CAP Theorem is crucial because it defines the fundamental trade-offs that must be made when designing distributed systems. Understanding these trade-offs allows system architects to make informed decisions based on the specific requirements of their application. For example:
-
In a globally distributed database, achieving high availability and partition tolerance might be critical, even if it means sacrificing some consistency (AP).
-
In financial systems where data consistency is paramount, the system might be designed to tolerate partitions but be less available during such events (CP).
Details
Компромиссы по CAP-теореме
Согласно CAP-теореме, распределенная система может обеспечить только два из трех свойств одновременно, но не все три:
-
Согласованность + Доступность (CA): Если система спроектирована для согласованности и доступности, она должна отказаться от устойчивости к разделению. Это означает, что в случае разделения сети (сбоя связи между узлами) система должна либо стать несогласованной, либо недоступной.
-
Согласованность + Устойчивость к разделению (CP): В системе, ориентированной на согласованность и устойчивость к разделению, жертвуется доступность. Это означает, что во время разделения сети система может не отвечать на некоторые или все запросы, обеспечивая при этом согласованность данных между узлами.
-
Доступность + Устойчивость к разделению (AP): Система, спроектированная для доступности и устойчивости к разделению, жертвует согласованностью. Это означает, что во время разделения сети система продолжит работать, но может возвращать устаревшие или несогласованные данные.
Почему CAP-теоре ма важна
CAP-теорема важна, потому что она определяет основные компромиссы, которые необходимо учитывать при проектировании распределенных систем. Понимание этих компромиссов позволяет архитекторам систем принимать обоснованные решения на основе конкретных требований их приложения. Например:
-
В глобально распределенной базе данных может быть критически важно обеспечить высокую доступность и устойчивость к разделению, даже если это означает жертвование частью согласованности (AP).
-
В финансовых системах, где согласованность данных имеет первостепенное значение, система может быть спроектирована для устойчивости к разделению, но при этом быть менее доступной во время таких событий (CP).
When to Use SQL vs. NoSQL Databases
Criteria for Choosing Between SQL and NoSQL Databases
| Criterion | SQL (Relational) | NoSQL (Non-Relational) |
|---|---|---|
| Data Structure | Structured data with predefined schema (tables, rows, columns) | Flexible, unstructured, or semi-structured data (JSON, XML) |
| Schema Flexibility | Rigid, requires upfront schema design; changes are complex | Dynamic, schema-less or schema-on-read; easier to change |
| Transaction Support | ACID (Atomicity, Consistency, Isolation, Durability) | BASE (Basically Available, Soft state, Eventually consistent); some NoSQL databases support ACID at a certain level |
| Complex Queries | Supports complex queries, joins, and transactions | Limited support for complex queries and joins |
| Scalability | Vertical scaling (adding more power to a single server) | Horizontal scaling (distributing data across multiple servers) |
| Data Integrity | Strong consistency and integrity due to ACID properties | Eventual consistency; data integrity is less strict |
| Use Cases | Traditional applications, financial systems, ERPs, CRMs | Big data, real-time analytics, content management systems, IoT |
| Examples | MySQL, PostgreSQL, Oracle, SQL Server | MongoDB, Cassandra, Redis, DynamoDB |
| Query Language | SQL (Structured Query Language) | Various, often specific to the database (e.g., MongoDB uses MQL) |
| Data Volume | Generally smaller volumes where relationships between data are important | Large volumes of data, high write throughput |
| Consistency Requirements | Strong consistency, data is consistent immediately after transaction | Eventual consistency, where data will be consistent eventually but not immediately |
| Cost and Maintenance | May require higher costs for hardware due to vertical scaling | Generally more cost-effective for large-scale distributed systems |
| Performance | May be slower with high write/read loads due to ACID compliance | Optimized for high performance and large scale with simpler consistency models |

Key Considerations
-
SQL is typically the choice when you need structured data, complex queries, strong consistency, and well-defined relationships between data entities. It is suitable for applications where data integrity and complex transactions are critical, such as in financial systems.
-
NoSQL is preferable when dealing with large volumes of unstructured or semi-structured data, where schema flexibility, horizontal scalability, and high performance for read/write operations are more important than strict consistency and complex queries.
Consistent hashing - NoSQL
To address the issue of scalability and efficient load distribution in a key-value storage system, the concept of consistent hashing with virtual nodes is a highly effective solution. Here's how scalability can be implemented and managed effectively:
1. Problem with Modulus-Based Partitioning
В системе, где данные в формате ключ-значение хранятся на нескольких узлах, обычным методом распределения запросов является вычисление хеша ключа и использование операции деления с остатком (hash(key) % number_of_nodes). Это хорошо работает на начальном этапе, но вызывает проблемы при добавлении или удалении узлов. Когда узел добавляется или удаляется, хеш-вычисление изменяется, что приводит к значительной перенастройке ключей на новые узлы. Это требует миграции данных и может сильно повлиять на производительность системы.
2. Solution: Consistent Hashing
Для решения этой проблемы используется consistent hashing (консистентное хеширование). В этом методе и узлы, и данные размещаются на концептуальном круговом хеш-ринге (с хеш-значениями в диапазоне от 0 до максимального значения n-1). Каждый узел получает позицию на ринге на основе своего хеша, и каждый ключ получает позицию на том же ринге. Запрос направляется на первый узел, найденный при движении по часовой стрелке от хеш-значения ключа.
IP - internet protocol

Преимущества:
- Минимальное перемещение данных: Когда узел присоединяется или уходит, перенастраиваются только те ключи, которые попадают между новым узлом и его предшественником, вместо всей базы данных. Это приводит к небольшой, предсказуемой миграции данных, что снижает накладные расходы.
- Масштабируемость: Добавление или удаление узлов затрагивает только ограниченное количество ключей, что позволяет системе легче масштабироваться.
3. Handling Load Imbalance: Virtual Nodes
Даже с consistent hashing, неравномерное распределение ключей может привести к тому, что некоторые узлы будут обрабатывать значительно больше запросов (образование «горячих точек»). Для решения этой проблемы могут быть введены virtual nodes (виртуальные узлы). Каждому физическому узлу назначается несколько виртуальных узлов на ринге, что позв оляет более равномерно распределять ключи между узлами.
Преимущества виртуальных узлов:
- Равномерное распределение нагрузки: Назначение нескольких виртуальных узлов на каждый физический узел снижает риск того, что один узел станет горячей точкой.
- Гибкое масштабирование: Узлам с большей вычислительной мощностью можно назначить больше виртуальных узлов, что позволит им обрабатывать пропорционально большую нагрузку.
- Отказоустойчивость: Если физический узел выходит из строя, виртуальные узлы, за которые он отвечал, могут быть перераспределены среди других физических узлов, обеспечивая устойчивость системы.
4. Replication for High Availability
Для обеспечения высокой доступности данные обычно реплицир уются на нескольких узлах. В peer-to-peer replication (одноранговой репликации) каждый элемент данных хранится на нескольких узлах для обеспечения долговечности и доступности. Replication factor (фактор репликации, например, n=3) определяет, сколько узлов будут хранить копии каждой пары ключ-значение.
CAP Theorem:
В распределенных системах CAP theorem (теорема CAP) подчеркивает компромисс между Consistency (консистентность), Availability (доступность) и Partition Tolerance (устойчивость к разделению). В key-value хранилищах, которые отдают приоритет доступности, система может временно допускать неконсистентности во время сетевых разделений, гарантируя, что узлы продолжают обслуживать запросы независимо. Эти несоответствия устраняются позже с помощью таких техник, как версионирование или разрешение конфликтов.
5. Design Summary:
Ключевые решения для масштабируемости включают:
- Consistent Hashing для эффективной и минимальной перераспределения данных при масштабировании.
- Virtual Nodes для обеспечения равномерного распределения нагрузки между узлами.
- Peer-to-Peer Replication для долговечности и высокой доступности.
- CAP Theorem Trade-offs: Система может предпочитать доступность строгой консистентности для поддержания работы во время сетевых разделений.
Интеграция этих методов делает систему масштабируемой и устойчивой к изменениям нагрузки при минимизации операционной сложности и накладных расходов.

To address the issue of scalability and efficient load distribution in a key-value storage system, the concept of consistent hashing with virtual nodes is a highly effective solution. Here's how scalability can be implemented and managed effectively:
1. Problem with Modulus-Based Partitioning
In a system where key-value data is stored across multiple nodes, a common method to distribute requests is by calculating the hash of the key and using the modulus operation (hash(key) % number_of_nodes). This works well initially but presents problems when nodes are added or removed. When a node is added or removed, the hash calculation changes, causing a significant number of keys to be remapped to new nodes. This requires data migration and can severely impact system performance.
2. Solution: Consistent Hashing
To address this, consistent hashing is employed. In this method, both nodes and data are placed on a conceptual circular hash ring (with hash values ranging from 0 to a maximum n-1 value). Each node is assigned a position on the ring based on its hash, and each key is assigned a position on the same ring. A request is routed to the first node found when moving clockwise from the key's hash value.
Benefits:
- Minimal data movement: When a node joins or leaves, only the keys that fall between the new node and its predecessor need to be remapped, instead of the entire dataset. This results in a small, predictable data migration, reducing overhead.
- Scalability: Adding or removing nodes impacts only a limited number of keys, allowing the system to scale more easily.
3. Handling Load Imbalance: Virtual Nodes
Even with consistent hashing, a non-uniform distribution of keys can result in some nodes handling significantly more requests (hotspots). To solve this, virtual nodes (vnodes) can be introduced. Each physical node is assigned multiple virtual nodes on the ring, allowing for a more balanced distribution of keys across nodes.
Advantages of Virtual Nodes:
- Even load distribution: By assigning multiple virtual nodes per physical node, the risk of one node becoming a hotspot is greatly reduced.
- Flexible scaling: Nodes with higher capacity can be assigned more virtual nodes, allowing them to handle a proportionally larger share of the load.
- Fault tolerance: If a physical node fails, the virtual nodes it was responsible for can be redistributed among other physical nodes, ensuring system resilience.
4. Replication for High Availability
For high availability, data is typically replicated across multiple nodes. In peer-to-peer replication, each data item is stored on multiple nodes to ensure durability and availability. A replication factor (e.g., n=3) determines how many nodes will store copies of each key-value pair.
CAP Theorem:
In distributed systems, the CAP theorem highlights the trade-off between Consistency, Availability, and Partition Tolerance. In key-value stores prioritizing availability, the system may allow temporary inconsistencies during network partitions, ensuring that nodes continue serving requests independently. These inconsistencies are reconciled later through techniques like versioning or conflict resolution.
5. Design Summary:
Key design decisions for scalability include:
- Consistent Hashing for efficient and minimal data redistribution when scaling.
- Virtual Nodes to ensure even load distribution across nodes.
- Peer-to-Peer Replication for durability and high availability.
- CAP Theorem Trade-offs: The system may prefer availability over strict consistency to maintain uptime during network partitions.
Incorporating these techniques makes the system scalable and resilient to load changes while minimizing operational complexity and overhead.
Transactions
Что такое транзакции в базе данных (SQL и NoSQL)?
Транзакция — это набор операций с данными, которые выполняются как единое целое. Транзакции обеспечивают ключевые гарантии согласованности данных в системах хранения, и их выполнение должно удовлетворять ACID-свойствам (Atomicity, Consistency, Isolation, Durability) в традиционных SQL системах или BASE-подходам в NoSQL.
- Атомарность (Atomicity): Все операции внутри транзакции должны быть выполнены полностью, или не выполнены вовсе.
- Согласованность (Consistency): Данные должны оставаться в согласованном состоянии после завершения транзакции.
- Изолированность (Isolation): Параллельные транзакции не должны мешать друг другу.
- Долговечность (Durability): После завершения транзакции её результаты сохраняются, даже в случае сбоя системы.
В NoSQL системах транзакции часто являются ослабленными и поддерживаются не во всех системах. Примеры: MongoDB поддерживает транзакции только в пределах одной коллекции, Cassandra использует концепцию лёгких транзакций, предоставляя "eventual consistency" (финальная согласованность).

Как работает транзакция?
Транзакции запускаются при выполнении команд записи/чтения данных в базе данных. В традиционных SQL-системах они контролируются механизмом блокировок (например, двухфазная фиксация), в то время как в NoSQL-системах используются альтернативные подходы, такие как механизмы оптимистической блокировки или согласование через распределённые алгоритмы, такие как Paxos или Raft.
Как транзакции масштабируются?
SQL-системы обычно сложно масштабировать горизонтально из-за строгих требований к согласованности и блокировкам. Однако вертикальное масштабирование или шардинг (разделение базы данных на части) может помочь. NoSQL решения часто выбираются за их лучшую масштабируемость, так как они изначально проектировались для работы в распределённых системах. Например, Cassandra использует "leaderless replication" и "quorum-based" консенсус для распределённых транзакций【6†source】.
Почему транзакции важны?
Транзакции критически важны для обеспечения целостности данных в системах, где возможны многопользовательские взаимодействия или параллельные операции. Без них системы могут попадать в несогласованные состояния, что ведёт к потере данных или некорректным результатам обработки.