本文主要说明如何基于阿里云数据库文件存储DBFS搭建MySQL数据库。

背景信息

云上自建数据库通常会选用云盘和ext4文件系统作为MySQL数据库的文件存储。而基于DBFS构建,不但简化了用户基于块存储架构的复杂度,而且面向数据库场景,提供了原子写、在线扩容、关键IO加速等特性。DBFS旨在为用户提供更高的性能、更好的数据可靠性可用性及易用性等。

DBFS优势如下表所示:
对比项 基于云盘+ext4构建 基于DBFS构建
原子写 不支持。 支持。避免Double Write Buffer的影响。
在线扩容 不可控IO Hang现象。 业务友好。
高可用 单机架构。 共享存储双机高可用架构。
易用性 需要管理云盘块设备,并且制作ext4。 挂载即用。

存储计算分离架构图:

cunji_bp

基于DBFS构建MySQL数据库

以下主要详细介绍如何基于DBFS构建MySQL的存储计算分离架构:

  1. 申请DBFS服务
    请参考“申请与创建”。
  2. 安装MySQL

    从官网下载安装包:

    #下载MySQL二进制包
    wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

    解压到DBFS挂载目录:

    #解压重命名,放置到DBFS的挂载目录“/mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr9**************”。

    挂载目录需要根据真实的环境,进行自行调整。可输入“df -h”显示挂载信息,结果如图所示。

    文件系统          容量   已用  可用   已用% 挂载点
    devtmpfs         16G     0   16G    0% /dev
    tmpfs            16G  288K   16G    1% /dev/shm
    dbfs_server     100G   46M  100G    1% /mnt/dbfs/hgsrb6i****/dbfs-ytr9rtr9**************

    使用如下命令检查创建好的数据库文件存放目录

    ls -lrt

    结果如图所示

    总用量 0
    drwxr-xr-x 1 root root 0 11月 18 18:53 mysql-5.7.26
  3. 初始化MySQL数据库
    1. 创建数据文件存放目录

      在DBFS服务挂载目录下,创建数据库目录“my3307”,可输入“ls -lrt”查看创建情况,如图所示

      总用量 0
      drwxr-xr-x 1 root root 0 11月 18 18:53 mysql-5.7.26
      drwxr-xr-x 1 root root 0 11月 18 19:30 my3307                             

      创建数据库文件子目录,切换到“my3307”目录,之后输入以下命令,创建子目录

       mkdir data log run tmp                          

      输入“ls -lrt”命令检查创建好的数据库文件存放目录

      总用量 1024
      -rw-r--r-- 1 root root 5339 11月 18 19:27 my.cnf
      drwxr-xr-x 1 root root    0 11月 18 19:30 tmp
      drwxr-xr-x 1 root root    0 11月 18 19:30 run
      drwxr-xr-x 1 root root    0 11月 18 19:30 log
      drwxr-xr-x 1 root root    0 11月 18 19:32 data
    2. 创建数据库

      MySQL数据库的配置文件“my.cnf”,请参考MySQL 5.7配置文件参考

      首先初始化MySQL数据库

      /mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr*************/mysql-5.7.26/bin/mysqld --defaults-file=/mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr9*************/my3307/my.cnf --initialize-insecure --user=root

      data目录下输入“ls -lrt”查看初始化完成后的data目录,结果如图所示

      总用量 4160512
      -rw-r----- 1 root root 1073741824 11月 18 19:27 ibdata1
      -rw-r----- 1 root root 1073741824 11月 18 19:27 ibdata2
      -rw-r----- 1 root root  524288000 11月 18 19:28 ib_logfile0
      -rw-r----- 1 root root  524288000 11月 18 19:28 ib_logfile1
      -rw-r----- 1 root root  524288000 11月 18 19:29 ib_logfile2
      -rw-r----- 1 root root  524288000 11月 18 19:29 ib_logfile3
      -rw-r----- 1 root root         56 11月 18 19:29 auto.cnf
      drwxr-x--- 1 root root          0 11月 18 19:29 performance_schema
      drwxr-x--- 1 root root          0 11月 18 19:29 mysql
      drwxr-x--- 1 root root          0 11月 18 19:29 sys
      -rw-r--r-- 1 root root        406 11月 18 19:29 ib_buffer_pool
      -rw-r----- 1 root root   12582912 11月 18 19:30 ibtmp1
      -rw-r--r-- 1 root root          5 11月 18 19:30 dbfs-node-1.pid
      drwxr-x--- 1 root root          0 11月 18 19:32 sbtest
  4. 运行MySQL数据库

    通过DBFS挂载点下MySQL二进制安装目录中的mysqld拉起数据库:

    
    /mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr9*************/mysql-5.7.26/bin/mysqld --defaults-file=/mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr9************/my3307/my.cnf --user=root &
                            

    登录MySQL数据库:

    /mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr9************/mysql-5.7.26/bin/mysql -uroot --socket=/mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr9**************/my3307/run/mysql.sock

    输出结果如下

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 2
    Server version: 5.7.26-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
                            
  5. sysbench测试
    • sysbench准备

      执行如下命令下载sysbench

      git clone https://github.com/akopytov/sysbench.git -b 1.0.17

      执行如下命令安装sysbench

      sh autogen.sh
      ./configure
      make && make install

      登录MySQL数据库

      /mnt/dbfs/hgsrb6*****/dbfs-ytr9rtr9*************/mysql-5.7.26/bin/mysql -uroot --socket=/mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr9**************/my3307/run/mysql.sock

      在MySQL中执行如下命令,创建sysbench测试账号

      create user 'sbtest'@'%';
      create database  sbtest;
      grant all privileges on *.* to 'sbtest'@'%' identified by 'sbtest';

      执行如下命令,初始化数据

      sysbench --db-driver=mysql --report-interval=1 --mysql-table-engine=innodb \
      --oltp-table-size=10000 --oltp-tables-count=32 --threads=32 --time=1000 \
      --mysql-host=127.0.0.1 --mysql-port=3307 --mysql-user=sbtest --mysql-password=sbtest \
      --mysql-db=sbtest /opt/sysbench/tests/include/oltp_legacy/oltp.lua prepare

      执行如下命令,跑OLTP模型

      sysbench --db-driver=mysql --report-interval=1 --mysql-table-engine=innodb \
      --oltp-table-size=10000 --oltp-tables-count=32 --threads=32 --time=1000 \
      --mysql-host=127.0.0.1 --mysql-port=3307 --mysql-user=sbtest --mysql-password=sbtest \
      --mysql-db=sbtest /opt/sysbench/tests/include/oltp_legacy/oltp.lua run
                                      
    • 性能数据

      性能数据参考《MySQL 性能测试