Twitter用户暴增20倍 欲弃用MySQL数据库 使用Cassandra数据库

Twitter计划将其数据库从MySQL迁移到Cassandra,以利用后者在弹性、可扩展性和可靠性方面的优势。这一迁移是为了应对快速增长的数据量及用户基数,Cassandra被认为更适合处理大规模数据并提供更好的性能。
2月24日消息,据外电报道,Twitter公司一位名叫Ryan King的工程师日前向博客MyNoSQL透露,公司计划从MySQL迁移到Cassandra数据库,因为后者具有更大的弹性、可扩展性和大量的社区网络开源开发人员。

我们有大量的数据,在数据巨大,增长率正在加速的情况下,我们需要一个系统,它可以更为自动化,并高度可靠、可用。Ryan King表示。

相关数据显示,在2009年里,Twitter用户数从1月份的每天约 200万人,激增至12月份的每天近5000万人。每天登陆Twitter的用户数量增长已经超过了20倍。

事实上,对于熟练的程序员来说,所谓的NoSQL数据库可以提高性能和可扩展性,这使得它们吸引消费者的网络世界。

像Facebook和Twitter,以及最初的Web 2.0的宠儿Digg,也正从MySQL数据库迁移到Cassandra数据库。

Ryan King表示,试验发现,Cassandra数据库比MySQL更具有可扩展性、可靠和更易于管理。

把装有所有tweets和 retweets信息的平台迁移到Cassandra上去,这是Twitter的当前要务。Ryan King说。在这之后,我们将开始把一些新的项目迁移到Cassandra或者其他的平台。
<think>我们之前讨论的是在同一个Spring Boot项目中同时支持MySQLCassandra两种数据库,通过条件配置切换使用哪种数据库。下面给出这个项目的标准目录结构: ### 项目目录结构(Maven标准) ``` src/main/java └── com └── tplink └── nbu └── demo └── basicspringboot ├── BasicspringbootApplication.java # Spring Boot启动类 ├── config │ ├── DataSourceConfig.java # 数据源配置类(定义Bean) │ ├── CassandraConfig.java # Cassandra配置(可选) │ └── JpaConfig.java # JPA配置(可选) ├── controller │ └── UserController.java # 用户相关API ├── service │ ├── UserService.java # 用户服务接口 │ └── impl │ └── UserServiceImpl.java # 用户服务实现 ├── dao │ ├── repository # 存放Repository接口 │ │ ├── mysql │ │ │ └── JPAUserRepository.java # MySQL的JPA Repository │ │ └── cassandra │ │ └── CassandraUserRepository.java # Cassandra的Repository │ └── impl │ ├── MySQLUserRepository.java # MySQL的Repository实现类 │ └── CassandraUserRepositoryImpl.java # Cassandra的Repository实现类 ├── entity │ ├── mysql │ │ └── UserInfo.java # MySQL实体类 │ └── cassandra │ └── CassandraUser.java # Cassandra实体类 └── dto ├── request │ └── UserRegisterDTO.java # 注册请求DTO └── response └── ApiResponse.java # 通用响应DTO ``` ### 关键文件说明 1. **配置类 (`config` 包)**: - `DataSourceConfig.java`: 定义条件化的Repository Bean,根据配置选择激活MySQLCassandra的实现。 - `CassandraConfig.java` (可选): 配置Cassandra连接和Keyspace,如果使用Spring Data Cassandra的自动配置,可以省略。 - `JpaConfig.java` (可选): 配置JPA和MySQL数据源。 2. **数据访问层 (`dao` 包)**: - `repository` 子包: 存放Spring Data的Repository接口(JPA和Cassandra)。 - `impl` 子包: 存放自定义的Repository实现类,这些类实现了我们定义的通用`UserRepository`接口。 3. **实体类 (`entity` 包)**: - 按数据库类型分子包存放实体类,避免混淆。 4. **服务层 (`service` 包)**: - 服务实现通过调用`UserRepository`接口操作数据,不直接依赖具体数据库实现。 ### 示例代码片段 **DataSourceConfig.java** ```java @Configuration public class DataSourceConfig { @Bean @ConditionalOnProperty(name = "app.datasource.type", havingValue = "mysql") public UserRepository<?, ?> mysqlUserRepository(JPAUserRepository jpaUserRepository) { return new MySQLUserRepository(jpaUserRepository); } @Bean @ConditionalOnProperty(name = "app.datasource.type", havingValue = "cassandra") public UserRepository<?, ?> cassandraUserRepository(CassandraUserRepository cassandraRepository) { return new CassandraUserRepositoryImpl(cassandraRepository); } } ``` **UserServiceImpl.java (片段)** ```java @Service public class UserServiceImpl implements UserService { private final UserRepository<?, ?> userRepository; @Autowired public UserServiceImpl(@Qualifier("userRepositoryImpl") UserRepository<?, ?> userRepository) { this.userRepository = userRepository; } @Override public ApiResponse register(UserRegisterDTO dto) { // 业务逻辑 } } ``` ### 资源文件 (`src/main/resources`) ``` src/main/resources ├── application.yml # 主配置文件 └── logback-spring.xml # 日志配置 ``` **application.yml 示例** ```yaml app: datasource: type: cassandra # 可选值: mysqlcassandra spring: # 根据选择的数据库类型配置对应数据源 datasource: url: jdbc:mysql://localhost:3306/test_db username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true data: cassandra: keyspace-name: test_ks contact-points: 127.0.0.1 port: 9042 local-datacenter: datacenter1 schema-action: create_if_not_exists ``` ### 项目依赖 (`pom.xml`) 需要同时包含Spring Data JPA和Spring Data Cassandra的依赖,但通过配置确保运行时只激活一种数据库。 ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MySQL 相关 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Cassandra 相关 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-cassandra</artifactId> </dependency> <!-- 其他工具 --> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>2.4.4</version> </dependency> </dependencies> ``` ### 注意事项 1. **避免同时激活两种数据库**:通过`app.datasource.type`配置项控制,确保运行时只使用一种数据库。 2. **实体类扫描**:需要在启动类或配置类中指定实体类的扫描路径,避免JPA和Cassandra实体互相干扰。 3. **事务管理**:Cassandra不支持ACID事务,如果业务需要跨实体操作,需考虑使用补偿机制。 §§相关问题§§ 1. 如何解决Spring Data JPA和Spring Data Cassandra的自动配置冲突? 2. 在双数据源项目中如何统一管理数据库迁移(如Flyway)? 3. 如何为MySQLCassandra分别编写单元测试? 4. 在Spring Boot中如何动态切换多个Cassandra集群? 5. 如何监控混合数据源项目的性能指标?</think>### MySQL + Cassandra 双数据源项目结构目录 #### 标准Maven项目结构 ```markdown src/main/java └── com └── example └── multidb ├── MultiDbApplication.java # Spring Boot主类 ├── config │ ├── CassandraConfig.java # Cassandra配置 │ └── DataSourceConfig.java # 数据源选择配置 ├── controller │ └── UserController.java # REST API控制器 ├── service │ ├── UserService.java # 服务接口 │ └── impl │ └── UserServiceImpl.java # 服务实现 ├── repository │ ├── generic │ │ └── UserRepository.java # 通用仓库接口 │ ├── mysql │ │ ├── JPAUserRepository.java # MySQL JPA接口 │ │ └── impl │ │ └── MySQLUserRepository.java # MySQL实现 │ └── cassandra │ ├── CassandraUserRepository.java # Cassandra接口 │ └── impl │ └── CassandraUserRepositoryImpl.java # Cassandra实现 ├── entity │ ├── mysql │ │ └── UserInfo.java # MySQL实体 │ └── cassandra │ └── CassandraUser.java # Cassandra实体 ├── dto │ ├── request │ │ └── UserRegisterDTO.java # 注册DTO │ └── response │ └── ApiResponse.java # 通用响应DTO └── exception └── GlobalExceptionHandler.java # 全局异常处理 src/main/resources ├── application.yml # 主配置文件 ├── application-mysql.yml # MySQL配置 ├── application-cassandra.yml # Cassandra配置 └── logback-spring.xml # 日志配置 ``` #### 关键文件说明 1. **数据源配置 (`config` 包)**: ```java // DataSourceConfig.java @Configuration public class DataSourceConfig { @Bean @ConditionalOnProperty(name = "app.datasource.type", havingValue = "mysql") public UserRepository mysqlUserRepository(JPAUserRepository jpaRepo) { return new MySQLUserRepository(jpaRepo); } @Bean @ConditionalOnProperty(name = "app.datasource.type", havingValue = "cassandra") public UserRepository cassandraUserRepository(CassandraUserRepository cassandraRepo) { return new CassandraUserRepositoryImpl(cassandraRepo); } } ``` 2. **通用仓库接口 (`repository/generic`)**: ```java public interface UserRepository<T, ID> { T save(T entity); Optional<T> findByEmail(String email); boolean existsByEmail(String email); long count(); void deleteByEmail(String email); } ``` 3. **MySQL 实现 (`repository/mysql/impl`)**: ```java @Repository public class MySQLUserRepository implements UserRepository<UserInfo, Integer> { private final JPAUserRepository jpaUserRepository; public MySQLUserRepository(JPAUserRepository jpaUserRepository) { this.jpaUserRepository = jpaUserRepository; } @Override public UserInfo save(UserInfo entity) { return jpaUserRepository.save(entity); } // 其他方法实现... } ``` 4. **Cassandra 实体 (`entity/cassandra`)**: ```java @Table("users") public class CassandraUser { @PrimaryKey private UUID id; private String email; private String username; // 其他字段... } ``` 5. **服务层实现 (`service/impl`)**: ```java @Service public class UserServiceImpl implements UserService { private final UserRepository userRepository; private final ModelMapper modelMapper; public UserServiceImpl( @Qualifier("userRepository") UserRepository userRepository, ModelMapper modelMapper) { this.userRepository = userRepository; this.modelMapper = modelMapper; } @Override public ApiResponse register(UserRegisterDTO dto) { if (userRepository.existsByEmail(dto.getEmail())) { return ApiResponse.error("Email already exists"); } Object userEntity = createUserEntity(dto); userRepository.save(userEntity); return ApiResponse.success("User registered"); } private Object createUserEntity(UserRegisterDTO dto) { if (userRepository instanceof MySQLUserRepository) { // 创建MySQL实体 } else if (userRepository instanceof CassandraUserRepositoryImpl) { // 创建Cassandra实体 } } } ``` #### 配置文件示例 (`application.yml`) ```yaml app: datasource: type: cassandra # 可选: mysqlcassandra spring: profiles: active: ${app.datasource.type} # 其他公共配置... ``` #### Cassandra专属配置 (`application-cassandra.yml`) ```yaml spring: data: cassandra: keyspace-name: user_keyspace contact-points: localhost port: 9042 local-datacenter: datacenter1 schema-action: create_if_not_exists ``` #### MySQL专属配置 (`application-mysql.yml`) ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/user_db username: root password: rootpass driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true ``` ### 项目特点 1. **模块化分离**:不同数据库的实现完全隔离 2. **条件化配置**:通过`@ConditionalOnProperty`动态选择数据源 3. **统一接口**:服务层通过通用接口访问不同数据库 4. **实体隔离**:MySQLCassandra实体类独立存放 5. **配置分离**:不同数据库使用独立的配置文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值