本指南将详细介绍如何在服务器上部署一个MySQL 主主(Master-Master)复制环境以及Redis缓存服务。通过本指南,您将能够搭建一个高可用、高性能的数据库与缓存系统,适用于中大型应用场景。
在开始之前,请确保满足以下前提条件:
MySQL 主主复制允许两个或多个 MySQL 实例相互复制数据,实现数据的高可用性和负载均衡。以下步骤将指导您在两台服务器上配置 MySQL 主主复制。
本文以 MySQL 8.0 为例,以下步骤适用于 CentOS 7 系统。
在每台服务器上执行以下命令添加 MySQL 官方仓库:
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm -y
sudo yum install mysql-server -y
sudo systemctl start mysqld
sudo systemctl enable mysqld
初始安装完成后,MySQL 会生成一个临时 root 密码,执行以下命令查看:
sudo grep 'temporary password' /var/log/mysqld.log
使用临时密码登录 MySQL 并设置新密码:
mysql_secure_installation
按照提示完成安全配置,包括设置新密码、删除匿名用户、禁止远程 root 登录等。
假设有两台服务器:
192.168.1.1
mysql-master1
192.168.1.2
mysql-master2
编辑 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
编辑 MySQL 配置文件,配置与 Server A 不同的 server-id
和 auto_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
在两台服务器上执行以下命令重启 MySQL 服务,使配置生效:
sudo systemctl restart mysqld
在 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端口通信。
在 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... |
+------------------+----------+--------------+------------------+-------------------+
记录下各自的 File
和 Position
或 Executed_Gtid_Set
,用于配置 CHANGE MASTER TO
。
在 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 复制模式。
在两台服务器上分别执行以下命令查看复制状态:
SHOW SLAVE STATUS\G
确保以下字段显示为 Yes
或正常状态:
为了验证主主复制是否正常工作,可以在任一服务器上创建测试数据库和表,并插入数据,检查数据是否同步到另一台服务器。
-- 在 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', '[email protected]');
-- 在 Server B 上验证数据
USE test_db;
SELECT * FROM users;
应输出插入的 Alice
数据,反之亦然。
注意事项:
- 避免在主主复制环境下直接操作自增主键,以防止主键冲突。
- 可以通过配置
auto_increment_increment
和auto_increment_offset
来避免主键冲突。
Redis 是一个高性能的键值存储系统,常用于缓存、消息队列等场景。以下步骤将指导您在服务器上安装和配置 Redis。
本文以 Redis 6.2 为例,以下步骤适用于 CentOS 7 系统。
sudo yum install -y gcc jemalloc-devel tcl
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
sudo make
sudo make install
sudo adduser --system --group --no-create-home redis
sudo mkdir /etc/redis
sudo mkdir /var/lib/redis
sudo chown redis:redis /var/lib/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 需要对外开放,请确保通过防火墙和安全组限制访问来源。
创建 /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
sudo systemctl daemon-reload
sudo systemctl start redis
sudo systemctl enable redis
sudo systemctl status redis
应显示 Redis 正在运行状态。
redis-cli ping
应返回 PONG
。
为了确保系统的高可用性和性能,需要为 MySQL 和 Redis 配置相应的负载均衡和高可用方案。
在主主复制环境中,需考虑以下负载均衡策略:
HAProxy 是一个高性能的 TCP/HTTP 负载均衡器,适用于 MySQL 负载均衡。
sudo yum install haproxy -y
编辑 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
用于健康检查,确保只有可用的后端服务器接收流量。
sudo systemctl start haproxy
sudo systemctl enable haproxy
应用程序连接字符串示例:
jdbc:mysql://:3307/test_db?user=&password=
Redis Sentinel 提供监控、通知、自动故障转移和配置中心功能。以下步骤将配置 Redis Sentinel 以实现 Redis 的高可用性。
在至少三个节点上部署 Redis Sentinel,以避免单点故障。以下以单个节点示例,实际部署请在多台服务器上进行。
Redis Sentinel 是 Redis 的一部分,无需单独安装。在每台 Redis 服务器上编辑配置文件添加 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
创建 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
在任一 Sentinel 节点上执行以下命令查看 Sentinel 状态:
redis-cli -p 26379 sentinel masters
应显示 Master 的详细信息。
确保数据库和缓存系统的安全性是至关重要的。以下是一些安全配置建议:
使用 firewalld 或 iptables 限制对 MySQL 和 Redis 服务的访问,仅允许特定 IP 访问。
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'
# 类似配置其他端口
root
用户不允许远程登录,使用强密码,并定期更换密码。requirepass
,并在 Sentinel 配置中同步密码。考虑使用 SSL/TLS 加密 MySQL 和 Redis 的传输,防止数据在传输过程中被窃听。
ssl
相关参数,启用 SSL 连接。使用专业的监控工具实时监控 MySQL 和 Redis 的性能和健康状态。
制定定期备份策略,确保数据安全与可恢复性。
SAVE
规则,定期生成 RDB 文件。编写自动化脚本,定期执行备份任务,并将备份文件存储在安全的位置,如远程服务器或云存储。
问题描述:SHOW SLAVE STATUS\G
中 Slave_IO_Running
或 Slave_SQL_Running
显示 No
。
解决方案:
server-id
、log_bin
等参数。问题描述:应用程序无法通过 HAProxy 连接 MySQL,或连接异常。
解决方案:
问题描述:当 Master Redis 节点宕机时,Sentinel 未能自动进行故障转移。
解决方案:
sentinel monitor
参数正确无误。通过本指南,您已成功搭建了一个 MySQL 主主复制与 Redis 缓存的高可用环境。以下是关键要点总结:
server-id
和复制参数,确保数据双向同步。最终建议:
通过科学的规划和细致的执行,您将拥有一个稳定、高效且安全的数据库与缓存系统,满足业务发展的需要。如遇到复杂问题,可以下方留言。
祝您的部署顺利!