原理

master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O Thread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒。

操作

修改配置文件

配置1

以下是192.168.241.22的配置
vim /etc/my.cnf

  • [mysqld]后追加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    server-id = 1        
    log-bin = mysql-bin
    binlog-ignore-db = mysql,information_schema
    sync_binlog = 1
    binlog_checksum = none
    binlog_format = mixed
    auto-increment-increment = 2
    auto-increment-offset = 1
    slave-skip-errors = all
  • 然后重启

    1
    2
    3
    service mysqld restart

    /etc/init.d/mysqld restart

数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql)
都是填写对方的用户名、IP、密码

1
2
3
mysql> grant replication slave,replication client on *.* to root@'192.168.241.33' identified by "1234";

mysql> flush privileges;
  • 最好将库锁住,仅仅允许读,以保证数据一致性;待主主同步环境部署后再解锁;锁住后,就不能往表里写数据,但是重启mysql服务后就会自动解锁!
    1
    2
    3
    4
    5
    # 注意该参数设置后,如果自己同步对方数据,同步前一定要记得先解锁!
    mysql> FLUSH TABLES WITH READ LOCK;

    # 显示表,记着上面的参数
    mysql> show master status;

配置2

以下是192.168.241.33的配置

  • 修改配置文件,在[mysqld]后追加
    vim /etc/my.cnf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    server-id = 2       
    log-bin = mysql-bin
    binlog-ignore-db = mysql,information_schema
    sync_binlog = 1
    binlog_checksum = none
    binlog_format = mixed
    auto-increment-increment = 2
    auto-increment-offset = 2
    slave-skip-errors = all
  • 重启mysql

  • 数据同步授权
    iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql
    同理,slave也要授权给master机器远程同步数据的权限

    1
    2
    3
    4
    mysql> grant replication slave ,replication client on *.* to root@'192.168.241.22' identified by "1234";  
    mysql> flush privileges;
    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> show master status;

执行主张同步操作

两台机器都需要执行以下操作,区别在于都需要写对方的数据

先在slave数据库上做同步master的设置。(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)

1
2
3
4
5
6
7
8
9
10
mysql> unlock tables;     //先解锁,将对方数据同步到自己的数据库中
mysql> stop slave;


# 这里填写的数据是对方查出来的 show master status 表
mysql> change master to master_host='192.168.241.22',master_user='root',master_password='1234',master_log_file='mysql-bin.000001',master_log_pos=612;


mysql> start slave;
mysql> show slave status \G;