windos搭建mysql2主多从高可用集群架构
有了mysql主从为什么还会出现mysql多主多从架构呢?
mysql 主主复制
mysql 主从复制是经常被提起的,但是主主复制却很少提起。主从复制一般是主库用来写入,多个从库用来读取。
主主复制则是两个库互为主从关系。比如现在是1主1从,主库负责写入,从库负责读取,但是当主库出现故障该怎么办呢?如果把另外的从库变成主库,那么就需要把原来的主库按照主从复制进行配置,这都是需要时间的。而如果先配置好互为主从关系,那么切换的速度就会更快。
如果现在是1主2从架构,那么当主库故障,需要选择一个从库变成主库,不仅需要在主库上面进行配置,还要再别的从库上进行配置,因为原来的从库的master
是原来的主库,而现在要把master
换成新的主库。这样会导致系统有一段时间的不可用,或者说不好用,毕竟你没把从库切换好,那么就算主库切过去了,写入没问题了,可是读取从库读不到数据啊。
这时候就可以运用主主复制
的技术来维持mysql的高可用
。
开始搭建mysql主主复制
这里,我假设你已经搭建好了一个主从架构,最少是一主一从的架构,如果你还没有搭建好,那么参考我的这篇文章进行搭建mysql主从集群。
现在假设你已经有了3306主库
和3307从库
,那么我们现在要进行的就是把3307
从库变成3306
的主库。其实很简单,也就是把从库那一套过程在主库上跑一遍就好了。
我们查看3307
从库的master
状态。
show master status;
请记住上面的file
和position
参数,要在3306
库上用到。
我们现在进入3306
库,运行下面的命令。
change master to
master_host='127.0.0.1', --master地址
master_port=3307, --master端口
master_user='root', --master登录用户名
master_password='pa88word', --master登录密码
master_log_file='mysql-bin.000009', --要开始同步的binlog文件 上面的file参数
master_log_pos=154; --要开始同步的具体指针位置 上面的position参数
接下来启动3306
库的slave
线程。
start slave;
这个命令是什么呢,主要是启动从库的更新线程,从库有两个更新线程,一个io线程负责把主库的binlog
写入从库的relay log
。一个sql线程负责把relay log
中的信息写入从库。
接下里看看从库的状态,执行下面的命令。
show slave status;
这里面主要看Slave_IO_Running
和Slave_SQL_Running
也就是上面说的两个线程是否在运行,如果是Yes
,那么就ok了。
如果不是Yes
可以退出重启一下mysql服务试试。
如果已经可以了,那么你就可以测试了。
首先修改3306
库的数据,看3307
库是否更新。如果数据更新了,接着测试修改3307
库,看3306
库的数据是否和3307
库一致,如果一致,那么说明这两个库已经互为主从关系了,也就是完成了主主复制
。
现在肯定有疑问,如果互为主从,会不会发生数据循环更新呢?这个问题是不会的,因为两个库的server id
不同,mysql会摒弃server_id相同的更新。
接下里完成了主主复制,那么就要开始搭建从库了。现在所有的从库以3306
库作为主库。那么实现了下面的点:
- 当3306库写入数据的时候,所有库数据一致
- 当3307库写入数据的时候,所有库数据一致
- 当3307库挂掉,3306库写入数据的时候,所有库数据一致
- 当3306库挂掉,3307库写入数据的时候,所有库数据一致
当然了,第4点现在还没有实现,实现这个需要用到其他方法,借助一些工具来达到把所有从库的主库切换为3307
库。这样才能实现。
其实这么看,2主和1主没啥区别。其实并不是。
主从复制和主主复制的区别
当处于主从的时候,主库宕机:
- 主库宕机无法写入
- 选取从库当新的主库
- 切换其他从库的主库为新的主库
当处于主主的时候,主库宕机:
- 主库宕机无法写入
- 使用另外的主库当新的主库
- 切换所有从库的主库为新的主库
这样看是一样的,但是呢,旧主库怎么办呢?
当主从的时候,旧主库因为不同步其他库的数据,所以和其他库数据不一致了,那么现在需要把旧主库设置为新主库的从库。
当主主的时候,旧主库因为是新主库的从库,所以旧主库数据没问题。
看到了吗,如果是主从,最终的结果还是变成了主主。那为什么不一开始就设置成主主呢???