Ubuntu下MySQL、MongoDB与Redis:从安装到协同的完整指南

发布于:2025-08-29 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一、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: 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' });
  }
});

五、总结与展望

通过本文的实践,我们可以看到:

  1. MySQL 提供了可靠的事务支持和ACID特性,是金融级数据的理想选择

  2. MongoDB 的灵活文档模型完美适配快速变化的业务需求

  3. Redis 的内存级性能为系统提供了强大的缓存能力

在Ubuntu环境下,这三种数据库的协同使用能够:

  • 将查询响应时间从秒级降至毫秒级

  • 支持从GB到PB级的数据增长

  • 实现99.9%以上的服务可用性

随着云原生技术的发展,这些数据库都在积极拥抱Kubernetes和Serverless架构。未来,我们可以期待看到更多创新的混合架构解决方案。

通过合理的设计和持续的优化,Ubuntu系统下的MySQL、MongoDB和Redis将构成你应用架构的坚实基石。


网站公告

今日签到

点亮在社区的每一天
去签到