MySQL虽然是一款免费的服务器,但其功能和性能均表现不错,下面简单的介绍一下如何设置Replication Server,即主从热备份。这样做的好处之一是可以把比较耗资源的查询操作转移到从服务器上,从而提高系统整体性能。(比如,本文的background是:有一两百台producer服务器向master的MySQL进行查询和修改操作,并同时还有若干的外部系统(consumer)需要查询这个master数据库,为了分担master的loading,所以我们引入了一个或者多个slave,让外部的系统转而查询slave,达到某种意义上的负载均衡)
本操作的环境为:
- CentOS 5.2
- MySQL-server-community-5.1.23-0.rhel4
- 需要同步的数据库por和misc中有旧的数据,如果是空的库,下面的操作就简单一些了。
- 这里待复制的两个库por和misc均使用MyISAM引擎
Step I:
首先编辑主服务器的my.cnf,下面是个例子:
[mysqld]
…
log-bin=mysql-bin
binlog-do-db=por
binlog-do-db=misc
binlog-ignore-db=mysql
server-id=1
…
Replaction是基于log文件的,所以这里必须打开MySQL的log功能,log-bin参数指明log文件的前缀,binlog-do-db参数指明你要同步的数据库名,binlog-ignore-db指明你不想同步的数据库名(在本次安装方案中,有些多余,不过我没有测试去掉它会如何)
还有一个重要的是要设置master服务器的ID,也就是serer-id。接下来,在master上创建一个用户同步的用户:
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'%' IDENTIFIED BY 'this_is_your_password';
Step II
重启MySQL服务器,这样就会生成log文件,通常在/var/lib/mysql下,然后用root登录,执行如下命令
mysql> FLUSH TABLES WITH READ LOCK;
这样做的目的是,让master服务器停止更新操作,可以为接下来的同步数据做一个干净的copy。
Step III
进入/var/lib/mysql 将你要同步的的数据库打包,比如这里为:por.tar和misc.tar
然后在MySQL命令行下执行:
show master status;
系统提示:
mysql> show master status;
+------------------+-----------+-------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+-------------------+------------------+
| mysql-bin.000001 | 106| por,misc,por,misc | mysql,mysql |
+------------------+-----------+-------------------+------------------+
1 row in set (0.00 sec)
这时候你就可以解除锁定了:
mysql> UNLOCK TABLES;
Step IV:
下面开始设置slave server
编辑slave 的my.cnf如下:
[mysqld]
…
server-id=2
master-host=165.204.233.38
master-user=repl
master-password=this_is_your_password
master-port=3306
master-connect-retry=60
…
Step V:
重启Slave,用root登录,执行如下命令:
>stop slave;
> change master to
-> master_host='165.204.233.38',
-> master_user='repl',
-> master_password='this_is_your_password',
-> master_log_file='mysql-bin.000001', // 注意这里的文件名就是上面提到的 show master status中显示的文件名
-> master_log_pos=106; // 注意这里的便宜值就是上面提到的 show master status中显示的偏移值
> slave start;
完毕。
测试一下吧,在master里面建一个新的table,看看是否在slave中出现。
附录:
- 如果你同步不成功,请查看MySQL的日志 缺省位于:/var/log/mysqld.log
- 最好主从服务器使用同一版本的MySQL
- 这里所配置的只是Replication Server,不是MySQL Cluster,不要混为一谈