mysql主从复制--mysql-5.5异步、半同步配置

背景介绍

mysql5.5之前版本,mysql主从复制比较简单

mysql5.6:gtid,multi-thread replication

master

1 启用二进制日志

log-bin = master-bin

log-bin-index = master-bin.index

2 选择一个唯一的server id

server-id = [0~2^32]

3 创建具有复制权限的用户

replication slave,复制的从节点

replication client,联系master,获取信息的权限

slave

1 启用二进制日志

relay-log = relay-log

relay-log-index = relay-log.index

2 选择一个唯一的server id,和主不同

server-id = [0~2^32]

3 连接至主服务器复制文件

从哪里开始复制?

1)master是新的,slave从头开始复制

2)master已经运行一段时间,在master执行一次备份,记录二进制日志文件名和事件位置,在slave还原数据,连接至哪一个二进制文件的哪一个位置?

mysql> change master to master_host= ,master_port= ,master_log_file= ,master_log_pos= ,master_user= ,master_password= ;

mysql> start slave;

4 mysql复制线程

master会为每一个slave启动1个dump线程

master:dump

slave:IO_thread,SQL_thread

可单独启动

mysql> start slave IO_thread

mysql> start slave SQL_thread

5 半同步复制时应指定同步超时时间,一旦超时,降级为异步复制



mysql主从异步复制

使用二进制格式安装mysql,并初始化、mtsql服务脚本复制、my.cnf配置文件复制。

导出PATH,方便使用mysql命令

# vim /etc/profile.d/mysql.sh

export PATH=$PATH:/usr/local/mysql/bin


master

1 修改配置文件

# vim /etc/my.cnf

[mysqld]

datadir = /data/mysql

innodb_file_per_table = 1

log-bin=master-bin

log-bin-index=master-bin.index

server-id   = 1

启动mysql

# service mysqld start

2 授权slave复制

mysql> grant replication slave on *.* to ‘replicationuser‘@‘192.168.8.31‘ identified by ‘replicationuser‘;

mysql> flush privileges;

mysql> flush tables with read lock; # 锁住table为只读

3 查看master二进制日志文件状态,在slave上需要使用

mysql> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000001 |      355 |              |                  |

+-------------------+----------+--------------+------------------+

mysql> show binlog events in "master-bin.000001";



slave

1 修改配置文件

# vim /etc/my.cnf

[mysqld]

datadir = /data/mysql

innodb_file_per_table = 1

relay-log = relay-log

relay-log-index = relay-log.index

server-id   = 10

启动mysql

# service mysqld start

2 配置slave同步设置,并启动slave复制

mysql> change master to master_host=‘192.168.8.30‘,master_user=‘replicationuser‘,master_password=‘replicationuser‘,master_log_file=‘master-bin.000001‘,master_log_pos=355;

mysql> start salve;

3 查看slave的状态

mysql> show slave status\G

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.8.30

Master_User: replicationuser

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: master-bin.000001

Read_Master_Log_Pos: 438

Relay_Log_File: relay-log.000004

Relay_Log_Pos: 254

Relay_Master_Log_File: master-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 438

4 在master查看slave

mysql> show slave hosts;




其他设置和说明

1 slave上不允许数据库的写操作,因此在slave上设置为用户只读模式,但此设置对具有super权限的用户无效

# vim /etc/my.cnf

[mysqld]

read-only = on

重启mysql,即生效

# service mysqld restart

重启mysqld,复制线程会自动重启

修改配置后,或者不重启,在数据库中直接修改参数也可以

查看只读模式是否生效

mysql> show global variables like ‘read_only‘;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| read_only     | ON    |

+---------------+-------+

2 为了保证master bin-log不在缓冲区缓存,立即同步到磁盘上,减少主从复制的延迟时间,在master设定

[mysqld]

sync-binlog = on

重启mysql,即生效

# service mysqld restart

重启mysqld,复制线程会自动重启

修改配置后,或者不重启,在数据库中直接修改参数也可以

查看立即同步模式是否生效

mysql> show global variables like ‘sync_binlog‘;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| sync_binlog   | 0     |

+---------------+-------+

3 重启mysqld,复制线程会自动重启,存在哪些问题,如何禁止?

当master执行了一些误操作,由于延迟原因,误操作还未同步slave;此时在slave关闭mysql,备份数据恢复到master上,启动slave的mysql,让IO_thread跳过刚才的误操作,再启动复制功能。若slave启动后,主从复制立即开始,还会同步刚才的误操作。

不让其随mysql自动启动,防止同步误操作。

连接master 需要这两个文件master.info,relay-log.info,临时移除。slave无法连接master

在数据文件下

master.info 记录了登陆master和相关信息

relay-log.info 记录了relay-log和master-bin的相关信息

4 从服务器的相关日志会记录在slave的错误日志中。

5 若master工作了一定时间,此时做主从的注意事项

5.1 master锁表

mysql> flush tables with read lock;

5.2 master mysql的数据库导出

# mysqldump mydb > mydb.sql

5.3 slave 创建同名数据库,并导入数据库

# mysqldump mydb < mydb.sql

5.4 此时操作和全新的数据库是相同的,注意master_log_file,master_log_pos即可

6 mysql复制过滤

在master上

# vim /etc/my.cnf

[mysqld]

binlog-do-db=db1,db2

binlog-ignore-db=db1,db2

master binlog-ignore-db带来的问题

不记录部分数据库的二进制日志,二进制日志不完整。当服务器崩溃时,只能恢复记录了二进制日志的数据,未记录的将不能恢复,因此不建议使用此选项。

在slave上

可以进行数据库级别的过滤,也可以进行表级别的过滤

# vim /etc/my.cnf

[mysqld]

数据库级别

replicate-do-db=

replicate-ignore-db=

表级别

replicate-do-table=

replicate-ignore-table=

在表级别使用通配

replicate-wild-do-table=mydb.tb% # 仅复制mydb中以tb开头的所有表

replicate-wild-ignore-table=mydb.tb_ # 仅复制mydb中以tb开头的、后面跟上一个字符的表

slave replicate-ignore-db带来的问题

使用此选项,虽不记录指定slave数据库的二进制日志,但是中继日志是完整的,因此会占有slave的带宽资源。

综上,如果必须对表进行过滤,建议在slave上进行。



半同步主从复制

1 master 添加模块

mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;

mysql> set global rpl_semi_sync_master_enabled = 1;

mysql> show variables like ‘rpl%‘;

+------------------------------------+-------+

| Variable_name                      | Value |

+------------------------------------+-------+

| rpl_recovery_rank                  | 0     |

| rpl_semi_sync_master_enabled       | ON   |

| rpl_semi_sync_master_timeout       | 10000 | # 异步复制超时时间,单位ms

| rpl_semi_sync_master_trace_level   | 32    |

| rpl_semi_sync_master_wait_no_slave | ON    | # 是否必须等待slave上线

+------------------------------------+-------+

2 slave 添加模块

mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;

mysql> set global rpl_semi_sync_slave_enabled = 1;

mysql> show variables like ‘rpl%‘;

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| rpl_recovery_rank               | 0     |

| rpl_semi_sync_slave_enabled     | ON    |

| rpl_semi_sync_slave_trace_level | 32    |

+---------------------------------+-------+

3 若此时主从同步是开启的,设置不会立即生效,需重启slave io_thread

3.1 master状态查看

mysql> show global status like ‘rpl%‘;

+--------------------------------------------+-------------+

| Variable_name                              | Value       |

+--------------------------------------------+-------------+

| Rpl_semi_sync_master_clients               | 0           |

| Rpl_semi_sync_master_net_avg_wait_time     | 0           |

| Rpl_semi_sync_master_net_wait_time         | 0           |

| Rpl_semi_sync_master_net_waits             | 0           |

| Rpl_semi_sync_master_no_times              | 0           |

| Rpl_semi_sync_master_no_tx                 | 0           |

| Rpl_semi_sync_master_status                | ON          |

| Rpl_semi_sync_master_timefunc_failures     | 0           |

| Rpl_semi_sync_master_tx_avg_wait_time      | 0           |

| Rpl_semi_sync_master_tx_wait_time          | 0           |

| Rpl_semi_sync_master_tx_waits              | 0           |

| Rpl_semi_sync_master_wait_pos_backtraverse | 0           |

| Rpl_semi_sync_master_wait_sessions         | 0           |

| Rpl_semi_sync_master_yes_tx                | 0           |

| Rpl_status                                 | AUTH_MASTER |

+--------------------------------------------+-------------+

3.2 slave状态查看

mysql> show global status like ‘rpl%‘;

+----------------------------+-------------+

| Variable_name              | Value       |

+----------------------------+-------------+

| Rpl_semi_sync_slave_status | OFF         |

| Rpl_status                 | AUTH_MASTER |

+----------------------------+-------------+

4 只重启io_thread即可

mysql> stop slave io_thread;

mysql> start slave io_thread;

4.1 master状态查看

mysql> show global status like ‘rpl%‘;

+--------------------------------------------+-------------+

| Variable_name                              | Value       |

+--------------------------------------------+-------------+

| Rpl_semi_sync_master_clients               | 1           |

+--------------------------------------------+-------------+

4.2 slave状态查看

mysql> show global status like ‘rpl%‘;

+----------------------------+-------------+

| Variable_name              | Value       |

+----------------------------+-------------+

| Rpl_semi_sync_slave_status | ON          |

| Rpl_status                 | AUTH_MASTER |

+----------------------------+-------------+

5 测试

当半同步超时后(10000ms)一次后,会降级为异步复制。

在slave停止io_thread

mysql> stop slave io_thread;

在master进行写操作时,会卡住100000ms,之后降级为异步复制,恢复速度;

6 为了使参数永久生效,在Master和Slave的my.cnf中编辑:

# On Master

[mysqld]

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000 # 1 second

# On Slave

[mysqld]

rpl_semi_sync_slave_enabled=1

7 mysql主从机制比较脆弱,若需重启master,需先要停止slave复制,即stop slave。



监控和监控主从复制工具

percona-toolkit(mattkit-tools)

https://www.percona.com/downloads/percona-toolkit/

# yum localinstall -y percona-toolkit-2.2.18-1.noarch.rpm --nogpgcheck

安装之后会出现一大堆pt命令

pt-slave-delay:使slave比master慢一些时间

pt-table-checksum:通过单向加密比较主从的数据是否一致

rhel使用的是光盘中的rpm库,无法解决percona的依赖

yum localinstall时出现如下提示

You could try using --skip-broken to work around the problem

You could try running: package-cleanup --problems

package-cleanup --dupes

rpm -Va --nofiles --nodigest

The program package-cleanup is found in the yum-utils package




mysql ssl 简要说明

授权时,增加ssl选项,强制使用ssl;若无此选项,不受限制,即使启用了ssl功能,复制时使用和不使用ssl都可以

mysql> grant replication slave on *.* to ‘replicationuser‘@‘192.168.8.31‘ identified by ‘replicationuser‘ require ssl;

ssl需要的内容

mysql> show global variables like ‘%ssl%‘;

+---------------+----------+

| Variable_name | Value    |

+---------------+----------+

| have_openssl  | DISABLED |

| have_ssl      | DISABLED |

| ssl_ca        |          |

| ssl_capath    |          |

| ssl_cert      |          |

| ssl_cipher    |          |

| ssl_key       |          |

+---------------+----------+

来自为知笔记(Wiz)

附件列表

时间: 2024-10-13 12:35:45

mysql主从复制--mysql-5.5异步、半同步配置的相关文章

mysql主从复制、延迟复制、半同步

#xtrabackup备份: #备份/data/mysql_backup/percona-xtrabackup-2.4.9-Linux-x86_64/bin/xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/backup/2020-01-22-14 --user=root --password= -S /var/lib/mysql/mysql.sock #恢复/data/mysql_backup/percona-

mysql主从复制异步半同步实例

建立mysql的复制 node1: mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+-----

InnoSQL HA Suite的实现原理与配置说明 InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能

InnoSQL HA Suite的实现原理与配置说明  InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能 http://www.innomysql.net/article/7403.html Virtual Sync Replication 搭建一个MySQL数据库的复制(replication)环境是相当简单的,这点是MySQL

mysql半同步配置

mysql版本为5.5以上 半同步的定义:主服务器端执行了写操作,必须往从服务器端复制一份,才能给客户端返回提交状态. 这里我们需要在主服务器端安装semisync_master.so从服务器端安装semisync_slave.so 查看是否存在 [[email protected] plugin]#cd /usr/local/mysql/lib/plugin/ [[email protected] plugin]# ls semisync_* semisync_master.so  semis

MySQL主从复制--MySQL5.5异步、半同步配置

大纲 一.主从复制复制原理 二.主从复制的作用及复制类型 三.MySQL5.5异步复制的实现 四.MySQL5.5半同步复制的实现 一.主从复制原理 工作原理 1.当Master接收到了一个写请求,处理写请求,将结果保存至磁盘中,并且会将此操作记录到二进制日志文件中 2.Slave会从Master的二进制日志中读取其中的事件保存至本地的中继日志中 3.Slave会启动一个线程来逐条读取中继日志中的事件并应用于本地的 二.主从复制的作用及复制类型 复制的作用 辅助实现备份 提供类似高可用的机制 异

MYSQL 完全备份、主从复制、级联复制、半同步

mysql 完全备份 1,启用二进制日志,并于数据库分离,单独存放 vim /etc/my.cnf 添加 log_bin=/data/bin/mysql-bin 创建/data/bin文件夹并授权 chown mysql.mysql /data/bin 2,完成备份数据库 mysqldump -A --single-transaction --master-data=2 | xz > /data/all.sql.xz 3,对数据库进行增删改 INSERT hellodb.students(stu

MySQL 主从复制 + MySQL Router 部署测试

4个节点 1.MySQLDB1  192.168.1.41  (MySQL 主节点) 2.MySQLDB2  192.168.1.42  (MySQL从节点) 3.MySQLDB3  192.168.1.43  (MySQL从节点) 4.MySQLRouter  192.168.1.47  (MySQLRouter服务节点) 软件版本说明: 1.操作系统  CentOS6.6_x86_64 2.MySQLServer  5.7.16 3.MySQLRouter  2.0.4 一.部署MySQL主

MySQL 5.5 主从复制异步、半同步以及注意事项详解

大纲 一.前言 二.Mysql 基础知识 三.Mysql 复制(Replication) 四.Mysql 复制(Replication)类型 五.Mysql 主从复制基本步骤 六.Mysql 主从复制(异步) 七.Mysql 主从复制(半同步) 八.Mysql 复制工具 九.Mysql 复制注意事项 十.Mysql 复制过滤 一.前言 从这一篇博客开始我们就来学习mysql的高级课程,在前面的几篇博客我们讲解了mysql基础知识.mysql日志类型.mysql配置文件.mysql备份策略,这一篇

MySQL 主从复制、主主复制、半同步复制

MySQL 复制 =============================================================================== 概述: =============================================================================== MySQL Replication:   1.主从复制的目的和架构 ★Master/Slave(主/从) Master: write/read Slave