ä»ä¹æ¶å使ç¨Shell
å 为Shellä¼¼ä¹æ¯åUNIXç³»ç»ä¹é´éç¨çåè½ï¼å¹¶ä¸ç»è¿äºPOSIXçæ ååãå æ¤ï¼Shellèæ¬åªè¦âç¨å¿åâä¸æ¬¡ï¼å³å¯åºç¨å°å¾å¤ç³»ç»ä¸ãå æ¤ï¼ä¹æ以è¦ä½¿ç¨Shellèæ¬æ¯åºäºï¼
â¢ç®åæ§ï¼Shellæ¯ä¸ä¸ªé«çº§è¯è¨ï¼éè¿å®ï¼ä½ å¯ä»¥ç®æ´å°è¡¨è¾¾å¤æçæä½ã
â¢å¯ç§»æ¤æ§ï¼ä½¿ç¨POSIXæå®ä¹çåè½ï¼å¯ä»¥åå°èæ¬æ 须修æ¹å°±å¯å¨ä¸åçç³»ç»ä¸æ§è¡ã
â¢å¼å容æï¼å¯ä»¥å¨çæ¶é´å å®æä¸ä¸ªåè½å¼ºå¤§å妤ç¨çèæ¬ã
ä½æ¯ï¼èèå°Shellèæ¬çå½ä»¤éå¶åæçé®é¢ï¼ä¸åæ åµä¸è¬ä¸ä½¿ç¨Shellï¼
1.èµæºå¯éåçä»»å¡ï¼å°¤å ¶å¨éè¦èèæçæ¶ï¼æ¯å¦ï¼æåºï¼hashççï¼ã
2.éè¦å¤ç大任å¡çæ°å¦æä½ï¼å°¤å ¶æ¯æµ®ç¹è¿ç®ï¼ç²¾ç¡®è¿ç®ï¼æè å¤æçç®æ¯è¿ç®ï¼è¿ç§æ åµä¸è¬ä½¿ç¨C++æFORTRAN æ¥å¤çï¼ã
3.æ跨平å°ï¼æä½ç³»ç»ï¼ç§»æ¤éæ±ï¼ä¸è¬ä½¿ç¨C æJavaï¼ã
4.å¤æçåºç¨ï¼å¨å¿ 须使ç¨ç»æåç¼ç¨çæ¶åï¼éè¦åéçç±»åæ£æ¥ï¼å½æ°ååï¼ççï¼ã
5.对äºå½±åç³»ç»å ¨å±æ§çå ³é®ä»»å¡åºç¨ã
6.对äºå®å ¨æå¾é«è¦æ±çä»»å¡ï¼æ¯å¦ä½ éè¦ä¸ä¸ªå¥å£®çç³»ç»æ¥é²æ¢å ¥ä¾µãç ´è§£ãæ¶æç ´åççã
7.项ç®ç±è¿ä¸²çä¾èµçå个é¨åç»æã
8.éè¦å¤§è§æ¨¡çæ件æä½ã
9.éè¦å¤ç»´æ°ç»çæ¯æã
10.éè¦æ°æ®ç»æçæ¯æï¼æ¯å¦é¾è¡¨ææ°çæ°æ®ç»æã
11.éè¦äº§çææä½å¾å½¢åçé¢ GUIã
12.éè¦ç´æ¥æä½ç³»ç»ç¡¬ä»¶ã
13.éè¦ I/O æsocket æ¥å£ã
14.éè¦ä½¿ç¨åºæè éçä¸æ¥çè代ç çæ¥å£ã
15.ç§äººçãéæºçåºç¨ï¼shell èæ¬æ代ç å°±æ¾å¨ææ¬æ件ä¸ï¼å ¨ä¸çé½è½çå°ï¼ã
å¦æä½ çåºç¨ç¬¦åä¸è¾¹çä»»æä¸æ¡ï¼é£ä¹å°±èèä¸ä¸æ´å¼ºå¤§çè¯è¨å§ââæ许æ¯PerlãTclãPythonãRubyââæè æ¯æ´é«å±æ¬¡çç¼è¯è¯è¨æ¯å¦C/C++ï¼æè æ¯Javaãå³ä½¿å¦æ¤ï¼ä½ ä¼åç°ï¼ä½¿ç¨shellæ¥ååå¼åä½ çåºç¨ï¼å¨å¼åæ¥éª¤ä¸ä¹æ¯é常æç¨çã
第ä¸ä¸ªShellèæ¬
æå¼ææ¬ç¼è¾å¨ï¼æ°å»ºä¸ä¸ªæ件ï¼æ©å±å为shï¼sh代表shellï¼ï¼æ©å±å并ä¸å½±åèæ¬æ§è¡ï¼è§åç¥æ就好ï¼å¦æä½ ç¨phpåshell èæ¬ï¼æ©å±åå°±ç¨php好äºã
è¾å ¥ä¸äºä»£ç ï¼
å¤å¶ä»£ç 代ç å¦ä¸:
#!/bin/bash
echo "Hello World !"
Â
â#!â æ¯ä¸ä¸ªçº¦å®çæ è®°ï¼å®åè¯ç³»ç»è¿ä¸ªèæ¬éè¦ä»ä¹è§£éå¨æ¥æ§è¡ï¼å³ä½¿ç¨åªä¸ç§Shellãechoå½ä»¤ç¨äºåçªå£è¾åºææ¬ã
è¿è¡Shellèæ¬æ两ç§æ¹æ³ã
ä½ä¸ºå¯æ§è¡ç¨åº
å°ä¸é¢ç代ç ä¿å为test.shï¼å¹¶cdå°ç¸åºç®å½ï¼
å¤å¶ä»£ç 代ç å¦ä¸:
chmod +x ./test.sh #使èæ¬å ·ææ§è¡æé
./test.sh #æ§è¡èæ¬
Â
注æï¼ä¸å®è¦åæ./test.shï¼èä¸æ¯test.shãè¿è¡å ¶å®äºè¿å¶çç¨åºä¹ä¸æ ·ï¼ç´æ¥åtest.shï¼linuxç³»ç»ä¼å»PATHé寻æ¾æ没æå«test.shçï¼èåªæ/bin, /sbin, /usr/binï¼/usr/sbinçå¨PATHéï¼ä½ çå½åç®å½é常ä¸å¨PATHéï¼æ以åætest.shæ¯ä¼æ¾ä¸å°å½ä»¤çï¼è¦ç¨./test.shåè¯ç³»ç»è¯´ï¼å°±å¨å½åç®å½æ¾ã
éè¿è¿ç§æ¹å¼è¿è¡bashèæ¬ï¼ç¬¬ä¸è¡ä¸å®è¦å对ï¼å¥½è®©ç³»ç»æ¥æ¾å°æ£ç¡®ç解éå¨ã
è¿éç"ç³»ç»"ï¼å ¶å®å°±æ¯shellè¿ä¸ªåºç¨ç¨åºï¼æ³è±¡ä¸ä¸Windows Explorerï¼ï¼ä½ææ æåæç³»ç»ï¼æ¯æ¹ä¾¿ç解ï¼æ¢ç¶è¿ä¸ªç³»ç»å°±æ¯æshellï¼é£ä¹ä¸ä¸ªä½¿ç¨/bin/shä½ä¸ºè§£éå¨çèæ¬æ¯ä¸æ¯å¯ä»¥çå»ç¬¬ä¸è¡å¢ï¼æ¯çã
ä½ä¸ºè§£éå¨åæ°
è¿ç§è¿è¡æ¹å¼æ¯ï¼ç´æ¥è¿è¡è§£éå¨ï¼å ¶åæ°å°±æ¯shellèæ¬çæ件åï¼å¦ï¼
å¤å¶ä»£ç 代ç å¦ä¸:
/bin/sh test.sh
/bin/php test.php
Â
è¿ç§æ¹å¼è¿è¡çèæ¬ï¼ä¸éè¦å¨ç¬¬ä¸è¡æå®è§£éå¨ä¿¡æ¯ï¼åäºä¹æ²¡ç¨ã
Â
zookeeperæ¥å®æåå¸å¼éçåè½ï¼å ¶å®æ¬è´¨ä¸æ¯ä¸ä¸»ä»åæ¢çå®ç°ä»£ç æ¯é常类似çï¼ä½æ¯åè½ä¸å¼ºè°çéç¹ä¸ä¸æ ·ã
è³äºï¼ä¸ºä»ä¹éè¦åå¸å¼éï¼å ¬å¹³éï¼ï¼ä¸ºä»ä¹ä¸ä½¿ç¨JAVA èªå¸¦çéçåºç¨ï¼
1ï¼ä¸ºä»ä¹éè¦åå¸å¼éï¼ å 为å¨åå¸å¼ç¯å¢ä¸ï¼å¯è½ä¼åºç°ä¸äºäºå¡ï¼è¿æ¶åæ们é¤äºå¯ä»¥å¨åå¨å±çæ°æ®åºè¿è¡æ§å¶ï¼ä¹å¯ä»¥å¨åºç¨å±æ§å¶ï¼ä¸¾ä¸ªä¾åæ¥è®²ï¼ä¸å½çé£æºè·¯çº¿ï¼æ们é½ç¥éä»»ä½æ¶åï¼é½åªè½ç±ä¸æ¶é£æºéè¿ï¼èè¿ä¸ªæ§å¶è¿ä¸ªç±è°éè¿ï¼ä»ä¹æ¶åéè¿ï¼æ¯ç±ä¸ä¸ªä¿¡å·æ§å¶å°æ¥å³å®çï¼åå¸å¼çç¯å¢ä¸ç±äºèç¹åæ£å¨å个å°æ¹ï¼å个åºåï¼æ以æ§å¶èµ·æ¥æ¯è¾éº»ç¦ï¼è¿æ¶åæ们就å¯ä»¥ä½¿ç¨zookeeperæ¥è½»æ¾çå®æï¼åå¸å¼éçåè½ã
2ï¼ä¸ºä»ä¹ä¸ä½¿ç¨JAVAèªå¸¦çéï¼JAVA JDKæä¾äºå ¬å¹³éï¼ä¸éå ¬å¹³éï¼ä½è¿ç§å®ç°æ¯åºäºåä¸ä¸ªJVMæ¥è¯´çï¼å¦æåä¸å°æºå¨ä¸ï¼ä¸åçJVMï¼åå¯ä»¥ä½¿ç¨æ件éï¼æ¥å®ç°ï¼ä½æ¯è¿äºå¹¶ä¸æ¯åå¸å¼ç模å¼ï¼è½ç¶å¯ä»¥éè¿RMIçæ¹å¼æ¥å®ç°ï¼ä½æ¯è¾ç¹çã
Â
Â
使ç¨zookeeperæ¥å®æåå¸å¼éçæ¥éª¤å¦ä¸ï¼
åºå· | å 容 | 1 | å建ä¸ä¸ªæä¹ znode | 2 | å¤ä¸ªç¨åºå¹¶åçå»zkæå¡ä¸ï¼å建ä¸ä¸ªçæææ¶åºæ§çèç¹è·¯å¾ã | 3 | å个èç¹çå¬ï¼æ¯å®å°çéé¢ï¼æ大çèç¹çå¨æã | 4 | å¦æåç°ï¼æ¯å®å°çéé¢ï¼æ大çèç¹åçééæ¾æéåºï¼å°±èªå¨æ¥æ¿ä¸ºç¬å é | 5 | 没åçæ¹åçèç¹ï¼ç»§ç»éå¤æ¥éª¤ï¼2,3,4 |
ææå¾å¦ä¸æ示ï¼
Â
Â
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauMGN1YjZ1EGZ4E2Nk1SMzATOtE2N2MTLyQDM20SZxE2Y3gTOj9CX0IDO48CXxkDMw8CX05WZth2YhRHdh9CXkF2bsBXdvwVbvNmLllXZ0lmLywGZvw1LcpDc0RHaiojIsJye.jpg)
注æä¸å¾ä¸çmasteræçå°±æ¯ï¼è·åéçå®ä¾ï¼è¿å ¶å®è·é群ç¯å¢éåªè½æä¸ä¸ªmasterçéçä¸æ ·ã
代ç å¦ä¸ï¼
Java代ç
Â
- package com.test; Â
- Â Â
- import java.nio.charset.Charset; Â
- import java.nio.charset.StandardCharsets; Â
- import java.text.SimpleDateFormat; Â
- import java.util.Collections; Â
- import java.util.Date; Â
- import java.util.List; Â
- import java.util.concurrent.CountDownLatch; Â
- Â Â
- import org.apache.zookeeper.CreateMode; Â
- import org.apache.zookeeper.WatchedEvent; Â
- import org.apache.zookeeper.Watcher; Â
- import org.apache.zookeeper.ZooDefs.Ids; Â
- import org.apache.zookeeper.ZooKeeper; Â
- import org.apache.zookeeper.Watcher.Event.KeeperState; Â
- import org.apache.zookeeper.data.Stat; Â
- Â Â
- public class Lock1  implements Watcher { Â
- Â Â Â Â Â Â
- Â Â Â Â Â Â
- Â Â Â Â Â Â
-     private ZooKeeper zk; Â
- Â Â Â Â Â Â
- Â Â Â Â Â Â
-     private CountDownLatch down=new CountDownLatch(1); Â
- Â Â Â Â Â Â
-     public Lock1() { Â
-         // TODO Auto-generated constructor stub Â
- Â Â Â Â }Â Â
- Â Â Â Â Â Â
- Â Â Â Â Â Â
- Â Â Â Â Â Â
-     public Lock1(String host)throws Exception { Â
-          this.zk=new ZooKeeper(host, 5000   , new Watcher() { Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â
-             @Override Â
-             public void process(WatchedEvent event) { Â
-                 // TODO Auto-generated method stub Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if(event.getState()==KeeperState.SyncConnected){Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â down.countDown();Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â });Â Â
- Â Â Â Â }Â Â
- Â Â Â Â Â Â
-      private static final Charset CHARSET=StandardCharsets.UTF_8; Â
- Â Â Â Â Â Â
-         public void write(String path,String value)throws Exception{ Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â
-             Stat stat=zk.exists(path, false); Â
- Â Â Â Â Â Â Â Â Â Â Â Â if(stat==null){Â Â
-                 zk.create(path, value.getBytes(CHARSET), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); Â
- Â Â Â Â Â Â Â Â Â Â Â Â }else{Â Â
-                 zk.setData(path, value.getBytes(CHARSET), -1); Â
- Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â
-          public void check()throws Exception{ Â
-              List<String> list=zk.getChildren("/a", null); Â
-               Collections.sort(list);//æåºä½¿å¾èç¹æ次åºÂ Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â if(list.isEmpty()){Â Â
-                   System.out.println("æ¤ç¶è·¯å¾ä¸é¢æ²¡æèç¹,åå¸å¼éä»»å¡å®ææè¿æ²¡å¯å¨ï¼"); Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â }else{Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
-                   String start=list.get(0);//è·å第ä¸ä¸ªèç¹Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
-                   String data=new String(zk.getData("/a/"+start, false,null)); Â
-                   if(data.equals("a")){//çäºæ¬èº«å°±å¯å¨ä½ä¸ºMaster Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if(list.size()==1){Â Â
-                           startMaster();//ä½ä¸ºMasterå¯å¨Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }else{Â Â
-                               automicSwitch();//对äºé第ä¸ä¸ªå¯å¨çèç¹ï¼ä¼è°ç¨æ¤æ¹æ³ï¼å 为ä»ç第ä¸ä¸ªæäºÂ Â
-                               //æéæ¾éäºï¼æ以å®æ¯æ¢å ç Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }else{Â Â
-                       //éå½åèç¹ï¼å°±æå°å½åèç¹ï¼çæ§çèç¹Â Â
-                       for(int i=0;i<list.size();i++){ Â
-                           //è·åé£ä¸ªèç¹åçæ¤å®¢æ·ç«¯ç模æIP Â
-                           String temp=new String(zk.getData("/a/"+list.get(i), false, null)); Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if(temp.equals("a")){Â Â
-                               //å 为åé¢ä½ä¸ºé¦ä½å¤æï¼æ以è¿ä¸ªåºç°çä½ç½®ä¸å¯è½æ¯é¦ä½Â Â
-                               //éè¦çå¬å°èç¹éé¢çæ大çä¸ä¸ªèç¹Â Â
-                               String watchPath=list.get(i-1); Â
-                               System.out.println("Lock1çå¬çæ¯:  "+watchPath); Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
-                               zk.exists("/a/"+watchPath, this);//çå¬æ¤èç¹ç详ç»æ åµï¼å¦æåçèç¹æ³¨éäºä»¶Â Â
-                               //åä¼è§¦åèªèº«çprocessæ¹æ³Â Â
-                               break;//ç»æ循ç¯Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â
- Â Â
-     @Override Â
-     public void process(WatchedEvent event) { Â
-         // TODO Auto-generated method stub Â
- Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â if(event.getType()==Event.EventType.NodeDeleted){Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â
-             //å¦æåç°ï¼çå¬çèç¹ï¼ææäºï¼é£ä¹å°±éæ°ï¼è¿è¡çå¬Â  Â
- Â Â Â Â Â Â Â Â Â Â Â Â try{Â Â
-            System.out.println("注ææééåºæéæ¾ï¼å ¬å¹³éå¼å§æ¢å ........"); Â
- Â Â Â Â Â Â Â Â Â Â Â Â check();Â Â
-             }catch(Exception e){ Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â e.printStackTrace();Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â Â }Â Â
- Â Â Â Â }Â Â
- Â Â Â Â Â Â
-      public String read(String path,Watcher watch)throws Exception{ Â
- Â Â Â Â Â Â Â Â Â Â Â
-          byte[] data=zk.getData(path, watch, null); Â
- Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â
-          return new String(data,CHARSET); Â
- Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â
-      SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Â
- Â Â
- Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â
-      public void close()throws Exception{ Â
- Â Â Â Â Â Â Â Â Â zk.close();Â Â
- Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â
-      public void automicSwitch()throws Exception{ Â
- Â Â Â Â Â Â Â Â Â Â Â
-         // System.out.println("æèç¹éæ¾éï¼Lock1éå å ¥.......,  æ¶é´Â  "+f.format(new Date())); Â
-          System.out.println("Lock1çä¸çº§éèç¹éåºæéæ¾éäºï¼Lock1éå å ¥.......,  æ¶é´Â  "+f.format(new Date())); Â
- Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â
-      public void createPersist()throws Exception{ Â
- Â Â Â Â Â Â Â Â Â Â Â
-          zk.create("/a", "主èç¹".getBytes(), Ids.OPEN_ACL_UNSAFE  , CreateMode.PERSISTENT); Â
- Â Â Â Â Â Â Â Â Â Â Â
-          System.out.println("å建主èç¹æå........"); Â
- Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â
-      public void createTemp()throws Exception{ Â
- Â Â Â Â Â Â Â Â Â Â Â
-          zk.create("/a/b", "a".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); Â
- Â Â Â Â Â Â Â Â Â Â Â
-       System.out.println("Lock1注åéæåï¼è¿å ¥å ¬å¹³éå...........");     Â
- Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â
-     public static void main(String[] args)throws Exception { Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â
-             //Slave s=new Slave("192.168.120.128:2181"); Â
-             Lock1 lock=new Lock1("192.168.120.128:2181"); Â
-             //  lock.createPersist();//å建主èç¹Â Â
-              lock.createTemp();//注å临æ¶æåºèç¹Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â lock.check();Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Thread.sleep(Long.MAX_VALUE);Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â //lock.close();Â Â
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â
- Â Â Â Â }Â Â
- Â Â Â Â Â Â Â
- Â Â Â Â Â Â Â
-      public void startMaster(){ Â
- Â Â Â Â Â Â Â Â Â Â Â
-          System.out.println("Lock1èç¹è·åéäºï¼å ¶ä»èç¹çå¾ ........"); Â
- Â Â Â Â Â }Â Â
- Â Â Â Â Â Â Â
- }Â Â
package com.test;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
/***
* åºäºzookeeperå®ç°ç
* åå¸å¼å
¬å¹³é
*
* @author qin dong liang
* QQææ¯ç¾¤äº¤æµï¼324714439
*
* */
public class Lock1 implements Watcher {
/**
* ZKå®ä¾
* */
private ZooKeeper zk;
/**åå计æ°éï¼é²æ¢å¨zk没æè¿ä¸åï¼æ§è¡CURDæä½*/
private CountDownLatch down=new CountDownLatch(1);
public Lock1() {
// TODO Auto-generated constructor stub
}
public Lock1(String host)throws Exception {
this.zk=new ZooKeeper(host, 5000 , new Watcher() {
@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
/**é¾æ¥ä¸zkæå¡ï¼å²å¯åæ¶é»å¡è®¡æ°**/
if(event.getState()==KeeperState.SyncConnected){
down.countDown();
}
}
});
}
/**
* å符ç¼ç
*
* **/
private static final Charset CHARSET=StandardCharsets.UTF_8;
/***
*
* æ¤æ¹æ³æ¯åå
¥æ°æ®
* å¦æä¸åå¨æ¤èç¹
* å°±ä¼æ°å»ºï¼å·²åå¨å°±æ¯
* æ´æ°
*
* **/
public void write(String path,String value)throws Exception{
Stat stat=zk.exists(path, false);
if(stat==null){
zk.create(path, value.getBytes(CHARSET), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}else{
zk.setData(path, value.getBytes(CHARSET), -1);
}
}
/**
*
* åæ¢é
*
* **/
public void check()throws Exception{
List<String> list=zk.getChildren("/a", null);
Collections.sort(list);//æåºä½¿å¾èç¹æ次åº
if(list.isEmpty()){
System.out.println("æ¤ç¶è·¯å¾ä¸é¢æ²¡æèç¹,åå¸å¼éä»»å¡å®ææè¿æ²¡å¯å¨ï¼");
}else{
String start=list.get(0);//è·å第ä¸ä¸ªèç¹
String data=new String(zk.getData("/a/"+start, false,null));
if(data.equals("a")){//çäºæ¬èº«å°±å¯å¨ä½ä¸ºMaster
if(list.size()==1){
startMaster();//ä½ä¸ºMasterå¯å¨
}else{
automicSwitch();//对äºé第ä¸ä¸ªå¯å¨çèç¹ï¼ä¼è°ç¨æ¤æ¹æ³ï¼å 为ä»ç第ä¸ä¸ªæäº
//æéæ¾éäºï¼æ以å®æ¯æ¢å ç
}
}else{
//éå½åèç¹ï¼å°±æå°å½åèç¹ï¼çæ§çèç¹
for(int i=0;i<list.size();i++){
//è·åé£ä¸ªèç¹åçæ¤å®¢æ·ç«¯ç模æIP
String temp=new String(zk.getData("/a/"+list.get(i), false, null));
if(temp.equals("a")){
//å 为åé¢ä½ä¸ºé¦ä½å¤æï¼æ以è¿ä¸ªåºç°çä½ç½®ä¸å¯è½æ¯é¦ä½
//éè¦çå¬å°èç¹éé¢çæ大çä¸ä¸ªèç¹
String watchPath=list.get(i-1);
System.out.println("Lock1çå¬çæ¯: "+watchPath);
zk.exists("/a/"+watchPath, this);//çå¬æ¤èç¹ç详ç»æ
åµï¼å¦æåçèç¹æ³¨éäºä»¶
//åä¼è§¦åèªèº«çprocessæ¹æ³
break;//ç»æ循ç¯
}
}
}
}
}
@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
if(event.getType()==Event.EventType.NodeDeleted){
//å¦æåç°ï¼çå¬çèç¹ï¼ææäºï¼é£ä¹å°±éæ°ï¼è¿è¡çå¬
try{
System.out.println("注ææééåºæéæ¾ï¼å
¬å¹³éå¼å§æ¢å ........");
check();
}catch(Exception e){
e.printStackTrace();
}
}
}
/**
*
* 读åæ°æ®ï¼ç»å®ä¸ä¸ªè·¯å¾å
* çå¬äºä»¶
*
* ***/
public String read(String path,Watcher watch)throws Exception{
byte[] data=zk.getData(path, watch, null);
return new String(data,CHARSET);
}
SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* å
³ézkè¿æ¥
*
* **/
public void close()throws Exception{
zk.close();
}
/**
* éæ¾é
* @throws Exception
*/
public void automicSwitch()throws Exception{
// System.out.println("æèç¹éæ¾éï¼Lock1éå å
¥......., æ¶é´ "+f.format(new Date()));
System.out.println("Lock1çä¸çº§éèç¹éåºæéæ¾éäºï¼Lock1éå å
¥......., æ¶é´ "+f.format(new Date()));
}
/**
* å建ä¸ä¸ªæä¹
nodeï¼
*
* **/
public void createPersist()throws Exception{
zk.create("/a", "主èç¹".getBytes(), Ids.OPEN_ACL_UNSAFE , CreateMode.PERSISTENT);
System.out.println("å建主èç¹æå........");
}
/***
* å建énodeï¼æ³¨ææ¯æ¢å ç
*
*
* */
public void createTemp()throws Exception{
zk.create("/a/b", "a".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("Lock1注åéæåï¼è¿å
¥å
¬å¹³éå...........");
}
public static void main(String[] args)throws Exception {
//Slave s=new Slave("192.168.120.128:2181");
Lock1 lock=new Lock1("192.168.120.128:2181");
// lock.createPersist();//å建主èç¹
lock.createTemp();//注å临æ¶æåºèç¹
lock.check();
Thread.sleep(Long.MAX_VALUE);
//lock.close();
}
/***
* è·åéæå
*
* */
public void startMaster(){
System.out.println("Lock1èç¹è·åéäºï¼å
¶ä»èç¹çå¾
........");
}
}
代ç å¦ä¸ï¼æ示ï¼æµè¯çæ¶åï¼éè¦æ建ä¸ä¸ª3个èç¹çzookeeperé群ï¼å ³äºæä¹æ建zookeeperé群ï¼æ£ä»åé¢çæç« éæä»ç»ï¼éè¦æ³¨æçæ¯myidæ件ä¸è¦æ¼æã
ä¸é¢è¿ä¸ªç±»ï¼éè¦æ·è´å¤ä»½ï¼å¹¶æ¹åéé¢çèç¹çå¼ï¼æ¾å¨ä¸åçeclipseä¸ï¼è¿è¡æ¨¡ææµè¯ã