(四)ShardingSphere入门读写分离和公共表
程序员文章站
2022-07-13 17:53:59
...
读写分离
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
使用ShardingSphere实现读写分离,首先是基于MySQL自身的bin-log日志实现主从复制,之后进行读写治理的工具。所以需要使用ShardingSphere实现数据的读写分离,需要先将MySQL配置主从复制。MySQL的主从复制配置方式网上有很多教程,很简单,提炼一些主要步骤
-- master 上运行 创建一个slave 账号
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'admin';
FLUSH PRIVILEGES;
-- 查看主数据库的binlog信息 记录binlog文件名称和position
SHOW MASTER STATUS;
-- slave 数据库
STOP SLAVE;
-- 修改 从数据库 同步master 修改自己的master地址,刚刚创建slave用户和bin-log和position
CHANGE MASTER to master_host='localhost',master_user='slave',master_password='admin',
master_log_file='mysql-bin.000001',master_log_pos=1026;
-- 查看slave状态 主要看Slave_IO_Runing 和 Slave_SQL_Running 保证这2个都是YES 如果一个为NO都不行
SHOW SLAVE STATUS \G;
# 这里我就使用了同一个数据库没有配置主从复制,就用同一个MySQL不同数据库模拟一下主从复制,最终看到的效果就是test_master这个数据库会有数据插入,test_slave没有,读取的时候只会从test_slave这个数据库读取,如果需要配置参考上面步骤
spring:
shardingsphere:
# 所有数据库的别名
datasource:
names: master,slave
# 具体数据库的配置信息
master:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/test_master?serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: admin
slave:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/test_slave?serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: admin
# 分表分库策略
sharding:
# 需要分表的策略
tables:
# 表名前缀
user:
# 注意这里的ds0 是配置主从复制上面master 的别名
actual-data-nodes: ds0.user
# 主键生成规则 默认使用雪花算法
key-generator:
column: id
type: SNOWFLAKE
# 分表策略
table-strategy:
inline:
algorithm-expression: user
sharding-column: id
master-slave-rules:
# ds0 表示一个主从复制集群的别名
ds0:
master-data-source-name: master
# 可以配置多个slave
slave-data-source-names:
- slave
props:
# 实际生成SQL
sql:
show: true
main:
allow-bean-definition-overriding: true
@RunWith(SpringRunner.class)
@ActiveProfiles("readWriteSeparation")
@SpringBootTest
public class ReadWriteSperationTest {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert() {
IntStream.range(0, 10).forEach(i -> {
User user = new User();
user.setName("name" + i);
user.setAge(10 + i);
userMapper.insert(user);
});
}
@Test
public void testFind(){
userMapper.selectList(null).forEach(System.out::println);
}
@Test
public void testFindByCondition(){
userMapper.selectList(Wrappers.lambdaQuery(User.class).ge(User::getAge,15)).forEach(System.out::println);
}
}
公共表
公共表 一般用于存储相对固定的数据,表结构和数据很少变化,而且查询经常关联,类似一个数据字典
在每一个数据库都创建相同的公共表,并保证每个库中的公共表数据一致
配置与其他yml类似多一个配置而已
spring:
shardingsphere:
sharding:
broadcast-tables:
- t_config
上一篇: 杭电OJ 1129(C++)
下一篇: 从0到1,一个普本学生的三年学习历程