当前位置: 首页 > article >正文

MySQL 主主复制与 Redis 环境安装部署

MySQL 主主复制与 Redis 环境安装部署

本指南将详细介绍如何在服务器上部署一个MySQL 主主(Master-Master)复制环境以及Redis缓存服务。通过本指南,您将能够搭建一个高可用、高性能的数据库与缓存系统,适用于中大型应用场景。


目录

  1. 前提条件
  2. MySQL 主主复制环境配置
    • 2.1 安装 MySQL
    • 2.2 配置 MySQL 主主复制
    • 2.3 启动复制并验证
  3. Redis 环境安装与配置
    • 3.1 安装 Redis
    • 3.2 配置 Redis
    • 3.3 启动 Redis 服务
  4. 高可用与负载均衡设计
    • 4.1 MySQL 负载均衡策略
    • 4.2 Redis 高可用方案(Redis Sentinel)
  5. 安全性配置
  6. 监控与备份策略
  7. 常见问题与解决方案
  8. 总结

1. 前提条件

在开始之前,请确保满足以下前提条件:

  • 服务器准备:准备至少两台物理服务器或虚拟机,操作系统建议使用 CentOS 7/8Ubuntu 20.04+
  • 网络配置:确保服务器之间网络通畅,能够通过内网 IP 互相访问。
  • 权限:需要具备服务器的 root 权限或具备 sudo 权限的用户。
  • 时间同步:确保所有服务器的时间同步,建议使用 NTP 服务。

2. MySQL 主主复制环境配置

MySQL 主主复制允许两个或多个 MySQL 实例相互复制数据,实现数据的高可用性和负载均衡。以下步骤将指导您在两台服务器上配置 MySQL 主主复制。

2.1 安装 MySQL

本文以 MySQL 8.0 为例,以下步骤适用于 CentOS 7 系统。

2.1.1 添加 MySQL 仓库

在每台服务器上执行以下命令添加 MySQL 官方仓库:

sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm -y
2.1.2 安装 MySQL
sudo yum install mysql-server -y
2.1.3 启动 MySQL 服务
sudo systemctl start mysqld
sudo systemctl enable mysqld
2.1.4 获取初始 root 密码

初始安装完成后,MySQL 会生成一个临时 root 密码,执行以下命令查看:

sudo grep 'temporary password' /var/log/mysqld.log
2.1.5 设置 root 密码

使用临时密码登录 MySQL 并设置新密码:

mysql_secure_installation

按照提示完成安全配置,包括设置新密码、删除匿名用户、禁止远程 root 登录等。

2.2 配置 MySQL 主主复制

假设有两台服务器:

  • Server A
    • IP: 192.168.1.1
    • 主机名: mysql-master1
  • Server B
    • IP: 192.168.1.2
    • 主机名: mysql-master2
2.2.1 配置 Server A

编辑 MySQL 配置文件 /etc/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf,根据实际文件位置调整。

[mysqld]
server-id=1
log_bin=mysql-bin
binlog_format=ROW
relay_log=relay-bin
auto_increment_increment=2
auto_increment_offset=1
replicate-same-server-id=0
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_transaction_dependency_history_size=100
2.2.2 配置 Server B

编辑 MySQL 配置文件,配置与 Server A 不同的 server-idauto_increment_offset

[mysqld]
server-id=2
log_bin=mysql-bin
binlog_format=ROW
relay_log=relay-bin
auto_increment_increment=2
auto_increment_offset=2
replicate-same-server-id=0
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_transaction_dependency_history_size=100
2.2.3 重启 MySQL 服务

在两台服务器上执行以下命令重启 MySQL 服务,使配置生效:

sudo systemctl restart mysqld
2.2.4 创建复制用户

在 Server A 和 Server B 上分别创建复制用户。

在 Server A 执行:

CREATE USER 'replicator'@'%' IDENTIFIED WITH mysql_native_password BY 'password123';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;

在 Server B 执行:

CREATE USER 'replicator'@'%' IDENTIFIED WITH mysql_native_password BY 'password123';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;

注意:请将 'password123' 替换为更强的密码,并确保网络防火墙允许两台服务器之间的3306端口通信。

2.2.5 获取 Master 状态

在 Server A 和 Server B 上分别执行以下命令获取 MASTER 状态信息。

在 Server A 执行:

SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154      |              |                  | e6d...             |
+------------------+----------+--------------+------------------+-------------------+

在 Server B 执行:

SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 156      |              |                  | a1b...             |
+------------------+----------+--------------+------------------+-------------------+

记录下各自的 FilePositionExecuted_Gtid_Set,用于配置 CHANGE MASTER TO

2.2.6 配置复制

在 Server A 配置复制到 Server B:

CHANGE MASTER TO
  MASTER_HOST='192.168.1.2',
  MASTER_USER='replicator',
  MASTER_PASSWORD='password123',
  MASTER_AUTO_POSITION=1;

START SLAVE;

在 Server B 配置复制到 Server A:

CHANGE MASTER TO
  MASTER_HOST='192.168.1.1',
  MASTER_USER='replicator',
  MASTER_PASSWORD='password123',
  MASTER_AUTO_POSITION=1;

START SLAVE;

注意MASTER_AUTO_POSITION=1 表示使用 GTID 复制模式。

2.2.7 验证复制状态

在两台服务器上分别执行以下命令查看复制状态:

SHOW SLAVE STATUS\G

确保以下字段显示为 Yes 或正常状态:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Last_IO_Error: (null)
  • Last_SQL_Error: (null)

2.3 启动复制并验证

为了验证主主复制是否正常工作,可以在任一服务器上创建测试数据库和表,并插入数据,检查数据是否同步到另一台服务器。

-- 在 Server A 上执行
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(100)
);
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');

-- 在 Server B 上验证数据
USE test_db;
SELECT * FROM users;

应输出插入的 Alice 数据,反之亦然。

注意事项

  • 避免在主主复制环境下直接操作自增主键,以防止主键冲突。
  • 可以通过配置 auto_increment_incrementauto_increment_offset 来避免主键冲突。

3. Redis 环境安装与配置

Redis 是一个高性能的键值存储系统,常用于缓存、消息队列等场景。以下步骤将指导您在服务器上安装和配置 Redis。

3.1 安装 Redis

本文以 Redis 6.2 为例,以下步骤适用于 CentOS 7 系统。

3.1.1 安装必要依赖
sudo yum install -y gcc jemalloc-devel tcl
3.1.2 下载 Redis 源码
cd /usr/local/src
sudo wget http://download.redis.io/releases/redis-6.2.6.tar.gz
sudo tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
3.1.3 编译安装 Redis
sudo make
sudo make install
3.1.4 创建 Redis 用户和目录
sudo adduser --system --group --no-create-home redis
sudo mkdir /etc/redis
sudo mkdir /var/lib/redis
sudo chown redis:redis /var/lib/redis

3.2 配置 Redis

复制默认配置文件到 /etc/redis/ 目录,并进行必要的修改。

sudo cp redis.conf /etc/redis/

使用编辑器打开配置文件进行修改:

sudo vi /etc/redis/redis.conf

修改或确认以下配置项:

# 监听所有接口(根据实际需求调整)
bind 0.0.0.0

# 禁用保护模式(确保访问安全)
protected-mode no

# 设置持久化策略
save 900 1
save 300 10
save 60 10000

# 设置数据库文件路径
dir /var/lib/redis

# 设置日志级别
loglevel notice
logfile "/var/log/redis/redis.log"

# 设置后台运行
daemonize yes

# 设置 pid 文件
pidfile /var/run/redis.pid

# 设置最大客户端数量
maxclients 10000

# 开启远程管理(可选,需确保安全)
# requirepass your_redis_password

安全提示

  • 强烈建议启用密码认证,修改 requirepass 并设置复杂密码。
  • 如果 Redis 需要对外开放,请确保通过防火墙和安全组限制访问来源。

3.3 启动 Redis 服务

3.3.1 创建 Redis 系统服务文件

创建 /etc/systemd/system/redis.service 文件:

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
3.3.2 启动并启用 Redis 服务
sudo systemctl daemon-reload
sudo systemctl start redis
sudo systemctl enable redis
3.3.3 验证 Redis 服务状态
sudo systemctl status redis

应显示 Redis 正在运行状态。

3.3.4 测试 Redis 连接
redis-cli ping

应返回 PONG


4. 高可用与负载均衡设计

为了确保系统的高可用性和性能,需要为 MySQL 和 Redis 配置相应的负载均衡和高可用方案。

4.1 MySQL 负载均衡策略

在主主复制环境中,需考虑以下负载均衡策略:

4.1.1 使用 HAProxy 进行负载均衡

HAProxy 是一个高性能的 TCP/HTTP 负载均衡器,适用于 MySQL 负载均衡。

安装 HAProxy
sudo yum install haproxy -y
配置 HAProxy

编辑 HAProxy 配置文件 /etc/haproxy/haproxy.cfg,添加 MySQL 后端配置:

frontend mysql_front
    bind *:3307
    mode tcp
    default_backend mysql_back

backend mysql_back
    mode tcp
    balance roundrobin
    option mysql-check user replicator
    server mysql1 192.168.1.1:3306 check
    server mysql2 192.168.1.2:3306 check

说明

  • 前端监听 3307 端口,应用程序通过该端口连接 MySQL。
  • 后端定义两台 MySQL 服务器,使用 roundrobin 负载均衡策略。
  • mysql-check 用于健康检查,确保只有可用的后端服务器接收流量。
启动并启用 HAProxy
sudo systemctl start haproxy
sudo systemctl enable haproxy
测试 HAProxy

应用程序连接字符串示例:

jdbc:mysql://<HAProxy_IP>:3307/test_db?user=<username>&password=<password>

4.2 Redis 高可用方案(Redis Sentinel)

Redis Sentinel 提供监控、通知、自动故障转移和配置中心功能。以下步骤将配置 Redis Sentinel 以实现 Redis 的高可用性。

4.2.1 部署 Redis Sentinel

在至少三个节点上部署 Redis Sentinel,以避免单点故障。以下以单个节点示例,实际部署请在多台服务器上进行。

安装 Redis Sentinel

Redis Sentinel 是 Redis 的一部分,无需单独安装。在每台 Redis 服务器上编辑配置文件添加 Sentinel 配置。

配置 Sentinel

创建 Sentinel 配置文件 /etc/redis/sentinel.conf

port 26379
sentinel monitor mymaster 192.168.1.1 6379 2
sentinel auth-pass mymaster your_redis_password
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
  • mymaster:Master 名称,可自定义。
  • 192.168.1.1 6379:Master Redis 实例的 IP 和端口。
  • 2:达到多少个 Sentinel 节点确认 master 故障。
  • your_redis_password:如果 Redis 设置了密码,需要配置此项。
启动 Sentinel

创建 Sentinel 系统服务文件 /etc/systemd/system/redis-sentinel.service

[Unit]
Description=Redis Sentinel
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-sentinel /etc/redis/sentinel.conf
Restart=always

[Install]
WantedBy=multi-user.target

启动并启用 Sentinel 服务:

sudo systemctl daemon-reload
sudo systemctl start redis-sentinel
sudo systemctl enable redis-sentinel
4.2.2 验证 Sentinel 配置

在任一 Sentinel 节点上执行以下命令查看 Sentinel 状态:

redis-cli -p 26379 sentinel masters

应显示 Master 的详细信息。


5. 安全性配置

确保数据库和缓存系统的安全性是至关重要的。以下是一些安全配置建议:

5.1 防火墙配置

使用 firewalldiptables 限制对 MySQL 和 Redis 服务的访问,仅允许特定 IP 访问。

示例:使用 firewalld 配置端口
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --permanent --add-port=3307/tcp    # HAProxy 端口
sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --permanent --add-port=26379/tcp
sudo firewall-cmd --reload

修改为仅允许特定 IP 地址访问,例如仅允许内网访问:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
# 类似配置其他端口

5.2 强化 MySQL 和 Redis 认证

  • MySQL:确保 root 用户不允许远程登录,使用强密码,并定期更换密码。
  • Redis:启用密码认证,配置 requirepass,并在 Sentinel 配置中同步密码。

5.3 加密传输

考虑使用 SSL/TLS 加密 MySQL 和 Redis 的传输,防止数据在传输过程中被窃听。

  • MySQL:配置 ssl 相关参数,启用 SSL 连接。
  • Redis:Redis 6.0 及以上支持 TLS,可在配置文件中启用。

6. 监控与备份策略

6.1 监控

使用专业的监控工具实时监控 MySQL 和 Redis 的性能和健康状态。

  • Prometheus + Grafana:采集和可视化监控指标。
  • Percona Monitoring and Management (PMM):专为 MySQL 设计的监控工具。
  • Redis Exporter:用于 Prometheus 的 Redis 指标收集工具。

6.2 备份

制定定期备份策略,确保数据安全与可恢复性。

  • MySQL 备份
    • 使用 mysqldump 进行逻辑备份。
    • 使用 Percona XtraBackup 进行物理备份。
  • Redis 备份
    • 配置 SAVE 规则,定期生成 RDB 文件。
    • 使用 Redis Backup ToolsRDB 拷贝脚本 进行备份。

6.3 自动化脚本

编写自动化脚本,定期执行备份任务,并将备份文件存储在安全的位置,如远程服务器或云存储。


7. 常见问题与解决方案

7.1 MySQL 复制不工作

问题描述SHOW SLAVE STATUS\GSlave_IO_RunningSlave_SQL_Running 显示 No

解决方案

  1. 检查复制用户权限是否正确。
  2. 确认网络连接正常,防火墙未阻挡。
  3. 检查 MySQL 配置是否正确,尤其是 server-idlog_bin 等参数。
  4. 查看错误日志,定位具体错误信息。

7.2 HAProxy 无法连接 MySQL 后端

问题描述:应用程序无法通过 HAProxy 连接 MySQL,或连接异常。

解决方案

  1. 确认 HAProxy 配置文件是否正确,后端服务器 IP 和端口配置无误。
  2. 检查后端 MySQL 服务是否正常运行。
  3. 查看 HAProxy 日志,分析连接失败原因。
  4. 确认防火墙配置允许 HAProxy 与 MySQL 后端通信。

7.3 Redis Sentinel 未能自动故障转移

问题描述:当 Master Redis 节点宕机时,Sentinel 未能自动进行故障转移。

解决方案

  1. 确认 Sentinel 配置文件中的 sentinel monitor 参数正确无误。
  2. 确保至少有三个 Sentinel 实例在运行。
  3. 检查 Sentinel 日志,查看故障转移相关错误信息。
  4. 确认 Sentinel 节点之间的网络通信正常。

8. 总结

通过本指南,您已成功搭建了一个 MySQL 主主复制Redis 缓存的高可用环境。以下是关键要点总结:

  1. 环境准备:确保服务器配置、网络通畅和必要的权限。
  2. MySQL 主主复制:安装 MySQL,两台服务器配置不同的 server-id 和复制参数,确保数据双向同步。
  3. Redis 安装与配置:编译安装 Redis,进行必要的安全配置,确保缓存服务稳定运行。
  4. 高可用与负载均衡:使用 HAProxy 进行 MySQL 负载均衡,配置 Redis Sentinel 实现 Redis 高可用。
  5. 安全性配置:通过防火墙、强密码和加密传输确保系统安全。
  6. 监控与备份:部署监控工具,制定定期备份策略,确保系统的可见性和数据安全。
  7. 故障排除:了解常见问题的解决方法,确保系统稳定运行。

最终建议

  • 定期维护:定期检查系统状态,更新软件版本,应用安全补丁。
  • 性能优化:根据监控数据优化数据库和缓存配置,提升系统性能。
  • 扩展性设计:根据业务增长需求,灵活扩展 MySQL 和 Redis 实例,确保系统可伸缩性。
  • 文档与培训:记录系统配置与操作流程,定期培训运维团队,提升团队应急响应能力。

通过科学的规划和细致的执行,您将拥有一个稳定、高效且安全的数据库与缓存系统,满足业务发展的需要。如遇到复杂问题,可以下方留言。

祝您的部署顺利!


http://www.kler.cn/a/577946.html

相关文章:

  • PHP之数组
  • 【Git】删除文件
  • 用了主键索引反而查询慢?深度解析SQL性能反常识现象
  • git本地仓库链接远程仓库
  • ApoorvCTF Rust语言逆向实战
  • Docker 部署 MongoDB 并持久化数据
  • Android A/B System OTA分析提取 payload 在ZIP包中的 offset 和 size
  • 深度学习语义分割数据集全景解析
  • 股票交易所官方api接口有哪些?获取和使用需要满足什么条件
  • linux安装OpenResty
  • 编译Telegram Desktop
  • hbase的主要功能
  • 树莓派5首次开机保姆级教程(无显示器通过VNC连接树莓派桌面)
  • 源码:用Python进行电影数据分析实战指南
  • Monica国内版深度测评:全能AI助手如何重塑你的智能生活?
  • Refreshtoken 前端 安全 前端安全方面
  • 国产FPGA往事
  • [数字图像处理]实验三:直方图增强
  • Linux的OOM Killer
  • 解决Node Electron下调用Python脚本输出中文乱码的问题