← Назад к вопросам

Какие знаешь базы данных, соответствующие теореме CAP?

1.8 Middle🔥 161 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Базы данных и 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 таблица

БДCAPConsistency модельUse Case
PostgreSQLACIDФинансы, OLTP
MySQLACIDWeb приложения
HBaseStrongAnalytics, Big Data
MongoDBStrong (в RS)Document store
CassandraEventualTime-series, Analytics
DynamoDBEventualServerless
RedisEventualКэш, Sessions
ElasticsearchEventualSearch, Logs

Стратегии для каждого выбора

CP выбирают когда:

  • Данные критичны и должны быть согласованы
  • Можешь пожертвовать доступностью
  • Пример: финансовые системы

AP выбирают когда:

  • Доступность важнее согласованности
  • Eventual consistency приемлема
  • Пример: social media, logs, analytics

CA выбирают когда:

  • Разделение сети невероятно
  • Требуется strong consistency и availability
  • Пример: монолитные приложения, локальные БД
Какие знаешь базы данных, соответствующие теореме CAP? | PrepBro