MySQL(主从、半同步、组复制、MHA高可用)

文章目录

  • 一、MySQL源码编译以及初始化
  • 二、mysql主从复制、半同步
    • MySQL组复制
    • MySQL读写分离
    • MHA高可用


一、MySQL源码编译以及初始化

源码编译使用cmake,所以要提前安装cmake,完成之后make install即可
这里要创建mysql用户,以及用普通用户方式初始化
MySQL(主从、半同步、组复制、MHA高可用)_第1张图片
启动mysql之后我们就可以查看到3306端口;我们还需要进行安全初始化,也就是对mysql进行一些设置以及密码的修改等
MySQL(主从、半同步、组复制、MHA高可用)_第2张图片
最终使用新设置的密码成功登录数据库;
MySQL(主从、半同步、组复制、MHA高可用)_第3张图片

二、mysql主从复制、半同步

首先我们新开一台主机,作为主从复制的从机,mysql的相关配置文件都可以直接从主机上拷贝过去,然后我们在master端上启用二进制日志和主从,并且创建了用户名和密码;
MySQL(主从、半同步、组复制、MHA高可用)_第4张图片
但是主从复制的是二进制日志,所以它们的基本配置应该是相同的,不然也不会复制成功;所以如果之前在master端对数据库进行过操作,就应该现将数据库中的数据拷贝出来并且复制到其他从机上,再在从机上进行数据的导入,以此来保证数据库的基本配置相同
我们在master端在表中插入数据,发现从机中自动进行了相同的操作,实现了主从复制
MySQL(主从、半同步、组复制、MHA高可用)_第5张图片
主从复制的原理:master端开启二进制日志之后,就会将所有操作保存下来,slave端首先进行信息认证,然后会通过io线程将master端的二进制日志中保存的操作进行读取并保存至中继日志,进而保存至磁盘;SQL线程会对这些二进制命令进行写操作,即将与master端相同的操作在slave端进行一遍。
当然,主从复制一定会有延迟

基于gtid实现mysql的主从

  • 保证同一个事务在某slave上绝对只执行一次,没有执行过的gtid事务总是会被执行。
  • 不用像传统复制那样保证binlog的坐标准确,因为根本不需要binlog以及坐标。
  • 故障转移到新的master的时候很方便,简化了很多任务。
  • 很容易判断master和slave的数据是否一致。只要master上提交的事务在slave上也提交了,那么一定是一致的。

使用gtid方式实现主从复制也便于实现半同步,由于主从是异步的,如果在数据传输的过程中出现断电等情况,可能slave端无法同步数据,但是半同步的方式就不存在这个问题

设置完半同步方式后,再进行数据的master端写入,也是能正常同步,并且我们可以通过SHOW STATUS LIKE ‘Rpl_semi_sync%’;命令查看到有一条命令成功通过半同步方式进行同步,以及有几个slave端等等信息

MySQL(主从、半同步、组复制、MHA高可用)_第6张图片
在mysql5.7之后使用AFTER_SYNC,这才保证数据库的强一致性;因为这是在io写入数据并返回ack之后master端才会提交引擎,这样就保证了每个slave端的数据的完全同步
我们在生产环境会将等待时间设置为无穷大,不然超过等待时间就会自动切换至异步,如果我们此时停掉slave端的io线程,master端添加数据就会处于一直等待的过程中,直到收到ack回应(这也保证了数据的无损)

MySQL组复制

我们做组复制的时候,需要至少三台主机,多主复制,也就是每一台主机都可以是master或者slave;也会允许其中最多一台主机出现故障;在做组复制之前我们要将mysql重新初始化,然后进入数据库并修改密码,但是我们在数据库中创建用户并授权之前要先关闭二进制日志,否则可能会影响数据的同步。
三台主机上的配置基本都一致,唯一区别的就是my.ini中的server id以及本机名要变,完成之后,我们在任意一台主机的数据库进行操作,其他主机都会同步数据;

MySQL读写分离

做读写分离的原因
数据库写入效率要低于读取效率,一般系统中数据的读取频率高于写入频率,单个数据库实例在写入的时候会影响读取性能,这是做读写分离的原因

mysql读写分离的基础
基于主从复制,通过路由的方式使应用对数据库的写请求只在master端进行,读在slave端

可以使用mysql proxy的方式实现读写分离

MHA高可用

MHA在线切换大概过程:
1.检测复制设置和确定当前主服务器
2.确定新的主服务器
3.阻塞写入当前主服务器
4.等待所有从服务器赶上复制
5.授予写入到新的主服务器
6.重新设置主服务器

你可能感兴趣的:(Linux企业运维,mysql,数据库,java)