MySQL主从复制(二)

1
<span style="font-family:sans-serif;">主从架构中:从node是不接受w操作的,否则可能会导致数据不一致。</span><br>

一、复制架构中应该注意的问题:

1.限制slave为只读模式

可以设置在启动参数中。

> show global variables like 'read_only';

此限制对拥有SUPER权限的用户都无效。

 阻止所有用户:

mysql> flush tables with read lock; //将阻塞所有w操作。

//但是中继日志的重放是可以的,不会被阻塞

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

master在执行事务后,应该立即写入都事务日志。 

二进制日志在内存中是有缓冲的。//一旦master宕机,slave仍然没有获取该事务,但是client已经commit,数据不一致 

方法://保证master尽快将事务保存到二进制日志

1)在master启动参数:

sync_binlog=ON //立即刷写二进制日志

如果用到innodb存储引擎:

innodb_flush_logs_at_trx_commit=ON 

innodb_support_xa=ON 

1.在事务提交时立即将事务日志缓冲区中与事务日志相关的数据刷写到事务日志中去

2.xa:分布式事务,基于2段式提交,执行分布式事务。

2)在slave节点上

skip_slave_start=OFF

//在slave启动时,是否自动启动复制线程

//为了事务安全:不建议启动,直接加入很有可能会导致出错

//建议手动启动。该线程

//参考http://www.2cto.com/database/201307/230420.html

//注意:怎么强调数据的安全性都不为过。 

slave: 

/var/lib/mysql/

master.info :master的账号密码信息,复制位置等

relay-log.info 从节点自己记录的,复制到哪个二进制日志的哪个position步骤。

show global variables like '%relay_log%';

relay_log_info_file //保存的文件

sync_relay_log

sync_relay_log_info //

master

show global varibales like '%master%';

sync_master_info 0 

//master.info中的信息是否同步到磁盘,从而让slave获取最新信息。

//有必要启动。 

小结:

master:

sync_master_info 

slave:

sync_relay_log 

sync_relay_log_info 

问题2:思考

如果master已经运行一段时间,且有大量数据,

如何配置并启动slave

方法:

通过备份恢复数据至从服务器

复制起始位置为备份时,二进制日志文件及其pos


二、如何进行主主复制:

A和B:都同时启动relay-log,binary-log,并互为主从

问题:

1.数据不一致,因此,慎用//选择其中一个,删除另外一个

2.auto_increment,A和B都在自动增长,合并将会出错。

//注意mysql 5.5及其之后的版本,在主主模型中 auto_increment 这个问题已经解决,不需要单独设定

A:奇数增长:

auto_increment_offset=1

auto_increment_increment=2

//从1开始,一次增长2个

B:偶数增长: auto_increment_offset=2

//左右不均衡怎么办?没有办法

auto_increment_offset=2

auto_increment_increment=2

//从2开始,一次增长2个

3.循环复制

配置步骤:

1.各node使用一个唯一server-id

2.都启动binary log和relay log 

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

4.定义自动增长id字段的数值为奇偶

5.均把对方指定为主node,并启动复制线程

步骤:

master A:

systemctl stop mariadb 

rm -rf /var/lib/mysql/* 

vim my.cnf 

[mysqld]

log-bin=master-bin

lelay_log=relay-log

server-id=1 

innodb_file_per_table=ON 

skip_name_resolve=ON

auto_increment_offset=1

auto_increment_increment=2

systemctl start mariadb 

mysql> show global variables like '%log%' //relay_log,log_bin

msyql> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.%' identified by 'replipass';

mysql> flush privileges;

//现在两个都是干净的

show master status //查看对方处于什么位置

master-bin.000003 506

change master to master_host='192.168.1.68',master_user='repuser',master_password='replpass',master_log_file='master-bin.000003',

master_log_pos=506; //从master的这个位置开始

show slave status;

start slave;

master B:

systemctl stop mariadb 

rm -rf /var/lib/mysql/*

vim my.cnf 

[mysqld]

log-bin=master-bin

lelay_log=relay-log

server-id=5 //不一样

innodb_file_per_table=ON 

skip_name_resolve=ON

auto_increment_offset=2 //不一样

auto_increment_increment=2

systemctl start mariadb 

msyql> show global variables like '%log%'; //relay-log,log-bin 

msyql> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.%' identified by 'replipass';

mysql> flush privileges;

mysql> show master status //查看自己处于什么位置

mysql> show master status ;

master-bin.000003 506 //也是506

change master to master_host='192.168.1.67',master_user='repuser',master_password='replpass',master_log_file='master-bin.000003',

master_log_pos=506; //从master的这个位置开始

show slave staus;

start slave;

=======================================

测试:

A:create database mydb;

show slave status;

B: use mydb;

create table tb1(id int unsigned not null auto_increment primary key,name char(30)) 

desc tb1;

show master status;

A:查看show slave status,二进制日志的位置已经发生改变

insert into tb1 (name) values ('yang kang'),('yang guo');

select * from tb1;

A:插入数据,

insert into tb1 (name ) ,,,,

最后:

select * from tb1;

1,3,5,6,8,10 //有一个内置的函数,保存了插入的id号

可以重置insert id即可

这样:就不需要在mariadb-server启动的时候指定

auto_increment_increment=2 ,...


三、半同步复制 //借助于插件

5.5版本之后的

master只等待一个slave返回复制确认结果即可//

假如没有任何一个节点返回同步成功消息:?

设置超时时间。超时后自动降级为异步模式

基于mariadb插件

/usr/lib64/mysql/plugin/

[root@localhost mysql]# ls /usr/lib64/mysql/plugin/sem*

/usr/lib64/mysql/plugin/semisync_master.so

/usr/lib64/mysql/plugin/semisync_slave.so

//一个是master节点的,一个是slave节点的

A:systemctl stop mariadb 

rm -rf /var/lib/mysql/* 

vim my.cnf 

log-bin=master-bin

server-id=1

innodb_file_per_table=ON 

skip_name_resolve=ON

systemctl start mariadb 

msyql> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.%' identified by 'replipass';

mysql> flush privileges;

mysql> flush privileges //slave是不需要创建该用户的

mysql-bin.00003 496

install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

show plugins //查看插件

show global variables like '%semi5'; //多了好几个变量

show global status like '%semi%'

。。client //有多少个半同步node

set global rpl_semi_sync_master_enabled=1 

B:systemctl stop mariadb 

rm -rf /var/lib/mysql/* 

vim my.cnf 

relay_log=relay-log

server-id=2

innodb_file_per_tab=ON 

skip_name_resolve=ON 

systemctl start mariadb 

change master to master_host='192.168.1.67',master_user='repuser',master_password='replpass',master_log_file='master-bin.000003',

master_log_pos=496; //从master的这个位置开始

install plugin rpl_semi_sync_slave SONAME 'symisync_slave.so';

set global rpl_semi_sync_slave_enabled=1 //启用

start slave;

show slave staus;

//再次在A上查看,...client 为1 .... master_status=ON 

注意:help install

[mysqld]

plugin_dir=/path/to/plugin/directory //默认/usr/lib64/mysql/plugin 

测试:

A:master 

msyql> create table tb1 (id int,name char(30));

msyql> show global status like '%semi%';

将会有很多的状态等待时间。


小结:

建议只配置一个半同步。

master:

mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

mysql> set global variables rpl_semi_sync_master_enabled=1;

mysql> show gloabl variables like '%semi%';

mysql> show global status like '%semi%';

slave:

msyql> install plugin rpm_semi_sync_slave SONAME 'semisync_slave.so'; 

msyql> set global variables rpl_semi_sync_slave_enabled=1;

四、复制过滤器:

msyql可以复制复制一个或多个数据库

复制过滤器可以在master和slave node做

在master上:会导致master的二进制日志不完整,不是记录了所有数据库的数据

让从节点仅复制指定的数据库,或指定数据库的指定表//但是master会发送所有的二进制数据给slave,由slave决定选择部分复制。

实现:

(1)主服务仅向二进制日志中记录与特定数据库(特定表)相关的事件

问题:时间 还原无法实现,不建议使用

binlog_do_db  //数据库白名单列表

binlog_ignore_db //数据库黑名单列表,这两个不要同时使用,

(2)slave sql_thread在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地。

问题:会带来网络及磁盘IO浪费

replicate_do_db //白名单,逗号隔开

replicate_ignore_db //忽略的数据库

实现: //在原有的主从架构上

mysql> show global variables like 'replicate%'

mysql> set global  replicate_do_db='mydb' ;

//在slave上进行过滤

mysql> show slave status \G;

//测试在master上创建其他数据库

//在slave上是看不到的,但是master在mydb上插入数据,在slave上是可以看到的

注意:show slave status \G;

replicate_ignore_table;

replicate_do_table; //限制可以单个表

replicate_do_db:

replicate_ignore_db;

replicate_wild_do_table; //通配符

replicate_wild_ignore_table; //通配符

基于SSL的复制

help change master //

change master master_ssl //指定使用ssl进行复制

查看是否支持:

mysql> show global variables like '%ssl%'; //为了安全起见,在前端应用到mysql之间使用ssl

前提:支持SSL

(1)master配置证书的私钥;并且要创建一个要求必须私用SSL连接的复制账号

help grant;

grant ... with ssl_option ssl_option 

//一般是slave验证master的状态

(2)slave端使用change master to 命令时指明ssl相关选项;

跟复制功能相关的文件:

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

relay-log.info:保存在当前slave节点上已经复制的二进制日志和本地relay log日志的对应关系

五、MySQL复制的监控和维护:

(1)清理日志:

purge binary logs to 'mysql-bin.010';

purge binary logs before '2008-04-01 10:00:12';

show binary logs; 

(2)复制监控

show master status;

show binlog events;

show binary logs;

show slave status;

show process list; //查看复制线程

(3)从server是否落后于master服务

slave:

show slave status;

Second_Behind_master;//落后于master多长时间。

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

percona-tools //一个工具可以检测

(5)数据不一致如何修复

1.slave数据删除,在master上重新备份

2.多个slave,灰度模式,逐个上下线

重新复制。

六、读写分离器

//开源实现方案,有的公司自己开发或者在前端应用实现读写分离

mysql-proxy //很多坑,已经不用

http://www.cnblogs.com/phpstudy2015-6/p/6687480.html#_label1

阿里巴巴的cobar

360的atlas

golang的kingshard

http://blog.csdn.net/hu_wen/article/details/53635976

mysql-router:官方提供,不支持读写分离,

它实现了失败转移和失败切换,而且这个工具有自己的ip和端口,实现了高可用。

算法:轮训,加权轮训等

七、如何添加一个新的salve 

1 dump主库master的数据,停止slave。

mysqldump -uroot -p --all-databases > all.sql 

show master status;

mysql-bin.000002 652 

2 传递到从库slave上,然后在从库slave上进行还原。

mysql > stop slave;

# msyql < all.sql;

change master to master_host='192.168.1.106',master_user='repluser',master_password='replpass'

,master_log_file='mysql-bin.000002',master_log_pos=652,master_connect_retry=5;

msyql>  start slave;

备注:reset slave //重置slave

附件:如何切换slave为master

注意:

1.mysqlhotcopy 只能对MyISAM表进行热备

2.原理:先将需要备份的数据库加上一个读锁,

然后用FLUSH TABLES将内存中的数据写回到硬盘上的数据库,

最后,把需要备份的数据库文件复制到目标目录

 mysqlhotcopy [option] dbname1 dbname2 backupDir/









本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1943729,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习之pytorch(二) 数据并行

又是好久没更新博客&#xff0c;最近琐事缠身&#xff0c;写文档写到吐。没时间学习新的知识&#xff0c;刚空闲下来立刻就学习之前忘得差不多得Pytorch。Pytorch和tensorflow差不多&#xff0c;具体得就不多啰嗦了&#xff0c;觉得还有疑问的童鞋可以自行去官网学习&#xff0…

JS 转换数字为大写

1 function toUpper(n) {2 n n;3 var unit 十百千万;4 var num 一二三四五六七八九 ;5 var array new Array();6 for (var in.length; i > 0; i--){7 var numIndex parseInt(n.charAt(i-1))-1;8 if(n…

ANSYS——ANSYS后处理操作技巧与各类问题良心大总结

目录 1.ANSYS后处理时如何按灰度输出云图&#xff1f; 2 将云图输出为JPG 3.怎么在计算结果实体云图中切面? 4.非线性计算过程中收敛曲线实时显示 5.运用命令流进行计算时,一个良好的习惯是: 6.应力图中左侧的文字中&#xff0c;SMX与SMN分别代表最大值和最小值 7.在非…

容器的综合应用:文本查询程序

需求 程序读取用户指定的任意文本文件&#xff0c;允许用户从该文件中查找单词。查询结果是该单词出现的次数&#xff0c;并列出每次出现所在行&#xff0c;如果某单词在同一行中多次出现&#xff0c;程序将只显示该行一次。行号按升序显示&#xff0c;即第 7 行应该在第 9 行之…

Anaconda 安装操作及遇到的坑

最近刚用Pytorch&#xff0c;编译开源代码的时候发现缺少n个package&#xff0c;原来是之前在Anaconda3 创建的虚拟环境各自是独立的&#xff0c;tensorflow下安装的不能在别的环境下使用&#xff0c;所以要重新安装。然而关键是国内各种屏蔽资源&#xff0c;无法FQ去直接下载安…

IE浏览器历史版本图标大全

上个月IE团队庆祝了IE的15周岁生日&#xff0c; 并晒了晒IE各个历史版本的图标&#xff1a; Internet Explorer 1.0 图标 Internet Explorer 2.0 图标 Internet Explorer 3.0 图标 Internet Explorer 4.0 图标 Internet Explorer 5.0 图标 Internet Explorer 6.0 图标 Internet…

7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

视频地址&#xff1a;http://edu.51cto.com/sd/be679 在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询&#xff0c;当然你也可以用包装类来实现。不过这里不说&#xff0c;做关联查询的步骤可以简单的总结为以下的几步&#xff1a;…

ANSYS——查看某一截面的云图分布(也叫做切片图)

1.确定截面的位置 此处以图中红色处截面为例 2.将工作平面经过坐标变化移动到指定截面处(工作平面的XY平面与截面重合) 工作平面坐标系默认是与总体坐标系重合的,这里是先平移再进行旋转

深度学习之keras (一) 初探

之前一段时间里&#xff0c;学习过tensorflow和Pytorch也写了点心得&#xff0c;目前是因为项目原因用了一段时间Keras&#xff0c;觉得很不错啊&#xff0c;至少从入门来说对新手极度友好&#xff0c;由于keras是基于tensoflow的基础&#xff0c;相当于tensorflow的高级API吧&…

swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)...

swift&#xff1a;高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符&#xff0c;Swift还有许多复杂的高级运算符&#xff0c;包括了C语和Objective-C中的位运算符和移位运算。 不同于C语言中的数值计算&#xff0c;Swift的数值计算默…

收集、报告或保存系统活动信息:sar命令

2019独角兽企业重金招聘Python工程师标准>>> 索引 sar命令的使用常用方法 查看网络设备&#xff08;网卡&#xff09;的状态信息查看socket使用情况查看cpu使用情况(默认)查看内存和交换空间使用情况查看内存的统计信息查看tty设备的活动状态查看等待运行的进程数和…

【GOF23设计模式】原型模式

【GOF23设计模式】原型模式 来源&#xff1a;http://www.bjsxt.com/ 一、【GOF23设计模式】_原型模式、prototype、浅复制、深复制、Cloneable接口 浅复制 1 package com.test.prototype;2 3 import java.util.Date;4 5 /**6 * 浅复制7 */8 public class Sheep implements C…

ANSYS——自定义的梁截面中心(法线节点)的偏置,详细全面

目录 1、ANSYS梁的确定 2.关于梁截面的一些名词 总体坐标系 梁截面坐标系 梁单元的坐标系

Deepfacelab 小白教程

不小心入了AI换脸的坑&#xff0c;但是感觉AI换脸很有意思&#xff0c;第一次感觉科研使我快乐。 目录 一、AI换脸软件简介 二、Deepfacelab下载安装 三、Deepfacelab Demo实现 四、Deepfacelab 填坑 五、总结 一、AI换脸软件简介 这个没有具体使用过&#xff0c;目前我…

Underscore.js 的模板功能

Underscore是一个非常实用的JavaScript库&#xff0c;提供许多编程时需要的功能的支持&#xff0c;他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能。 无论你写一段小的js代码&#xff0c;还是写一个大型的HTML5应用&#xff0c;underscore都能帮上忙。目前&…

ANSYS——查看剖面图的应力分布云图以及工作平面的相关设置

剖面图和切片图其实差不多,只是切片图只有一个截面,而剖面图是切去一部分保留另一部分模型,不但可以看到截面处应力分布还可以看到剩余模型的应力分布 切片应力云图可见:https://blog.csdn.net/qq_45769063/article/details/106357700 1.剖面云图的查看 首先将工作平面的…

2016.8.2

高端内存映射方式 高端内存映射分为三种&#xff1a;永久映射、临时映射和非连续动态内存映射。高端内存一般是指896MB以上的页框&#xff0c;这段区间内核一般不能直接访问。 1.永久映射 永久内核映射允许内核建立高端页框到内核地址空间的长期映射。它们使用主内核页表中的一…

深度学习之pytorch(三) C++调用

玩深度学习&#xff0c;个人觉得基于anaconda的python适合开发与测试&#xff0c;C适合实际的工程部署&#xff01;而pytorch官方有编译好的libtorch&#xff0c;特别方便&#xff0c;适合于我这样的伸手党和手残党(win10下编译tensorflow编译了好久都没通过&#xff0c;好忧伤…

ANSYS入门——模态分析步骤与实例详解

目录 一、ANSYS求解模态分析步骤 建模 施加载荷和求解

javascript库之Mustache库使用说明

一、简单示例 代码&#xff1a; 1 function show(t) { 2 $("#content").html(t); 3 } 4 5 var view { 6 title: YZF, 7 cacl: function () { 8 return …