随着数据量增加,读写并发的增加,系统可用性要求的提升,单机MySQL存在着一些问题:
核心流程是:
binlog格式
这个模式存的是哪条记录被修改,修改成什么样.缺点是日志内容大。
存的是sql语句,日志量少。缺点是一些函数、触发器同步可能有障碍。
两种模式的结合,根据执行的sql语句来区分对待记录的日志形式。
查看binlog命令,进入mysql的bin目录下执行。
mysqlbinlog --no-defaults ../data/binlog.000116
修改binlog模式
SHOW VARIABLES LIKE "%binlog_format%";
set global binlog_format='MIXED';
配置文件my.ini中加入
binlog_format="MIXED" #开启MIXED模式
修改后重启mysql服务
主从复制方案
传统的主从复制,网络或机器故障,会导致数据不一致
保证Source和Replica最终一致性
简称MGR,基于分布式协议Paxos实现,保证数据一致性
主从复制实战
异步复制
server-id=1 log-bin=mysql-bin
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
server-id=2 log-bin=mysql-bin
show master status;
记录下File和Position
change master to master_host='192.168.161.21', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 837, master_connect_retry=30;
master_log_file和master_log_pos就是上面记录下的File和Position。
执行完后继续执行下面的命令,开启主从复制
start slave
show slave status \G;
两个都是YES,说明成功
主从复制的局限性
方案1:
基于Spring提供的路由数据源AbstractRoutingDataSource以及AOP
缺点:
具体实现:https://www.cnblogs.com/cjsblog/p/9712457.html
方案2:
ShardingSphere-jdbc 的 Master-Slave 功能
缺点:
具体操作:https://www.cnblogs.com/javammc/p/12470838.html
方案3:
使用MyCat/ShardingSphere-Proxy的Master-Slave功能
部署中间件,规则配置在中间件中,业务系统无侵入。
什么是高可用?
高可用代表着更少的不可服务的时间。一般互联网公司要求达到4个9,即一年不能服务的时间不超过52.6分钟
99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
数据库要实现高可用,需要做到
常见的一些策略有:
方案1:主从手动切换
如果主节点挂掉了,将某个从改为主。然后配置其他从节点。应用侧需要修改数据源配置。
缺点:
方案2:主从手动切换2
用LVS+Keepalived实现多个节点的探活+请求路由
,配置VIP或DNS实现应用侧配置不变更
缺点:
方案3:MHA
MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本 DeNA 公司的 youshimaton(现就职于 Facebook 公司)开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。
基于Perl语言开发,一般能在30S内实现主从切换。切换时通过SSh复制主节点的日志。
缺点:
方案4:MGR
Mysql Group Replication(MGR)
MGR的特点:
缺点:
方案5:Mysql Cluster
MySQL InnoDB Cluster是一个高可用的框架,它由下面这几个组件构成:
方案6:orchestrator
一款MySQL高可用和复制拓扑管理工具,支持自动故障转移和手动主从切换等。通过Web界面操作可以更改Mysql实例的复制关系和部分配置信息,同时提供命令行和API接口,方便运维管理。