关于mysql master/slave的应用场景就不做介绍,本文主要讲解是配置。配置相对还是比较简单,只需要在master和slave的mysql的配置文件中增加几行就可以了。
Master上修改:
修改master配置文件,linux默认为/etc/my.cnf,在 mysqld 段中添加如下配置。
server-id = 1
# 唯一ID,master/slave 集群中不能重复,默认master使用 1
log-bin = mysql-bin
# 同步事件的日志记录文件,master/slave通过该文件来达到同步的目的
binlog-do-db = db_name
# 需要同步的数据库名,如果多个库,重复设置binlog-do-db即可
# 如果指定,mysql服务器只会记录指定库的操作日志到mysql-bin中
# 也可以不指定,此时除binlog-ignore-db中指定的库外,其它所有库的操作日志都会记录在mysql-bin中
binlog-ignore-db = db_name1
# 忽略同步的数据库名,如果多个库,重复设置binlog-ignore-db即可
# 可以不指定
另外需要在master上需要创建一个用户,并且赋予其replication slave的权限,例如:
grant replication slave on *.* to slaveuser@192.168.1.3 identified by '123456';
其中slaveuser是用户名,192.168.1.3是slave的ip,可以使用通配符,例如192.168.1.%表示192.168.1.0 – 192.168.1.255这个网段所有slave都可以能通过该用户来访问master,123456是slaveuser对应的密码。
slave上修改:
修改配置文件,在 mysqld 段中增加如下配置:
server-id = 2
# 唯一ID,不能与master或其他slave重复
master-host = master ip
master-port = 3306
# master 服务的端口
master-user = slaveuser
master-password = 123456
# master上已授权replication slave的用户和密码
replicate-do-db = tagphi_asm
# 需要同步的数据库名,如果多个库,重复设置replicate-do-db即可
# 如果指定,slave上只会同步更新制定的库,其他库的更新将被忽略
# 可以不指定,此时slave会更新master上mysql-bin日志中记录所有库
上面主要讲了 master/slave 的配置细节,接下来通过实例来说明。
如果对于一个全新的环境,假设master服务器的ip为192.168.1.68,需要同步的库为testDB,
master 配置:
server-id = 1
log-bin = mysql-bin
binlog-do-db = testDB
创建并授权用户:
grant replication slave on *.* to slaveuser@192.168.1.3 identified by '123456';
slave 配置:
server-id = 2
master-host=192.168.1.68
master-port=3306
master-user=slaveuser
master-password=123456
replicate-do-db=testDB
配置到此就完成了,分别重启master和slave上的mysql服务器。
在master上使用如下命令:
show master status;
输出结果为:
+------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+-------------------------------+
| mysql-bin.000016 | 892 | testDB | |
+------------------+----------+--------------+-------------------------------+
在slave上使用如下命令:
show slave status \G
如果输出的Slave_IO_Running和Slave_SQL_Running都为yes说明master,slave正常工作。现在在master创建数据库testDB以及其对应的表,应该在slave上会同步创建testDB库和表,同时如果master上的testDB中的表中数据有变化(插入、更新、删除),slave上对应的表也会做相应的变化。
上面的配置实例是在一开始规划数据库的部署就是用master,slave的情况,但现实中往往可能是先有一台mysql服务器,系统运行一段时间后,才准备使用master、slave的架构,这时我们的数据库中已经有了数据,另外记录log的文件也可能清除过,而且数据库的数据随时都可能变化,这种情况下,配置同上面的几乎一致,但需要额外处理一些其他的事,。这里也假设master服务器的ip为192.168.1.68,需要同步的库为testDB。
master上服务器的配置修改同上,修改配置后重新mysql服务,另外需要把testDB数据库使用mysqldump备份出来,同时使用show master status命令把输出的结果中的File和Position信息记录下来,命令如下:
锁定数据库为只读状态,防止在备份数据库时外部程序对数据修改
flush tables with read lock;
查看master的状态,同时记录File和Position
show master status;
+------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+-------------------------------+
| mysql-bin.000012 | 653 | testDB | |
+------------------+----------+--------------+-------------------------------+
备份数据库
mysqldump -uroot -p123456 testDB > testDB.sql
备份完数据库后解除数据库的锁定
unlock tables;
slave配置也同上,注意此时启动slave的mysql服务时不启动slave服务,可以通过在配置文件中使用
skip-slave-start = true
来实现。启动mysql服务后,先在上面创建数据库testDB,然后将master上备份导入到testDB中,在mysql客户端下执行如下命令:
设定master信息,其中MASTER_LOG_FILE和MASTER_LOG_POS就是上面记录的File和Position的值
CHANGE MASTER TO MASTER_HOST='192.168.1.68',
MASTER_USER='slaveuser',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000012',
MASTER_LOG_POS=653;
启动slave
start slave;
不出意外,master,slave就正常工作了,另外把配置文件skip-slave-start去掉,下次重启slave上的mysql服务就会自动启动slave的。