基本原理
- 一台mysql服务器作为master节点,其他服务器作为slave节点。每个节点需要配置全局唯一的
server-id
。 - master将操作记录在binary log中,slave同步binary log,通过回放重做来获得master的变更,实现数据复制。
原理图如下:
优缺点
配置过程
-
配置master服务器。
- 在
my.cnf
文件的mysqld
节点中新增以下配置并重启服务器。
[mysqld] server-id=1 //需全局唯一 log_bin=/home/dalton/d_arch_exp/mysql_cluster/mysql1/mysql-bin.log binlog_do_db=test_repl //可选,默认是所有数据库。可以配置多个数据库。
- 新建用于同步的用户。要将复制的权限和使用待复制的数据库的权限赋给新用户,没有权限会导致slave无法连接master。
create user repl_01 identified by 'loveme123'; grant replication slave on *.* to repl_01; grant all privileges on test_repl.* to 'repl_01'@'%'; flush privileges;
- 在
-
配置slave服务器
在my.cnf
文件的mysqld
节点新增以下配置。[mysqld] server-id=2 relay-log=/home/dalton/d_arch_exp/mysql_cluster/mysql2/mysql-relay-bin.log log_bin=/home/dalton/d_arch_exp/mysql_cluster/mysql2/mysql-bin.log binlog_do_db=test_repl
-
同步基准数据。
导出master节点待同步数据库的数据,然后导入到slave数据库中。这期间可以给数据库加read lock或者停止数据库,以防止发生其他变更。- 导出数据:
mysqldump -u root -p --opt test_repl > test_repl.sql
- 给数据库加锁。这个操作需要重新打开一个mysql终端连到master节点。
use test_repl; FLUSH TABLES WITH READ LOCK;
- 记录当前使用的日志文件及位置
SHOW MASTER STATUS;
输出内容如下,使用的文件是
mysql-bin.000002
,偏移是1253
:+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 1253 | test_repl | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
- 导入数据到slave服务器。
mysql -u root -p test_repl < test_repl.sql
-
启动复制。
- 在slave节点执行change master操作。
change master to master_host='127.0.0.1',master_port=3307,master_user='repl_01',master_password='loveme123',master_log_file='mysql-bin.000002',master_log_pos=1253;
- 启动slave。
start slave;
- 查看slave状态。
show slave status;
如果是以下状态,
Slave_IO_Running
和Slave_SQL_Running
都是Yes
,则表明配置ok。
- slave都启动好了就可以去掉master上的锁。
UNLOCK TABLES; QUIT;
-
可能碰到的几个错误
- 启动slave后,状态表中显示
Slave failed to initialize relay log info structure from the repository
。
解决方法:重置slave。reset slave;
- 启动slave后,状态表中显示
error connecting to master 'repl_01@127.0.0.1:3307' - retry-time: 60 retries: 1
。
解决方法:尝试用change master
中的参数去连接master节点。一般都是参数或权限不对,导致的连接失败。理论上能正常连接的话slave不会报错。
- 启动slave后,状态表中显示