Какие знаешь базы данных, соответствующие теореме CAP?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Базы данных и CAP теорема
CAP теорема (Brewer's theorem) гласит, что любая распределённая система может гарантировать только ДВА из ТРЁХ свойств:
- C — Consistency (согласованность)
- A — Availability (доступность)
- P — Partition tolerance (устойчивость к разделению сети)
Что такое каждое свойство
Consistency — все узлы видят одинаковые данные одновременно. При изменении данных оно видно всем клиентам.
Availability — система всегда отвечает на запросы (даже если некоторые узлы упали).
Partition Tolerance — система продолжает работать при разделении сети (когда узлы не могут коммуницировать друг с другом).
CA базы данных (Consistency + Availability)
Теряют Partition Tolerance — работают только когда все узлы в сети.
PostgreSQL (Репликация)
// Spring Data JPA с PostgreSQL
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
// application.properties
spring.datasource.url=jdbc:postgresql://primary-db:5432/mydb
spring.datasource.username=user
spring.datasource.password=pass
Особенности:
- ACID транзакции — гарантия согласованности
- Синхронная репликация — данные копируются на replica до commit
- Требует network connectivity между узлами
- Если сеть упадёт — система недоступна
MySQL InnoDB Cluster
-- MySQL InnoDB Cluster (Group Replication)
SET @@GLOBAL.group_replication_group_name='aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';
SET @@GLOBAL.group_replication_start_on_boot=ON;
SET @@GLOBAL.group_replication_local_address='mysql-node1:33061';
SET @@GLOBAL.group_replication_group_seeds='mysql-node1:33061,mysql-node2:33061';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Когда используется:
- Требуется строгая согласованность
- Раздел сети маловероятен
- Небольшое количество узлов (2-3)
CP базы данных (Consistency + Partition Tolerance)
Теряют Availability — при разделении сети часть узлов становится недоступной.
HBase
// HBase с Java Client
public class HBaseExample {
public static void main(String[] args) throws Exception {
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf("users"));
Put put = new Put(Bytes.toBytes("user1"));
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name"), Bytes.toBytes("John"));
table.put(put);
Get get = new Get(Bytes.toBytes("user1"));
Result result = table.get(get);
System.out.println(result);
}
}
Особенности:
- Strong Consistency — HDFS гарантирует
- Partition Tolerant — работает при разделении сети
- При split brain — выбирается majority partition
- Недоступна при частичном отказе узлов
Zookeeper
// Zookeeper для координации
public class ZookeeperExample {
public static void main(String[] args) throws Exception {
ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, event -> {});
// Create node
zk.create("/config", "data".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// Read node
byte[] data = zk.getData("/config", false, null);
System.out.println(new String(data));
}
}
Используется для:
- Leader election в распределённых системах
- Consensus между узлами
- Configuration management
MongoDB (с Replica Set)
// MongoDB с Spring Data
@Document(collection = "users")
public class User {
@Id
private String id;
private String name;
private String email;
}
@Repository
public interface UserRepository extends MongoRepository<User, String> {}
// application.properties
spring.data.mongodb.uri=mongodb://mongo1:27017,mongo2:27017,mongo3:27017/?replicaSet=rs0
spring.data.mongodb.auto-index-creation=true
MongoDB стратегия:
- Strong Consistency в одной replica set
- Partition Tolerant — может выбрать нового primary
- При split brain — minority узлы невидимы
AP базы данных (Availability + Partition Tolerance)
Теряют Consistency — при разделении сети узлы могут иметь разные данные (eventual consistency).
Cassandra
// Cassandra с DataStax Driver
public class CassandraExample {
public static void main(String[] args) {
CqlSession session = CqlSession.builder()
.addContactPoint(new InetSocketAddress("localhost", 9042))
.withLocalDatacenter("datacenter1")
.build();
session.execute("CREATE KEYSPACE IF NOT EXISTS test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3}");
ResultSet rs = session.execute("SELECT * FROM users");
for (Row row : rs) {
System.out.println(row.getString("name"));
}
}
}
Особенности:
- Eventual Consistency — данные согласуются со временем
- Always Available — любой узел может ответить
- P — работает при разделении сети
- Конфликты решаются Last Write Wins (LWW)
DynamoDB (AWS)
// AWS DynamoDB с Spring
@DynamoDBTable(tableName = "Users")
public class User {
@DynamoDBHashKey(attributeName = "UserId")
private String userId;
@DynamoDBAttribute(attributeName = "Name")
private String name;
}
// Использование
DynamoDBMapper mapper = new DynamoDBMapper(dynamoDB);
User user = new User();
user.setUserId("user1");
user.setName("John");
mapper.save(user);
Особенности:
- Fully managed serverless
- Global distribution с eventual consistency
- High availability по умолчанию
- Partition tolerant — работает при сбое региона
Redis
// Redis с Spring Data
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
return new StringRedisTemplate(factory);
}
}
@Service
public class CacheService {
@Autowired
private RedisTemplate<String, String> redis;
public void setData(String key, String value) {
redis.opsForValue().set(key, value, Duration.ofHours(1));
}
}
// application.properties
spring.redis.host=localhost
spring.redis.port=6379
Особенности:
- In-memory database — очень быстро
- AP модель с асинхронной репликацией
- Данные могут потеряться при сбое
- Идеален для кэша, не для primary DB
CAP таблица
| БД | C | A | P | Consistency модель | Use Case |
|---|---|---|---|---|---|
| PostgreSQL | ✓ | ✓ | ✗ | ACID | Финансы, OLTP |
| MySQL | ✓ | ✓ | ✗ | ACID | Web приложения |
| HBase | ✓ | ✗ | ✓ | Strong | Analytics, Big Data |
| MongoDB | ✓ | ✗ | ✓ | Strong (в RS) | Document store |
| Cassandra | ✗ | ✓ | ✓ | Eventual | Time-series, Analytics |
| DynamoDB | ✗ | ✓ | ✓ | Eventual | Serverless |
| Redis | ✗ | ✓ | ✓ | Eventual | Кэш, Sessions |
| Elasticsearch | ✗ | ✓ | ✓ | Eventual | Search, Logs |
Стратегии для каждого выбора
CP выбирают когда:
- Данные критичны и должны быть согласованы
- Можешь пожертвовать доступностью
- Пример: финансовые системы
AP выбирают когда:
- Доступность важнее согласованности
- Eventual consistency приемлема
- Пример: social media, logs, analytics
CA выбирают когда:
- Разделение сети невероятно
- Требуется strong consistency и availability
- Пример: монолитные приложения, локальные БД