mysql复制

author:skate
time:2012/03/08


MySQL高可用解决方案
1.主备模式:master/slave
2.级联主备模式:A->B->C
3.mysql双主MMM模式
4.hearbeat/san,hearbeat/BRBD模式
5.NDB cluster模式


这里只讲配置,具体的适合应用场景稍后在详述


1.主备模式:master/slave


A.master可以停机配置slave
B.master不允许停机配置slave
C.添加/删除slave
D.常用的维护与诊断手册



A.master可以停机(停止更新)配置slave
通过"load data from master"语句把master主服务器的数据copy到slave从服务器上,但是这个语句使用是有前提条件的;
一个是只对myisam表起作用,第二是该语句将会获得全局的读锁,禁止master主库的任何更新,当然热备份就不会有全局
读锁了。



mysql的复制基本原理是master对数据库的更新存入master的二进制日志文件里,slave通过读master的二进制日志来完成master和slave的主从同步的。整个同步过程需要三个线程来完成


master有一个io线程:负责将master的二进制日志发送到slave
slave有一个io线程和一个sql线程:slave的I/O线程读取master的Binlog Dump线程发送的内容并将该数据拷贝到slave的
数据目录中的本地文件中,即中继日志。slave的sql线程用于读取中继日志并执行日志中包含的更新。


 


在复制的环境中用到的文件
master的文件:
1.二进制文件
二进制文件最好放在单独的目录下,这不但对方便优化、更方便维护。重新命名二进制日志很简单,只需要修改[mysqld]里的
log_bin选项,这里有一点需要注意,如下例子:


log_bin=/home/mysql/binlog/binlog.log


[root@localhost ~]# ll /home/mysql/binlog
total 8
-rw-rw---- 1 mysql mysql 98 Mar  7 17:24 binlog.000001
-rw-rw---- 1 mysql mysql 33 Mar  7 17:24 binlog.index
[root@localhost ~]#


从上面的例子可以看到,我要重新调整logbin的路径为“/home/mysql/binlog”,但我log_bin的设置却有些不同



这里需要注意两点
1).目录的文件夹命名不能有空格
2).指定目录时候一定要以*.log结尾,即不能仅仅指定到文件夹的级别,否则在重启mysql时会报错。


2.错误日志
错误日志对于诊断问题非常重要,第一个要看的就应该是这个文件,类似oracle的alertlog文件。
它的默认路径是“log-error=/var/log/mysqld.log”。


 


slave文件
1.中继日志文件(包括中继日志索引文件)
中继日志文件和master的二进制文件格式一样,也应该单独维护它,把它单独放在一个目录下,可以通过如下两个参数修改
--relay-log=file_name
--relay-log-index=file_name


和中继日志有关的几个参数
--max-relay-logs-size=size
定义中继日志的大小


--relay-log-info-file=file_name
从服务器用于记录中继日志相关信息的文件名。默认名为数据目录中的relay-log.info。


--relay-log-purge={0|1}
是否自动清空不再需要中继日志时。默认值为1(启用)。这是一个全局变量,可以用SET GLOBAL Relay_log_purge动态更改。


3.master.info和relay-log.info两个状态文件
这两个文件都是保存在硬盘上的,服务器异常不会丢失的
master.info:
在slave重启时,读取这个文件以确定它已经从主服务器读取了多少二进制日志,默认名字是数据目录下master.info,若要修改其文件名,通过参数 “--master-info-file=file_name”


relay-log.info:
在slave重启时,读取这个文件以确定它已经处理了多少二进制日志,默认名字是数据目录下relay-log.info,若要修改其文件名,通过参数“--relay-log-info-file=file_name”


4.错误日志
这个和master一样,参考上面,这里就不说了


5.二进制日志
当做级联复制时,二进制文件也会启用,和master类似。


 


停机master复制配置的步骤
1)确定主从服务器的版本,最好版本一样
2)在master服务器上建立一个复制用户并授权,用户slave服务器连接取log用。
3)配置主master,并为slave服务器准备master的备份数据
4)配置slave服务器
5)严重配置是否正确


 


1)确定主从服务器的版本,最好版本一样
在主从库上运行如下语句,检查版本是否一致
mysql> select version();


2)在master服务器上建立一个复制用户并授权,用户slave服务器连接取log用。


创建复制用户:
mysql> grant replication slave on *.* to 'repluser'@'192.168.1.*'  identified by '123456' with grant option;

Query OK, 0 rows affected (0.04 sec)


3)配置主master,为slave服务器准备master的备份数据
master的my.cfg文件
[mysqld]
server-id=1
log_bin=/home/mysql/binlog/binlog.log
binlog-do-db=backup             //需要同步的数据库,默认是所有的数据库都同步
#binlog-ignore-db = mysql         //忽略此数据库同步,不记录到binlog里
#binlog-ignore-db = skate           //忽略此数据库同步,不记录到binlog里



以上的配置没有考虑双master模式


 


获得全局读锁
mysql> flush  tables with read lock;
Query OK, 0 rows affected (0.00 sec)


记录master的日志名和偏移量后
mysql> show master status;


这个时候可以用tar创建了数据库的快照或者关闭mysql直接copy数据文件


[root@localhost mysql]# tar -cvf /tmp/backup-snap.tar ./backup
./backup/
./backup/tt.frm
./backup/right_table.frm
./backup/tt.MYI
./backup/t1.MYD
./backup/t2.frm
./backup/t5.frm
./backup/t1.MYI
./backup/t5.MYD
./backup/db.opt
./backup/t1.frm
./backup/tt.MYD
./backup/left_table.frm
./backup/t5.MYI


注意:如果有innodb表的话,还要打包表空间”ibdata1“。


 


master服务器上重新启用更新
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)



把归档文件传送到salve服务器,然后解压缩文件到slave的数据目录下


[root@localhost mysql]# tar -xvf /tmp/backup-snap.tar



4)配置slave服务器
这个时候mysql应该是停止的


[mysqld]
server-id=11    //不能和master一样
master-connect-retry=60     //在master宕机或连接丢失的情况下,slave线程重新尝试连接master之前睡眠的秒数,默认60s
logs-warnings                //记录更详细的错误信息
read-only  //该选项让slave只允许来自slave线程或具有SUPER权限的用户的更新。可以确保slave的数据一致性。
relay-log-purge=0   //默认值为1,自动清空不需要的rely-log;最好自己定制清空策略     
replicate-do-db=backup  //只复制backup数据库
skip-slave-start  //在第一次配置要使用这个,slave启动时不启动从服务器线程


auto_increment_offset=2   //AUTO_INCREMENT列值的起点,影响到在复制设置中可以有多少主服务器
auto_increment_increment=1 //控制列值增加的间隔


relay_log = mysql-relay-log #中继日志
relay_log_index= mysql-relay-log-index  #指定中继日志的名字的索引文件的位置和名字

log_slave_updates = 1 #将从服务器将所有的复制记录到自己的日志中,该项可以把从服务器作为一个另一个从服务器的主服务器


 


启动mysql服务


[root@localhost mysql]# service mysqld start


开始复制
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.104',

>MASTER_USER='rpl',

>MASTER_PASSWORD='rpl',

>MASTER_LOG_FILE='mysql-bin.000001',

>MASTER_LOG_POS=0;

启动slave
mysql> start slave;



5)查看配置是否正确
然后在主库创建表,在从库查看,并观察错误log


建议:

1.无论主从服务器server-id从10开始

2.主服务器使用innodb引擎,从服务器使用myisam引擎.前者写并发大,后者读效率高.

posted @ 2013-09-25 01:58  rorshach  阅读(197)  评论(0编辑  收藏  举报