MySQL 主主复制与 Redis 环境安装部署
本指南将具体介绍怎样在服务器上部署一个MySQL 主主(Master-Master)复制环境以及Redis缓存服务。通过本指南,您将能够搭建一个高可用、高性能的数据库与缓存系统,适用于中大型应用场景。
目录
- 前提条件
- MySQL 主主复制环境配置
- 2.1 安装 MySQL
- 2.2 配置 MySQL 主主复制
- 2.3 启动复制并验证
- Redis 环境安装与配置
- 3.1 安装 Redis
- 3.2 配置 Redis
- 3.3 启动 Redis 服务
- 高可用与负载均衡设计
- 4.1 MySQL 负载均衡计谋
- 4.2 Redis 高可用方案(Redis Sentinel)
- 安全性配置
- 监控与备份计谋
- 常见标题与解决方案
- 总结
1. 前提条件
在开始之前,请确保满足以下前提条件:
- 服务器准备:准备至少两台物理服务器或虚拟机,操作系统建议使用 CentOS 7/8 或 Ubuntu 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-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
复制代码 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 实行:
输出示例:
- +------------------+----------+--------------+------------------+-------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
- +------------------+----------+--------------+------------------+-------------------+
- | mysql-bin.000001 | 154 | | | e6d... |
- +------------------+----------+--------------+------------------+-------------------+
复制代码 在 Server B 实行:
输出示例:
- +------------------+----------+--------------+------------------+-------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
- +------------------+----------+--------------+------------------+-------------------+
- | mysql-bin.000001 | 156 | | | a1b... |
- +------------------+----------+--------------+------------------+-------------------+
复制代码 记录下各自的 File 和 Position 或 Executed_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 验证复制状态
在两台服务器上分别实行以下下令检察复制状态:
确保以下字段显示为 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_increment 和 auto_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 毗连
应返回 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 防火墙配置
使用 firewalld 或 iptables 限定对 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 Tools 或 RDB 拷贝脚本 进行备份。
6.3 主动化脚本
编写主动化脚本,定期实行备份使命,并将备份文件存储在安全的位置,如长途服务器或云存储。
7. 常见标题与解决方案
7.1 MySQL 复制不工作
标题描述:SHOW SLAVE STATUS\G
中 Slave_IO_Running 或 Slave_SQL_Running 显示 No。
解决方案:
- 查抄复制用户权限是否精确。
- 确认网络毗连正常,防火墙未拦截。
- 查抄 MySQL 配置是否精确,尤其是 server-id、log_bin 等参数。
- 检察错误日记,定位具体错误信息。
7.2 HAProxy 无法毗连 MySQL 后端
标题描述:应用步伐无法通过 HAProxy 毗连 MySQL,或毗连非常。
解决方案:
- 确认 HAProxy 配置文件是否精确,后端服务器 IP 和端口配置无误。
- 查抄后端 MySQL 服务是否正常运行。
- 检察 HAProxy 日记,分析毗连失败原因。
- 确认防火墙配置允许 HAProxy 与 MySQL 后端通讯。
7.3 Redis Sentinel 未能主动故障转移
标题描述:当 Master Redis 节点宕机时,Sentinel 未能主动进行故障转移。
解决方案:
- 确认 Sentinel 配置文件中的 sentinel monitor 参数精确无误。
- 确保至少有三个 Sentinel 实例在运行。
- 查抄 Sentinel 日记,检察故障转移干系错误信息。
- 确认 Sentinel 节点之间的网络通讯正常。
8. 总结
通过本指南,您已成功搭建了一个 MySQL 主主复制与 Redis 缓存的高可用环境。以下是关键要点总结:
- 环境准备:确保服务器配置、网络通畅和必要的权限。
- MySQL 主主复制:安装 MySQL,两台服务器配置不同的 server-id 和复制参数,确保数据双向同步。
- Redis 安装与配置:编译安装 Redis,进行必要的安全配置,确保缓存服务稳固运行。
- 高可用与负载均衡:使用 HAProxy 进行 MySQL 负载均衡,配置 Redis Sentinel 实现 Redis 高可用。
- 安全性配置:通过防火墙、强暗码和加密传输确保系统安全。
- 监控与备份:部署监控工具,制定定期备份计谋,确保系统的可见性和数据安全。
- 故障扫除:了解常见标题的解决方法,确保系统稳固运行。
最终建议:
- 定期维护:定期查抄系统状态,更新软件版本,应用安全补丁。
- 性能优化:根据监控数据优化数据库和缓存配置,提升系统性能。
- 扩展性设计:根据业务增长需求,灵活扩展 MySQL 和 Redis 实例,确保系统可伸缩性。
- 文档与培训:记录系统配置与操作流程,定期培训运维团队,提升团队应急响应本领。
通过科学的规划和过细的实行,您将拥有一个稳固、高效且安全的数据库与缓存系统,满足业务发展的需要。如遇到复杂标题,可以下方留言。
祝您的部署顺利!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |