1.1. 基础信息
数据库主服务器 IP:127.0.0.1
数据库从服务器 IP:192.168.1.31
1.2. 主服务器配置文件 my.ini 配置 (master)
[mysqld]
#打开日志 (主机需要打开) 表示二进制变更日值
log-bin=mysql-bin
#服务器唯一 id
server-id=1
#给从机同步的数据库名称
binlog-do-db=shenxianyun_console
binlog-do-db=shenxianyun_portal
binlog-do-db=test
#自动清理 1 天前的 log 文件
expire_logs_days=1
1.3. 重启主 MYSQL 服务
service mysqld restart
1.4. 主数据库授权同步数据库的用户
- 授权
GRANT REPLICATION SLAVE ON *.* TO 'user'@'%' IDENTIFIED BY'password';
- 刷新权限
FLUSH PRIVILEGES;
- 查看主服务状态
SHOW MASTER STATUS;
1.5. 从服务器配置文件 my.ini 配置 (slave)
[mysqld]
#服务器 id
server-id=2
#要从主机同步的库
replicate-do-db=shenxianyun_console
replicate-do-db=shenxianyun_portal
replicate-do-db=test
#配置中继日志(一般可以不用)
#relay_log =
mysql-relay-bin
# slave 将复制事件写进自己的二进制日志 (后面会看到它的用处)。
#log_slave_updates = 1
#它防止改变数据 (除了特殊的线程) 慎重使用
#read_only = 1
server_id 是必须的,而且唯一。slave 没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果 slave 为其它 slave 的 master,必须设置 bin_log。在这里,我们开启了二进制日志,而且显示的命名 (默认名称为 hostname,但是,如果 hostname 改变则会出现问题)。
relay_log 配置中继日志,log_slave_updates 表示 slave 将复制事件写进自己的二进制日志 (后面会看到它的用处)。
有些人开启了 slave 的二进制日志,却没有设置 log_slave_updates,然后查看 slave 的数据是否改变,这是一种错误的配置。所以,尽量使用 read_only,它防止改变数据 (除了特殊的线程)。但是,read_only 并不很实用,特别是那些需要在 slave 上创建表的应用。
1.6. 重启从 MYSQL 服务
service mysqld restart
1.7. 启动 slave (实现数据同步)
接下来就是让 slave 连接 master,并开始重做 master 二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用 CHANGE MASTER TO 语句,该语句可以完全取代对配置文件的修改,而且它可以为 slave 指定不同的 master,而不需要停止服务器。如下:
- 配置 slave 服务器用于连接 master 服务器的参数
【注意:MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=594 是通过前面的主数据库 SHOW MASTER STATUS; 得到】
CHANGE MASTER TO MASTER_HOST='1.1.1.1',MASTER_USER='root', MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=594;
- 开启 SLAVE 同步
start slave;
- 查看下 slave 状态
show slave status;
当 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,才说明主从复制成功
slave 的 I/O 和 SQL 线程都已经开始运行,而且 Seconds_Behind_Master 不再是 NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在 master 上进行修改,你可以在 slave 上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。
你可查看 master 和 slave 上线程的状态。在 master 上,你可以看到 slave 的 I/O 线程创建的连接:
在 master 上输入 show processlist\G;
行 2 为处理 slave 的 I/O 线程的连接。在 slave 服务器上运行该语句: show processlist;
行 1 为 I/O 线程状态,行 2 为 SQL 线程状态。
1.8. 添加新 slave 服务器
假如 master 已经运行很久了,想对新安装的 slave 进行数据同步,甚至它没有 master 的数据。
此时,有几种方法可以使 slave 从另一个服务开始,例如,从 master 拷贝数据,从另一个 slave 克隆,从最近的备份开始一个 slave。Slave 与 master 同步时,需要三样东西:
(1)master 的某个时刻的数据快照;
(2)master 当前的日志文件、以及生成快照时的字节偏移。这两个值可以叫做日志文件坐标 (log file coordinate),因为它们确定了一个二进制日志的位置,你可以用 SHOW MASTER STATUS 命令找到日志文件的坐标;
(3)master 的二进制日志文件。
可以通过以下几中方法来克隆一个 slave:
(1) 冷拷贝 (cold copy)
停止 master,将 master 的文件拷贝到 slave;然后重启 master。缺点很明显。
(2) 热拷贝 (warm copy)
如果你仅使用 MyISAM 表,你可以使用 mysqlhotcopy 拷贝,即使服务器正在运行。
(3) 使用 mysqldump
使用 mysqldump 来得到一个数据快照可分为以下几步:
<1> 锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下:
mysql> FLUSH TABLES WITH READ LOCK;
<2> 在另一个连接用 mysqldump 创建一个你想进行复制的数据库的转储:
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
<3> 对表释放锁。
mysql> UNLOCK TABLES;
2. 复制的常用拓扑结构
复制的体系结构有以下一些基本原则:
(1) 每个 slave 只能有一个 master;
(2) 每个 slave 只能有一个唯一的服务器 ID;
(3) 每个 master 可以有很多 slave;
(4) 如果你设置 log_slave_updates,slave 可以是其它 slave 的 master,从而扩散 master 的更新。
MySQL 不支持多主服务器复制 (Multimaster Replication)——即一个 slave 可以有多个 master。但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。1.9. 单一 master 和多 slave
由一个 master 和一个 slave 组成复制系统是最简单的情况。Slave 之间并不相互通信,只能与 master 进行通信。如下:
如果写操作较少,而读操作很时,可以采取这种结构。你可以将读操作分布到其它的 slave,从而减小 master 的压力。但是,当 slave 增加到一定数量时,slave 对 master 的负载以及网络带宽都会成为一个严重的问题。
这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。一些建议:
(1) 不同的 slave 扮演不同的作用 (例如使用不同的索引,或者不同的存储引擎);
(2) 用一个 slave 作为备用 master,只进行复制;
(3) 用一个远程的 slave,用于灾难恢复;1.10.
主动模式的 Master-Master(Master-Master in Active-Active Mode)
Master-Master 复制的两台服务器,既是 master,又是另一台服务器的 slave。如图:
主动的 Master-Master 复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。这种结构最大的问题就是更新冲突。假设一个表只有一行 (一列) 的数据,其值为 1,如果两个服务器分别同时执行如下语句:
在第一个服务器上执行:
mysql> UPDATE tbl SET col=col + 1;
在第二个服务器上执行:
mysql> UPDATE tbl SET col=col * 2;
那么结果是多少呢?一台服务器是 4,另一个服务器是 3,但是,这并不会产生错误。
实际上,MySQL 并不支持其它一些 DBMS 支持的多主服务器复制 (Multimaster
Replication),这是 MySQL 的复制功能很大的一个限制 (多主服务器的难点在于解决更新冲突),但是,如果你实在有这种需求,你可以采用 MySQL Cluster,以及将 Cluster 和 Replication 结合起来,可以建立强大的高性能的数据库平台。但是,可以通过其它一些方式来模拟这种多主服务器的复制。1.11.
主动 - 被动模式的 Master-Master(Master-Master in Active-Passive Mode)
这是 master-master 结构变化而来的,它避免了 M-M 的缺点,实际上,这是一种具有容错和高可用性的系统。它的不同点在于其中一个服务只能进行只读操作。如图:
1.12. 带从服务器的 Master-Master 结构 (Master-Master with Slaves)
这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到 slave 上。