MySQL存储计算分离实践

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

背景信息

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

DBFS优势如下表所示:

对比项

基于云盘+ext4构建

基于DBFS构建

原子写

不支持。

支持。避免Double Write Buffer的影响。

在线扩容

不可控IO Hang现象。

业务友好。

高可用

单机架构。

共享存储双机高可用架构。

易用性

需要管理云盘块设备,并且制作ext4。

挂载即用。

基于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挂载目录:

    #解压并重命名为mysql-5.7.26,放置到DBFS的挂载目录“/mnt/dbfs/hgsrb6i*****/dbfs-ytr9rtr9**************”。
    tar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
    mv mysql-5.7.26-linux-glibc2.12-x86_64 mysql-5.7.26

    挂载目录需要根据真实的环境,进行自行调整。可输入“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                          

      在“my3307”目录下创建MySQL数据库的配置文件my.cnf,配置可参考MySQL 5.7配置文件参考

      输入“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数据库

      /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 性能测试