类似于redis集群,mysql也可以搭建集群与分布式。
一主多从mysql,主机只进行修改插入操作(写操作),丛机只进行查询操作(读操作),读写分离来提高并发量。
主从复制过程:

  • 主机mysql进行写操作时,会把操作命令写入binlog日志文件中。
  • 当主机进行了写操作,会立即将binlog日志文件发送给所有丛机
  • 丛机接受到binlog文件,读取命令,完成数据修改。

数据一致性问题:
(1)主机在向丛机发送binlog日志文件之前宕机了,丛机没有接受到完成的binlog日志文件,造成主机和丛机数据不一致。

mysql集群主从复制有三种策略:

  • 异步复制
    主机有线程完成写操作立即返回,写操作成功,开启线程使用异步向丛机发送binlog日志。如果主机写入完成,主机宕机,丛机没有收到binlog,会造成数据不一致。
  • 半同步复制
    开启事务,主机完成写操作,必须等到至少有一个丛机接收到binlog才认为写入成功。若主机写入,所有丛机都没有收到binlog,主机宕机,主机进行事务回滚。(机器有电容,主机宕机断电,不会立刻关机)
  • 同步复制
    开启事务,必须等到所有丛机都收到了binlog,才认为写入成功,否则进行回滚。

(2)主从复制需要一定的时间,在这段时间内,主机已经完成了数据更新,而丛机还没有完成数据的更新,这段时间如果对丛机进行读操作,会读到旧数据,造成数据不一致的问题。
可以使用分布式读写锁,并且采用同步复制策略。当主机写操作时,获取分布式写锁,获取不到分布式读锁,不能对丛机读。当丛机更新数据完毕,主机写操作完成,释放分布式写锁,才能获取到分布式读锁,才能读丛机。