Ubuntu下MySQL、MongoDB与Redis:从安装到协同的完整指南
目录
一、MySQL:稳定可靠的关系型数据库
1.1 安装与配置
1.2 性能优化实战
二、MongoDB:灵活的文档数据库
2.1 安装与配置
2.2 性能优化策略
三、Redis:高性能内存数据库
3.1 安装与配置
3.2 高级应用场景
四、协同实战:电商平台架构
4.1 架构设计
4.2 实际代码示例
五、总结与展望
在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: shardsvrreplication: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)# 查询MongoDBproduct = 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将构成你应用架构的坚实基石。