“这是我参与8月更文挑战的第1天,活动详情查看: 8月更文挑战” juejin.cn/post/698796… ”
SequoiaDB 简介
SequoiaDB 巨杉数据库是一款金融级分布式关系型数据库,主要面对高并发联机交易型场景提供高性能、可靠稳定以及无限水平扩展的数据库服务。
SequoiaDB 特性
- 完全兼容传统关系型数据,数据分片对应用程序完全透明
- 高性能与无限水平弹性扩展能力
- 分布式事务与 ACID 能力
- 同时支持结构化、半结构化与非结构化数据
- 金融级安全特性,多数据中心间容灾做到 RPO=0
- HTAP 混合负载,同时运行联机交易与批处理任务且互不干扰
- 多租户能力,云环境下支持多种级别的物理与逻辑隔离
Docker 部署 SequoiaDB
有关 Docker 的配置本文不做介绍,不是本文的主要内容
拉取镜像
docker pull sequoiadb/sequoiadb:v5.0.1
docker pull sequoiadb/sequoiasql-mysql:v5.0.1
(1)搭建单副本集群
详细步骤
以下的操作作者推荐在 wsl 环境下操作
-
到 Ubuntu 环境下创建一个文件夹 ~/docker/SequoiaDB
cd mkdir -p /docker/SequoiaDB -
进入我们创建的文件夹
cd ~/docker/SequoiaDB -
创建一个 docker-compose 文件
touch docker-compose.yml -
使用 vi 添加以下内容 进入 vi
vi docker-compose.yml添加如下内容,
version: "3" services: # 引擎配置 sdbserver: # 使用的镜像 image: sequoiadb/sequoiadb:v5.0.1 # 容器名 container_name: sdbserver # 主机名 hostname: "sdbserver" # 端口映射 ports: - "11810:11810" - "11814:11814" # 设置是否在 Docker 守护进程启动时重新启动 restart: always # 环境变量 environment: # 是否集群部署 SDB_DEPLOY: "true" # 编目节点列表 SDB_CATALOG: "sdbserver:11800" # 协调节点列表 SDB_COORD: "sdbserver:11810" # 数据节点列表 SDB_DATA: "group1=sdbserver:11820;group2=sdbserver:11830" # 集群时序服务端节点李彪 SDB_STP_SERVER: "sdbserver:9622" # 网络配置 networks: sdb-net: ipv4_address: "192.168.1.11" extra_hosts: - "sdbmysql:192.168.1.10" - "sdbserver:192.168.1.11" dns: - 223.5.5.5 - 223.6.6.6 # 实例配置 sdbmysql: image: sequoiadb/sequoiasql-mysql:v5.0.1 container_name: sdbmysql hostname: "sdbmysql" ports: - "3306:3306" restart: always environment: # 协调节点列表 MYSQL_SDB_COORD: "sdbserver:11810" networks: sdb-net: ipv4_address: "192.168.1.10" extra_hosts: - "sdbmysql:192.168.1.10" - "sdbserver:192.168.1.11" dns: - 223.5.5.5 - 223.6.6.6 depends_on: - sdbserver # docker 网络配置 networks: sdb-net: ipam: config: - subnet: 192.168.1.0/16 -
保存退出 先按键盘上的
Esc,然后Shift + :,输入 wq 后回车 -
运行编写好的 docker-compose.yml
docker-compose -f docker-compose.yml up -d -
检查启动状态
docker logs -f sdbmysql正常来说,看到以下输出则代表已经成功启动了
2021-08-08 06:25:47+00:00 INFO [Entrypoint]: Entrypoint script for MySQL Server 5.0.1 started. 2021-08-08 06:25:47+00:00 INFO [Entrypoint]: Starting init process ************ Deploy SequoiaSQL-MySQL ***************** Create instance: [name: MySQLInstance3306, port: 3306] 2021-08-08 06:25:55+00:00 INFO [Entrypoint]: MySQL init process done. Ready for start up. 2021-08-08 06:25:58+00:00 INFO [Entrypoint]: Mysql service startup is complete. 2021-08-08 06:26:03+00:00 INFO [Entrypoint]: Your sequoiadb-mysql service started successfully ! 2021-08-08 07:25:46+00:00 INFO [Entrypoint]: Entrypoint script for MySQL Server 5.0.1 started. 2021-08-08 07:25:46+00:00 INFO [Entrypoint]: Mysql instance MySQLInstance3306 already existed. 2021-08-08 07:25:48+00:00 INFO [Entrypoint]: Mysql service startup is complete. # 这一句代表已经启动成功 2021-08-08 07:25:54+00:00 INFO [Entrypoint]: Your sequoiadb-mysql service started successfully ! -
配置 mysql 客户端(可选) 这里我们使用 Linux 下的 mysql-client,如果读者的 wsl 下没有这个 client,可以使用以下命令来实现安装,
sudo apt install mysql-client-core-5.7但注意这里读者可能会遇到因为依赖文件缺失导致的安装失败,可以使用下面的命令来重新安装,
sudo apt-get update sudo apt install mysql-client-core-5.7 --fix-missing -
使用客户端来连接到 mysql 实例
mysql -h127.0.0.1 -P3306 -uroot -p默认是没有密码的,所以直接回车就可以连接上啦!
-
销毁集群的方法
docker-compose -f docker-compose.yml down
(2)搭建三副本高可用集群
详细步骤
和上面的步骤大致相同,不同的只是 docker-compose 文件
-
创建 docker-compose-cluster.yml 文件
touch docker-compose-cluster.yml -
将下面的内容添加到文件中并保存退出
version: "3" services: sdbserver1: image: sequoiadb/sequoiadb:v5.0.1 container_name: sdbserver1 hostname: "sdbserver1" ports: - "11810:11810" restart: always environment: SDB_DEPLOY: "true" SDB_COORD: "sdbserver1:11810,sdbserver2:11810,sdbserver3:11810" SDB_CATALOG: "sdbserver1:11800,sdbserver2:11800,sdbserver3:11800" SDB_DATA: "group1=sdbserver1:11820,sdbserver2:11820,sdbserver3:11820;group2=sdbserver1:11830,sdbserver2:11830,sdbserver3:11830" SDB_STP_SERVER: "sdbserver1:9622,sdbserver2:9622,sdbserver3:9622" networks: sdb-net: ipv4_address: "192.168.1.11" extra_hosts: - "sdbmysql:192.168.1.10" - "sdbserver1:192.168.1.11" - "sdbserver2:192.168.1.12" - "sdbserver3:192.168.1.13" dns: - 223.5.5.5 - 223.6.6.6 depends_on: - sdbserver2 - sdbserver3 sdbserver2: image: sequoiadb/sequoiadb:v5.0.1 container_name: sdbserver2 hostname: "sdbserver2" restart: always networks: sdb-net: ipv4_address: "192.168.1.12" extra_hosts: - "sdbmysql:192.168.1.10" - "sdbserver1:192.168.1.11" - "sdbserver2:192.168.1.12" - "sdbserver3:192.168.1.13" dns: - 223.5.5.5 - 223.6.6.6 sdbserver3: image: sequoiadb/sequoiadb:v5.0.1 container_name: sdbserver3 hostname: "sdbserver3" restart: always networks: sdb-net: ipv4_address: "192.168.1.13" extra_hosts: - "sdbmysql:192.168.1.10" - "sdbserver1:192.168.1.11" - "sdbserver2:192.168.1.12" - "sdbserver3:192.168.1.13" dns: - 223.5.5.5 - 223.6.6.6 sdbmysql: image: sequoiadb/sequoiasql-mysql:v5.0.1 container_name: sdbmysql hostname: "sdbmysql" ports: - "3306:3306" restart: always environment: MYSQL_SDB_COORD: "sdbserver1:11810,sdbserver2:11810,sdbserver3:11810" networks: sdb-net: ipv4_address: "192.168.1.10" extra_hosts: - "sdbmysql:192.168.1.10" - "sdbserver1:192.168.1.11" - "sdbserver2:192.168.1.12" - "sdbserver3:192.168.1.13" dns: - 223.5.5.5 - 223.6.6.6 depends_on: - sdbserver1 networks: sdb-net: ipam: config: - subnet: 192.168.1.0/16 -
运行 yml 来启动集群
docker-compose -f docker-compose-cluster.yml up -d -
查看启动状态
docker logs -f sdbmysql -
销毁集群的方法
docker-compose -f docker-compose-cluster.yml down
Spring Boot 整合
1. 准备工作
1.1 创建一个数据库用户
grant all privileges on *.* to lwj@'%' identified by '123456';
这里为了偷懒直接创建一个用户名为 lwj,密码为 123456,并且拥有最高权限的用户,但是如果小伙伴要上线的项目还是自己掂量一下哈
1.2 测试是否连接上
- 这里作者使用的是 DataGrip 工具,读者也可以用别的工具来实现这个操作。
-
接下来我们创建一个 springboot_db 数据库,我们的整合工作也主要在 springboot_db 中进行
create database springboot_db; -
在数据库中创建一个表
create table User ( id int auto_increment primary key, username varchar(32) not null comment '用户名', age int not null );
2. Spring Boot 工程配置
2.1 创建并添加 Spring Boot 依赖
2.2 数据库配置
修改 application.properties 文件为以下内容:
# 应用名称
spring.application.name=SequoiaDB-demo
# 数据库驱动:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源名称
spring.datasource.name=springboot_db
# 数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC
# 数据库用户名&密码:
spring.datasource.username=lwj
spring.datasource.password=123456
# 应用服务 WEB 访问端口
server.port=8080
2.3 工程结构
2.4 entity
User.class 内容如下,
@Data
@TableName("User")
public class User {
@TableId(type = IdType.AUTO)
private int id;
private String username;
private int age;
}
@Data 来自 Lombok 依赖
2.5 mapper
我们使用的是 mybatis-plus 作为 orm 框架,UserMapper 内容如下,
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
2.6 service
UserService.class
public interface UserService {
boolean insertUser(User user);
boolean deleteUser(String username);
User getUser(String username);
List<User> getAllUser();
}
其实现类,UserServiceImpl.class
@Service
public class UserServiceImpl implements UserService {
private UserMapper userMapper;
@Autowired
public UserServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public boolean insertUser(User user) {
return userMapper.insert(user) == 1;
}
@Override
public boolean deleteUser(String username) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username);
return userMapper.delete(queryWrapper) == 1;
}
@Override
public User getUser(String username) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username);
return userMapper.selectOne(queryWrapper);
}
@Override
public List<User> getAllUser() {
return userMapper.selectList(null);
}
}
实现基本的增删改查
2.7 controller
@RequestMapping("/user")
@RestController
public class UserController {
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/add/{username}/{age}")
public String addUser(@PathVariable String username, @PathVariable int age) {
User user = new User();
user.setUsername(username);
user.setAge(age);
if (userService.insertUser(user)) {
return "添加用户成功";
}
return "添加用户失败";
}
@RequestMapping("/remove/{username}")
public String removeUser(@PathVariable String username) {
if (userService.deleteUser(username)) {
return "移除用户成功";
}
return "移除用户失败";
}
@RequestMapping("/get/")
public List<User> listUser() {
return userService.getAllUser();
}
@RequestMapping("/get/{username}")
public User getUser(@PathVariable String username) {
return userService.getUser(username);
}
}
3. 测试结果
1. 添加 User
我们在浏览器输入,localhost:8080/user/add/lwj/18
2. 查找 User
我们输入来获取刚添加的 user,localhost:8080/user/get/lwj
3. 获取所有 User
首先我们继续添加若干 User,
查找所有 User,
4. 删除用户
localhost:8080/user/remove/lwj
至此我们的文章主要内容就没有啦!
可能的问题及解决方案
1. 端口占用
通常是因为安装宿主机已经安装其他数据库产品导致 3306 端口被占用,这时候可以通过修改上面的 docker-compose.yml 文件来更改端口映射。
ports:
- "3307:3306"