可以让 mysql 服务器同时作为主服务器和从服务器吗?

可以让 mysql 服务器同时作为主服务器和从服务器吗?

我正准备将数据库从一台服务器移到另一台服务器。为了减少客户端的停机时间,我想知道我是否可以打开复制功能并给它时间进行完全复制,然后将客户指向新服务器。

我遇到的问题是,我要迁移到的服务器有其他客户的现有活跃数据库。而我要迁移的服务器有其他活跃客户,他们目前不会迁移。

这有可能吗?如果可能,我该如何配置要迁移的服务器和要迁移到的服务器?

答案1

是的——mysql 服务器可以同时作为主服务器和从服务器。

如果您使用 innodb 作为该数据的存储引擎并且移动整个数据库,则应该可以:

  • 在旧服务器上启用 binlogging
  • 从旧服务器进行完全一致的转储,而不阻止任何正在进行的流量
  • 将转储转移到新服务器,然后在那里恢复
  • 为选定的数据库启用复制,并允许新服务器“赶上”生产机器
  • 一旦服务器需要同步数据库 - 切换流量

这可能会有所帮助:

附言:我假设新旧服务器之间的数据库名称没有重叠。

答案2

是的当然。

您应该实现的想法称为 MySQL 循环复制。

例如,假设您有以下内容:

  • DBServer1 有数据库 db1、db2、db3、db4
  • 您想将 db3 和 db4 移动到 DBServer2
  • 您想要限制对 DBServer1 上的 db1 和 db2 的读写
  • 您想要限制对 DBServer2 上的 db3 和 db4 的读写

你可以尝试以下方法

STEP01)GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO replicator@'%' IDENTIFIED BY 'replpass';在DBServer1上运行

步骤02)在 DBServer2 上安装相同版本的 MySQL(您将在 /var/lib/mysql 中拥有默认数据)

步骤03)rsync DBServer1:/var/lib/mysql DBServer2:/var/lib/mysql

STEP04)重复STEP02,直到两次连续的rsync时间相同,最好小于2分钟。

步骤05)禁止你的应用程序向数据库写入任何内容

service mysql stopDBServer1 上的步骤06)

步骤07)在 DBServer1 上配置二进制日志

将此添加到 DBServer1 上的 /etc/my.cnf 中

[mysqld]
server-id=1
log-bin=mysql-bin

将此添加到 DBServer2 上的 /etc/my.cnf

[mysqld]
server-id=2
log-bin=mysql-bin

步骤 08) rsync DBServer1:/var/lib/mysql DBServer2:/var/lib/mysql (最终 RSYNC)

STEP09)service mysql start在 DBServer1 上(二进制日志将开始填充)

STEP10)service mysql start在 DBServer2 上(二进制日志将开始填充)

步骤11)将 db1 和 db2 的应用程序指向 DBServer1

步骤12)将 db3 和 db4 的应用程序指向 DBServer2

步骤13)在DBServer1上运行此命令

CHANGE MASTER TO
MASTER_HOST='xxx.xx.xx.xxx',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=PPPP;

步骤14)在DBServer2上运行此命令

CHANGE MASTER TO
MASTER_HOST='yyy.yy.yy.yyy',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=PPPP;

对于步骤 13 和 14

  • xxx.xx.xx.xxx 是 DBServer2 的私有 IP 地址
  • yyy.yy.yy.yyy 是 DBServer1 的私有 IP 地址
  • PPPP 是任何二进制日志的初始位置
    • 对于 MySQL 5.5,PPPP 为 107
    • 对于 MySQL 5.1,PPPP 为 106
    • 在MySQL 5.1之前,PPPP是98

STEP15)START SLAVE;在DBServer1上运行

STEP16)START SLAVE;在DBServer2上运行

STEP17)SHOW SLAVE STATUS\G在DBServer1上运行,直到Seconds_Behind_Master为0

STEP18)SHOW SLAVE STATUS\G在 DBServer2 上运行,直到 Seconds_Behind_Master 为 0

这种实现方式不仅允许数据库的拆分,而且还允许数据库的备用服务器。

DBServer1 将成为 db1 和 db2 进行读写操作的地方。它还提供 db3 和 db4 的备份。

DBServer2 将成为 db3 和 db4 进行读写操作的地方。它还提供 db1 和 db2 的备份。

试一试 !!!

相关内容