Mysql 主从配置原理

主从同步的定义

Mysql 主从复制是指数据可以从一个Mysql数据服务器主节点,复制到一个或多个从节点数据服务器。Mysql 默认采用异步复制的方式,这样从节点不用一直访问主服务器来更新数据,从服务器甚至可以通过拨号断断续续的连接主服务器,通过配置文件,从节点可以复制主数据库中的所有数据库或特定的数据库或特定的表。

主从同步好处

  • 读写分离,使数据库可以支撑更大的并发

    主服务器负责写,从服务器负责读,即使出现锁表的情况,通过读从库也可以保证业务的正常进行

    降低单台服务器的I/O 访问压力,提升单台服务器I/O 性能

    在主服务器上生成数据,而在从服务器上分析这些数据,从而提高主服务器的性能

  • 发扬不同表引擎的优点

    目前Myisam表的查询速度比innodb略快,而写入并发innodb比myIsam要好。那么,我们可以使用innodb作为master,处理高并发写入,使用master作为slave,接受查询。或在myisam slave中建立全文索引,解决innodb无全文索引的弱点

  • 数据热备

    提高数据安全,因为数据已经复制到从服务器,从服务器可以终止复制进程,可以在从服务器上备份而不破坏主服务器相应的数据

主从同步机制

Mysql 主从同步_数据库

Mysql 服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制来记录数据库的变动情况,从服务器通过读取和执行该二进制日志文件来保持和主服务器的数据一致性

  • slave 执行 change master to 命令 (主库的连接信息 + 复制的起点)
  • slave 将以上信息记录到 master.info 文件中
  • slave 执行 start slave 命令,服务器立刻开启 IO 和 SQL 线程
  • slave IO线程 读取 master.info 文件中的信息,获取到 IP/PORT/USER/PASSWORD/BINLOG 等信息
  • slave IO线程 请求连接master 服务器,master 提供一个 DUMP 线程 和 IO线程交互
  • master DUMP线程 将最新的binlog,通过网络传输给 salve IO线程
  • salve IO线程 接收到 binlog 日志,存储到TCP/IP缓存,立即返回ACK给master,并且更新 master.info
  • salve IO线程 将TCP/IP缓存中数据,写入到磁盘文件relaylog中(中继日志)
  • slave SQL 线程 读取relay.info中的信息,获取到上次已应用过的relaylog的位置信息
  • slave SQL 会按照上次的位置点回放到最新的relaylog,再次更新relay.info信息
  • salve purge
    relay 定期清理

主从复制类型

  • 异步复制

    一个主库,一个或多个从库,数据异步同步到从库

  • 同步复制

    在MySQL cluster中特有的复制方式

  • 半同步复制

    在异步复制的基础上,确保任何一个主库上的事物在提交之前至少有一个从库已经收到该事物并日志记录下来

  • 延迟复制

    在异步复制的基础上,人为设定主库和从库的数据同步延迟时间,即保证数据延迟至少是这个参数

主从配置

Master

添加主从配置 /etc/my.cnf

[mysqld]
server-id=1
log-bin=matser-mysql-bin
binlog_cache_size=1M
binlog-format=MIXED
binlog-do-db=api
binlog-ignore-db=mysql
expire_logs_days=7
参数字段 参数说明
server-id 唯一标识
log-bin binlog 日志路径
binlog_cache_size binlog 缓存大小
binlog_format binlog 格式 Statement ,ROW , MIXED
binlog-do-db binlog 记录的数据库
binlog-ignore-db binlog 不记录的数据库
expire_logs_days 日志保存大小

创建从服务器登录账号,并设置授权

CREATE USER 'slave'@'%' IDENTIFIED BY 'MyNewPass4!';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

重启mysql服务,并查询master 状态

systemctl restart mysqld
mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| matser-mysql-bin.000001 |      154 | api          | mysql            |                   |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

查看master的binlog的文件名(File)和binlog的偏移量(Position)

Slave

[mysqld]
server-id=2
log-bin=matser-mysql-bin
binlog_cache_size=1M
binlog-format=MIXED
binlog-do-db=api
binlog-ignore-db=mysql
expire_logs_days=7
参数字段 参数说明
server-id 唯一标识
log-bin binlog 日志路径
binlog_cache_size binlog 缓存大小
binlog_format binlog 格式 Statement ,ROW , MIXED
binlog-do-db binlog 记录的数据库
binlog-ignore-db binlog 不记录的数据库
expire_logs_days 日志保存大小

change master to配置和改变slave服务器用于连接master服务器的参数,以便slave服务器读取master服务器的binlog及slave服务器的relay log。同时也更新master info及relay log info信息库。执行该语句前如果从机上slave io及sql线程已经启动,需要先停止(执行stop slave)

change master to master_host = 'ip',master_user='user',master_password='yourpasswod',master_log_file='file',aster_log_pos=position;

change master to后面不指定某个参数的话,该参数保留原值或默认值。所以后续如果某些参数没有更改的话,change master to后无需带该参数,例如我们只改变了用于复制的用户密码,那么change master to只需针对MASTER_PASSWORD选项作出修改即可

stop slave;
change master to master_password = 'new_password';
start slave;

全备master数据库,主从数据库的数据要保持一致,不然主从同步会出现bug

  • 锁定主数据库,只允许读取,不允许写入,这样做的目的是为了防止备份过程中或备份完成后有新数据插入,导致备份数据和主数据不一致

    flush tablses with read lock;
    
  • 通过主服务器上全备初始化从服务器上的数据

    [root@localhost data]# cd /usr/local/tmp
    [root@localhost db_backup]#  mysqldump -uroot -p --master-data=1 --single-transaction --routines --triggers --events  --all-databases > all.sql
    Enter password:
    
  • 将sql文件传递给从服务器,并执行sql文件

    scp /usr/local/tmp/all.sql root@127.0.0.1 :/usr/local/tmp/
    mysql -uroot -p'MyNewPass4!' <all.sql
    
  • 解锁主服务器

    unlock tables;
    

开启主从同步

  • 开启同步命令
start slave;
  • 查看节点状态

    Mysql 主从同步_数据库_02