mysql 5.0 Replication master-master 实操

mysql 5.0 Replication master-master 实操

740人阅读 评论(0) 收藏 举报

先假设两台机器

A 192.168.65.128 

B 192.168.65.129

 

目的:

有原来一台db, 增加有一台,将mysql设置为master-master的热备份,两台都可以进行读写操作,系统为LAMP配置。

原理:

分别设置两台db互为master-slave,并设置不同的auto_increment

操作:

先假设两台机器ip为:

A 192.168.65.128 

B 192.168.65.129

 由于db内部存在MyISAM和InnoDB,为了保证安全,我采取停止服务+mysqldump的方法搬数据。

先假设192.168.65.128为master.192.168.65.129为slave

1.检查两台机器的my.cnf.是否存在

[mysqld]

server-id = 1

relay-log = 指定relay log的名称
replicate-same-server-id
log-bin = /usr/local/mysql-standard-4.1.14-pc-linux-gnu-i686/binlog/db01-bin
(另外一台server-id = 2)

不存在添加,重启

2.在master上新加一个帐户,slave才能用它来连接。这个帐户必须授予 REPLICATION SLAVE 权限。如果这个帐户只用于同步(推荐这么做),那就没必要授予其他权限了。设定你的域是 mydomain.com,想要授权一个帐户 repl 使用密码 slavepass,允许它可以在域里的任何主机连接到master上。用 GRANT 语句来创建帐户:

 

mysql> GRANT REPLICATION SLAVE ON *.*
    -> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
如果打算在slave上执行 LOAD TABLE FROM MASTERLOAD DATA FROM 
MASTER 语句,那么必须给该帐户授予附加权限:

  • 授予全局 SUPERRELOAD 权限。
  • 授予对想要加载的所有表上的 SELECT 权限。在master上任何没有 SELECT 权限的表都会被 LOAD DATA FROM MASTER 略过。

当然如果有phpMyAdmin的话就更加方便。直接点就可以了

3.执行mysql> FLUSH TABLES WITH READ LOCK;

执行 mysql > SHOW MASTER STATUS;

+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73       | test         | manual,mysql     |
+---------------+----------+--------------+------------------+
记录 file 和 position.

 退出mysql console, 使用mysqldump 备份并压缩

shell> mysqldump --opt -u root (-h 192.168.65.127) --password="password" -l --all-databases | gzip -c > /root/test.gz

 理论上master(192.168.65.128)就可以开机投入生产了。

进入mysql console
mysql> UNLOCK TABLES;

4.使用scp或其他传输方式将文件发去slave(192.168.65.129),

shell>scp -r /root/test.gz root@192.168.65.129:/root 

5.登陆192.168.65.129,

shell>gunzip /root/test.gz

shell> mysql -u root -p < /root/test.sql

进入mysql

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master_host_name',
    ->     MASTER_USER='replication_user_name',
    ->     MASTER_PASSWORD='replication_password',
    ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;

mysql>SET GLOBAL auto_increment_increment=n;

mysql>SET GLOBAL auto_increment_offset=n;

n >= server number

当将多个服务器配置为复制主服务器时,使用auto_increment时应采取特殊步骤以防止键值冲突,否则插入行时多个主服务器会试图使用相同的auto_increment值。

服务器变量auto_increment_increment和auto_increment_offset可以帮助协调多主服务器复制和AUTO_INCREMENT列。每个变量有一个默认的(并且是最小的)值1,最大值为65,535。

将这些变量设置为非冲突的值,当在同一个表主插入新行时,多主服务器配置主的服务器将不会与AUTO_INCREMENT值冲突。

auto_increment_increment controls the increment between successive AUTO_INCREMENT values.

  • auto_increment_offset determines the starting point for AUTO_INCREMENT column values.

    mysql> START SLAVE;

    检测mysql 的 error log 是否已经正常启动replication.log的具体位置要查看mysql的配置my.cnf.

    如果正常,master-slave已经建立勒

    6.将两台机器的反过来按照上面所说的程序配置,这样就可以建立起master-master.

    注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info 和 relay-log.info
    所以如有要修改相关slave的配置要先删除这两个文件,否则修改的配置不能生效。

  • mysql 命令

    service mysqld start

    mysqladmin -u root -p shutdown

    apache 命令

    /etc/init.d/http start

    /etc/init.d/http stop

     注意:

  • MySQL同步目前还不支持任何在master和slave上的分布式(跨服务器)更新锁协议以保证操作的原子性。也就是说,存在这样的可能性:客户端A在并存的master 1上做了一个更新,同时,在它同步到并存master 2上之前,客户端B在master 2上可能也做了一个和客户端A在master 1上不同的更新操作。因此,当客户端A所做的更新同步到master 2时,它将产生和master 1上不同的数据表,尽管master 2上的更新操作也全都同步到master 1上去。这意味着除非能确保所有的更新都能以任何顺序安全地执行,否则不要使用双向同步,或者除非注意在客户端程序中的不知原因的无序更新操作。

  • 同时也要意识到在所关心的更新问题上,双向同步实际上并不能很大地改善性能(甚至没有)。两个服务器都需要执行同样数量的更新操作,在一台服务器上也是。唯一区别的是,可能这样做会减少一些锁争夺,因为来自其他服务器的更新操作都会被串行地放到slave线程中。甚至这种好处还可以作为网络延迟的补偿。

     参考资料:http://dev.mysql.com/doc/#manual

http://blog.csdn.net/acsheva/article/details/1474600

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值