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= auto_increment_increment= server_id=
(2) Master和Slave都创建拥有复制权限的账号
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '';
注意:复制的权限非常大,不能使用上述通配符的方式,最好是单ip授权
(3) 互为主从
SHOW MASTER STATUS;
CHANGE MASTER TO MASTER_HOST='192.168.1.202', MASTER_USER='repl',MASTER_PASSWORD='',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/
MySQL Replicationation进阶的更多相关文章
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
- mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...
- mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)
1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...
- MySQL第二讲 一一一一 MySQL语句进阶
通过命令来备份数据库: 通过数据库软件里面的,mysqldump模块来操作,如下: mysqldump -u root db1 > db1.sql -p; //没有-d就是备份的时候:数据表结构 ...
- MYSQL(进阶篇)——一篇文章带你深入掌握MYSQL
MYSQL(进阶篇)--一篇文章带你深入掌握MYSQL 我们在上篇文章中已经学习了MYSQL的基本语法和概念 在这篇文章中我们将讲解底层结构和一些新的语法帮助你更好的运用MYSQL 温馨提醒:该文章大 ...
- mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
- 数据库学习笔记(二)MySQL数据库进阶
MySQL 进阶 关于连表 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 #上下连表示例: select sid, ...
随机推荐
- c# base和this在构造函数中的应用
构造函数可以使用 base 关键字来调用基类的构造函数.例如: public class Manager : Employee{ public Manager(int annualSalary) : ...
- Bucket Sort - leetcode [桶排序]
桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里.每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽巢排序 ...
- 3.struts2访问Servlet API,并和mybaits实现全套增删改查
1.创建数据库脚本userinfo.sql prompt PL/SQL Developer import file prompt Created on 2016年5月19日 by pc set fee ...
- 【转】如何将ACCESS数据库后缀名accdb改为mdb
office 2007中的ACCESS数据库保存时,默认的后缀名是*.accdb, 但是在数据库编程中,用到的后缀名却是*.mdb, 不能直接将后缀名由 accdb 改为 mdb,虽然没有出错,但是编 ...
- Tiny6410之LED裸机驱动
操作步骤: 第一步:查看开发板电路原理图 找到LED 的管脚所对应的寄存器 nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 - GPK6 nLED_4 - GPK7 由原理图可知 ...
- HDU 4262 Juggler
点我看题 初步想法是模拟,找到下一个位置并记录操作数,O(n^2)肯定会超时. 那么进行优化,会发现到下一位置的操作数就是两个位置之间存在的数的个数,于是就变成了计数问题. 不难想到用树状数组或线段树 ...
- Python 修炼2
Python开发IDE:Pycharm.elipse 1.运算符 1 1.算数运算 + - * / // ** % 2. 赋值运算 a = 1 a += 2 3.比较运算 1>3 4.逻辑运算 ...
- React Route
有幸你能看来我的这篇文章,这篇文章是继React后面写的Reactroute,所以你需要看看我前面整理的React笔记再来看Reactroute可能更容易 All the work we've don ...
- [笔记]The Linux command line
Notes on The Linux Command Line (by W. E. Shotts Jr.) edited by Gopher 感觉博客园是不是搞了什么CSS在里头--在博客园显示效果挺 ...
- php app版本升级的思路
用户端传递当前app的版本号,再根据机型和app_type ,查找数据库里的版本号 ,去比较 ... CREATE TABLE `common_versioninfo` ( `id` int(11) ...