目录
在Ubuntu操作系统下,MySQL、MongoDB和Redis是构建现代应用的三大核心数据存储技术。它们分别代表了关系型数据库、文档型数据库和内存数据库的典型范例,各自拥有独特的优势和使用场景。本文将带你从基础的安装配置开始,深入探讨性能优化、安全加固,并最终通过一个电商平台的实战案例,展示这三者如何高效协同工作。
一、MySQL:稳定可靠的关系型数据库
1.1 安装与配置
在Ubuntu上安装MySQL非常简单,推荐两种主流方式:
方式一:官方APT仓库(推荐)
# 1. 下载并添加MySQL官方仓库
wget https://dev.mysql.com/get/mysql-apt-config_0.8.26-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.26-1_all.deb
sudo apt update
# 2. 安装MySQL服务器
sudo apt install -y mysql-server
方式二:Ubuntu默认仓库
sudo apt update
sudo apt install -y mysql-server
安全配置
安装完成后,立即运行安全脚本是最佳实践:
sudo mysql_secure_installation
该脚本会引导你设置root密码、移除匿名用户、禁止远程root登录和删除测试数据库,显著提升安全性。
基础配置
编辑配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf
,根据服务器内存调整关键参数:
[mysqld]
innodb_buffer_pool_size = 4G # 建议为物理内存的50-70%
max_connections = 200
character-set-server = utf8mb4
1.2 性能优化实战
核心参数调优 一个经过实战验证的电商数据库配置片段:
[mysqld]
# 内存优化
innodb_buffer_pool_size = 12G
innodb_log_file_size = 1G
innodb_flush_method = O_DIRECT
# 连接优化
max_connections = 1000
max_user_connections = 800
# I/O优化
innodb_io_capacity = 2000
innodb_read_io_threads = 16
innodb_write_io_threads = 16
查询优化技巧
使用
EXPLAIN
分析查询计划为经常用于JOIN、WHERE和ORDER BY的列创建索引
避免使用SELECT *,明确指定所需列
二、MongoDB:灵活的文档数据库
2.1 安装与配置
Ubuntu 22.04安装步骤
# 1. 导入MongoDB公钥
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor
# 2. 创建源列表
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] \
https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
# 3. 安装
sudo apt update
sudo apt install -y mongodb-org
安全配置 启用身份验证是生产环境的关键步骤:
# 1. 连接到MongoDB
mongosh
# 2. 创建管理员用户
use admin
db.createUser({
user: "myAdmin",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
})
# 3. 启用认证
sudo nano /etc/mongod.conf
# 添加:
security:
authorization: enabled
# 4. 重启服务
sudo systemctl restart mongod
2.2 性能优化策略
索引优化
// 为商品集合创建复合索引
db.products.createIndex({category: 1, price: -1})
// 查看索引效果
db.products.explain("executionStats").find({category: "electronics", price: {$gte: 100}})
分片配置(大数据量场景)
sharding:
clusterRole: shardsvr
replication:
replSetName: shard1
三、Redis:高性能内存数据库
3.1 安装与配置
快速安装
sudo apt update
sudo apt install -y redis-server
核心配置优化
编辑 /etc/redis/redis.conf
:
# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru
# 持久化
save 900 1
save 300 10
save 60 10000
rdbcompression yes
# 网络
bind 0.0.0.0
port 6379
3.2 高级应用场景
缓存与数据库协同
import redis
import pymongo
# Redis缓存MongoDB查询结果
def get_product_detail(product_id):
cache_key = f"product:{product_id}"
cached = redis_client.get(cache_key)
if cached:
return json.loads(cached)
# 查询MongoDB
product = mongo_db.products.find_one({"_id": ObjectId(product_id)})
redis_client.setex(cache_key, 300, json.dumps(product))
return product
四、协同实战:电商平台架构
4.1 架构设计
一个典型的电商平台会这样分工:
MySQL:处理订单、支付、用户账户等核心事务
MongoDB:存储商品详情、用户行为日志等非结构化数据
Redis:缓存热点商品、用户会话、实时排行榜
数据流示意图:
用户请求 → API网关 → Redis缓存 →
├─ 缓存命中 → 直接返回
└─ 缓存未命中 →
├─ 商品详情 → MongoDB
└─ 库存订单 → MySQL
4.2 实际代码示例
Node.js服务集成
const express = require('express');
const mysql = require('mysql2/promise');
const redis = require('redis');
const { MongoClient } = require('mongodb');
// 初始化连接
const mysqlPool = mysql.createPool({
host: 'localhost',
user: 'ecommerce_user',
password: 'secure_password',
database: 'ecommerce',
connectionLimit: 10
});
const redisClient = redis.createClient({ host: 'localhost', port: 6379 });
const mongoClient = new MongoClient('mongodb://localhost:27017');
// 商品详情API
app.get('/api/products/:id', async (req, res) => {
const productId = req.params.id;
const cacheKey = `product:${productId}`;
try {
// 1. 尝试从Redis获取缓存
const cached = await redisClient.get(cacheKey);
if (cached) {
return res.json(JSON.parse(cached));
}
// 2. 查询MongoDB获取商品详情
const product = await mongoClient.db('ecommerce')
.collection('products')
.findOne({ _id: ObjectId(productId) });
if (!product) {
return res.status(404).json({ error: 'Product not found' });
}
// 3. 缓存到Redis,5分钟过期
await redisClient.setex(cacheKey, 300, JSON.stringify(product));
// 4. 获取MySQL中的库存信息
const [inventoryRows] = await mysqlPool.query(
'SELECT quantity FROM inventory WHERE product_id = ?',
[productId]
);
product.inventory = inventoryRows[0]?.quantity || 0;
res.json(product);
} catch (error) {
console.error('Error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
五、总结与展望
通过本文的实践,我们可以看到:
MySQL 提供了可靠的事务支持和ACID特性,是金融级数据的理想选择
MongoDB 的灵活文档模型完美适配快速变化的业务需求
Redis 的内存级性能为系统提供了强大的缓存能力
在Ubuntu环境下,这三种数据库的协同使用能够:
将查询响应时间从秒级降至毫秒级
支持从GB到PB级的数据增长
实现99.9%以上的服务可用性
随着云原生技术的发展,这些数据库都在积极拥抱Kubernetes和Serverless架构。未来,我们可以期待看到更多创新的混合架构解决方案。
通过合理的设计和持续的优化,Ubuntu系统下的MySQL、MongoDB和Redis将构成你应用架构的坚实基石。