日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql zookeeper 切换_zookeeper在mysql主库选举切换中的应用

發布時間:2025/4/16 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql zookeeper 切换_zookeeper在mysql主库选举切换中的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了保證可用性,傳統的關系型數據庫(mysql)通常采用一主多備的方式,當主宕機后,切換到備機。

有多種方式可以做到主備自動失效檢測切換,比如傳統的HA軟件heartbeat,keepalived等等,采取虛擬IP的方式對客戶端透明;

這里主備自動切換方案沒有采取VIP的方式,而是用zookeeper對數據庫集群進行管理,可以做到主備失效檢測切換,主庫的選舉,

比如考慮到mysql對多核利用率不高而一個節點部署多個mysql實例,如果采用VIP的方式是不可行的。

基本做法是,每個mysql實例上部署一個agent節點,agent負責對該mysql實例定時進行ping操作,agent在zookeeper上注冊臨時節點,

如果agent或者該agent代理的mysql宕掉,注冊在zookeeper上的節點就會發生變化,利用zookeeper watch功能實現mysq實例失效后的主庫的選舉操作,

讀節點也通過watch master節點的功能實現指向新的master。

如上圖所示,zookeeper上的master節點存儲當前主節點名稱;

servers下面保存在線的節點,命名規則一般為ip:port_序列號;

nodeid為當前的序列號,每當節點獲取一個序列號時,該節點值自就增,以便于分配給下一個節點。

過程如下:

a、初始化階段,創建servers,master,nodeid節點

b、每個client創建servers子節點,zoo_create("/servers/xxx",EPHEMERAL)

c、zoo_get_child(/servers,NULL)

d、若當前client的序列號id是當前最小的節點,則當前節點是master,設置master節點退出

e、否則,zoo_exsists(lastid before id,watcher)//當前節點watch比當前節點id次小的那個節點的狀態

如果id不存在,那么退出

否則等待watch觸發,重新選舉master

相關偽代碼參考示例如下:

try {

ProposoWatcher wc = new ProposoWatcher();

final ZooKeeper zk = new ZooKeeper("10.1.1.24:2181", 60000, wc);

wc.setZk(zk);

if (zk.exists("/master", false) == null) {

zk.create("/master", null, Ids.OPEN_ACL_UNSAFE,

CreateMode.PERSISTENT);

}

zk.create("/servers/" + nodeName, new byte[0], Ids.OPEN_ACL_UNSAFE,

CreateMode.EPHEMERAL);

List list = zk.getChildren("/servers", false);

String[] nodes = list.toArray(new String[list.size()]);

Arrays.sort(nodes);

if (nodeName.equals(nodes[0])) {//初次

System.out.println("this is master" + nodes[0]);

zk.setData("/master", nodeName.getBytes(), -1);

} else {

// 監控比自己次小的Node

String lower = "";

for (int i = 0; i < nodes.length; i++) {

if (nodeName.equals(nodes[i])) {

lower = nodes[i - 1];

break;

}

}

zk.exists("/servers/" + lower, true);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//watcher

public static class ProposoWatcher implements Watcher {

private ZooKeeper zk;

public ZooKeeper getZk() {

return zk;

}

public void setZk(ZooKeeper zk) {

this.zk = zk;

}

@Override

public void process(WatchedEvent event) {

// TODO Auto-generated method stub

switch (event.getType()) {

case None: {

// connectionEvent(event);

break;

}

case NodeDeleted: {

// servers.remove(event.getPath());

System.out.println("node? removed**" + event.getPath());

String delName = event.getPath().substring(

event.getPath().lastIndexOf("/"));

// final ZooKeeper zk1 = zk;

List children = new ArrayList();

try {

children = zk.getChildren("/servers", false);

} catch (KeeperException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

String[] nodes = children.toArray(new String[children.size()]);

Arrays.sort(nodes);

for (int i = 0; i < nodes.length; i++) {

if (nodes[i].compareTo(delName) > 0) {

// TODO:curr Node become master

System.out.println("this is master" + nodes[i]);

try {

zk.setData("/master", nodes[i].getBytes(), -1);

} catch (KeeperException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

break;

}

}

break;

}

}

}

}

總結

以上是生活随笔為你收集整理的mysql zookeeper 切换_zookeeper在mysql主库选举切换中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。