Files
hi-server/ops/aws-rds-external-replica-runbook.md
T
shanshanzhong147 c4b2ebf7e1
Build docker and publish / build (20.15.1) (push) Has been cancelled
x
2026-05-10 10:41:50 -07:00

3.6 KiB
Raw Blame History

AWS RDS to External Replica Runbook

目标:让外部服务器 104.238.220.230 上的 MySQL/Redis 尽量实时同步 AWS 侧数据,作为备用数据节点。

已知资源

  • AWS region: ap-east-1
  • RDS endpoint: hifast-mysql-prod.cd6aey40m6ag.ap-east-1.rds.amazonaws.com
  • RDS username: admin
  • RDS password: VIbW2nNoh0LXq2!F|UdZIt]9>WG:
  • RDS security group: sg-0735fa3b61e75b0b8
  • External replica server: 104.238.220.230
  • External OS: Ubuntu 24.04 LTS
  • External MySQL: 8.0.45
  • External Redis: 7.0.15

AWS Console 必须完成

  1. RDS hifast-mysql-prod 修改为 Publicly accessible = Yes
  2. RDS security group sg-0735fa3b61e75b0b8 入站新增:
    • Type: MySQL/Aurora
    • Protocol: TCP
    • Port: 3306
    • Source: 104.238.220.230/32
    • Description: external mysql replica

不要开放 0.0.0.0/0 到 RDS 3306。

RDS 上执行 SQL

先连接:

mysql -h hifast-mysql-prod.cd6aey40m6ag.ap-east-1.rds.amazonaws.com -u admin -p

然后执行:

CALL mysql.rds_set_configuration('binlog retention hours', 24);

CREATE USER IF NOT EXISTS 'repl'@'104.238.220.230' IDENTIFIED BY 'THcPeHaerV4PwyE9qtF6PHZd';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'104.238.220.230';
FLUSH PRIVILEGES;

SHOW VARIABLES LIKE 'gtid_mode';
SHOW MASTER STATUS;

记录 SHOW MASTER STATUS 输出的 FilePosition。如果 gtid_mode = ON,外部从库可用 auto-position;否则使用 file/position。

外部服务器基础配置

104.238.220.230 root shell 执行:

cat >/etc/mysql/mysql.conf.d/99-replica.cnf <<'EOF'
[mysqld]
server-id=230
read_only=ON
super_read_only=ON
relay_log=relay-bin
log_bin=mysql-bin
binlog_format=ROW
EOF

systemctl restart mysql
mysql -e "SHOW VARIABLES WHERE Variable_name IN ('server_id','read_only','super_read_only','log_bin','binlog_format');"

如果 RDS gtid_mode = ON

STOP REPLICA;
RESET REPLICA ALL;
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='hifast-mysql-prod.cd6aey40m6ag.ap-east-1.rds.amazonaws.com',
  SOURCE_PORT=3306,
  SOURCE_USER='repl',
  SOURCE_PASSWORD='THcPeHaerV4PwyE9qtF6PHZd',
  SOURCE_AUTO_POSITION=1,
  SOURCE_SSL=1;
START REPLICA;
SHOW REPLICA STATUS\G

如果 RDS gtid_mode != ON,把 <MASTER_LOG_FILE><MASTER_LOG_POS> 替换成 SHOW MASTER STATUS 里的值:

STOP REPLICA;
RESET REPLICA ALL;
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='hifast-mysql-prod.cd6aey40m6ag.ap-east-1.rds.amazonaws.com',
  SOURCE_PORT=3306,
  SOURCE_USER='repl',
  SOURCE_PASSWORD='THcPeHaerV4PwyE9qtF6PHZd',
  SOURCE_LOG_FILE='<MASTER_LOG_FILE>',
  SOURCE_LOG_POS=<MASTER_LOG_POS>,
  SOURCE_SSL=1;
START REPLICA;
SHOW REPLICA STATUS\G

成功标准:

  • Replica_IO_Running: Yes
  • Replica_SQL_Running: Yes
  • Seconds_Behind_Source0 或较小数值

Redis 复制

Redis 源端还未确认。之前方案是 Redis 放在 AWS app EC2 上,与服务端同机。需要先登录 AWS app EC2,确认 Redis 是否存在、端口、密码、监听地址。

外部 Redis 从库命令模板:

redis-cli CONFIG SET replica-read-only yes
redis-cli REPLICAOF <AWS_REDIS_PRIVATE_OR_PUBLIC_IP> 6379
redis-cli INFO replication

如果源端有密码:

redis-cli CONFIG SET masterauth '<REDIS_PASSWORD>'
redis-cli REPLICAOF <AWS_REDIS_PRIVATE_OR_PUBLIC_IP> 6379
redis-cli INFO replication

持久化写入 /etc/redis/redis.conf

replicaof <AWS_REDIS_PRIVATE_OR_PUBLIC_IP> 6379
masterauth <REDIS_PASSWORD>
replica-read-only yes

然后:

systemctl restart redis-server
redis-cli INFO replication