保持数据库配置数据与zooKeeper数据实时同步

最近公司做了一个备份数据库(保存zk的配置节点数据),当zk发送宕机或者错误的时候,数据丢失后,能够保证mysql中存储的配置数据同步在zk中。相关实现逻辑如下:

首先是zk的一个初始化工具类:操作zk常用的方法。

  1 /**
  2  * Corearchi.com Inc.
  3  * Copyright (c) 2017-2018 All Rights Reserved.
  4  */
  5 package com.corearchi.incat.server.common.zkconfig;
  6
  7 import com.corearchi.incat.server.api.SystemInfo.SystemInfoMsg;
  8 import com.corearchi.incat.server.common.request.PageResult;
  9 import lombok.extern.slf4j.Slf4j;
 10 import org.apache.zookeeper.*;
 11 import org.apache.zookeeper.data.Stat;
 12
 13 import java.io.IOException;
 14 import java.text.DecimalFormat;
 15 import java.util.List;
 16 import java.util.concurrent.CountDownLatch;
 17
 18 /**
 19  * ZooKeeper工具类
 20  *
 21  * @author DonnieGao
 22  * @version Id: ZooKeeperUtils.java, v 0.1 2018/2/28 下午6:28 DonnieGao Exp $$
 23  */
 24 @Slf4j
 25 public class ZooKeeperUtils {
 26
 27     public final static String CONNECT_IP = "10.211.55.10:2181";
 28
 29     public static int sessionTimeout = 3000;
 30
 31     public static final String ROOT_PATH = "/corearchi/config/incat-client";
 32
 33     /**
 34      * 获取Zookeeper对象
 35      *
 36      * @return Zookeeper实例
 37      * @throws IOException          IOException
 38      * @throws InterruptedException InterruptedException
 39      */
 40     public static ZooKeeper getInstance() throws IOException, InterruptedException {
 41
 42         final CountDownLatch connectedSignal = new CountDownLatch(1);
 43         ZooKeeper zk = new ZooKeeper(CONNECT_IP, sessionTimeout, new Watcher() {
 44             @Override
 45             public void process(WatchedEvent event) {
 46                 if (event.getState() == Event.KeeperState.SyncConnected) {
 47                     connectedSignal.countDown();
 48                 }
 49             }
 50         });
 51         connectedSignal.await();
 52         return zk;
 53     }
 54
 55     /**
 56      * 判断总开关是否打开
 57      *
 58      * @return
 59      */
 60     public static boolean isSwitchOpen() {
 61         Stat s = new Stat();
 62         byte[] data = null;
 63         try {
 64             ZooKeeper zk = ZooKeeperUtils.getInstance();
 65             data = zk.getData(ZooKeeperUtils.ROOT_PATH + "/" + "switchOpen", true, s);
 66         } catch (Exception e) {
 67             System.err.println("获取开关失败" + e.toString());
 68         }
 69         return Boolean.parseBoolean(new String(data));
 70     }
 71
 72     public static boolean detectUsed(SystemInfoMsg systemInfoMsg) throws IOException, InterruptedException, KeeperException {
 73
 74         boolean flag = false;
 75         DecimalFormat df   = new DecimalFormat("######0.00");
 76         Integer memTotal = systemInfoMsg.getMemTotal();
 77         Integer memUsed = systemInfoMsg.getMemUsed();
 78         Integer cpuCore = systemInfoMsg.getCpuCore();
 79         Integer cpuUsed = systemInfoMsg.getCpuUsed();
 80
 81         if (memUsed != null && memTotal != null && cpuCore != null && cpuUsed !=null) {
 82             double  men = Double.parseDouble(df.format((memUsed / (memTotal * 1.0))));
 83             if (men >= 0.8 || cpuUsed >= 80) {
 84
 85                 if (isSwitchOpen()) {
 86                     ZooKeeper zk = getInstance();
 87                     zk.setData(ZooKeeperUtils.ROOT_PATH + "/" + "switchOpen", "false".getBytes(), -1);
 88                     zk.close();
 89                     flag = true;
 90                 }
 91             }
 92         }
 93
 94         return flag;
 95
 96     }
 97
 98
 99     public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
100         ZooKeeper zk = ZooKeeperUtils.getInstance();
101         Stat s = new Stat();
102
103         List<String> znodes = zk.getChildren(ZooKeeperUtils.ROOT_PATH, true);
104         for (String znode : znodes) {
105             byte[] data = zk.getData(ZooKeeperUtils.ROOT_PATH + "/" + znode, true, s);
106             System.out.println("获取节点:" + znode + " 的数据是:"
107                     + (data == null ? "null" : new String(data)));
108             /*System.out.println(znode);*/
109         }
110     }
111 }

而且当数据库配置发送改变的时候保证zk节点数据要与数据库数据保持一致,下面是逻辑实现:

 1  @Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
 2     public void synZooKeeper() throws Exception {
 3         ZooKeeper zk = ZooKeeperUtils.getInstance();
 4         List<ZkConfig> zkConfigs = zkConfigMapper.selectAllZkConfig();
 5         if (null == zk.exists(ZooKeeperUtils.ROOT_PATH, true)) {
 6             // 父节点不存在创建父节点
 7             String paths = ZooKeeperUtils.ROOT_PATH;
 8             String[] split = paths.split("/");
 9             StringBuffer sb = new StringBuffer();
10             int i = 0;
11             for (String s : split) {
12                 i++;
13                 if (i == 1) {
14                     continue;
15                 }
16                 sb.append("/").append(s);
17                 zk.create(sb.toString(), "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
18             }
19         }
20
21         // 创建子节点,并设置值
22         for (ZkConfig zkConfig : zkConfigs) {
23             String nodePath = ZooKeeperUtils.ROOT_PATH + "/" + zkConfig.getDataKey();
24             // 判断节点是否存在
25             if (zk.exists(nodePath, true) != null) {
26                 zk.setData(nodePath, zkConfig.getDataValue().getBytes(), -1);
27             } else {
28                 // 节点不存在
29                 zk.create(nodePath, zkConfig.getDataValue().getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
30             }
31         }
32
33         zk.close();

当数据库配置数据发送变化的时候,只需调用该方法即可。就能完成zk节点数据与mysql配置数据保持同步。

原文地址:https://www.cnblogs.com/codegeekgao/p/8531257.html

时间: 2024-11-17 14:12:54

保持数据库配置数据与zooKeeper数据实时同步的相关文章

[ASP.NET Core 3框架揭秘] 配置[5]:配置数据与数据源的实时同步

在<配置模型总体设计>介绍配置模型核心对象的时候,我们刻意回避了与配置同步相关的API,现在我们利用一个独立文章来专门讨论这个话题.配置的同步涉及到两个方面:第一,对原始的配置源实施监控并在其发生变化之后重新加载配置:第二,配置重新加载之后及时通知应用程序进而使应用能够及时使用最新的配置.要了解配置同步机制的实现原理,我们先得了解一下配置数据的流向. 一.配置数据流 通过前面的介绍,我们已经对配置模型有了充分的了解,处于核心地位的 IConfigurationBuilder对象借助注册的ICo

inotify用法简介及结合rsync实现主机间的文件实时同步

一.inotify简介 inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改.新增.删除 等,并可以将相应的事件通知给应用程序.该机制由著名的桌面搜索引擎项目beagle引入用于替代此前具有类似功能但存在诸多缺陷的dnotify. inotify既可以监控文件,也可以监控目录.当监控目录时,它可以同时监控目录及目录中的各子目录及文件的.此外,inotify

【linux教程】inotify用法简介及结合rsync实现主机间的文件实时同步

一.inotify简介 inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改.新增.删除等,并可以将相应的事件通知给应用程序.该机制由著名的桌面搜索引擎项目beagle引入用于替代此前具有类似功能但存在诸多缺陷的dnotify. inotify既可以监控文件,也可以监控目录.当监控目录时,它可以同时监控目录及目录中的各子目录及文件的.此外,inotify

全网备份+NFS存储+单点实时同步.docx

目  录 老男孩教育 linux 运维就业班第八和九关(周)课后学习效果能力上机大考察... 1 1.1 逻辑图... 1 1.2 50 台集群服务器全网数据备份解决方案... 1 1.2.1 一.搭建rsync备份服务器... 3 1.2.2 二.web01本地测试... 7 1.2.3 web01本地脚本... 7 1.2.4 本地定时任务... 8 1.2.5 backup服务器上脚本... 8 1.2.6 backup定时任务... 8 1.3 网站集群后端 NFS 共享存储搭建及优化解

rsync+lsyncd实现(本地以及远程)文件实时同步

lsyncd基于lua语言开发,整合了rsync和notify 实现文件的实时同步 系统环境  cat /etc/issue CentOS release 6.6 (Final)  uname -sr Linux 2.6.32-504.el6.x86_64 服务器规划 rsync服务器:                   192.168.10.241 rsync + lsyncd服务器 :         192.168.10.231 一.配置rsync服务器 1.配置xinetd来管理rsy

Sqlserver2000连接Oracle11G数据库进行数据实时同步

 Sqlserver2000连接Oracle11G数据库进行数据实时同步 1,前提条件 已经有sqlserver2000环境,已经存在oracle11g环境,准备这两个数据库,建立各自的访问账号,两者之间需要ping通,telnet端口也要能通,目的是将sqlserver里面的数据自动同步到oracle数据库里面去.Sqlserver里面有链路服务器(linked server)可以实现. 2,在sqlserver上面建立odbc数据源 有2种方式:"Microsoft ODBC for Ora

数据访问池+服务插件配置+数据库配置

01.数据访问对象池 TDBAPool a.分配访问对象: DBAPool.AllocateObject;  //每次都新建一个 b.返还访问对象: DBAPool.ReleaseObject(TDBAccess); //释放并注销掉 c.分配对象数量: DBAPool.AllocatedObjects; 02.服务端数据库配置信息的处理:TDBConfig a.取现有已注册数据库信息: DBConfig.FetchDatabaseList(var CDS:TClientDataSet) b.注

rsync简介与rsync+inotify配置实时同步数据

rsync简介 rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. rsync特性 rsync支持很多特性: 可以镜像保存整个目录树和文件系统 可以很容易做到保持原来文件的权限.时间.软硬链接等等 无须特殊权限即可安装 快速:第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件.rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽 安全:可以使用scp.

centos7服务搭建常用服务配置之二:Rsync+sersync实现数据实时同步

目录 1.RSYNC数据备份 1.1 rsync服务简介 1.2 rsync特点和优势 1.3 rysnc运行模式简介 1.4 数据同步方式 2 Rsync实验测试 2.1 实验环境说明 2.2 服务安装 2.3 Rsync命令详解 2.3 实验一使用rsync命令备份数据 2.4 实验二使用rsyncd服务进行数据备份 3.Rsync+sersync实现数据实时同步 3.1 rsync+sersync架构作用 3.2 rsync+inotify-tools与rsync+sersync架构的区别