MySQL 主从的一些基础知识

80次阅读
没有评论

共计 3798 个字符,预计需要花费 10 分钟才能阅读完成。

本篇文章给大家分享的是有关 MySQL 主从的一些基础知识,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

MySQL 复制原理

1. 主库修改时会把数据变更作为 event 记录在 binlog 中, 主库上的 sync_binlog 参数控制 binlog 日志刷新到磁盘.

2. 主库推送 binlog 中的事件到从库的中继日志 relay log,之后从库根据中继日志 relay log 重做数据变更操作。通过逻辑复制达到主从同步。

MySQL 通过 3 个现成来完成主从数据库之间的复制:

1.binlog dump 跑在主库上,负责读取数据库事件并发送给 I / O 线程

2.I/ O 线程 跑在从库上,当从库 start slave 时 创建 I / O 线程 链接到 master 将主库的事件写入到 relaylog

3.SQL 线程跑在从库上,负责读取 relay
log 并更新从库。

4.Master.inf and relay-log.info 用来保存复制的进度。

三种复制方法, MIX,STATEMENT,ROW

1.  statement

基于语句的复制, 可能会因为存储过程或触发器, 时间函数导致主备不一致,数据量小。

2. row

行级数据复制, 缺点是数据量较大,但是不会因为触发器等外在条件影响数据

3.   Mix

默认采用 statement 模式 如果语句中包含更新时间,用户相关的函数等

Mysqlbinlog –vv logfilename –base64-output=DECODE-ROWS
–start-pos=number 才能解析 row 模式的内容。

双主复制架构:

由 master1 作为读写库,master2 作为只读库。

同时双向作为对方的 slave。

当维护时

1.  先停掉 master1 上的 slave。免得当 master2 做维护时影响到 master1.

2.  停掉 master2 上的 slave。
开始维护操作,比如创建索引。

3.  打开 master2 上的 slave 让 master2 与 master1 同步。

4.  将读写操作转移到 master2,确保 master1 上无写入操作

5.  将 master1 的 slave 打开,
让其与 salve2 同步完成。

搭建 mysql 复制:

1.  建立一个用于 replication 的账号:

Create replac
slave on *.* TO‘repl’@’192.168.7.200’identified by‘1234test’;

2.  修改 my.cnf 开启 binlog 并且设置 server-id 的值
log-bin = xxxxx.log
server-id=1

3.  锁住所有的表,lock tables with read lock

4.  检查当前日志偏移量 show master status

5.  备份或者通过直接 shutdown 数据库
拷贝数据文件的方式到 slave 库。

6.  Unlock tables;

7.  修改 slave 的 my.cnf  server-id=2

8.  使用延迟复制开启 salve ./bin/mysql_safe –skip-slave-start

9.  对数据库服务做响应设置
mysql change master to master_host=’’,master_user=’’,master_password=’’,master_logfile=’’,master_log_pos=’’;

10.  从库上输入:start slave;

11.  show process\G 检查 slave 进程

12.  show variables like‘%sync_binlog%’
0 的表示 mysql 不控制 binlog 的刷新,由文件系统控制。

13.  最后注意的几点就是 MHA 架构可以通过自动抽取缺失的 log 进行 catchup。也可以通过 mysqlbinlog 工具来抽取之前主库为宕机时未抽取的 log 传送到备库上去。

半同步复制:

在 mysql 5.5 之前,由于主备库之间都处于异步复制的状态,如果主库在 commit 了之后而崩坏,此时 binlog 尚未传到 slave 的库上。则会丢失数

而 5.5 之后 mysql 推出了半同步复制状态。在默认状态下 mysql 需要保证有任意一台备库的 relaylog 接收到的更改之后才会确认 commit 已经成功。如果中途断网的话
则会再自动切换回半同步复制模式。

安装:
1. 首先需要确认 mysql 是否可以使用该功能,select @@have_dynamic_loading = YES

2 到 $MYSQL_HOME/lib/plugin/ 下找到主库 / 从库插件 semisync_master/slave.so

3. 主备库上安装该插件 install
plugin rpl_semi_sync_master/salve soname‘semisync_master/slave.so’

4.select * from mysql.plugin

5. 在主备库上设置全局参数打开半同步 set
global rpl_semi_sync_master_enabled=1;

  Set
global rpl_semi_sync_master_timeout=3000;

  从库上
  set global rpl_semi_sync_slave=1;

6 如果已经启动了异步复制 需要停止一下 io_thread. Stop
slave io_thread; start slave io_thread;

Show status like‘%semi_sync%’

需要注意的几个结果有:

rpl_semi_syc_master_status  ON 代表打开;

rpl_semi_syc_master_yes/no_tx 表示 同步或非同步的 transaction 次数

rpl_semi_syc_master_timeout 标示等待多久会判断 slave 超时。

如果从库断开后重新连接上了,会自动转回半同步状态。

Mysql replication 一些有用的参数:

1.  Log-slave-updates 从库是否需要记 binlog  这个对于从库传从库是比较有帮助的

2.  Master-connect-retry 在从库和主库失去连接时的重试间隔
默认 60 秒

3.  ./bin/Mysqld_safe –read-only 让以避免超级用户以外的人修改从库的数据

日常维护命令:

1.  查看从库状态 show slave status. 比较关心的 2 状态一个是 SLAVE_IO_Running 和 Slave_SQL_Running.

2.  有时候主备库差距越来越大,可以在空闲的时候使用 flush tables with read lock.
show master status 查看 binlog 的 position。接下来使用 select master_pos_wait(‘logiflename’,’log_pos’); 这个语句会阻塞直到从库同步到该点。然后再解锁表。

3.  从库出错:

a)  如果需要跳过某些导致 replication 失败的语句可以使用 set global SQL_SLAVE_SKIP_COUNTER=N. N=1|2. 当主库没有自增长时使用 1 自增长用 2.

b)  Log event entry exceeded
max_allowed_packet 一般是因为有长字符串或 blob 无法传输。
此时需要增加主库上该参数的大小。

c)  多主复制时自增长变量冲突的话
在双主上需要设置 auto_increment_increment=2,auto_increment_offset=1;(1,3,5,7….)
auto_increment_increment=2,auto_increment_offset=0;(2,4,6,8….)

一些简单的提高从库性能的架构

1. 通过 master1 传给 master2  master2 使用 blackhole 引擎开始 slave-log-update。
  另外的 slave 通过 replace-do-db 的方式只复制部分数据库。这种方法的缺点是一旦 master1 宕机之后会比较麻烦需要提前商量好异常处理方案。

2.mysql 5.6 之后有多线程复制,允许从库并行更新。Slave_parallel_works=2.
Percona 分支的 mysql 还可以用淘宝丁奇的 mysql transfer 来实现从主库多线程应用中继日志来解决。

Http://dinglin.iteye.com/blog/188640.

切换主从:

1. 先确保所有从库都执行了 relay log 中的全部更新。
在每个从库上执行 stop slave io_thread。
然后用 show process \G 直到看到 state: has read all relay log 之后标志更新全都执行完毕。

2. S1 上 Stop slave. 打开 log-bin 模式。同时关闭 log-slave-updates.

3. Reset master.

4. S2 上执行 stop slave 然后 change master to master_host=S1. Start slave.

5. 删除 S1 上的 master.info 和 relay-log.info 否则下次还是按照从库启动

6. 主库修复后
可以按照 s2 的配置方法
重置到 S1。

以上就是 MySQL 主从的一些基础知识,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计3798字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)