MySQL和MariaDB单实例压测对比

根据 MariaDB 官网的文章 https://mariadb.com/resources/blog/benchmark-mariadb-vs-mysql-on-commodity-cloud-hardware/ 修改而来。

本次压测使用默认的 docker 容器,未经任何配置。

先将本次使用的压测脚本放出来:

#!/bin/bash

# set -eux

is_exists=0
command -v sysbench >/dev/null 2>&1 || { is_exists=1; }

if [ $is_exists -ne 0 ]; then
    echo 'sysbench 命令不存在,安装 sysbench'
    source /etc/os-release
    if [ $ID == 'arch' ]; then
        sudo pacman -Syy
        sudo pacman -S sysbench --noconfirm
    elif [ $ID == 'ubuntu' || $ID == 'debian' ]; then
        sudo apt update
        sudo apt install -y sysbench
    else
        echo '未知发行版'
        exit 1
    fi
    echo 'sysbench 已安装'
fi

# 输入认证信息
# read -p 'MySQL host: ' mysql_host
# read -p 'MySQL port: ' mysql_port
# read -p 'MariaDB host: ' mariadb_host
# read -p 'MariaDB port: ' mariadb_port
# read -p 'user: ' user
# read -p 'password: ' password
# 认证信息输入完毕

mysql_ctn='mysql_bench'
mariadb_ctn='mariadb_bench'
mysql_port=33061
mariadb_port=33062
password=123456

# 测试前删除重名测试容器
docker rm $mysql_ctn -f
docker rm $mariadb_ctn -f
# 创建 bench 容器
docker run -itd --name $mysql_ctn -p $mysql_port:3306 -e MYSQL_ROOT_PASSWORD=$password mysql
docker run -itd --name $mariadb_ctn -p $mariadb_port:3306 -e MARIADB_ROOT_PASSWORD=$password mariadb

host=172.17.0.1

# 创建后休息 10 秒等容器完全启动
sleep 10

echo '创建 bench 数据库'
docker exec -it $mysql_ctn mysql -uroot -p$password -e 'CREATE DATABASE sysbench'
docker exec -it $mariadb_ctn mariadb -uroot -p$password -e 'CREATE DATABASE sysbench'
echo '数据库已创建'

echo '准备数据'
sysbench oltp_read_write --mysql-host=$host --mysql-port=$mysql_port --mysql-user=root --mysql-password=$password --mysql-db=sysbench --table-size=1000000 --tables=10 --threads=16 --auto-inc=off --secondary=off --create_secondary=off prepare
sleep 3
sysbench oltp_read_write --mysql-host=$host --mysql-port=$mariadb_port --mysql-user=root --mysql-password=$password --mysql-db=sysbench --table-size=1000000 --tables=10 --threads=16 --auto-inc=off --secondary=off --create_secondary=off prepare


# 压测
BASEDIR="$HOME/sysbench"
if [ ! -d $BASEDIR ]; then
    mkdir -p $BASEDIR
fi
cd $BASEDIR
rm -rf $BASEDIR/logs*
exec 3>&1 4>&2 1>> sysbench.log 2>&1

# 8, 16, 32, 64, 128
THERAD_NUMBER="8 64 128"

round=0
# 跑 10 轮测试
while [ $round -le 10 ]; do
    round_dir=$BASEDIR/logs-${round}
    mkdir -p ${round_dir}

    for thread in `echo "${THERAD_NUMBER}"`; do
        sysbench oltp_read_write --point-selects=9 --range-selects=false --index-updates=0 --non-index-updates=1 --delete-inserts=0 --time=300 --tables=10 --table-size=1000000 --rand-type=uniform --report-interval=10 --mysql-db=sysbench --mysql-host=$host --mysql-port=$mysql_port --mysql-user=root --mysql-password=$password --threads=$thread --rand-seed=12341 run >> ${round_dir}/sysbench_mysql_${thread}.log        
        sysbench oltp_read_write --point-selects=9 --range-selects=false --index-updates=0 --non-index-updates=1 --delete-inserts=0 --time=300 --tables=10 --table-size=1000000 --rand-type=uniform --report-interval=10 --mysql-db=sysbench --mysql-host=$host --mysql-port=$mariadb_port --mysql-user=root --mysql-password=$password --threads=$thread --rand-seed=12341 run >> ${round_dir}/sysbench_mariadb_${thread}.log
        # 不同线程之间休息 5 分钟
        sleep 300
    done

    round=`expr $round + 1`
    # 每轮压缩之间停顿 5 分钟
    sleep 300
done

# 删除测试容器
docker rm $mysql_ctn -f
docker rm $mariadb_ctn -f

下面是本次压测用到的 MySQL 和 MariaDB 版本信息:

mariadb  Ver 15.1 Distrib 10.6.5-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
mysql  Ver 8.0.27 for Linux on x86_64 (MySQL Community Server - GPL)

下面是本机配置信息:

OS: Arch Linux x86_64
Kernel: 5.15.10-arch1-1
CPU: Intel i7-9700 (8) @ 4.700GHz
Memory: 6378MiB / 15662MiB

准备数据(命令已包含在上面的脚本中):

sysbench oltp_read_write --mysql-host=localhost --mysql-user=root --mysql-password=123456 --mysql-db=sysbench --table-size=1000000 --tables=10 --threads=10 --auto-inc=off --secondary=off --create_secondary=off prepare

压测(命令已包含在上面的脚本中):

sysbench oltp_read_write --point-selects=9 --range-selects=false --index-updates=0 --non-index-updates=1 --delete-inserts=0 --time=300 --tables=10 --table-size=1000000 --rand-type=uniform --report-interval=10 --mysql-db=sysbench --mysql-host=localhost --mysql-user=root --mysql-password=123456 --threads=16 --rand-seed=12341 run

100W 条数据分别以 8、64、128 线程压测 10 轮,得到的结果有些出人意料,我并没有看到网上所传的 MariaDB 性能比 MySQL 高,不论是 TPS 还是延迟,MySQL 都辗压 MariaDB。

当然,受于硬件限制,本次压测与官网中的压测条件不能相提并论,TPS 很难达到官网中的那么高。

各线程 10 轮 TPS 结果

8 线程压测下 MySQL 和 MariaDB 的 TPS 对比

64 线程压测下 MySQL 和 MariaDB 的 TPS 对比

128 线程压测下 MySQL 和 MariaDB 的 TPS 对比

10 轮最终结果的 TPS 和延迟汇总

MySQL和MariaDB的延时对比.png

结论

从上面的图表能够看出来,MySQL 辗压 MariaDB 没毛病吧?

我还是老老实实地用 MySQL 吧。

posted @ 2021-12-24 21:21  thepoy  阅读(174)  评论(0编辑  收藏  举报