Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2451046
  • 博文数量: 225
  • 博客积分: 11622
  • 博客等级: 上将
  • 技术积分: 7358
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-18 10:05
个人简介

我们的生活是多么美好呀!!!!

文章存档

2013年(2)

2012年(9)

2011年(59)

2010年(8)

2009年(35)

2008年(112)

分类: Mysql/postgreSQL

2008-12-30 15:32:25

RedHat Enterprise 5MySQL镜像服务实现

什么是镜像机制

镜像机制是一种能够让运行在不同计算机上的两个或多个MySQL服务器保持同步变化的机制,这样可以保证MySQL的数据被一个或多个的主机备份。我们通过主服务器-从服务器这样的模式来实现镜像机制。

主-从镜像关系中的数据同步是通过主控系统的二进制日志文件实现的:主控系统把自己执行过的SQL命令记载到自己的二进制日志文件里,从属系统则通过从主控系统的二进制日志文件读出SQL命令并加以执行的办法来同步它们自己的数据库;

 

采用镜像机制的原因

1 安全:主控计算机故障时,可让从属计算机设置为新的主控计算机从而恢复整个系统的运转;

2 速度:让主控计算机负责执行数据修改操作,把开销昂贵的查询操作分散到多台从计算机上去执行,可以大大提高查询速度;

注意:

如果是出于安全方面的考虑才打算使用镜像机制,更好的解决方案是建立一个RAID系统;

如果只是出于速度和性能方面的考虑才打算使用镜像机制,应该首先考虑其它的性能改善措施;

 

MySQL镜像机制的不足

跟像Oracle这样的数据库镜像机制相比,MySQL的不足之处有:

1 不支持fail-safe replication: MySQL目前还不支持让从系统自动切换为主控系统(原主控系统故障的时候),但可以保证查询操作继续进行;

2 不支持multi-master replication: 即让多台主控系统的信息进行数据同步;

 

在镜像机制中,所有数据的修改操作必须在主控系统上进行,否则镜像关系就会被破坏;如果要禁止用户对从属系统里的数据进行修改,要设置MySQL的配置文件/etc/my.cnf,设置[mysqld]配置段添加binlog-ignore-db=mysql,但会带来难以同步mysql数据库的问题;

 

设置镜像机制的步骤

关于MySQL日志

1 实现镜像机制要用到日志;

2 通过日志可以把数据重新创建出来,即恢复数据库;

3 默认情况下几乎所有日志功能处于禁用态;

4 日志文件占用的空间往往比数据库本身大,所以要给日志预留较大空间;

5 MySQL5.0后的日志采用二进制文件,不能直接查看,要用mysqlbinlog程序来查看;

 

启用日志

设置/etc/my.cnf

[mysqld]

log-bin=anmy ;将在/var/lib/mysql中增加anmy.000001/anmy.index两个日志文件;

注:如果没有给出文件名,将会创建以主机来命名的文件,如localhost-bin.000001  localhost-bin.index这两个文件;最好要自己命名,特别是建立镜像机制的时候;

查看日志方法:mysqlbinlog anmy.000001

重启mysql将启用新的日志文件,或者用flush logs切换到下一个日志,外部用mysqladmin flush-logs也可以切换;

当日志超过max_binlog_size给出的上限(默认1GB),也会创建新日志;

删除日志用reset master命令;

按照最早生成的日志最先恢复的原则;

mysqlbinlog logname | mysql -u root -p;

为安全起见,最好不要把日志文件与数据库存放在同一块硬盘上;

设置暂停日志记录 set sql_log_bin=0;

设置启用日志记录 set sql_log_bin=1;

出错日志放于/var/log/mysqld.log文件中

 

关闭主控服务器

 

mysql> flush tables with read lock;

mysql> show master status;

+-------------+----------+--------------+------------------+

| File        | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------+----------+--------------+------------------+

| anmy.000001 |      177 |              |                  |

+-------------+----------+--------------+------------------+

 

为主控服务器创建快照

a /var/lib/mysql/目录下的有关数据库子目录和数据库文件压缩并安装到从属系统上作为该数据库的初始状态;注意不要把各日志文件包括进去;

b mysqldump --all-databases --master-data > a.sql 生成备份文件;(如果要备份InnoDB表空间文件即ibdata文件,再加上--single-transaction选项)

 

修改配置文件让某服务器成为主控服务器

/etc/my.cnf

加入

[mysqld]

log-bin=anmy

server-id=1

 

建立从属系统

将主系统上的数据放至/var/lib/mysql下,而从属系统的日志功能没必要启用;

给从属系统修改配置文件/etc/my.cnf并分配标识符

[mysqld]

server-id=2 注:不要与主系统和其它从属系统冲突;

从属系统的配置文件还可以设置read-only以防止修改;

 

启动镜像机制

在从属系统上执行

mysql> change master to

    -> master_host = '192.168.0.247',    注:主控服务器IP;

    -> master_user = 'root',

    -> master_log_file = 'anmy.000001',

    -> master_log_pos = 177;  注:值要跟show master status得出的值一致;

再执行

mysql> start slave;

 

7 检查镜像机制是否工作正常

在主控系统上的创建或删除操作可以反映到从属系统上;

在从系统上的/var/log/mysqld.log当中可以看到如下信息:

080527  8:19:52 [Note] Slave SQL thread initialized, starting replication in log 'anmy.000001' at position 177, relay log './localhost-relay-bin.000001' position: 4

080527  8:19:52 [Note] Slave I/O thread: connected to master 'root@192.168.0.247:3306',  replication started in log 'anmy.000001' at position 177

进一步测试:

关停主系统,创建新数据库比如yp,再重新启动从系统,从系统应该在几秒钟内自动完成同步工作;

不想把SQL命令镜像到从系统set sql_log_bin=0;

继续镜像set sql_log_bin=1;

注意事项:

从系统数据根目录下的master.info文件不可以随意更改

阅读(905) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~