MySQL Replicationation进阶

摘要

上一篇: MySQL Replication 基础       下一篇 MySQL Replication-MHA

  一、主主复制

  二、半同步复制

  三、复制过滤器

  四、总结

  五、切分

    待续

一、主主复制

  MySQL的主主复制通过互为主从来实现,此时负载均衡调度器较为容易实现,但是由于多台服务器都为Master,但是存在着严重的问题,需要慎重使用:
    1. 数据不一致问题,无法解决,详情见paxos算法说明
    2. auto_increment id问题

      如何解决?以2台为例,一台用奇数,一台用偶数即可

  配置步骤:

    (1)  各节点使用一个唯一的server_id

    (2)  都启动二进制日志和中继日志

    (3) 创建拥有复制权限的用户账号

    (4) 定义自动增长id字段的数值范围为奇数和偶数

    (5) 互为主从,都启动复制线程
  

  演示如下:

  (1) Master和Slave修改配置,主要是以下参数
  

log-bin=master-bin

relay_log=relay_log

auto_increment_offset=2

auto_increment_increment=2

server_id=1

  (2)  Master和Slave都创建拥有复制权限的账号

 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘repl‘@‘192.168.1.%‘ IDENTIFIED BY ‘111111‘;

注意:复制的权限非常大,不能使用上述通配符的方式,最好是单ip授权

 (3)  互为主从

SHOW MASTER STATUS;
CHANGE MASTER TO MASTER_HOST=‘192.168.1.202‘, MASTER_USER=‘repl‘,MASTER_PASSWORD=‘111111‘,MASTER_LOG_FILE=‘master-bin.000003‘,MASTER_POS=506;
START SLAVE;

此时,在二台服务器上都可以写操作,注意主主复制还是有很多的细节问题,除非数据不重要,否则不建议使用。

二、半同步复制

Master至少要等待一个Slave有所响应的策略

由谷歌研发的插件 ,所以要查看semisync_master.so 和semisync_slave.so是否被当前的数据库支持,一般MariaDB默认就是会安装的

配置步骤:

    (1)  各节点使用一个唯一的server_id

    (2)  Master启动二进制日志, Slave中继日志

    (3)  Master创建拥有复制权限的用户账号

    (4) 以半同步方式连接Master和Slave

安装插件方式: HELP INSTALL

  INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘

  INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘

演示如下:

(1) Master 配置,安装插件  

log-bin=master-bin
log-bin-index=master-bin-index
server-id       = 1

启动mysql:

INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘repl‘@‘192.168.1.%‘ IDENTIFIED BY ‘111111‘;

(2) Slave配置,安装插件

relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
server-id       = 2

启动mysql:

INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘

(3) SHOW GLOBAL VARIABLES LIKE ‘%semi%‘;

  MASTER上

set global rpl_semi_sync_master_enabled=‘ON‘;

(4) SHOW GLOBAL STATUS LIKE ‘%semi%‘;

  SLAVE上

set global rpl_semi_sync_slave_enabled=‘ON‘;

(5) Connect SLAVE TO MASTER

 

三、复制过滤器

让从节点仅仅复制指定的数据库,或者指定数据库中的指定表

实现方式:

  (1) 主服务器仅仅向二进制日志记录特定数据库相关的事件,不建议使用

    binlog_do_db: binlog的白名单,使用逗号隔开

    binlog_ignore_db:binlog的黑名单

  (2) 从服务器SQL_THREAD在replay中继日志中事件时,仅仅读取与特定数据库(特定表)相关的事件并应用到本地;

    问题:同步了没必要的数据,会造成网络以及磁盘IO的浪费

    replicate_do_db: replay时白名单

    replicate_ignore_db: replay时黑名单

    

四、总结

MySQL的分布式系统满足CAP原则,AP且对A妥协。注意到MySQL Replication只是对读操作进行了分摊,不管Master Slave和双主模型,都没有分摊写操作。

问题:

  1. 如何限制从服务器为只读?

    (1) 首先可以在slave上设置read_only=ON; 但是此限制对拥有SUPER权限的用户无效

    (2) 阻止所有用户:施加一个全局的读锁

      mysql> FLUSH TABLES WITH READ LOCK;

  2. 如何保证中从复制的事务安全?

    Master:无非某些IO操作不使用内存BUFFER,每次操作都刷到硬盘上。

      sync_binlog=ON 必须

      innodb_flush_logs_at_trx_commit=ON

      innodb_support_xa=ON

      sync_master_info=ON 可选

  Slave上:

    skip_slave_start=ON

    sync_relay_log_info可选

    sync_relay_log可选

跟复制功能相关的文件:

  master.info: 用于保存slave连接至master的相关信息,例如账号,密码,服务器地址等等

  relay_log.info: 保存当前slave节点上已经复制的当前二进制日志和本地repay log日志信息

维护和监控常用命令:
(1) 如何清理日志?

URL: https://mariadb.com/kb/en/sql-commands-purge-logs/

Examples:
PURGE BINARY LOGS TO ‘mysql-bin.010‘;
PURGE BINARY LOGS BEFORE ‘2008-04-02 22:46:26‘;

(2) 复制监控

  SHOW MASTER STATUS;
  SHOW SLAVE STATUS;
  SHOW BINARY LOGS;

  SHOW BINLOG EVENTS;
  SHOW PROCESSLIST;

(3) 从服务器是否落后于主服务器

SHOW SLAVE STATUS中的字段Seconds_Behind_Master:0信息

(4) 如何确定主从节点数据是否一致;

需要专门的工具,例如percona-tools中就有这个工具

(5) 数据不一致?

选一台重新复制,数据应该已经丢失了,只能人工判断。

五、切分

http://haitian299.github.io/2016/05/26/mysql-partitioning/

 

时间: 2024-11-06 14:18:21

MySQL Replicationation进阶的相关文章

MySQL的进阶实战篇

[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/69857949 出自[zejian的博客] 关联文章: MySQL的初次见面礼基础实战篇 MySQL的进阶实战篇 本篇上一篇博文MySQL的初次见面礼基础实战篇的延续,是mysql的进阶内容的记录,本篇主要知识点如下: 进阶实战篇 进阶实战篇 mysql视图机制 什么是视图 视图创建与使用 视图的本质 高效索引 使用索引的理由 索引

mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)

1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间后回滚.系统默认值是50秒.用户可以根据业务自行设置.生产环境不推荐使用过大的 innodb_lock_wait_timeout 参数值. -- 查看事务超时时间 SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; 也可以对当前会话进行超时设置如: set

mysql 开发进阶篇系列 47 xtrabackup (完全备份恢复,恢复后重启失败总结)

一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全备份文件的目录,还原到datadir目录下. xtrabackup --copy-back --target-dir=/data/backups/ 可以使用xtrabackup --move-back选项恢复备份.这个选项类似于xtrabackup --copy-back,唯一的区别是它将文件移动到

mysql 开发进阶篇系列 55 权限与安全(安全事项 )

一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限,在安装mysql时就要重视安全问题. (1) 锁定mysql用户. (2) 其它任何用户都采取独立的账号登录,管理员通过mysql专有用户管理mysql服务,或者通过 root su到mysql用户下进行管理. (3) mysql用户目录下,除了数据文件目录,其它文件和目录属主都改为root. 我本

python 全栈 数据库(二)MySQL数据库进阶

MySQL 进阶 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 例如: select sid,sname from sname union select tid,tname from teacher select sid,sname from student UNION ALL select sid,sname from student 1.视图 (不常用,开发过程中不长用,在开发语句中写,不要在数据库中写)

mysql语句进阶

1.null mysql> create table worker(id int not null,name varchar(8) not null,pass varchar(20) not null); mysql> insert into worker values(1,'HA','123456'); mysql> insert into worker values(1,'LB',null); ERROR 1048 (23000): Column 'pass' cannot be n

MySQL数据库进阶操作

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 临时表搜索: SELECT * FROM ( SELECT nid, NAME FROM tb1 WHERE nid > 2 ) AS A WHERE A. NAME > 'alex'; 1.创建视图 --格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v1 AS SELET nid, name FR

MySQL查询(进阶)(每个标点都是重点)

MySQL 是工作中很普遍的需要用到的,所以必须掌握,而 之前我们一直说的都是怎么存. 你只会存不会取有个屁用.所以希望大家在如何查询读取数据这方面多下点功夫. 这篇和上一篇都是干货,我也是第一次学.反正我就是这样理解,这样一遍一遍写,一遍一遍看的才慢慢有点感觉的. 目前还整理的很乱,先将就看,等以后想起来了我会再进一步整理. 简单查询 : 单表查询和多表查询 distinct : 去重 单表的唯一查询用 distinct group by : 分组 多表的唯一查询用 group by sele

mysql基础进阶

Mysql安装方式:1.rpm包安装2.二进制包安装     进入下载地址:选择 linux generic,找到对应的二进制包3.源代码安装下载地址: http://dev.mysql.com/downloads/mysql/1.SHOW TABLE STATUS 查看表的状态.2. 修改表的行格式     ALTER TABLE table_name ROW_FORMAT = DEFAULT  其中可选值有:     DEFAULT     FIXED     DYNAMIC     COM