mysql主从同步配置与原理

  • 一、原理
  • 1、binlog模式
  • SBR模式
  • RBR模式(ROW-BASED REPLICATION)
  • 2、作用
  • 3、主从模式
  • 二、主从配置
  • 1、master节点
  • 配置文件
  • 创建用户
  • 查看id和文件名称
  • 2、slave节点
  • slave配置
  • 设置replication
  • 三、主从同步测试


一、原理

  MYSQL主从复制的原理是主服务器数据库的每次操作都会记录在mysql下的data目录中二进制文件mysql-bin.xxx里,从服务器的I/O线程使用专用账号登录到主服务器中读取该二进制文件,并将文件内容写入到从服务器的relay-log日志文件中,然后从服务器的SQL线程会根据relay-log日志中的内容执行SQL语句。

1、binlog模式

SBR模式

  SBR(statement-based replication)只执行SQl语句,SBR的日志量取决于SQl的情况,SBR不会记录每一行的变化,节约了binlog日志量,减少IO,提高性能。

  • SBR缺点
      1、 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候,
      2、调用具有不确定因素的UDF时复制也可能出问题
      3、使用以下函数语句无法复制:
    * LOAD_FILE()
    * UUID()
    * USER()
    * FOUND_ROWS()
    * SYSDATE()
      4、执行INSERT … SELECT 会产生比RBR更多的行级锁
      5、复制需要进行全表扫描的UPDATE时,需要比RBR请求更多的行级锁
      6、对于有AUTO_INCREMENT字段的INNODB表,INSERT语句会阻塞其他的INSERT.
      7、对于一些复杂的语句,在服务器上的耗资情况会更严重,而RBR模式下,只会对那个发生变化的记录产生影响
      8、从节点mysql数据库的数据表必须和主服务器一致才可以,否则容易导致同步出错。

RBR模式(ROW-BASED REPLICATION)

  • 优点
  • 任何情况都可以被复制,对于数据来说是最安全可靠的,和大多数数据库系统复制技术一样
  • 从服务器上的表如果有主键,复制会快很多
  • 复制一下语句时行级锁少
  • INSERT … SELECT
  • 包含AUTO_INCREMENT字段的INSERT日志
  • 没有附带条件或者没有修改很多记录的UPDATE、DELETE语句
  • 执行INSERT、UPDATE、DELETE语句时锁更少
  • 服从器上采用多线程来执行复制称为可能
  • RBR缺点
  • binlog日志大了很多
  • 复杂的回滚时binlog中包含大量的数据
  • 主服务器上执行UPDATE语句时,所有发生变化的记录都会写入到binlog中,而SBR只会写一次,这会导致频繁发生binlog并发写问题
  • UDF产生的大量BLOB值会导致复制变慢
  • 无法从binlog中看到都复制写了什么语句
  • 当在非事物表上执行一段堆积的SQL语句时,最好采用SBR模式,否则容易导致主从服务器的数据不一致情况发生

2、作用

  • 数据分布
  • 负载均衡
  • 备份
  • 高可用性和容错行

3、主从模式

本案例讲述为一主一从

  • 一主一从
  • 一主多从
  • 多主一从

二、主从配置

1、master节点

配置文件

  1、修改mysql的配置文件。
vim /etc/my.cnf

log-bin = mysql-bin
server_id = 1
binlog-do-db = hain_res #如果有多个库同步,重复设置此参数
log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 1
expire_logs_days = 7
log_bin_trust_function_creators = 1

2、重启mysql
  重启mysql使配置生效。

systemctl restart mysql

创建用户

1、创建同步专用账号
%:代表所有的地址都可以使用此用户进行访问,建议换成指定的从库的地址。

GRANT REPLICATION SLAVE ON *.* to 'mysyxs'@'%' identified by '****';

2、刷新

flush privileges;

查看id和文件名称

1、登录mysql

mysql -h127.0.0.1 -uroot -p****

2、复制id和日志文件名称

show master status;

2、slave节点

slave配置

  1、开启relaylog
修改/etc/my.cnf配置文件

vim /etc/my.cnf
relay-log = /data/3307/relay-bin
server-id = 2

2、重启mysql服务

systemctl resatrt mysqld

设置replication

1、登录mysql

mysql -h127.0.0.1 -uroot -p****

2、设置replication

mysql> CHANGE MASTER TO MASTER_HOST='127.0.0.1',  
    -> MASTER_PORT=3306,
    -> MASTER_USER='mysqlxs',
    -> MASTER_PASSWORD='*****',
    -> MASTER_LOG_FILE='mysql-bin.0003',根据master的日志文件名进行修改
    -> MASTER_LOG_POS=337;#根据master的id进行修改

3、启动slave

mysql> start slave;

4、查看slave

mysql> show slave status\G

三、主从同步测试

1、在master节点创建表并插入数据(略)
2、在slave节点进行查看结果(略)