0. 前言
随着国产化进程的加速推进,众多关键业务领域正逐步开启国产化转型。例如,操作系统和数据库系统等核心组件,都在向国产解决方案迁移。相较于国外产品,国产化方案可以有效缓解“卡脖子”带来的问题,还能有效保障数据安全,提供更加定制化的服务。
崖山数据库(YaShan DataBase)是深圳计算科学研究院自主研发的一款国产数据库, 自己搞了一个”有界计算“理论,高度兼容Oracle数据库。而在11.14号崖山数据库推出了YashanDB V23.3版本,宣称1:1平替Oracle,提供单机主备、共享集群、分布式等形态,且性能强劲,可用性高。
我通过了崖山数据库的管理员认证(YCA认证),正在备考更高级的认证(YCP),听说集群版本可以公开体验,准备测试一下。
本文包括安装部署和性能测试两部分。
文章目录
-
- 0. 前言
- 1.环境搭建
-
- 1.1 安装前准备
- 1.2 主机安装
-
- 1.2.1 命令行安装
- 1.2.2 可视化安装
- 1.3 **客户端**安装
- 2.性能测试
-
- 2.1 单次查询
- 2.2 批量查询
- 2.3 压力测试
- 2.4 QPS测试
- 2.5 高可用测试
- 3.结论
- 4.代码附录
-
- 4.1 单次查询速度测试
- 4.2 批量查询测试
- 4.3 压力测试
- 4.4 QPS测试
- 4.5 高可用测试
1.环境搭建
高可用使用虚拟机进行测试,搭建一主一备的环境,模拟常见使用环境.
首先安装好系统、设置主机名和固定ip地址。这里不再赘述,
| 角色 | 主机名 | CPU/内存/硬盘 | 局域网IP地址 | 系统 |
|---|---|---|---|---|
| 主机 | YashanDB1 | 4/4GB/50GB | 192.168.7.227 | Centos 8.1 |
| 备机1 | YashanDB2 | 4/4GB/50GB | 192.168.7.231 | Centos 8.1 |
| 存储服务器 | YashanDB3 | 4/4GB/50GB | 192.168.7.232 | Centos 8.1 |
1.1 安装前准备
官网推荐创建一个新用户安装YashanDB数据库:
# 创建用户
useradd yashan
# 创建用户组
groupadd YASDBA && usermod -a -G YASDBA yashan
# 设置免密登录(需要有sudo命令)
echo "yashan ALL=(ALL)NOPASSWD:ALL" | EDITOR='tee -a' visudo
# 设置密码
passwd yashan
当然,集群一个一个地设置非常麻烦,于是我写了一个脚本,需要主机有sudo命令,使用的时候只需要传密码参数即可:
使用:wget -qO- http://dl.foxhank.top/yashandb_preinstall.sh | sh /dev/stdin <新用户密码>
如:wget -qO- http://dl.foxhank.top/yashandb_preinstall.sh | sh /dev/stdin 114514
如果主机没有sudo命令,需要首先下载:apt install sudo(deb)/yum install sudo(rpm)
#!/bin/bash
# Check if a password parameter has been provided
if [ -z "$1" ]; then
echo "Please enter the password:"
read -s password
else
password=$1
fi
# Add user 'yashan' with home directory, bash shell, and set the password
useradd -m -d /home/yashan -s /bin/bash yashan
echo "yashan:$password" | chpasswd
# Create the YASDBA group and add user 'yashan' to this group
groupadd YASDBA
usermod -aG YASDBA yashan
# Check for the existence of the /etc/sudoers file
if [ ! -f "/etc/sudoers" ]; then
# Check if the visudo command exists
if command -v visudo > /dev/null 2>&1; then
echo "visudo command detected but /etc/sudoers file not found. This might be a non-standard configuration, please check."
else
echo "sudo package not detected. Please try to install it using the following methods:"
echo "Debian/Ubuntu/Deepin: apt-get install sudo"
echo "Redhat/Centos: yum install sudo"
exit 1
fi
fi
# Add 'yashan ALL=(ALL)NOPASSWD:ALL' to the sudoers file
# Use visudo to avoid potential issues from directly editing /etc/sudoers
echo "yashan ALL=(ALL)NOPASSWD:ALL" | EDITOR='tee -a' visudo
echo "Script execution completed."
[root@localhost ~]# wget -qO- http://dl.foxhank.top/yashandb_preinstall.sh | sh /dev/stdin 114514
yashan ALL=(ALL)NOPASSWD:ALL
Script execution completed.

1.2 主机安装
首先需要下载安装包:YashanDB 下载中心
mkdir -p /home/yashan/install && cd /home/yashan/install
wget https://linked.yashandb.com/upload1010/yashandb-23.2.4.100-linux-x86_64.tar.gz && tar -zxvf yashandb-*.gz
1.2.1 命令行安装
切换到安装目录后生成配置文件:需要把<上文设置的密码>更改为刚才设置的密码
./bin/yasboot package ce gen \
--cluster yashandb \
-u yashan \
-p <上文设置的密码> \
--ip 192.168.7.227,192.168.7.231 \
--port 22 \
--install-path /data/yashan/yasdb_home \
--data-path /data/yashan/yasdb_data \
--begin-port 1688 \
--node 2 \
--data /dev/yas/data \
--vote /dev/yas/vote \
--ycr /dev/yas/ycr
参数详解:[yasboot package | YashanDB Doc](https://doc.yashandb.com/yashandb/23.2/zh/工具手册/yasboot/yasboot命令介绍/yasboot package.html)
| 参数 | 含义 | 值 |
|---|---|---|
| –cluster | 集群安装,集群名称 | 名称:yashandb |
| -u | 服务器ssh用户名 | yashan |
| -p | ssh密码 | 刚才设置的密码,比如我设为114514 |
| –ip | 集群内服务器ip地址 | 集群内网ip地址 |
| –port | ssh端口 | 22 |
| –install-path | 安装目录,保持默认即可 | /data/yashan/yasdb_home |
| –data-path | 数据存放目录,保持默认即可 | /data/yashan/yasdb_data |
| –begin-port | 数据库起始端口 | 默认:1688 |
| –node | 节点数量 | 2 |
| –data | 绑定的数据盘路径 | /dev/yas/data |
| –vote | 投票盘路径,协调集群内各个节点工作 | /dev/yas/vote |
| –ycr | 绑定的YCR盘路径 | /dev/yas/ycr |
执行完毕后,当前目录下将生成yashandb.toml(数据库集群的配置文件)和hosts.toml(服务器的配置文件)两个配置文件,可对其进行手动修改,这里保持默认.
随后执行安装命令:
./bin/yasboot package install -t hosts.toml -i yashandb-23.2.4.100-linux-x86_64.tar.gz
进行数据库部署:
./bin/yasboot cluster deploy -t yashandb.toml --yfs-force-create
提示task completed, status: SUCCESS即为安装成功.
随后重启数据库执行更改:
./bin/yasboot cluster restart -c yashandb
1.2.2 可视化安装
共享集群部署仅支持使用命令行安装,可视化安装为分布式部署:
分布式部署可以将数据库系统分散到多个独立的计算节点上,每个节点都拥有自己的存储和计算资源,并且能够独立处理查询请求。单个节点发生故障,其他节点仍然可以继续工作。
而共享集群部署是在一个或多个机器上运行多个数据库实例,所有实例共享同一套硬件资源(如CPU、内存、存储等)。数据库的读写操作会被分布到不同的实例上执行,但底层的数据存储是共享的。这种部署方式的写操作必须通过单一的主节点进行;而且如果共享的存储出现故障,整个集群都会受到影响。
简单的说:分布式部署通过多个独立节点横向扩展,适合高可用性和大规模数据处理,而共享集群部署则是在多个实例间共享同一套硬件资源,更适合简化管理和读取扩展。
运行下面命令打开web页面(需要先在防火墙放开9001端口):
./bin/yasom --web --listen 0.0.0.0:9001
之后打开ip:9001,即可进入配置页面


点击”尝试连接“,显示连接成功即完成。

下一步是设置权限。但因为上文已经给了sudo权限,所以直接默认设置跳过即可:

节点规模设置填写部分可以按照上文表格,选择节点数量,节点端口默认为1688

之后一直下一步即可,提示安装成功即完成安装流程.
1.3 客户端安装
访问客户端,下载对应系统的安装包:这里以Windows系统安装amd64版本为例:

下载后解压到一个文件夹后,在“我的电脑”点击右键,选择“属性”-”高级系统设置“

随后选择“环境变量”,在Path变量增加刚才解压出来的两个文件夹:

然后Win+R打开CMD,输入命令测试:
yasql <用户名>/<密码>@<主机ip地址>:1688

出现SQL>则表示连接成功.
2.性能测试
为了直观地测试数据库性能,我写了一系列python脚本进行测试,python安装参考[YashanDB Python驱动使用介绍 | YashanDB Doc](https://doc.yashandb.com/yashandb/23.2/zh/开发手册/Python驱动/YashanDB Python驱动使用介绍.html)
这里踩了一个小坑:安装python的路径最好不要有中文,否则会出现YAS-08045空指针错误。同时非常感谢群内的数据库大佬,非常耐心地为我一步一步排查问题!
由于代码过长,均放置于4.代码附录部分:
2.1 单次查询
可以通过对创建(create)、查询(select)、插入(insert)、和删除(delete)这四种基本操作的执行时间进行比较。
在同服务器部署的环境下,崖山数据库在这四个方面的操作执行时间上均展示出良好表现。特别是创建表的操作,MySQL在处理创建表请求时花费了大约两秒钟的时间才完成响应,而相比之下,崖山数据库仅用了0.11秒即完成了相同的操作。这一结果依靠于崖山数据库原创的“有界计算理论”,在处理DDL(数据定义语言)语句非常高效,在面对大规模或复杂的表结构创建时,能够提供更快捷的服务响应速度。
对于其他三种操作,即查询、插入和删除,崖山数据库同样展示了比MySQL更为优越的性能特点。在高并发访问环境下,这种优化就显得尤为重要了。

2.2 批量查询
为了测试大量数据插入的情景,随机生成一万个整数、和一千个浮点数,分别对崖山数据库、mysql数据库执行插入、修改、删除操作:

可以看到,崖山数据库在插入、更新、删除的表现均优于MySQL,这对于大量数据插入的场景时可以有显著的效果提升。甚至在部分场景,崖山数据库的操作时间是mysql的一半以上。
2.3 压力测试
为了评估崖山数据库在处理大量数据写入时的I/O性能,对其执行压力测试:持续三十秒内的插入、修改和删除操作,并记录每个操作的响应时间。

测试结果显示,崖山数据库的延迟表现极其出色,平均插入和删除操作的时间仅需0.几毫秒,同时在没有建立索引的情况下,查询操作的响应时间也稳定在1毫秒左右。
这表明崖山数据库在高负载条件下仍能保持高效的事务处理能力,非常适合用于应用后端数据库。
Pressure test completed over 30 seconds.
Total operations performed: 2001
Average time for update_data: 0.0005 seconds
Average time for insert_data: 0.0006 seconds
Average time for select_data: 0.0010 seconds
Average time for delete_data: 0.0005 seconds
2.4 QPS测试
QPS压力测试是测试数据库不可不尝的一环,还是对数据库进行30s的查询操作,测试耗时和响应速度。
我的主机是一块西数4TB蓝盘,7200转,结果非常理想,几乎达到了磁盘I/O上限。平均查询只要0.3毫秒。QPS达到了3097,几乎是这块硬盘的上限了。
Total operations performed: 92914
Total time taken: 30.0004 seconds
Queries per second (QPS): 3097.0937
Average response time for select: 0.0003 seconds

可以说完全可以胜任大型业务的后端数据库了。
2.5 高可用测试
高可用的目的就是当一个服务器因为各种各样奇奇怪怪的原因死机之后仍能提供正常服务。那么就模拟“拔电源”操作,进行持续120s的读写,但是在50s时对集群某台幸运服务器进行断电操作!
使用python记录响应时间,在50s通过ssh连接到集群内备用机并执行init 0命令。在50s时间段(标注小箭头处,由于线程原因断电时间比红线要略早一点点),响应时间有大幅度上升,但是在5s左右集群便进行了自我恢复,响应时间显著,影响业务时间极短,效果非常理想。

3.结论
经过测试,崖山数据库在数据增删改查操作上均表现了非常优异的性能,相较mysql有不错的性能提升。在国产化进程推进的今天,崖山数据库非常适合用于Oracle、mysql数据库之类的国产替代,同时相对于 Oracle 之类的大型数据库安装部署也更简单,特别适合个人初学者的数据库入门学习。
4.代码附录
4.1 单次查询速度测试
import yasdb
import mysql.connector
import matplotlib
matplotlib.use('Agg') # 使用非交互式后端,适合无头环境
import matplotlib.pyplot as plt
import time
# 连接到崖山数据库
yasdb_connection = yasdb.connect(host="192.168.7.112", port=1688, user="sys", password="root")
yasdb_cursor = yasdb_connection.cursor()
# 连接到第二个数据库 (MySQL)
mysql_connection = mysql.connector.connect(
host="127.0.0.1",
port=3306,
user="test",
password="114514",
database="data" # 指定测试数据库名称
)
mysql_cursor = mysql_connection.cursor()
# 准备列表来存储各个操作的名称和它们对应的执行时间
operations = []
times_yasdb = []
times_mysql = []
def measure_time(operation_name, operation_func_yasdb, operation_func_mysql):
start_time = time.time()
operation_func_yasdb()
end_time = time.time()
elapsed_time_yasdb = end_time - start_time
start_time = time.time()
operation_func_mysql()
end_time = time.time()
elapsed_time_mysql = end_time - start_time
operations.append(operation_name)
times_yasdb.append(elapsed_time_yasdb)
times_mysql.append(elapsed_time_mysql)
# 定义要测试的操作(为每个数据库定义)
def create_table_yasdb():
yasdb_cursor.execute("drop table if exists bind_param_heap_1")
yasdb_cursor.execute("create table bind_param_heap_1(a int, b double, c int)")
def create_table_mysql():
mysql_cursor.execute("DROP TABLE IF EXISTS bind_param_heap_1")
mysql_cursor.execute("CREATE TABLE bind_param_heap_1(a INT, b DOUBLE, c INT)")
def insert_data_yasdb():
yasdb_cursor.executemany("insert into bind_param_heap_1 values(:1, :2, :3)", [
(1, 10, 30), (2, 20, 40)


1557

被折叠的 条评论
为什么被折叠?



