解决问题
解决问题Master挂掉不会影响业务
对于现有架构只有一个Master,将来我们扩展多个Slave,但是现有Master挂掉就会影响现有架构业务,也就是Master挂掉,Slave写数据就不知道怎么写入数据了,而且Slave不知道监听哪台Master了,所以将来我们可以给Master备份另外一台Master,这样可以实现一个心跳感应。心跳感应
心跳感应就是其中一台Master挂掉我们可以立马切换到另一台Master
场景
假设我们现有一台Master和一台Slave,然后Master开启了它的binary log,Salve去监听binary log,监听如果有写操作就会写入Slave的replay log,replay log回去执行一些sql语句,完成一些添加删除更新等写操作,从而实现了Slave和Master的数据同步,现在我需要将现有的Slave一位另一台Master,我们可以给这台Slave开启binary log,而且还要开一log_slave_updates,它表示当我们的relay log发生改变的时候,它会通过log_salve_updates写入我们的binary log中,也就是实现了Slave和Master中的binary log的同步,这样Slave和Master它们拥有内容是一模一样的,然后再让Master的去监听Slave的binary log,这样Maser也要开启relay log,让他作为我们Slave的从机,这样我们就实现了Master和Slave互为主从,这样的好处就是我们在向其中任何一台机器写入数据,另外一台机器都会跟着改变,其中一个挂掉另外一个可以直接作为主机来提供服务。最终我们可以达到双Master的效果,各自的Master下都有各自的Slave集群,其中一个Master挂掉不影响另外的Master提供服务。
接下来就是把我们Slave也变成主机(Master)
步骤
配置 SlaveSlave开启 binary log (这里是在152机器上操作)1vi /etc/my.cnf
添加下面代码1
2log-bin=mysql-bin
binlog_format=mixed
另外还需要将 relay log 从主机里面监听的写的操作也写入 binary log 当中,因为我们需要两个biary log要一致,
所以我们还需要添加下面代码,它的意思是将我们的 relay log 通过这样的内容写入 binary log 中,这样即使我们向主机写入我们从机的binary log和主的bianry log是一模一样的。如果将来我们的主机挂掉那么我们的从机立马会作为新的主机来上位1log_slave_updates=1
重启Slave1service mysqld restart
这样我们的Slave就有了作为主机的能力从机Slave给主机Master授权(这里是在152机器上操作)
从机Slave要让我们的主机Master来监听从机Slave的binary log
进入从机Slave的MySQL, 也就是我这里的152机器,我们孕育master这个用户通过151来监听152这台机器1grant replication slave on *.* to [email protected] identified by '123';
主机Master监听从机Slave(这里是在151机器上操作)
首先打开主机Master的配置文件,也是151机器上的配置文件,在原来的基础上添加 relay_log=mysql-relay-bin , 除了开启relay log,还要开启一个东西,因为将来我们这台机器要做从机的话,我们从152这台机器binary log来写数据,也要通过一个选项来写 如binary log里面去,所以也需要添加 log_slave_updates=11
2relay_log=mysql-relay-bin
log_slave_updates=1
这样就可以实现151和151的binary log保持一致重启151Master1service mysqld restart连接进入MySQL监听152机器(这里是在151机器上操作)
首先查看152状态(这里是在152机器上操作查看状态)1show master status;
会发现我们的152机子的binary log是mysql-bin.000001,位置是451,我们对它进行reset操作1reset master;
现在就可以在151机器上执行下面代码操作(这里是在151机器上操作)1
2
3
4
5
6
7mysql> change master to
-> master_host='192.168.1.152',
-> master_port=3306,
-> master_user='master',
-> master_password='123',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=154;
其中master_log_file和master_log_pos是152机器上reset后的值
现在152已经指向了152,151已经变成了152的从机了。现在开启主机中的从(这里是在151机器上操作)1
2start slave;
show slave statusG
发现上面是两个yes,说明没有问题,现在151是152的从,152也是151的从,然后151是152的主,152也是151的主,它们互为主从
我们去152中执行下面语句(这里是在152机器上操作)1show slave statusG
现在我们去操作数据库看一下是否成功
现在数据中存在的数据,他们的数据是一致的
现在我们在151中将id为1的数据删除
现在我们去152中将id为3的数据删除掉
下面又准备了153和154两台机器