MySQL高可用架构设计方案
2、详细架构
连接管理器,连接不可用,或者监控到Zookeeper中的主备地址变化时(通过事件的方式可以获得,无需定时检查),从zookeeper获取新的数据库Master地址,建立新的连接APP/basedbZooKeeper master----Master ---10.10.10.1:5000 -----lock={10.10.10.1:5000} -----servers ---10.10.10.1:5000 ---10.10.10.2:5001AgentAgent半同步复制业界测试,性能损失20%,用的比较多监控Master状态,定期更新Zookeeper上的锁的时间,声明自己可用。Master10.10.10.2Slave定期检查Zookeeper上的锁更新时间,如果Master更新超时,那么把Slave状态变成master,readonly属性关闭同时更新zookeeper上的Master地址,为原来Slave的地址10.10.10.1管理工具1.监控主从状态2.主动主从切换(当主恢复的时候,需要此功能)
3、整体思路
??主备库构成分布式环境,但是有状态
—确保Agent可以重启,可以任意次重启,但是有超时限制
??主库切换逻辑可以通过Zookeeper实现
—锁的升级实现
??切换时,MySQL的read-only的设置很重要
MySQL高可用架构设计方案
??切换时,需要将异常的故障节点+App数据源一起切换
1、首先在Zookeeper初始化,创建对应的节点,写入模块信息、数据库源名称、数据库IP、数据库端口信息等,然后写入下面的数据库子节点中,并添加watcher,增加监视事件。
2、创建lock子节点,不需要设置watcher,如果当前client的id是当前最小的节点,则获得了lock,退出。否则继续等待,如果id不存在,则创建子节点
3、当发生异常master宕机后,则watcher事件触发,然后从当前id序列中得到最小的id,将该节点置为新的master,同时将DB的read-only置为on,保证可以读写
6.2.2.流程设计
流程1:Agent启动
满足
启动数据库监视器 注册成功 告警,等待手工处理 根据传入的参数在Zookeeper上注册节点 退出 检查工作环境是否满足工作要求 MySQL高可用架构设计方案
流程2:数据库监控正常
开始修改本地监控状态是否Master节点检查是否有lock节点创建Lock节点更新实例节点数据结束
流程3:数据库监控数据库Down
开始修改本地监控状态If pre_stat = active then now_stat = active2downIf pre_stat = running then now_stat = running2downElse now_stat = down是否为Active2down是否删除lock节点更新实例节点数据结束
MySQL高可用架构设计方案
流程4:Master库正常停止
开始删除Master节点停止Master数据库结束
流程五:应用启动,初始化数据库连接池
dfd Data Flow 开始读取数据源组信息zookeeper是从ZK读取数据源信息建立ZK LOCK节点的监听否构建数据源组结束
MySQL高可用架构设计方案
流程六:应用监听到Active数据库宕机
6.2.3.应用层切换设计
目前我们连接池重建连接的过程是当在连接上执行DB操作时发生特定异常时触发连接池关闭不可用连接,重新向数据源获取连接。在使用Oracle的RAC配置特性时,Oracle在驱动层会自行判断数据源是否可用,若不可用则尝试从另外一个数据源获取连接,Oracle的这个特性可以理解为对等数据源的优先选择。但MYSQL的复制机制(非共享存储)决定了其驱动层不能支持当主库出问题时自动连接到从库上,因此我们考虑使用GroupDataSource来实现类似Oracle驱动做的事情,即数据源组中的首选数据源不可用时,我们尝试同组中的其他数据源来获取连接,对于连接池来说这个过程是透明的。连接池还是保持之前当连接异常时,触发执行关闭不可用连接并重新获取连接即可。
主备切换和按权重选择、按优先级选择数据源的选择策略是不一样的,因此设计DbSelector来描述数据源的选择策略,不同的选择策略在同一数据源组中会同时存在,一个GroupDataSource包括写数据源选择策略、读数据源选择策略和运行时切换策略,使用何种具体策略取决于组数据源的配置。待选择的数据源要求是对等的,即读数据源选择策略只针对标识为读的数据源,不能把读写数据源混在一起选择。
引入了Zookeeper之后,我们可以通过Zookeeper感知到主数据库的状态。Zookeeper在完成主备切换后会通知应用程序主数据库发生了变更,应用程序收到通知后,需要关闭连接池中之前已建立的主数据库连接,重新创建新的主库连接。基于Zookeeper的通知机制,我们在AtomDataSource中接收数据源配置变化的信息,收到变化通知后更新数据源本身的状态,同时建立listner机制,把数据源状态变化发布给连接池等对象进行相应的处理。