2018/04/04

主从配置


主从的工作流程

  • 1、主库把数据更改记录到二进制日志(Binary Log)中
  • 2、备库将主库上的日志复制到自己的中继日志 (Relay Log) 中
  • 3、备库读取中继日志中的事件,将其重放到备库数据之上

/blog/img/mysql_rep1.jpg

第一步是主库记录binlog日志。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到binlog日志中,MySQL 会按照事务提交的顺序而不是语句执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。然后从库复制二进制日志到其本地中继日志中,首先从库会启动一个工作线程,称为 I/O 线程 (Slave_IO_Running),I/O 和主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog dump)线程,该线程会读取主库上二进制日志的事件,如果该线程追赶上主库将睡眠状态,直到主库发送信号量通知其有新事件产生才会被唤醒,从库 I/O 线程会将收到的事件记录到中继日记。从库的另外一个 SQL 线程 (Slave_SQL_Running) 则会分析中继日志,落地到自身数据库中。

主从配置步骤:

  • 1.配置主库参数 my.cnf,建议将 sync_binlog 设置为1,保证数据不丢失。
  • 2.添加从库访问主库的账号。
  • 3.使用mysqldump导出主库数据。
  • 4.配置从库参数my.cnf,主要配置 relay-log。
  • 5.将导出主库的数据 导入到从库中。
  • 6.进入从库mysql终端,设置master相关参数,主要是设置主库的连接信息,binlog文件和pos位置。
  • 7.启动从库复制START SLAVE;,启动完毕查看状态SHOW SLAVE STATUS;

1.配置主库参数

log-bin=mysql-bin
binlog_format=mixed
server-id = 1
expire_logs_days = 10
sync_binlog = 1

在主库里添加从库访问主库的账号

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'%' IDENTIFIED BY 'repl';
mysql> flush privileges;

导出主库数据

mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --all-databases > all-databases.sql

配置从库参数

log-bin=mysql-bin
binlog_format=mixed
server-id = 2
expire_logs_days = 10
early-plugin-load = ""
relay-log=mysql-relay-bin
read_only=1
log-slave-updates=0
skip-slave-start
  • relay-log 中继日志存放
  • read_only 用户只读模式,不允许修改
  • log-slave-updates 从库也要给其他库充当主库身份时,需要设置 logs-slave-updates 选项,这个选项告诉从库将其 SQL 线程执行的更新记录到自己的binlog日志上
  • skip-slave-start 不随数据库启动而启动从库复制

将导出主库的数据 导入到从库中

mysql> source /opt/all-databases.sql;

从库启动复制配置

mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.40.10',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='repl',
    -> MASTER_LOG_FILE='mysql-bin.000043',
    -> MASTER_LOG_POS=154,
    -> MASTER_CONNECT_RETRY=10;

启动从库复制

START SLAVE;
SHOW SLAVE STATUS;

如果发现 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,则表示启动成功,如果有为no的,则存在失败,此时我们就需要翻看mysql报错日志文件排查问题

常见错误1:

The slave I/O thread stops because master and slave have equal MySQL server ids;

出现此报错是因为主从采用的 server_id 一样导致的,修改从库 server_id 重启即可

常见错误2:

The slave I/O thread stops because master and slave have equal MySQL server UUIDs;

出现以上报错是因为主从数据库使用相同的uiid,查看 auto.cnf,原因是拷贝了虚拟机的环境导致的,解决方法是将从库的 auto.cnf 备份删除,然后重启mysql

参考

http://blog.opskumu.com/mysql-rep.html