mysql多主单向环形_mysql多主单向--gt;环形同步_MySQL

bitsCN.com

原理:

MySQL的Replication是一种多个MySQL的数据库做主从同步的方案,特点是异步,广泛用在各种对MySQL有更高性能,更高可靠性要求的场合。与之对应的另一个技术是同步的MySQL Cluster,但因为比较复杂,使用者较少。

下图是MySQL官方给出了使用Replication的场景:

Replication原理

Mysql 的 Replication 是一个异步的复制过程,从一个MySQL节点(称之为Master)复制到另一个MySQL节点(称之Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(SQL 线程和 I/O 线程)在 Slave 端,另外一个线程(I/O 线程)在 Master 端。

要实现 MySQL 的 Replication ,首先必须打开 Master 端的 Binary Log,因为整个复制过程实际上就是 Slave 从 Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。

看上去MySQL的Replication原理非常简单,总结一下:

* 每个从仅可以设置一个主。

* 主在执行sql之后,记录二进制log文件(bin-log)。

* 从连接主,并从主获取binlog,存于本地relay-log,并从上次记住的位置起执行sql,一旦遇到错误则停止同步。

从这几条Replication原理来看,可以有这些推论:

* 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。

* 如果主从的网络断开,从会在网络正常后,批量同步。

* 如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。

* 一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,可以工作良好。

* 如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。

主从设置

因为原理比较简单,所以Replication从MySQL 3就支持,并在所有平台下可以工作,多个MySQL节点甚至可以不同平台,不同版本,不同局域网。做Replication配置包括用户和my.ini(linux下为my.cnf)两处设置。

首先在主MySQL节点上,为slave创建一个用户:

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.1.10' IDENTIFIED BY 'slave';

实际上,为支持主从动态同步,或者手动切换,一般都是在所有主从节点上创建好这个用户。然后就是MySQL本身的配置了,这需要修改my.cnf或者my.ini文件。在mysqld这一节下面增加:

server-id=1

auto-increment-increment=2

auto-increment-offset=1

log-bin

binlog-do-db=mstest

binlog_format=mixed

master-host=192.168.1.62

master-user=slave

master-password=slave

replicate-do-db=mstest

上面这两段设置,前一段是为主而设置,后一段是为从设置的。也就是说在两个MySQL节点上,各加一段就好。binlog-do-db和 replicate-do-db就是设置相应的需要做同步的数据库了,auto-increment-increment和auto- increment-offset是为了支持双主而设置的(参考下一节),在只做主从的时候,也可以不设置。

双主的设置

从原理论来看MySQL也支持双主的设置,即两个MySQL节点互为主备,不过虽然理论上,双主只要数据不冲突就可以工作的很好,但实际情况中还是很容发生数据冲突的,比如在同步完成之前,双方都修改同一条记录。因此在实际中,最好不要让两边同时修改。即逻辑上仍按照主从的方式工作。但双主的设置仍然是有意义的,因为这样做之后,切换主备会变的很简单。因为在出现故障后,如果之前配置了双主,则直接切换主备会很容易。

双主在设置时,只需将上面的一段设置复制一份,分别写入两个MySQL节点的配置文件,但要修改相应的server-id,auto- increment-offset和master-host。auto-increment-offset就是为了让双主同时在一张表中进行添加操作时不会出现id冲突,所以在两个节点上auto-increment-offset设置为不同的值就好。 另:不要忘了,在两个节点上都为对方创建用户。 应用层的负载均衡 本文只介绍了MySQL自身的Repilication配置,在上面的图中也可以看出,有了Replication,还需要应用层(或者中间件)做一个负载均衡,这样才能最大程度发挥MySQL Replication的优势,这些将在以后探讨。

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

环形

解决多台写服务器主自增长ID重复问题

二台Mysql服务器,他们的IP地址分别为:

A:192.168.0.97

B:192.168.0.98

数据库都是 test_3306

首先我给两台服务器的my.ini 贴出来

A:my.ini

server-id=2

master-host=192.168.0.98

master-user=mydb

master-password=123

master-port=3306

master-connect-retry=1

replicate-do-db=tbqu

log-bin=

log-slave-updates

binlog-ignore-db=mysql

slave-skip-errors=all

B:my.ini

server-id=1

master-host=192.168.0.97

master-user=mydb

master-password=123

master-port=3306

master-connect-retry=1

replicate-do-db=tbqu

log-bin=

log-slave-updates

binlog-ignore-db=mysql

slave-skip-errors=all

在这里,配置文件和主从配置方法基本上一样

log-slave-updates 这个参数一定要加上,否则不会给更新的记录些到二进制文件里

slave-skip-errors 是跳过错误,继续执行复制操作

其他参数请参照 http://www.tbqu.com/post/15.html

多主互备和主从复制有一些区别,因为多主中 都可以对服务器有写权限,所以设计到自增长重复问题

出现的问题(多主自增长ID重复)

1:首先我们通过A,B的test表结构

2:掉A,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1

3:后停掉B,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1

4:然后 我们同时启动A,B,就会出现主键ID重复

解决方法:

我们只要保证两台服务器上插入的自增长数据不同就可以了

如:A查奇数ID,B插偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了

在这里我们在A,B上加入参数,以实现奇偶插入

A:my.ini上加入参数

auto_increment_offset = 1

auto_increment_increment = 2

这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了

B:my.ini上加入参数

auto_increment_offset = 2

auto_increment_increment = 2

这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了

可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID 重复。

在这里我们说的是2台MYSQL服务器,你也可以扩展到多台,实现方法类似

A -> B -> C-> D ->A

这样一个环形的备份结构就形成了,最后可要记住 自增长ID(主键)要设计好哦,否则会出错的。

————————————————————————————————————————–

假定有三台Mysql服务器,他们的IP地址分别为:

192.168.1.8

192.168.1.88

192.168.1.188

在192.168.1.8的安装目录下找到my.ini文件,在该文件的最后加上:

server-id=1

log-bin

#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字

binlog-do-db=asyntest1

#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器

log-slave-updates

master-host=192.168.1.188

master-user=root

#在此处填入192.168.1.188的root密码

master-password=XXXXX

#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字

replicate-do-db=asyntest1

master-connect-retry=10

#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止

slave-skip-errors=all

在192.168.1.88的安装目录下找到my.ini文件,在该文件的最后加上:

server-id=2

log-bin

#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字

binlog-do-db=asyntest1

#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器

log-slave-updates

master-host=192.168.1.8

master-user=root

#在此处填入192.168.1.8的root密码

master-password=XXXXX

#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字

replicate-do-db=asyntest1

master-connect-retry=10

#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止

slave-skip-errors=all

在192.168.1.188的安装目录下找到my.ini文件,在该文件的最后加上:

server-id=3

log-bin

#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字

binlog-do-db=asyntest1

#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器

log-slave-updates

master-host=192.168.1.88

master-user=root

#在此处填入192.168.1.88的root密码

master-password=XXXXX

#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字

replicate-do-db=asyntest1

master-connect-retry=10

#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止

slave-skip-errors=all

在192.168.1.8, 192.168.1.88, 192.168.1.188上建立完全一样的数据库asyntest1,重启这三台数据库,然后在任何一台机器上进行的更新操作,都会同步到另外的两台机 器上,这是一种环形同步,在192.168.1.8有任何修改,会首先同步到192.168.1.88的机器上,88的机器再将同步的数据同步到 192.168.1.188的机器上。同样,如果在192.168.1.88上有任何更新,首先会同步到192.168.1.188的机器上,然后再同步 到192.168.1.8的机器上;而在192.168.1.188的机器上有任何更新,首先会同步到192.168.1.8的机器上,然后在同步到 192.168.1.88的机器上。利用这种原理,可以解决任意多台机器的互相同步问题。

如果出现问题,首先请在每一台服务器上用命令行通过telnet命令检查其他机器3306端口的连通情况。另外,请检查各机器的防火墙设置和杀毒软件的配置。可将这些软件暂停后进行试验。bitsCN.com

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

TAG标签:mysql多

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

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

相关文章

***PHP 去除换行符

PHP在不同的系统中,换行是不同的 Linux:\n Windows:\r\n mac:\r 所以去除回车换行的方法: 1.使用php定义好的变量(比较好的方法,推荐) $str str_replace(PHP_EOL, , $str); 2.使用str_replace …

个人代码归档

http://pan.baidu.com/s/1D7Qii 密码:52n3转载于:https://www.cnblogs.com/vvonline/p/4121141.html

mysql current_timestamp 不自动更新_MySQL ON UPDATE CURRENT_TIMESTAMP不更新

我有一张桌子,看起来像这样:CREATE TABLE IF NOT EXISTS Hosts (id int(128) NOT NULL AUTO_INCREMENT,IP varchar(15) NOT NULL DEFAULT ,Port varchar(5) NOT NULL DEFAULT ,Password varchar(32) NOT NULL DEFAULT ,Username varchar(32) NOT NULL DE…

序列for循环语句

序列for循环语句 序列for循环语句允许重复遍历一组序列,而这组序列可以是任何可以重复遍历的序列,如由begin()和end()函数定义的STL序列。所有的标准容器都可用作这种序列,同时它也同样可以是std::string,初始化列表(l…

mysql批量用trim限定_如何使用trim()并更新mysql中的所有行[复制]

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

C#中用WMI实现对驱动的查询

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Management; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace WMI_驱动…

01C语言的概述

一、计算机常识在学习C语言之前,先要了解一些计算机常识1.计算机只能识别0和1大家都知道,计算机要通电才能工作,说白了,它跟电视、洗衣机一样,都是电器。电器都有个共同的能力:懂得判断通电还是断电&#x…

mysql5.7物理备份_Mysql5.7—运维常用备份方式

一、 Mysqldump备份结合binlog日志恢复使用mysqldump进行全库备份,并使用binlog日志备份,还原时,可以使用binlog日志恢复到备份前的任意位置或时间1. Binlog简介主要用于主从复制和恢复数据库,使用mysqlbinlog命令查看binlog二进制…

XAMPP on Mac 组态 Virual Host

首先,在hosts文件中添加virtual host域名。方向127.0.0.1 我一般使用的命名约定dev-domainname.comsudo nano /private/etc/hosts # VirtualHosts Mapping 127.0.0.1 dev-domainname.com接下来配置Apache。打开Apache的配置文件 /Applications/XAMPP/etc/httpd.conf…

二叉查找树之二

BST树的经典问题 首先构造如下一棵二元查找树(BST树): C代码实现: typedef struct _BSTreeNode {int value;struct _BSTreeNode *left;struct _BSTreeNode *right;} BSTreeNode;static BSTreeNode* insert(BSTreeNode* q, int x) …

mysql 停止服务内存_服务器莫名的内存高占用 导致 MySQL 停止运行问题

这问题是年后开始出现的,服务器内存占用越来越高,一度达到90%,最后 MySQL 都停止运行了。贴吧签到的数据库用户 ID 这一项也丢失了,导致无法签到,断签了好些天,被提醒才发现,要挨打的。幸好设置…

LeetCode - Convert Sorted Array to Binary Search Tree

给出一个已排序的数组,将其转化为二叉查找树(BST)。 思路:取数组中间元素为根结点的value,则数组左侧、右侧分别为BST的左子树、右子树。递归可求解。代码如下: 1 /**2 * Definition for binary tree3 * …

匿名包装器(function(){})()

转载自***:https://bonsaiden.github.io/JavaScript-Garden/zh/#function.scopes只有一个全局作用域导致的常见错误是命名冲突。在 JavaScript中,这可以通过 匿名包装器 轻松解决。(function() {// 函数创建一个命名空间window.foo function() {// 对外…

PS滤镜绘制漂亮线条制作

先看最后效果   1.新建一图层---选择画笔画条垂直线(颜色为白色)。  2.滤镜里面的动感模糊(大小视效果而定吧)  3.两头细的线条出来了  执行后效果如…

ffmpeg.exe 笔记

2019独角兽企业重金招聘Python工程师标准>>> open_input_file: avformat_open_input 打开了输入文件 av_dict_get 获取信息 setup_find_stream_info_opts avformat_find_stream_info codec avcodec_find_decoder open_output_file avformat_alloc_output_context2(…

java comparator排序顺序_Java 集合排序策略接口 Comparator

1. 前言 最近用到了集合排序&#xff08;基于 Java 8&#xff09;。现在我能用 Stream 的就用 Stream &#xff0c;真香&#xff01;排序可以这么写&#xff1a; List<People> peoples new ArrayList<>();// 中间省略// 按照年龄从小到大排序 peoples.sort(Compar…

关闭IOS更新功能(ios4/5/6)

防止IOS升级&#xff1a; 工具&#xff1a;ifunbox 展开/System/Library/LaunchDaemons&#xff0c;将下面4个文件删除&#xff08;不推荐&#xff09;或者改名&#xff08;后缀也得改&#xff09;,改名后记得必须重启。 com.apple.mobile.softwareupdated.plist - OTA升级&…

TCP/IP、Http的区别

2019独角兽企业重金招聘Python工程师标准>>> TPC/IP协议是传输层协议&#xff0c;主要解决数据如何在网络中传输&#xff0c;而HTTP是应用层协议&#xff0c;主要解决如何包装数据。关于TCP/IP和HTTP协议的关系&#xff0c;网络有一段比较容易理解的介绍&#xff1a…

如何在Ubuntu下安装 monodevelop

参考介绍 http://www.monodevelop.com/download/linux/ 首先&#xff0c;Add the Mono Project GPG signing key sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF 其次&#xff0c;Add the package repository echo "d…

百度地图定位地址为空

在使用百度地图定位的时候&#xff0c; BDLocation 不为空&#xff0c;但是&#xff0c;城市&#xff0c;地址各个字段都为空&#xff0c;需要设置option.setAddrType("all");全部代码为&#xff1a; mLocClient new LocationClient(this);mLocClient.registerLocat…