本文主要说明如何基于阿里云数据库文件存储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

    从Oracle官网下载安装包:

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

    解压到DBFS挂载目录:

    #解压重命名,放置到DBFS的挂载目录“/mnt/dbfs/v-bp196g0zi82d0pqte8r9”。
    #挂载目录需要根据真实的环境,进行自行调整。
    [root@iZbp156ycm6s06xjdb8acoZ ~]# df -h
    文件系统        容量  已用  可用 已用% 挂载点
    devtmpfs         16G     0   16G    0% /dev
    tmpfs            16G  288K   16G    1% /dev/shm
    dbfs_server     100G   46M  100G    1% /mnt/dbfs/v-bp196g0zi82d0pqte8r9
    [root@iZbp156ycm6s06xjdb8acoZ v-bp196g0zi82d0pqte8r9]# ls -lrt
    总用量 0
    drwxr-xr-x 1 root root 0 11月 18 18:53 mysql-5.7.26
    						
  3. 初始化MySQL数据库
    1. 创建数据文件存放目录

      在DBFS服务挂载目录下,创建数据库目录”my3307“:

      #创建位于DBFS上的数据目录
      [root@iZbp156ycm6s06xjdb8acoZ v-bp196g0zi82d0pqte8r9]# 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”目录,创建子目录
      [root@iZbp156ycm6s06xjdb8acoZ my3307]# mkdir data log run tmp
      
      #检查创建好的数据库文件存放目录
      [root@iZbp156ycm6s06xjdb8acoZ my3307]# 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配置文件参考

      以下主要介绍“LD_PRELOAD”高性能的使用方法,其它使用方式请参考“快速入门“栏目中的使用方式章节内容。

      #初始化MySQL数据库。
      #DBFS_HOME的中值,通过dbfs_get_home_path.sh fsid得到,其中fsid为“db8acoqte8r9”,以下类同。
      DBFS_HOME="/opt/dbfs/data/44a2444a-9c11-4612-93b2-916dedad1b0f/server/db8acoqte8r9" \
      LD_PRELOAD="/usr/lib64/libdbfs_hook.so" /mnt/dbfs/v-bp196g0zi82d0pqte8r9/mysql-5.7.26/bin/mysqld --defaults-file=/mnt/dbfs/v-bp196g0zi82d0pqte8r9/my3307/my.cnf --initialize-insecure --user=root
      
      #初始化完成后的data目录
      [root@iZbp156ycm6s06xjdb8acoZ data]# ls -lrt
      总用量 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拉起数据库:

    #通过LD_PRELOAD模式,拉起MySQL数据库进程。
    DBFS_HOME="/opt/dbfs/data/44a2444a-9c11-4612-93b2-916dedad1b0f/server/db8acoqte8r9" \
    LD_PRELOAD="/usr/lib64/libdbfs_hook.so" /mnt/dbfs/v-bp196g0zi82d0pqte8r9/mysql-5.7.26/bin/mysqld --defaults-file=/mnt/dbfs/v-bp196g0zi82d0pqte8r9/my3307/my.cnf --user=root &
    						

    登录MySQL数据库:

    #登录MySQL数据库
    DBFS_HOME="/opt/dbfs/data/44a2444a-9c11-4612-93b2-916dedad1b0f/server/db8acoqte8r9" \
    LD_PRELOAD="/usr/lib64/libdbfs_hook.so" /mnt/dbfs/v-bp196g0zi82d0pqte8r9/mysql-5.7.26/bin/mysql -uroot --socket=/mnt/dbfs/v-bp196g0zi82d0pqte8r9/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数据库
      DBFS_HOME="/opt/dbfs/data/44a2444a-9c11-4612-93b2-916dedad1b0f/server/db8acoqte8r9" \
      LD_PRELOAD="/usr/lib64/libdbfs_hook.so" /mnt/dbfs/v-bp196g0zi82d0pqte8r9/mysql-5.7.26/bin/mysql -uroot --socket=/mnt/dbfs/v-bp196g0zi82d0pqte8r9/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 性能测试