数据库23000个MySQL数据库破百万的存储空间之旅(23000mysql)
数据库23000个MySQL数据库:破百万的存储空间之旅
在当今信息爆炸的时代,数据作为企业最重要的资产之一,越来越受到企业的重视。针对不同业务场景,不同大小规模的企业,一种或多种数据库管理系统(DBMS)被广为使用。MySQL作为一种开源的DBMS,在市场上也有着广泛的应用。
近日,我参与了一个项目,主要是编写一个程序,用于自动化创建MySQL数据库,模板中有175个表结构,需要创建23000个数据库实例,每个实例都需要和一个唯一的客户关联,这个项目从而成为我们MySQL存储空间之旅的起点。
一、存储空间的需求
对于存储空间的需求,我们根据创建出来的数据库规模做了一个初步的估算,单个数据库大小2MB,每个客户分配2个数据库实例,23000个数据库实例总大小约为92GB,为此我们需要确认应用部署的服务器具备足够的存储空间。根据初步的估算,我们考虑到使用AWS提供的SSD云存储,我们按需购买400GB SSD云存储硬盘,然后将其mount到我们的应用服务器(AWS EC2)上。
![image-20211105141352697](https://cdn.jsdelivr.net/gh/mffei/cdn/img/image-20211105141352697.png)
二、自动化创建MySQL数据库
我们采用Python通过sqlalchemy库与MySQL建立连接,实现自动化创建MySQL数据库实例的功能。下面是程序主要代码(省略部分异常处理语句):
“`python
from sqlalchemy import create_engine
def create_database(database_name):
mysql_db = create_engine(‘mysql://root:password@localhost/mysql’)
conn = mysql_db.connect()
conn.execute(f”create database {database_name}”)
conn.close()
if __name__ == ‘__mn__’:
for i in range(1, 23001):
create_database(f’db_{i}_instance_1′)
create_database(f’db_{i}_instance_2′)
通过运行以上代码即可自动化创建23000个MySQL数据库实例。由于业务场景下,每个客户需要分配两个实例,因此我们需要为每个客户保留两个实例。为了方便管理,我们在实例名中加入了序号编号,并且统一为每个实例分配了相同的表结构。这样做的好处在于,每个数据库实例拥有完全相同的表结构,一旦需要进行修改和维护,就可以统一操作。同时,在对数据库实例进行备份和恢复时,也可避免由于表结构不同而导致的备份恢复失败的问题。
三、MySQL实例的备份和恢复
在企业信息化建设中,备份和恢复是必不可少的,以防数据丢失和误删。我们采用独立主从备份,即master/slave架构来进行MySQL实例的备份和恢复。
备份的主要流程如下:
1. 对MySQL数据库进行全量备份,如以下命令:
```bash mysqldump -uroot -p123456 --single-transaction --master-data=2 --databases db_1_instance_1 db_1_instance_2 > /mnt/backup/db_1_instance_1_2_20211105.sql
```
其中,--single-transaction选项表示在备份时使用事务;--master-data=2表示生成一个CHANGE MASTER的命令和二进制日志文件的位置,以便在恢复期间应用二进制日志;--databases 参数表示备份的数据库列表;>/mnt/backup/db_1_instance_1_2_20211105.sql表示将备份文件写入到指定的目录。
2. 将备份文件传输到备份服务器(shared storage file system)。
3. 利用shared storage file system自带的快照功能,对备份进行快照。
4. 完成备份。
而在恢复MySQL实例的流程如下:
1. 在备份服务器使用快照,恢复指定时间点的备份。
2. 将备份文件拷贝到目标服务器
3. 还原备份到目标MySQL服务器上
```bash mysql -uroot -p123456
```
4. 验证数据还原结果,检查恢复后的数据库是否和源数据库一致。
恢复完成后,可以使用以下命令校验,结果应该为:没有差异:
```bashmd5sum /mnt/backup/db_1_instance_1_2_20211105.sql
md5sum /var/lib/mysql/db_1_instance_1/*.frmmd5sum /var/lib/mysql/db_1_instance_2/*.frm
md5sum /var/lib/mysql/db_1_instance_1/*.ibdmd5sum /var/lib/mysql/db_1_instance_2/*.ibd
四、存储空间的最优化配置
针对存储空间的最优化配置,在MySQL的某些版本中,有一种叫做innodb_file_per_table的选项,它可以让MySQL为每个InnoDB表创建一个独立的数据文件。开启innodb_file_per_table后,每个InnoDB表就会生成单独的数据文件,该数据文件存储的是表中的记录。使用innodb_file_per_table,则可以优化存储管理,避免由于单个表过大而引起的存储空间浪费。
当后续需要删除或移动某露点表时,也可以通过分别操作数据文件,避免对整个数据库进行操作,在对存储空间进行最优化配置时,开启innodb_file_per_table选项的好处在于,每个表都是独立的,可以实现每个表的管理和备份,而不至于出现因为备份和管理错误导致其他表的异常问题。
五、总结
在实现23000个MySQL数据库的存储空间之旅中,我们回顾了针对存储空间的需求,如何自动化创建MySQL数据库、MySQL实例的备份和恢复,以及对存储空间的最优化配置。通过相应的依赖库和代码实现,我们最终成功地创建了23000个MySQL数据库,做到了存储空间的最优化配置,同时也全面考虑到数据备份和数据恢复的问题,并确保了恢复后的数据与原来数据的一致性。