Zookeeper環境搭建


  zookeeper支持windows、linux、mac等操作系統,其搭建方式也有集群、偽集群、單機環境。下面研究三種方式的搭建。

  單機環境:windows操作系統

  偽集群:windows

  集群:linux

1.單機環境

  下面在windows下面搭建zookeeper的單機環境。windows下面也適合做開發。但是不適合生產環境的部署安裝。

1.Java安裝

  這個就不說了,zookeeper依賴於Java環境,所以先自行安裝JDK。

2.zookeeper下載以及安裝

(1)下載zookeeperxxx.tar.gz

  下載地址:http://zookeeper.apache.org/releases.html  下載xxx.tar.gz解壓即可,里面有sh腳本,也有cmd腳本。

    

 

(2)解壓上面下載的文件

(3)在conf目錄下面創建zoo.cfg (在conf目錄下面提供了一分樣本文件zoo_sample.cfg),或者復制一分樣本文件改名為zoo.cfg

tickTime = 2000
dataDir = E:/zookeeper/zookeeper-3.4.13/data
clientPort = 2181
initLimit = 5
syncLimit = 2

解釋:

  tickTime:這個時間是作為 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
  dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日志文件也保存在這個目錄里。
  dataLogDir:log目錄, 同樣可以是任意目錄. 如果沒有設置該參數, 將使用和dataDir相同的設置.
  clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。

  我在自己設置的時候同事配置dataDir和dataLogDir反而啟動報錯,所以我只設置了dataDir

(4)在對應目錄建立上面的data目錄即可

 (5)啟動zookeeper

E:\zookeeper\zookeeper-3.4.13\bin> .\zkServer.cmd

E:\zookeeper\zookeeper-3.4.13\bin>call "C:\Program Files\Java\jdk1.8.0_121"\bin\java "-Dzookeeper.log.dir=E:\zookeeper\zookeeper-3.4.13\bin\.." "-Dzookeeper.root.logger=INFO,CONSOLE" -cp "E:\zookeeper\zookeeper-3.4.13\bin\..\build\classes;E:\zookeeper\zookeeper-3.4.13\bin\..\build\lib\*;E:\zookeeper\zookeeper-3.4.13\bin\..\*;E:\zookeeper\zookeeper-3.4.13\bin\..\lib\*;E:\zookeeper\zookeeper-3.4.13\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain "E:\zookeeper\zookeeper-3.4.13\bin\..\conf\zoo.cfg"
2019-03-07 18:14:37,163 [myid:] - INFO  [main:QuorumPeerConfig@136] - Reading configuration from: E:\zookeeper\zookeeper-3.4.13\bin\..\conf\zoo.cfg
2019-03-07 18:14:37,170 [myid:] - INFO  [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2019-03-07 18:14:37,171 [myid:] - INFO  [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2019-03-07 18:14:37,171 [myid:] - INFO  [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2019-03-07 18:14:37,173 [myid:] - WARN  [main:QuorumPeerMain@116] - Either no config or no quorum defined in config, running  in standalone mode
2019-03-07 18:14:37,229 [myid:] - INFO  [main:QuorumPeerConfig@136] - Reading configuration from: E:\zookeeper\zookeeper-3.4.13\bin\..\conf\zoo.cfg
2019-03-07 18:14:37,230 [myid:] - INFO  [main:ZooKeeperServerMain@98] - Starting server
2019-03-07 18:14:37,271 [myid:] - INFO  [main:Environment@100] - Server environment:zookeeper.version=3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
2019-03-07 18:14:37,271 [myid:] - INFO  [main:Environment@100] - Server environment:host.name=MicroWin10-1535
2019-03-07 18:14:37,272 [myid:] - INFO  [main:Environment@100] - Server environment:java.version=1.8.0_121
2019-03-07 18:14:37,272 [myid:] - INFO  [main:Environment@100] - Server environment:java.vendor=Oracle Corporation
2019-03-07 18:14:37,272 [myid:] - INFO  [main:Environment@100] - Server environment:java.home=C:\Program Files\Java\jdk1.8.0_121\jre
2019-03-07 18:14:37,273 [myid:] - INFO  [main:Environment@100] - Server environment:java.class.path=E:\zookeeper\zookeeper-3.4.13\bin\..\build\classes;E:\zookeeper\zookeeper-3.4.13\bin\..\build\lib\*;E:\zookeeper\zookeeper-3.4.13\bin\..\zookeeper-3.4.13.jar;E:\zookeeper\zookeeper-3.4.13\bin\..\lib\audience-annotations-0.5.0.jar;E:\zookeeper\zookeeper-3.4.13\bin\..\lib\jline-0.9.94.jar;E:\zookeeper\zookeeper-3.4.13\bin\..\lib\log4j-1.2.17.jar;E:\zookeeper\zookeeper-3.4.13\bin\..\lib\netty-3.10.6.Final.jar;E:\zookeeper\zookeeper-3.4.13\bin\..\lib\slf4j-api-1.7.25.jar;E:\zookeeper\zookeeper-3.4.13\bin\..\lib\slf4j-log4j12-1.7.25.jar;E:\zookeeper\zookeeper-3.4.13\bin\..\conf
2019-03-07 18:14:37,274 [myid:] - INFO  [main:Environment@100] - Server environment:java.library.path=C:\Program Files\Java\jdk1.8.0_121\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;E:\Anaconda3\exe;E:\Anaconda3\exe\Library\mingw-w64\bin;E:\Anaconda3\exe\Library\usr\bin;E:\Anaconda3\exe\Library\bin;E:\Anaconda3\exe\Scripts;E:\ImageMagick-7.0.8-Q16;C:\oraclexe\app\oracle\product\11.2.0\server\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;E:\soft\apache-maven-3.5.3\bin;C:\WINDOWS\System32\OpenSSH\;E:\git\Git\cmd;E:\SVN\bin;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\110\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\;C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;E:\soft\maven\apache-maven-3.3.9\bin;C:\Program Files\MySQL\MySQL Server 5.7\bin;C:\Program Files\Java\jdk1.8.0_121\bin;E:\git\Git\bin;E:\git\Git\usr\bin;E:\git\Git;C:\Program Files\Java\jdk1.8.0_121\jre\bin;D:\zdcontomcat\zdc8\lo\program;E:\tesseract4\Tesseract-OCR;E:\redis\redis-win;;.
2019-03-07 18:14:37,276 [myid:] - INFO  [main:Environment@100] - Server environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
2019-03-07 18:14:37,276 [myid:] - INFO  [main:Environment@100] - Server environment:java.compiler=<NA>
2019-03-07 18:14:37,277 [myid:] - INFO  [main:Environment@100] - Server environment:os.name=Windows 10
2019-03-07 18:14:37,278 [myid:] - INFO  [main:Environment@100] - Server environment:os.arch=amd64
2019-03-07 18:14:37,279 [myid:] - INFO  [main:Environment@100] - Server environment:os.version=10.0
2019-03-07 18:14:37,285 [myid:] - INFO  [main:Environment@100] - Server environment:user.name=Administrator
2019-03-07 18:14:37,287 [myid:] - INFO  [main:Environment@100] - Server environment:user.home=C:\Users\Administrator
2019-03-07 18:14:37,289 [myid:] - INFO  [main:Environment@100] - Server environment:user.dir=E:\zookeeper\zookeeper-3.4.13\bin
2019-03-07 18:14:37,296 [myid:] - INFO  [main:ZooKeeperServer@836] - tickTime set to 2000
2019-03-07 18:14:37,297 [myid:] - INFO  [main:ZooKeeperServer@845] - minSessionTimeout set to -1
2019-03-07 18:14:37,302 [myid:] - INFO  [main:ZooKeeperServer@854] - maxSessionTimeout set to -1
2019-03-07 18:14:37,585 [myid:] - INFO  [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2019-03-07 18:14:37,588 [myid:] - INFO  [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181

 3.測試

(1)用netstat或者jps查看都可以

C:\Users\Administrator>netstat -ano|findstr 2181
  TCP    0.0.0.0:2181           0.0.0.0:0              LISTENING       15532
  TCP    [::]:2181              [::]:0                 LISTENING       15532

C:\Users\Administrator>jps -l
19320 sun.tools.jps.Jps
15532 org.apache.zookeeper.server.quorum.QuorumPeerMain
4780

 

(2)zkCli.cmd連接進行測試:

PS E:\zookeeper\zookeeper-3.4.13\bin> .\zkCli.cmd
Connecting to localhost:2181
.........
[zk: localhost:2181(CONNECTING) 0] 2019-03-07 18:23:07,894 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1303] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x10035685eb40002, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0]

 

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
        stat path [watch]
        set path data [version]
        ls path [watch]
        delquota [-n|-b] path
        ls2 path [watch]
        setAcl path acl
        setquota -n|-b val path
        history
        redo cmdno
        printwatches on|off
        delete path [version]
        sync path
        listquota path
        rmr path
        get path [watch]
        create [-s] [-e] path data acl
        addauth scheme auth
        quit
        getAcl path
        close
        connect host:port
[zk: localhost:2181(CONNECTED) 1] quit
Quitting...
2019-03-07 18:24:38,781 [myid:] - INFO  [main:ZooKeeper@693] - Session: 0x10035685eb40002 closed
2019-03-07 18:24:38,783 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@522] - EventThread shut down for session: 0x10035685eb40002
PS E:\zookeeper\zookeeper-3.4.13\bin>

 

2.偽集群安裝-windows安裝

  偽集群,就是一台機器開啟多個端口然后進行集群配置,最常用的學習方式。。。這個集群有點類似於ActiveMQ的偽集群。

1.將E:\zookeeper\zookeeper-3.4.13\conf\zoo.cfg復制出三分,分別命名為zoo1.cfg,zoo2.cfg,zoo3.cfg

對應內容:

zoo1.cfg

tickTime = 2000
dataDir = E:/zookeeper/zookeeper-3.4.13/data1
clientPort = 2181
initLimit = 5
syncLimit = 2

server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

 

zoo2.cfg

tickTime = 2000
dataDir = E:/zookeeper/zookeeper-3.4.13/data2
clientPort = 2182
initLimit = 5
syncLimit = 2

server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

 

zoo3.cfg

tickTime = 2000
dataDir = E:/zookeeper/zookeeper-3.4.13/data3
clientPort = 2183
initLimit = 5
syncLimit = 2

server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

解釋:    server.{num}=ip/domain:Port1:Port2

  num:表示數字表示第幾號服務器;

  ip/domain :是服務器域名或者ip地址。

   Port1:表示這個服務器和集群中的Leader服務器交換信息的端口;

   Port2:表示萬一集群中的Leader服務器掛了,需要一個端口重新進行選舉,選出一個新的Leader,這個端口就是用來執行選舉時服務器相互通信的端口。

        由於我們是偽集群,所以ip或者域名是一樣的,所以要分配不同的端口號

2.創建對應的目錄

 

3.進入E:\zookeeper\zookeeper-3.4.13\bin下復制文件zkServer.cmd為zkServer-1.cmd,zkServer-2.cmd,zkServer-3.cmd

zkServer-1.cmd內容修改為如下:

@echo off

setlocal
call "%~dp0zkEnv.cmd"

set ZOOCFG=E:/zookeeper/zookeeper-3.4.13/conf/zoo1.cfg
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
echo on
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal

 

 zkServer-2.cmd內容修改為如下:

@echo off

setlocal
call "%~dp0zkEnv.cmd"

set ZOOCFG=E:/zookeeper/zookeeper-3.4.13/conf/zoo2.cfg
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
echo on
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal

 

 zkServer-3.cmd內容修改為如下:

@echo off

setlocal
call "%~dp0zkEnv.cmd"

set ZOOCFG=E:/zookeeper/zookeeper-3.4.13/conf/zoo3.cfg
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
echo on
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal

4.添加myid文件

  除了修改 zoo.cfg 配置文件,集群模式下還要配置一個標識自己身份也就是自己的ID值文件 myid,這個文件在zoo.cfg里dataDir指定的目錄下,這個文件里面就只有一個數字,這個數字和server.n的n保持一致,該值范圍可以是1-255之間,Zookeeper 啟動時會讀取這個文件,拿到里面的數據與 zoo.cfg 里面的配置信息比較從而判斷到底是那個 server。

$ pwd
/e/zookeeper/zookeeper-3.4.13/data1

Administrator@MicroWin10-1535 MINGW64 /e/zookeeper/zookeeper-3.4.13/data1
$ echo "1">myid

 

Administrator@MicroWin10-1535 MINGW64 /e/zookeeper/zookee                            per-3.4.13/data2
$ pwd
/e/zookeeper/zookeeper-3.4.13/data2

Administrator@MicroWin10-1535 MINGW64 /e/zookeeper/zookeeper-3.4.13/data2
$ echo "2">myid

 

Administrator@MicroWin10-1535 MINGW64 /e/zookeeper/zookeeper-3.4.13/data3
$ echo "3">myid

5.啟動即可

PS E:\zookeeper\zookeeper-3.4.13\bin> .\zkServer3.cmd

E:\zookeeper\zookeeper-3.4.13\bin>call "C:\Program Files\Java\jdk1.8.0_121"\bin\java "-Dzookeeper.log.dir=E:\zookeeper\zookeeper-3.4.13\bin\.." "-Dzookeeper.root.logger=INFO,CONSOLE" -cp "E:\zookeeper\zookeeper-3.4.13\bin\..\build\classes;E:\zookeeper\zookeeper-3.4.13\bin\..\build\lib\*;E:\zookeeper\zookeeper-3.4.13\bin\..\*;E:\zookeeper\zookeeper-3.4.13\bin\..\lib\*;E:\zookeeper\zookeeper-3.4.13\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain "E:/zookeeper/zookeeper-3.4.13/conf/zoo3.cfg"
。。。。。。
2019-03-07 19:03:31,939 [myid:3] - INFO  [QuorumPeer[myid=3]/0:0:0:0:0:0:0:0:2183:ZooKeeperServer@174] - Created server with tickTime 2000 minSessionTimeout 4000 maxSessionTimeout 40000 datadir E:\zookeeper\zookeeper-3.4.13\data3\version-2 snapdir E:\zookeeper\zookeeper-3.4.13\data3\version-2
2019-03-07 19:03:31,942 [myid:3] - INFO  [QuorumPeer[myid=3]/0:0:0:0:0:0:0:0:2183:Follower@65] - FOLLOWING - LEADER ELECTION TOOK - 112
2019-03-07 19:03:31,945 [myid:3] - INFO  [QuorumPeer[myid=3]/0:0:0:0:0:0:0:0:2183:QuorumPeer$QuorumServer@184] - Resolved hostname: localhost to address: localhost/127.0.0.1
2019-03-07 19:03:32,048 [myid:3] - INFO  [QuorumPeer[myid=3]/0:0:0:0:0:0:0:0:2183:Learner@336] - Getting a snapshot from leader 0x100000000
2019-03-07 19:03:32,056 [myid:3] - INFO  [QuorumPeer[myid=3]/0:0:0:0:0:0:0:0:2183:FileTxnSnapLog@301] - Snapshotting: 0x100000000 to E:\zookeeper\zookeeper-3.4.13\data3\version-2\snapshot.100000000
2019-03-07 19:03:47,177 [myid:3] - WARN  [QuorumPeer[myid=3]/0:0:0:0:0:0:0:0:2183:Follower@119] - Got zxid 0x100000001 expected 0x1
2019-03-07 19:03:47,180 [myid:3] - INFO  [SyncThread:3:FileTxnLog@213] - Creating new log file: log.100000001

 

  啟動前兩個服務器的時候報錯鏈接拒絕,因為在通過端口選舉leader的時候沒找到端口。在console也看到一些關於選舉leader等信息。

6.查看啟動狀態:

(1)jps查看

C:\Users\Administrator>jps
21984 QuorumPeerMain
1576 QuorumPeerMain
22280 QuorumPeerMain
11132 Jps
4780

(2)連接集群的1281節點並創建第一條數據從1282節點查看數據

 .\zkCli.cmd -server 127.0.0.1:2181

創建節點:

[zk: 127.0.0.1:2181(CONNECTED) 3] create /FirstZnode "Myfirstzookeeper-app"
Created /FirstZnode
[zk: 127.0.0.1:2181(CONNECTED) 4] ls
[zk: 127.0.0.1:2181(CONNECTED) 5] ls /
[zookeeper, FirstZnode]
[zk: 127.0.0.1:2181(CONNECTED) 6] get /FirstZnode
Myfirstzookeeper-app
cZxid = 0x100000003
ctime = Thu Mar 07 19:30:14 CST 2019
mZxid = 0x100000003
mtime = Thu Mar 07 19:30:14 CST 2019
pZxid = 0x100000003
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 20
numChildren = 0

  接下來鏈接到1282並繼續查看 節點信息同上證明集群搭建成功。

(3)linux下面有zkServer.sh status查看節點狀態,但是cmd腳本不支持傳入參數,這個在研究源碼之后編寫的bat腳本可以實現windows下面查看zookeeper集群節點狀態:

  通過研究sh的源碼發現其進行查詢狀態的時候是啟動的org.apache.zookeeper.client.FourLetterWordMain類,我們查看org.apache.zookeeper.client.FourLetterWordMain的main函數需要的參數如下:

    public static void main(String[] args)
            throws IOException
    {
        if (args.length != 3) {
            System.out.println("Usage: FourLetterWordMain <host> <port> <cmd>");
        } else {
            System.out.println(send4LetterWord(args[0], Integer.parseInt(args[1]), args[2]));
        }
    }

  所以我們自己寫java命令也可以查看狀態了。

 

於是自己編寫的查看1281端口的bat腳本如下:  主要做的就是   清空classpath的值。然后重新賦值classpath的值,賦值classpath是為了引入zookeeper依賴的jar包

status1281.bat (需要放置到E:\zookeeper\zookeeper-3.4.13,也就是放置到與zookeeperxxx.jar同級目錄)

e:
cd zookeeper\zookeeper-3.4.13
set classpath=
set classpath=./*;./lib/*;
java -cp zookeeper-3.4.13.jar -classpath %classpath% org.apache.zookeeper.client.FourLetterWordMain 127.0.0.1 2181 status
pause

結果:

 

我們修改上面bat里面的腳本查看2182和2183的狀態如下:

 

 

 

3.集群版

  這里研究正式linux環境集群,使用虛擬機進行配置。

  操作工具我們使用SecureCRT,方便同時向linux發送相同的命令。關於如何開啟發送相同命令如下:

一、首先在SecureCRT里同時打開多個服務器session
二、選擇菜單欄View -->Chat Windows  對號,此時所有服務器連接下方應該有個空白的部分
三、在空白的部分(Chat Windows)右鍵鼠標, 選上Send Chat to All Tabs, 這樣Chat Windows里會有"<Send chat to all tabs>"的標志

 0.當然首先在三個機器裝JDK環境

1.准備三台centos操作系統,ip分別為:

    192.168.1.130       我們為A機器

    192.168.1.131   我們為B機器

    192.168.1.133  我們稱為C機器

2.建立相同的目錄並上傳zookeeperxxx.tar.gz

3.解壓上面的目錄 (三個做相同操作)

4.復制conf\zoo_sample.cfg到con\zoo.cfg目錄下:

[root@localhost conf]# cp ./zoo_sample.cfg ./zoo.cfg
[root@localhost conf]# ls
configuration.xsl  log4j.properties  zoo.cfg  zoo_sample.cfg

5.修改 zoo.cfg

 A\B\C機器的內容都如下:

tickTime = 2000
dataDir = /opt/zookeeper/zookeeper-3.4.13/data
clientPort = 2181
initLimit = 5
syncLimit = 2

server.1=192.168.1.130:2888:3888
server.2=192.168.1.131:2888:3888
server.3=192.168.1.133:2888:3888

 

6.同時創建三個服務器對應的數據目錄

mkdir /opt/zookeeper/zookeeper-3.4.13/data

 

7.在三個機器的對應的data目錄下面分別創建對應的id文件(重要)

A機器:

[root@localhost data]# echo "1">myid
[root@localhost data]# cat myid
1

 

B機器:

[root@localhost data]# echo "2">myid
[root@localhost data]# cat myid
2

 

C機器:

[root@localhost data]# echo "3">myid
[root@localhost data]# cat myid
3

8.接下來啟動三個服務器即可(同時發送命令)

/opt/zookeeper/zookeeper-3.4.13/bin/zkServer.sh start

9.JPS查看JVM

  三個服務器都有主類為QuorumPeerMain的PID即啟動成功。

10查看集群狀態

/opt/zookeeper/zookeeper-3.4.13/bin/zkServer.sh status

A機器:

B機器:

C機器:

 

  A\B為follower,C為leader。

注意:

(1)在上面必須有設置myid那一步,之前我好像沒有那一步就啟動報錯

(2)我在上面查看的時候報錯沒有路由可以連接到主機,所以我猜想是防火牆的原因。我采用下面方式將三個主機的防火牆都關閉之后可以正常啟動且查看狀態。

service iptables stop

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM