mysql mm架构_linux下mysql5.6搭建MM架构

本文详细介绍了MySQL的MM(Master-Master)架构,即双主架构,以及为何要建立这种架构以实现高可用性和读写分离。在MM架构中,两个节点互为主备,数据同步避免了传统MS架构的脏数据问题。文章还阐述了如何在CentOS下搭建MySQL5.6的MM架构,包括安装、配置、初始化、启动和设置主从关系的步骤。
摘要由CSDN通过智能技术生成

参考文章:

MySQL Replication, 主从和双主配置

查看mysql主从配置的状态及修正 slave不启动问题

主从同步设置的重要参数log_slave_updates

常用数据库高可用和分区解决方案(1) — MySQL篇

一、什么是mysql的MM、MS架构

MM即master-master,双主架构;MS即master-slave,一个主对应一个从或多个从架构

MM架构其实是基于MS架构特殊设置的,在服务器1设置为服务器2的master同时,把服务器2也反过来设置成服务器1的master,这样互为主备。因为mysql的主备模型只能支持一个主一个从,所以MM架构只能有两个节点,但是每个节点内还可以建成一个集群,对外层MM架构只暴露成单个节点。

二、为什么要建立MM架构

传统的master-slave架构支持了读写分离实现,写的操作引流到master上,读的操作引流到slave上。在大流量请求下,需要建立HA(高可用性)集群,通过HA中间件承载MS架构的分流、健康监测、failover、故障节点重入等。在这种架构下的mysql,读服务器(slave)挂了,读节点会平移到写服务器上,对运行中的项目是不可见并不需关心的,最多平移成功前有一些报错。

但是对写节点就无法实现平移,因为只有一个写节点。在写节点挂掉的情况下,写节点转移到slave上,大量新数据写到slave转成的新master上,原master恢复同步时间长。还容易造成脏数据,因为在宕机前,原master可能还有一些数据没有同步到slave,slave接管了master之后,不会再同步原master的数据,这时候尚未同步的那些不就成了脏数据了吗。如果后面需要把写节点恢复到原master上,相当于又一次failover过程,同样会制造未同步的脏数据。比如你刚发的帖子没了、你才注册的账户系统说你不存在,用户会怎么想。当然如果你用户量不大、数据量小,让dba去恢复一下还是可以的。

三、MM架构的优势

MM架构就是在传统MS架构基础上,两个节点互为对方的主、互为对方的备,实现方式是一个节点change master到另一个节点同时,另一个节点也chang master到前一个节点,双方的master会显示成对方的ip,一个节点修改数据的记录会同步到另一个,另一个节点的记录也会同步到前一个。mysql早已支持这样的设置方式了。

有小伙伴可能会想到,如果是并发插入有自增键的表数据呢,两个节点同时插入一张表,同时生成同一个id,会不会冲突。这一点也不用担心,mysql有关于自增的配置项auto-increment-increment和auto-increment-offset,前一个是id自增步进,后一个是id自增起始,聪明的小伙伴应该想到了,只要设置一台的步进是单数另一台是双数不就行了吗,就算并发同时插入,生成的id也不会冲突,还可以设置一台的自增起始是1,另一台是10000000(0的数目是我随便写的),中间的这部分就是绝对不会冲突的区间了。

MM架构的设置方法实现了,现在我们预演一下failover(故障转移)的过程。当HA中间件发现一台挂了之后,自然发出failover,写操作就平移到另一台上面去了,因为两台都是master,所以根本就不存在需要重新切换关系的问题,现在就是单M架构,读和写都在这个节点上,用户数据没有任何丢失。原master恢复后,自动连接新master,同步数据,重新形成MM架构。写分流入口要不要回到原来的master都无所谓,因为两者是平级的。但是基于读写分离的原则,读操作在原master恢复后,还是应该分流到和写节点不同的另一台上去。

所以总结一下MM架构的优势,就是在failover转移之后,系统又恢复了,不再需要恢复成原来的对应关系,两个节点都是主,谁做主都一样。而且不会造成脏数据,因为你同步我的,我也会同步你的,切换来切换去都没关系。

四、MM架构的集群

进一步思考,用户量大了,数据多了,服务器撑不住,挂了一台切换到另一台后又挂了,怎么办。

因为MM互为主备,而mysql只支持一主一从或一主多从,所以MM架构最上层始终只有两个节点,无法扩展更多平行节点,不然如果有10个节点,HA中间件随便选一个顶上就行了,所以在普通MM架构下,两个节点都挂那就是真的全挂了。那最上层无法着手,就从下一层着手,搭建一个备用集群,挂了有机可用。

MM架构始终只有一台是写节点,确保不会出现互写冲突,另一台是HA备机,并且用于向备用节点集群同步数据,可能会有很多IO连接。备用集群就是读节点,同步MM架构的数据,开放给读请求。当MM两个节点都挂掉时,提出两个备机节点设立MM关系,从备机提升为master节点,选举出其中一台对外提供写服务,备机集群重新设立同步关系,从另一台开始同步数据

五、centos下搭建mysql5.6的MM架构

环境:

centos 7

mysql 5.6.16

1、安装mysql

tar zxvf mysql-5.6.16.tar.gz

cd mysql-5.6.16

cmake -DCMAKE_INSTALL_PREFIX=/Data/tmp/mysql-5.6.16-1/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_DATADIR=/Data/tmp/mysql-5.6.16-1-data/ -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1

make && make install

另一个如法炮制,只是目录不同

cmake -DCMAKE_INSTALL_PREFIX=/Data/tmp/mysql-5.6.16-2/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_DATADIR=/Data/tmp/mysql-5.6.16-2-data/ -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1

2、配置文件

cd /Data/tmp/mysql-5.6.16-1/

mkdir etc

cp support-files/my-default.cnf etc/

vim etc/my-default.cnf

在[mysqld]段下添加配置项

server-id=8 #服务id,不同节点这里一定要不同

port = 3308

auto-increment-increment=2 #id递增步进,不同节点要单双数隔离

auto-increment-offset=1

log-bin=localhost-bin

binlog-do-db=mmtest #binlog记录的库,指定到同一个要同步的库

binlog_format=mixed

log_slave_updates=1 #控制本机是否把同步另一个节点的操作也写入到binary log,默认的情况下mysql是关闭的,在也有其他机器是本机的从机时必须打开,否则本机从机无法同步MM架构的另一台的记录

basedir = /Data/tmp/mysql-5.6.16-1/

datadir = /Data/tmp/mysql-5.6.16-1/data/另一个也是

cd /Data/tmp/mysql-5.6.16-1/

...........

配置值有些不同的地方

server-id=9

port = 3309

auto-increment-increment=2

auto-increment-offset=2

log-bin=localhost-bin

binlog-do-db=mmtest

binlog_format=mixed

log_slave_updates=1

basedir = /Data/tmp/mysql-5.6.16-2/

datadir = /Data/tmp/mysql-5.6.16-2/data/

3、初始化mysql

cd /Data/tmp/mysql-5.6.16-1/bin

./mysql_install_db --defaults-file=/Data/tmp/mysql-5.6.16-1/etc/my-default.cnf --user=mysql --basedir=/Data/tmp/mysql-5.6.16-1/ --datadir=/Data/tmp/mysql-5.6.16-1/data/ --port=3308

cd /Data/tmp/mysql-5.6.16-2/bin

./mysql_install_db --defaults-file=/Data/tmp/mysql-5.6.16-2/etc/my-default.cnf --user=mysql --basedir=/Data/tmp/mysql-5.6.16-2/ --datadir=/Data/tmp/mysql-5.6.16-2/data/ --port=3309

4、启动mysql

/Data/tmp/mysql-5.6.16-1/bin/mysqld --defaults-file=/Data/tmp/mysql-5.6.16-1/etc/my-default.cnf --user=mysql --log-error=/Data/tmp/mysql-5.6.16-1/log/mysql.log&

/Data/tmp/mysql-5.6.16-1//bin/mysqladmin -u root password '密码'

/Data/tmp/mysql-5.6.16-2/bin/mysqld --defaults-file=/Data/tmp/mysql-5.6.16-2/etc/my-default.cnf --user=mysql --log-error=/Data/tmp/mysql-5.6.16-2/log/mysql.log&

/Data/tmp/mysql-5.6.16-2//bin/mysqladmin -u root password '密码'

5、登录mysql服务器,设置master

mysql -h127.0.0.1 -uroot -P3308 -p密码

首先为slave创建一个用户

>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON mmtest TO 'slave'@'127.0.0.1' IDENTIFIED BY 'slave';

设置master

>change master to master_host='127.0.0.1', master_port=3309, master_user=slave, master_password=slave;

>start slave;

另一台也是这样操作,只是master信息不同

各自查看状态

>show slave status;

注意看两个变量的值

Slave_IO_Running: Yes #master的binlog传输线程,将master的最新修改传输到本地保存为relaylog

Slave_SQL_Running: Yes #本地relaylog回放线程,将io线程传过来的记录应用到本地数据库

都是yes的话是正常的

------如果Slave_IO_Running是no

可能是主库是的master的信息有变化

先查看master状态

>show master status;

记录下File,Position字段,假设为‘mysql-bin.000004’,98,执行

>stop slave;

>change master to master_log_file='mysql-bin.000004',master_log_pos=98;

>start slave;

-------如果Slave_SQL_Running为NO

slave状态看到有语句Error信息,可以尝试跳过错误语句

>stop slave;

>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; #1是跳过1跳,可以随意设置,到没有sql报错为止

>start slave;

6、完成

现在试试在两边库各做下操作,结果是互相同步,插入id自增新数据的话,一节点插入的是单数id,二节点插入的是双数id,update操作两边都会执行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值