本文主要說明如何基于阿里云數據庫文件存儲DBFS搭建MySQL數據庫。
背景信息
云上自建數據庫通常會選用云盤和ext4文件系統作為MySQL數據庫的文件存儲。而基于DBFS構建,不但簡化了用戶基于塊存儲架構的復雜度,而且面向數據庫場景,提供了原子寫、在線擴容、關鍵IO加速等特性。DBFS旨在為用戶提供更高的性能、更好的數據可靠性可用性及易用性等。
DBFS優勢如下表所示:
對比項 | 基于云盤+ext4構建 | 基于DBFS構建 |
原子寫 | 不支持。 | 支持。避免Double Write Buffer的影響。 |
在線擴容 | 不可控IO Hang現象。 | 業務友好。 |
高可用 | 單機架構。 | 共享存儲雙機高可用架構。 |
易用性 | 需要管理云盤塊設備,并且制作ext4。 | 掛載即用。 |
基于DBFS構建MySQL數據庫
以下主要詳細介紹如何基于DBFS構建MySQL的存儲計算分離架構:
申請DBFS服務
請參考“申請與創建”。
安裝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
初始化MySQL數據庫
創建數據文件存放目錄
在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
創建數據庫
首先初始化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
運行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>
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 性能測試》