Spring Boot 整合 Docker SequoiaDB 完全详解

854 阅读7分钟

“这是我参与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 环境下操作

  1. 到 Ubuntu 环境下创建一个文件夹 ~/docker/SequoiaDB

    cd
    mkdir -p /docker/SequoiaDB
    
  2. 进入我们创建的文件夹

    cd ~/docker/SequoiaDB
    
  3. 创建一个 docker-compose 文件

    touch docker-compose.yml
    
  4. 使用 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
    
  5. 保存退出 先按键盘上的 Esc,然后 Shift + :,输入 wq 后回车

  6. 运行编写好的 docker-compose.yml

    docker-compose -f docker-compose.yml up -d
    
  7. 检查启动状态

    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 !
    
  8. 配置 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
    
  9. 使用客户端来连接到 mysql 实例

    mysql -h127.0.0.1 -P3306 -uroot -p
    

    默认是没有密码的,所以直接回车就可以连接上啦!

  10. 销毁集群的方法

    docker-compose -f docker-compose.yml down
    

(2)搭建三副本高可用集群

详细步骤

和上面的步骤大致相同,不同的只是 docker-compose 文件

  1. 创建 docker-compose-cluster.yml 文件

    touch docker-compose-cluster.yml
    
  2. 将下面的内容添加到文件中并保存退出

    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
    
  3. 运行 yml 来启动集群

    docker-compose -f docker-compose-cluster.yml up  -d
    
  4. 查看启动状态

    docker logs -f sdbmysql
    
  5. 销毁集群的方法

    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 测试是否连接上

  1. 这里作者使用的是 DataGrip 工具,读者也可以用别的工具来实现这个操作。

  1. 接下来我们创建一个 springboot_db 数据库,我们的整合工作也主要在 springboot_db 中进行

    create database springboot_db;
    
  2. 在数据库中创建一个表

    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,

localhost:8080/user/add/小明/21

localhost:8080/user/add/小黄/23

查找所有 User,

localhost:8080/user/get/

4. 删除用户

localhost:8080/user/remove/lwj

localhost:8080/user/get/

至此我们的文章主要内容就没有啦!

可能的问题及解决方案

1. 端口占用

​ 通常是因为安装宿主机已经安装其他数据库产品导致 3306 端口被占用,这时候可以通过修改上面的 docker-compose.yml 文件来更改端口映射。

      ports:
         - "3307:3306"

参考文档

sequoiadb/sequoiadb - Docker Image | Docker Hub

产品概述_SequoiaDB 简介_文档中心_SequoiaDB巨杉数据库