mysql 5.0 Replication master-master 实操
先假设两台机器
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 MASTER
或LOAD DATA FROM MASTER
语句,那么必须给该帐户授予附加权限:
- 授予全局
SUPER
和RELOAD
权限。 - 授予对想要加载的所有表上的
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 forAUTO_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://blog.csdn.net/acsheva/article/details/1474600