百度搜索了那么多文章,真正精华的还需要自己去提炼 并且自己去动手。下面给大家分享我的原创。自己动手丰衣足食。
首先说说原理吧,如下:
在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上,这个改变是基于sql语句的改变,如果删除系统数据库源文件或删除后新创建同名MYSQL表实现同步则无效。这样两台服务器互为主从,并且都能向外提供服务,这就比使用主从复制具有更好的性能.
双主的设置
从原理论来看MySQL也支持双主的设置,即两个MySQL节点互为主备,不过虽然理论上,双主只要数据不冲突就可以工作的很好,但实际情况中还是很容发生数据冲突的,比如在同步完成之前,双方都修改同一条记录。因此在实际中,最好不要让两边同时修改。即逻辑上仍按照主从的方式工作。但双主的设置仍然是有意义的,因为这样做之后,切换主备会变的很简单。因为在出现故障后,如果之前配置了双主,则直接切换主备会很容易。
双主在设置时,只需将上面的一段设置复制一份,分别写入两个MySQL节点的配置文件,但要修改相应的server-id,auto-increment-offset和master-host。auto-increment-offset就是为了让双主同时在一张表中进行添加操作时不会出现id冲突,所以在两个节点上auto-increment-offset设置为不同的值就好。
步骤如下:
实验环境
服务器名 | IP | 系统 | MySQL |
A | 192.168.1.56 | centos6.5 | 5.5.16 |
B | 192.168.1.55 | centos6.5 | 5.5.16 |
(一)在ServA上增加一个ServB可以登录的帐号:
Mysql>GRANT all privileges ON *.* TO tongbu@'192.168.1.55' IDENTIFIED BY '123456';
在ServB上增加一个ServA可以登录的帐号:
Mysql>GRANT all privileges ON *.* TO tongbu@'192.168.1.56' IDENTIFIED BY '123456';
(二)修改my.cnf
1、 以root用户登录ServA,修改ServA的my.cnf文件
[root@A ~]# cat /usr/local/mysql55/etc/my.cnf
[mysqld]
basedir = /usr/local/mysql55
datadir = /usr/local/mysql55/data
log-error = /usr/local/mysql55/log/mysql_error.log
pid-file = /usr/local/mysql55/mysql.pid
user = mysql
tmpdir = /tmp/mysql_tmp
#port = 3306
log-bin=mysql-bin
server-id=1
binlog-do-db=mydb #需要记录进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项
binlog-ignore-db=mysql #不需要记录进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项
replicate-do-db=mydb #需要进行同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个replicate-do-db选项
binlog-ignore-db=mysql #不需要同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项
#同步参数:
#保证slave挂在任何一台master上都会接收到另一个master的写入信息
log-slave-updates
sync_binlog=1
auto_increment_offset=2
auto_increment_increment=2
slave-skip-errors=all #过滤掉一些没啥大问题的错误
---------------------------------------------------------------------------------------------
2、以root用户登录ServB,修改ServB的my.cnf文件
root@B etc]# cat my.cnf
[mysqld]
basedir = /usr/local/mysql55
datadir = /usr/local/mysql55/data
log-error = /usr/local/mysql55/log/mysql_error.log
pid-file = /usr/local/mysql55/mysql.pid
user = mysql
tmpdir = /tmp/mysql_tmp
#port = 3306
log-bin=mysql-bin
server-id=2
binlog-do-db=mydb #需要记录进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项
binlog-ignore-db=mysql #不需要记录进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项
replicate-do-db=mydb #需要进行同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个replicate-do-db选项
binlog-ignore-db=mysql #不需要同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项
#同步参数:
#保证slave挂在任何一台master上都会接收到另一个master的写入信息
log-slave-updates
sync_binlog=1
auto_increment_offset=2
auto_increment_increment=2
slave-skip-errors=all #过滤掉一些没啥大问题的错误
---------------------------------------------------------------------------------------------------------
㈢ 分别重启服务器A,B上的mysql服务
㈣ 分别在服务器A、B 上查看做为主服务器状态
对于A服务器:
mysql> stop slave;
Query OK, 0 rows affected (0.02 sec)
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000015
Position: 107
Binlog_Do_DB: mydb
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
ERROR:
No query specified
对于B服务器:
mysql> stop slave;
Query OK, 0 rows affected (0.02 sec)
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000023
Position: 107
Binlog_Do_DB: mydb
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
ERROR:
No query specified
㈤ 分别在服务器A、B上用change master语句指定同步位置 :
对于A:
change master to master_host='192.168.1.55',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000023',master_log_pos=107;
注:master_log_file,master_log_pos由上面主服务器查出的状态值中确定
master_log_file对应File,master_log_pos对应Position
对于B:
change master to master_host='192.168.1.56',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000015',master_log_pos=107;
分别在服务器A、B上查看从服务器状态 :
mysql> show slave status\G;
*************************** 1. row ***************************
主要关注以下 2 个参数:
...
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
...
EVEN上:
mysql> show slave status\G;
*************************** 1. row ***************************
主要关注以下 2 个参数:
...
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
...
㈦ 测试
在severA上:
mysql> unlock tables;
mysql> use mydb;
mysql> create table abc(id int);
mysql>insert into abc values(1);
在serverB上:
mysql> select * from abc.mydb;
ERROR 1146 (42S02): Table 'abc.mydb' doesn't exist
mysql> select * from mydb.abc;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
到此mysql双主配置完成!!!