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引擎.前者写并发大,后者读效率高.