本问是一个系列文章的一部分,该系列较为完整的对各个云厂商的RDS MySQL进行了测试,包括了阿里云、腾讯云、华为云、百度云、AWS、Azure、GCP、Oracle Cloud等,更多参考:云数据库RDS MySQL的性能。
在不同的云厂商,购买相同规格的MySQL实例(如4vCPU-16GB),获得的性能相同吗?
为了回答上面的疑问,于是就开启了我的数据库性能测试之旅。这是第二次测试,上一次是在2023年12月(参考:云数据库(RDS MySQL)性能深度测评与对比)。
本问是一个系列文章的一部分,该系列较为完整的对各个云厂商的RDS MySQL进行了测试,包括了阿里云、腾讯云、华为云、百度云、AWS、Azure、GCP、Oracle Cloud等,更多参考:云数据库RDS MySQL的性能。
在不同的云厂商,购买相同规格的MySQL实例(如4vCPU-16GB),获得的性能相同吗?
为了回答上面的疑问,于是就开启了我的数据库性能测试之旅。这是第二次测试,上一次是在2023年12月(参考:云数据库(RDS MySQL)性能深度测评与对比)。
原本我一直是使用各个YUM仓库中默认的sysbench版本的,主要是考虑安装部署方便,而一直以来这个版本似乎都没有遇到什么问题,直到…尝试自动化的对Azure上的MySQL进行压测。
默认的sysbench版本是1.0.17版(Mar 15, 2019),首先,是遇到了如下的报错信息:
sysbench 1.0.17 (using system LuaJIT 2.0.4)
FATAL: unable to connect to MySQL server on host 'xxx.mysql.database.azure.com', port 3306, aborting...
FATAL: error 3159: Connections using insecure transport are prohibited while --require_secure_transport=ON
在该版本中,sysbench提供了参数--mysql-ssl=[on|off]
以尝试解决这个问题,但对于最新版本的MySQL,该参数很多时候都无法正常工作,如果你也尝试了该参数,那么会报如下错误:
FATAL: unable to connect to MySQL server on host 'xxx.mysql.database.azure.com', port 3306, aborting...
FATAL: error 2026: SSL connection error: SSL_CTX_set_default_verify_paths failed
如果,恰好,你注意上面的报错可能是CA
证书的问题,于是你也像我一样尝试通过 下载证书的方式去解决,并通过GitHub上的issue,成功将CA
证书改名成cacert.pem,并放在当前的路径下,那么你还会遇到如下报错:
SSL error: Unable to get certificate from 'client-cert.pem'
FATAL: unable to connect to MySQL server on host 'xxx.mysql.database.azure.com', port 3306, aborting...
FATAL: error 2026: SSL connection error: Unable to get certificate
好了,也许你再成功生成client-cert.pem
、client-key.pem
的话,也许你真的能够运行成功。不过,再向后,我就没有尝试了,原因是,如果每一次测试都去获得各一个身份认证的密钥对,那么实在是太复杂了。
最终,我根据AWS上这篇文章(Running sysbench on RDS MySQL… via SSL/TLS)的建议,尝试自己编译安装了最新版本的sysbench,也就是1.1.0版本。然后简单的使用参数--mysql-ssl=preferred
或--mysql-ssl=required
彻底的解决了这个问题。
在开始创建Compute/Database资源之前,需要先完成认证,再将需要的基础资源准备好。基础资源包括VCN/Subnet等相关的网络基础组件。本文将通过简单的示例展示这些基础组件的创建。
和所有的Provider一样,我们会在Oracle Cloud的provider基础配置中配置好region。在资源创建的时候,核心资源都需要配置compartment_id
,可以简单理解为,该资源属于哪个逻辑组(关于Compartment)。例如,一个典型的、简单的VCN的创建代码如下:
provider "oci" {
region = var.region
}
# 创建一个新的compartment,他的parent compartment是tenancy_id
resource "oci_identity_compartment" "oic" {
#Required
compartment_id = var.tenancy_id
description = "for database benchmark"
name = var.naming
}
resource "oci_core_vcn" "ocv" {
#Required
compartment_id = oci_identity_compartment.oic.id
cidr_block = "172.17.0.0/16"
display_name = var.naming
}
这里说的“公网”能力,包括了两个方面:
这里配置要求比较严谨,与AWS有一些类似。分为以下几个步骤:
resource "oci_core_vcn" "ocv" {
#Required
compartment_id = oci_identity_compartment.oic.id
cidr_block = "172.17.0.0/16"
display_name = var.naming
dns_label = var.naming
}
# Creates a subnet
resource "oci_core_subnet" "subnet_primary" {
availability_domain = data.oci_identity_availability_domain.oad.name
cidr_block = "172.17.1.0/24"
display_name = "domain_primary"
dns_label = "tfsubnet"
security_list_ids = [oci_core_vcn.ocv.default_security_list_id]
compartment_id = oci_identity_compartment.oic.id
vcn_id = oci_core_vcn.ocv.id
route_table_id = oci_core_vcn.ocv.default_route_table_id
dhcp_options_id = oci_core_vcn.ocv.default_dhcp_options_id
}
resource "oci_core_internet_gateway" "internet_gateway" {
compartment_id = oci_identity_compartment.oic.id
display_name = "InternetGateway"
vcn_id = oci_core_vcn.ocv.id
}
resource "oci_core_default_route_table" "route_table_for_internet" {
manage_default_resource_id = oci_core_vcn.ocv.default_route_table_id
display_name = "RouteTableForInternet"
route_rules {
destination = "0.0.0.0/0"
destination_type = "CIDR_BLOCK"
network_entity_id = oci_core_internet_gateway.internet_gateway.id
}
}
resource "oci_core_security_list" "osl" {
compartment_id = oci_identity_compartment.oic.id
vcn_id = oci_core_vcn.ocv.id
display_name = "${var.naming}SecurityList"
ingress_security_rules {
protocol = "6" // tcp
source = "0.0.0.0/0"
stateless = false
tcp_options {
# source_port_range {
# min = 100
# max = 100
# }
# // These values correspond to the destination port range.
min = 22
max = 22
}
}
}
和Compartment一样,这是另一个Oracle Cloud上必须得,但是似乎必要性并不强的概念。在Oracle Cloud上,整体的资源位置从大到小:region -> Availability Domains -> Fault Domain
。其中,Fault Domain
可以理解为其他云的zone
的概念,代表了一个IDC机房(可能是相邻的多个building),通常,3个Fault Domain
构成一个Availability Domains
。在一个Region通常只有一个Availability Domains
,也有部分Region有2~3个Availability Domains
。
在Terraform中,如果确定了Region,我们需要使用data.oci_identity_availability_domain
获取对应availability_domain
的信息:
data "oci_identity_availability_domain" "oad" {
#Required
compartment_id = oci_identity_compartment.oic.id
ad_number = 1
}
这里参考了example public_ip.tf@GitHub,使用了较为“直接”的方式(缺乏扩展性)获取需要镜像:
variable "instance_image_ocid" {
type = map(string)
default = {
# See https://docs.oracle.com/en-us/iaas/images/image/abf452f1-bf22-4837-b47b-79945ed26bee/
# CentOS-7
ap-tokyo-1 = "ocid1.image.oc1.ap-tokyo-1.aaaaaaaa4hzluwszvbv3m3m27pvly5qm6ldnjgibjxrexuhe4ky5ncijjsra"
}
}
这里的ocid则是根据 Images@Oracle Cloud Infrastructure Documentation 列出的所有镜像选择而来。更具扩展性的做法应该是通过terraform data
对象去获取。
在OCI中,计算实例的配置,相对来说是比较简单的:
# Creates an instance (without assigning a public IP to the primary private IP on the VNIC)
resource "oci_core_instance" "oi" {
availability_domain = data.oci_identity_availability_domain.oad.name
compartment_id = oci_identity_compartment.oic.id
display_name = var.naming
fault_domain = var.zone_primary
shape = var.vm_instance_type
shape_config {
memory_in_gbs = 2
ocpus = 1
}
source_details {
source_type = "image"
source_id = var.instance_image_ocid[var.region]
boot_volume_size_in_gbs = 50
}
create_vnic_details {
assign_public_ip = true
display_name = "Vnic${var.naming}"
subnet_id = oci_core_subnet.subnet_primary.id
hostname_label = var.naming
}
metadata = {
ssh_authorized_keys = var.publickey
}
preserve_boot_volume = false
}
上面通过:
source_details
描述了使用的镜像以及启动盘的大小create_vnic_details
描述了VNIC的主要配置,包括所属子网、是否有绑定公网IP等metadata
则描述了ssh的公钥信息,实现秘钥对登录在OCI上创建MySQL实例比较简单,选项也不多,实际在通过Terraform配置也比较简单和顺利:
resource "oci_mysql_mysql_db_system" "om" {
display_name = var.naming
compartment_id = oci_identity_compartment.oic.id
availability_domain = data.oci_identity_availability_domain.oad.name
fault_domain = var.zone_primary
is_highly_available = true
admin_password = var.db_pass
admin_username = var.db_user
shape_name = var.rds_instance_type
data_storage_size_in_gb = 100
subnet_id = oci_core_subnet.subnet_primary.id
## this appear as optional in documentation
## but it is a must to add it
deletion_policy {
#Optional
# automatic_backup_retention = false
final_backup = "SKIP_FINAL_BACKUP"
is_delete_protected = false
}
}
参数值错误有很多,根据报错这里是automaticBackupRetention相关的参数值错误,对应在Terraform中是deletion_policy中的automatic_backup_retention配置项,该选项并不是必须的,暂时删除解决。
╷
│ Error: 400-InvalidParameter, Request contains an invalid value for 'com.oracle.oci.mysql.model.CreateDbSystemDetails$Builder["deletionPolicy"]->com.oracle.oci.mysql.model.CreateDeletionPolicyDetails$Builder["automaticBackupRetention"]'
│ Suggestion: Please update the parameter(s) in the Terraform config as per error message Request contains an invalid value for 'com.oracle.oci.mysql.model.CreateDbSystemDetails$Builder["deletionPolicy"]->com.oracle.oci.mysql.model.CreateDeletionPolicyDetails$Builder["automaticBackupRetention"]'
│ Documentation: https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/mysql_mysql_db_system
│ API Reference:
│ Request Target: POST https://mysql.ap-tokyo-1.ocp.oraclecloud.com/20190415/dbSystems
│ Provider version: 5.42.0, released on 2024-05-19.
│ Service: Mysql Db System
│ Operation Name: CreateDbSystem
│ OPC request ID: ...
│
│
│ with oci_mysql_mysql_db_system.om,
│ on rds.mysql.tf line 6, in resource "oci_mysql_mysql_db_system" "om":
│ 6: resource "oci_mysql_mysql_db_system" "om" {
│
不同的sysbench参数可能对测试结果有一定的影响,如果不注意的话,可能会影响我们对于测试结果的分析,甚至可能会得出错误的测试结论。本文较为详细的介绍sysbench中的--rand-type
参数。
--rand-type
是sysbench中控制随机数据分布的参数,主要的选项包括了uniform,gaussian,special,pareto
,在最新的版本,新增了zipfian
。具体的各个随机分布类似介绍如下:
uniform
是均匀分布gaussian
是正态分布,也叫高斯分布(常见的标准正态分布是其特殊形式)pareto
是帕累托分布,“二八分布”是其特殊形态。该分布在经济学中使用较多,最为常见的例子是认为20%的人拥有80%的财富,即财富在人群中的分布情况。zipfian
分布与该分布有一些类似。special
这个是一个奇怪的分布,并不是某个标准分布。应该是Sysbench作者自己定义的某个分布,该分布下取值几乎完全落在中间值附近。关于这些分布的讨论可以参考Sysbench在GitHub Issue上的讨论(Use the uniform distribution by default @GitHub Issue),也可以参考Percona相关的讨论文章(Sysbench and the Random Distribution Effect@Percona)。这里使用GitHub Issue中提到的方法,来对这些分布做一个测试,从而大家可以非常好的从可视化的角度去理解这些分布:
(more…)近日,MySQL发布了8.4版本,这是一个新的稳定版。在MySQL版本规划中,在2026年8.0.x生命周期结束后,将成为下一个主流稳定版本。
目前为止,看到该版本并没有特别大的改进。部分改变包括改进了直方图统计信息更新、并行复制、组复制(GR)等,完整的更新可以参考:Changes in MySQL 8.4.0 (2024-04-30, LTS Release)。
Oracle Cloud上也第一时间支持了该版本,于是也通过性能测试的方式,第一时间“尝鲜”了一下该版本。性能测试的趋势图如下:
注意到,在该Sysbench测试模式下:
作为一个稳定版本,期待官方尽快解决。
(more…)本问是一个系列文章的一部分,该系列较为完整的对各个云厂商的RDS MySQL进行了测试,包括了阿里云、腾讯云、华为云、百度云、AWS、Azure、GCP、Oracle Cloud等,更多参考:云数据库RDS MySQL的性能。
在Oracle Cloud Infrastructure(简称OCI,也就是Oracle云)上购买MySQL实例,也会有第三代CPU和第四代CPU规格的选择,分别是:MySQL.VM.Standard.E4.2.32GB
和MySQL.VM.Standard.E3.2.32GB
。本文对比两个版本规格的价格与性能,以供参考。
E4(AMD EPYC 7J13)、E3(AMD EPYC 7742
)同属于AMD系列的CPU,E4似乎主要是在OCI平台,E3较为通用。从性能测试上,可以看到,E4相比于E3有着较为明显的性能优势,以常见的16并发时数据为参考,则E4(MySQL.VM.Standard.E4.2.32GB
)相比于E3(MySQL.VM.Standard.E3.2.32GB
)性能要高11%。
这也与之前的,“新一代CPU总是有着更高的性能”的结论一致。
(more…)