-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
2478 lines (1212 loc) · 219 KB
/
index.html
File metadata and controls
2478 lines (1212 loc) · 219 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!doctype html>
<html class="theme-next muse use-motion" lang="zh-tw">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />
<link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />
<link href="/css/main.css?v=5.1.0" rel="stylesheet" type="text/css" />
<meta name="keywords" content="Hexo, NexT" />
<link rel="alternate" href="/atom.xml" title="Anthroraemon | 人型叮當貓" type="application/atom+xml" />
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.1.0" />
<meta property="og:type" content="website">
<meta property="og:title" content="Anthroraemon | 人型叮當貓">
<meta property="og:url" content="http://xraywu.github.io/index.html">
<meta property="og:site_name" content="Anthroraemon | 人型叮當貓">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Anthroraemon | 人型叮當貓">
<script type="text/javascript" id="hexo.configurations">
var NexT = window.NexT || {};
var CONFIG = {
root: '/',
scheme: 'Muse',
sidebar: {"position":"left","display":"post","offset":12,"offset_float":0,"b2t":false,"scrollpercent":false},
fancybox: true,
motion: true,
duoshuo: {
userId: '0',
author: '博主'
},
algolia: {
applicationID: '',
apiKey: '',
indexName: '',
hits: {"per_page":10},
labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
}
};
</script>
<link rel="canonical" href="http://xraywu.github.io/"/>
<title> Anthroraemon | 人型叮當貓 </title>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="zh-tw">
<script type="text/javascript">
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?8ac0c57df39ac4113b32c9d667097505";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<div class="container sidebar-position-left
page-home
">
<div class="headband"></div>
<header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-wrapper">
<div class="site-meta ">
<div class="custom-logo-site-title">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<span class="site-title">Anthroraemon | 人型叮當貓</span>
<span class="logo-line-after"><i></i></span>
</a>
</div>
<p class="site-subtitle"></p>
</div>
<div class="site-nav-toggle">
<button>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
</button>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section">
<i class="menu-item-icon fa fa-fw fa-home"></i> <br />
首頁
</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives" rel="section">
<i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
歸檔
</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags" rel="section">
<i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
標籤
</a>
</li>
<li class="menu-item menu-item-photo">
<a href="http://anthroraemon.lofter.com/" rel="section">
<i class="menu-item-icon fa fa-fw fa-camera"></i> <br />
攝影
</a>
</li>
<li class="menu-item menu-item-subscribe">
<a href="/atom.xml" rel="section">
<i class="menu-item-icon fa fa-fw fa-subscript"></i> <br />
訂閱
</a>
</li>
</ul>
</nav>
</div>
</header>
<main id="main" class="main">
<div class="main-inner">
<div class="content-wrap">
<div id="content" class="content">
<section id="posts" class="posts-expand">
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<link itemprop="mainEntityOfPage" href="http://xraywu.github.io/2018/02/14/express-vpn-with-xiaomi-router/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="人型叮當貓">
<meta itemprop="description" content="">
<meta itemprop="image" content="/images/default_avatar.png">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Anthroraemon | 人型叮當貓">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2018/02/14/express-vpn-with-xiaomi-router/" itemprop="url">
使用 ExpressVPN 和小米路由器搭建翻墙路由
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">發表於</span>
<time title="創建於" itemprop="dateCreated datePublished" datetime="2018-02-14T14:06:16+08:00">
2018-02-14
</time>
</span>
<span class="post-category" >
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分類於</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/动动手/" itemprop="url" rel="index">
<span itemprop="name">动动手</span>
</a>
</span>
</span>
<span id="/2018/02/14/express-vpn-with-xiaomi-router/" class="leancloud_visitors" data-flag-title="使用 ExpressVPN 和小米路由器搭建翻墙路由">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">閱讀次數 </span>
<span class="leancloud-visitors-count"></span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p><a href="https://www.expressvpn.com" target="_blank" rel="external">ExpressVPN</a>(需翻墙)是一家美国 VPN 供应商,提供同时在线 3 台设备、不限流量的高质量收费 VPN 服务。其服务器遍布全球,支持多种协议(PPTP、L2TP 或 OpenVPN)和多种设备客户端(包括移动、桌面、路由器甚至 PS 游戏机等)。简单来说,是市面上最好的收费 VPN 服务之一。当然,高质量的服务收费也很感人,一次性购买一年的费用高达 100 刀!不过,考虑这两年的国内网络环境,这样稳定的梯子实在是不可奢求更多。这不,前几天我就咬咬牙入手了一个账号,果然生活质量得到了极大的提高~</p>
<p>花了这么多钱买的梯子,自然想不只是简单在设备上简单使用啦(况且来回切换网络也很麻烦)。想了想,决定在家里原有路由器之外,再搭个翻墙路由,也好让买了许久,却因为网络环境吃灰许久的 Amazon Echo 能在无墙网络里用起来。看了一圈,决定入手个小米路由器3G。本以为其自带的 VPN 设置可以轻松完成任务,却发现小米路由器固件只支持简单的 L2TP 协议(都没有IPSec!)。折腾了两天,终于把它改造好了。下面做些记录,以备不时之需(你懂的)。</p>
<h3 id="获取小米路由器的-Root-权限"><a href="#获取小米路由器的-Root-权限" class="headerlink" title="获取小米路由器的 Root 权限"></a>获取小米路由器的 Root 权限</h3><p>小米路由器默认出厂刷的是稳定版,要获取 Root 权限,首先需要去其官网<a href="http://www1.miwifi.com/miwifi_download.html" target="_blank" rel="external">下载相应型号的最新开发版 ROM</a> 并刷机。下载完 ROM 后,从浏览器访问<code>192.168.3.1</code>进入小米路由器默认的管理后台,在右上角菜单中选择系统升级,并选择刚刚下载的升级包进行安装。安装完成后,等待路由器重启完成。</p>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-15%20at%2010.21.16%20AM.png" alt="小米下载开发板ROM"></p>
<p>安装完开发版系统后,需要使用小米官方提供的 <a href="http://d.miwifi.com/rom/ssh" target="_blank" rel="external">Root 工具</a>。需要注意的是,下载链接需要通过小米路由器提供的网络进入,并且需要登录小米账号。</p>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-15%20at%2010.21.21%20AM.png" alt="小米下载ROOT工具"></p>
<p>下载 Root 工具后,不要修改文件名(<code>miwifi.bin</code>),并且将文件拷到 U 盘中。将 U 盘插入小米路由器,断电,然后按住 Reset 键不放再恢复电源。按住 Reset 键并开机约 10 秒后(官网说 3-5 秒,实测需要按更长一些),会进入刷机模式,放开 Reset 键,等刷机完成后重新启动。重启完成后,路由器的 SSH 登录即被激活。此时,使用如下命令 SSH 远程连接设备若成功(Root 密码在下载 Root 工具时会在小米官网上显示),证明已经获得路由器 Root 权限。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ ssh root@192.168.3.1</div></pre></td></tr></table></figure>
<h3 id="刷入-Breed-启动器以及-Padavan-固件"><a href="#刷入-Breed-启动器以及-Padavan-固件" class="headerlink" title="刷入 Breed 启动器以及 Padavan 固件"></a>刷入 Breed 启动器以及 Padavan 固件</h3><p>为了能够刷入第三方固件,我们首先需要刷入 Bootloader。目前,<a href="https://breed.hackpascal.net/" target="_blank" rel="external">Breed</a>是小米路由器最常使用的启动器。进入上面的下载地址,找到相应型号的安装文件(比如小米路由器3G 对应 <code>breed-mt7621-xiaomi-r3g.bin</code>)并下载。下载后,将安装文件拷贝到路由器上——</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ scp ./breed-mt7621-xiaomi-r3g.bin root@192.168.31.1:/tmp/</div></pre></td></tr></table></figure>
<p>之后,由于在刷入 Bootloader 并进入控制台时会处于无网络状态,我们同样可以先准备好第三方固件。目前,一个被大家广泛使用的固件是<code>Padavan</code>,俗称“老毛子”固件。Padavan 固件功能非常强大,在这里,最重要的是其 VPN 客户端支持 <strong>OpenVPN</strong>。你可以在<a href="http://www.right.com.cn/forum/thread-161324-1-1.html" target="_blank" rel="external">这里</a>下载到由中国开发者汉化并扩展的最新版固件。</p>
<p>拷贝完成后,将小米路由器与其他路由设备(如光猫等)断开,并且使用网线,将路由器的 WAN 口与 PC 连接 <strong>(重要!)</strong>。</p>
<p>然后同样 SSH 远程登录路由器,并且执行如下命令:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ mtd -r write /tmp/breed-mt7621-xiaomi-r3g.bin Bootloader</div></pre></td></tr></table></figure>
<p>执行后,路由器会自动重启。重启后,和刷入 Root 时一样的操作,断电,按住 Reset 不放再开机等待 10 秒。完成后,可以进入刷机模式,通过 <code>192.168.1.1</code> 进入 Breed 控制台,就可以通过 Breed 刷入 Padavan 了。选择左边菜单栏中的<code>固件更新</code>,并且在<code>固件</code>一栏中选择前面下载的 Padavan ROM 安装包。确认更新后等待更新进度条完成,路由器会自动重启,就安装完成啦。此时,你可以将路由器重新连回光猫或外网接口,然后访问 <code>192.168.123.1</code> 进入 Padavan 的管理后台。Padavin 相关的默认密码如下——</p>
<ul>
<li>后台:admin@admin:192.168.123.1</li>
<li>SSH:admin@admin:192.168.123.1</li>
<li>Wifi 密码:1234567890</li>
</ul>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-15%20at%2010.18.38%20AM.png" alt="Breed 控制台"></p>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-15%20at%2010.18.47%20AM.png" alt="Breed 刷入固件"></p>
<p>好了,下一步就是在 Padavan 控制台上配置 ExpressVPN 实现翻墙路由了!</p>
<h3 id="使用-OpenVPN-连接-ExpressVPN"><a href="#使用-OpenVPN-连接-ExpressVPN" class="headerlink" title="使用 OpenVPN 连接 ExpressVPN"></a>使用 OpenVPN 连接 ExpressVPN</h3><p>首先,在这里,我们假设你已经购买了 ExpressVPN 的服务。正如上文所说,基于 L2TP 协议的 VPN 在目前的网络状况下几乎没有成功连接的可能性。因此,在开始配置之前,你需要访问首先访问 ExpressVPN,获取你的 OpenVPN 信息。在<a href="https://www.expressvpn.com/setup#manual" target="_blank" rel="external">这个页面</a>,你能够找到你的 OpenVPN 账号和密码、ExpressVPN 各个服务器的 OpenVPN 配置文件(<code>.ovpn 文件</code>)、以及访问需要的证书和公私钥。记录或下载后,进入 Padavan 后台开始配置。</p>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-14%20at%209.09.33%20PM.png" alt="获取ExpressVPN的OpenVPN文件"></p>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-14%20at%209.10.09%20PM.png" alt="获取ExpressVPN的OpenVPN密钥和证书"></p>
<p>点击 Padavan 后台左侧菜单栏的<code>VPN Client</code>一项,选择<code>Enable VPN Client</code>。由于 Padavan 的 OpenVPN 客户端只支持手工配置,你需要从你下载的服务器配置文件中提取出服务器地址——使用任何文本编辑器即可打开配置文件,在文件中你可以找到相应的服务器地址,然后对以下选项做如下修改——</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">- VPN Client Protocol: OpenVPN</div><div class="line">- Remote VPN Server (IP or DNS host): 服务器地址</div><div class="line">- Port: 1195 (ExpressVPN 没有使用默认的 1194 端口)</div><div class="line">- Authentication type: TLS: client.crt/client.key</div><div class="line">- Authentication Algorithm: SHA-512, 512 bit</div><div class="line">- Encryption Cipher Algorithm: AES, 256 bit</div><div class="line">- Obtaining DNS from VPN Server: Replacing all existing</div><div class="line">- Route All Traffic through the VPN interface: Yes</div></pre></td></tr></table></figure>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-15%20at%2010.12.20%20AM.png" alt="OpenVPN 配置1"></p>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-15%20at%2010.12.29%20AM.png" alt="OpenVPN 配置2"></p>
<p>之后,还需要配置一些额外的参数。点击界面上的 <code>OpenVPN Extended Configuration</code> 链接,展开文本框中填入以下内容——</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">remote-cert-tls server</div><div class="line">persist-key</div><div class="line">persist-tun</div><div class="line">fragment 1300</div><div class="line">mssfix 1450</div><div class="line">keysize 256</div><div class="line">auth-user-pass /etc/storage/auth.txt</div></pre></td></tr></table></figure>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202018-02-15%20at%2010.12.37%20AM.png" alt="OpenVPN 扩展配置"></p>
<p>完成后,先点击保存按钮。页面刷新后,点击页面的第二个 tab 选项(<code>OpenVPN Certificates & Keys</code>),在四个文本框中<strong>依次</strong>填入下载的公私钥文件中的 <code>ca.crt</code>、<code>client.crt</code>、<code>client.key</code>、<code>ta.key</code> 文件中的内容,点击保存。</p>
<p>最后,由于 ExpressVPN 连接时除了公私钥还同时还需要用户名密码,我们需要把用户名密码写入上面扩展配置里指定的 <code>/etc/storage/auth.txt</code> 文件中。SSH 远程登录路由器后,新建该文件,并且将用户名密码作为内容输入(各一行),保存。完成后,回到管理后台,依次点击 <code>Administration</code> -> <code>Settings</code> -> <code>Commit Internal Storage to Flash Memory Now</code>,以防设备重启后丢失该文件。这样一来,OpenVPN 就配置完成啦。路由器此时会自动拨号连接,如果成功的话,在服务器右侧会有绿色的 <code>Connected</code> 提示,表明 VPN 就成功连接了。需要注意的是,尽管使用了 OpenVPN 协议,ExpressVPN 的不少服务器在国内依然很难连上。多试几个吧,毕竟 ExpressVPN 的服务器好多呢。</p>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<link itemprop="mainEntityOfPage" href="http://xraywu.github.io/2017/08/06/an-introduction-to-superset/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="人型叮當貓">
<meta itemprop="description" content="">
<meta itemprop="image" content="/images/default_avatar.png">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Anthroraemon | 人型叮當貓">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2017/08/06/an-introduction-to-superset/" itemprop="url">
使用开源数据 BI 工具 Superset 对 Hive 仓储数据进行可视化分析
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">發表於</span>
<time title="創建於" itemprop="dateCreated datePublished" datetime="2017-08-06T21:06:16+08:00">
2017-08-06
</time>
</span>
<span class="post-category" >
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分類於</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Visualization/" itemprop="url" rel="index">
<span itemprop="name">Visualization</span>
</a>
</span>
</span>
<span id="/2017/08/06/an-introduction-to-superset/" class="leancloud_visitors" data-flag-title="使用开源数据 BI 工具 Superset 对 Hive 仓储数据进行可视化分析">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">閱讀次數 </span>
<span class="leancloud-visitors-count"></span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p><a href="https://github.com/apache/incubator-superset" target="_blank" rel="external">Superset</a> (此前命名为<code>Caravel</code> 或 <code>Panoramix</code>)是由 Airbnb 开源,Apache 基金会孵化中的企业级 BI 工具,提供了一个基于 Web 的 BI 数据分析和可视化环境,并可连接多种不同数据源。当前,Superset 项目还在快速迭代中。不论是其官方文档还是中文社区,可以找到的资料和文档都比较分散,因此在使用中会有不少坑。因此,在这篇文章当中,我会介绍:1)Superset 的环境搭建,特别是如何连接 Hive 数据仓储;2)Superset 使用中的一些基本概念;3)Superset 与其他企业级 BI 工具,如 Tableau 之间的比较。</p>
<h3 id="Superset-的环境搭建与-Hive-连接"><a href="#Superset-的环境搭建与-Hive-连接" class="headerlink" title="Superset 的环境搭建与 Hive 连接"></a>Superset 的环境搭建与 Hive 连接</h3><p>Superset 的后端主要基于 Python Flask 框架开发,因此要安装 Superset 首先需要 Python 的运行环境。此外,Superset 对数据源的连接主要通过 Python 的 <code>SQLAlchemy</code> 包实现——也就是说,任何数据源只要有 SQLAlchemy 的方言实现即可。因此,尽管当前 Superset 官方并不支持对 Hive/Presto 的连接,但通过自行安装 Dropbox 开源的 <a href="https://github.com/dropbox/PyHive" target="_blank" rel="external">PyHive</a> (其中包含 Hive/Presto 的 SQLAlchemy 实现),即可达成目的。</p>
<p>通过这样的配置,在填写数据源地址时,通过下面的链接形式即可连接到 Hive/Presto (这里强烈建议使用 Presto,比起 Hive 原生的 MapReduce 要快一个数量级,而且配置相当简单。Airbnb 官方人员在 Superset 的 Github 项目上也是这么推荐的)。</p>
<ul>
<li>Hive</li>
</ul>
<p><code>hive://user:password@host:port/database</code></p>
<ul>
<li>Presto</li>
</ul>
<p><code>presto://user:password@host:port/hive/database</code></p>
<hr>
<p>下面就是一个基于 Docker 的环境搭建(参考了<a href="https://hub.docker.com/r/tyyzqmf/superset/" target="_blank" rel="external">这个</a>镜像,包括构建过程中需要的文件)——</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div></pre></td><td class="code"><pre><div class="line"># PyHive + Superset 当前在 Python3 下还不稳定</div><div class="line">FROM python:2.7</div><div class="line"></div><div class="line"># Configure environment</div><div class="line">ENV LANG=C.UTF-8 \</div><div class="line"> LC_ALL=C.UTF-8 \</div><div class="line"> PATH=$PATH:/home/superset/.bin \</div><div class="line"> PYTHONPATH=/home/superset/.superset:$PYTHONPATH \</div><div class="line"> SUPERSET_VERSION=0.19.0</div><div class="line"></div><div class="line">RUN apt-get update</div><div class="line">RUN apt-get install -y curl python-dev libmysqlclient-dev build-essential libsasl2-dev</div><div class="line">RUN pip install --upgrade pip</div><div class="line">RUN pip install superset mysqlclient ldap3 psycopg2 redis pythrifthiveapi pyhive flask-oauth flask_oauthlib flask-mail sqlalchemy-redshift</div><div class="line"></div><div class="line">RUN adduser superset && \</div><div class="line"> mkdir /home/superset/.superset && \</div><div class="line"> touch /home/superset/.superset/superset.db && \</div><div class="line"> chown -R superset:superset /home/superset</div><div class="line"></div><div class="line"># Configure Filesysten</div><div class="line">WORKDIR /home/superset</div><div class="line">COPY superset .</div><div class="line">RUN chmod -R 777 .</div><div class="line">VOLUME /home/superset/.superset</div><div class="line"></div><div class="line"># Deploy application</div><div class="line">EXPOSE 8088</div><div class="line">HEALTHCHECK CMD ["curl", "-f", "http://localhost:8088/health"]</div><div class="line">ENTRYPOINT ["superset"]</div><div class="line">CMD ["runserver"]</div><div class="line">USER superset</div></pre></td></tr></table></figure>
<p>构建完毕后,即可启动环境——</p>
<ul>
<li>启动镜像</li>
</ul>
<p><code>docker run --detach --name superset -p 8088:8088 superset</code></p>
<ul>
<li>初始化账户</li>
</ul>
<p><code>docker exec -it superset superset-init</code></p>
<p>好了,打开你的浏览器,进入 <code>http://localhost:8088</code> 使用 Superset 吧!</p>
<h3 id="Superset-的一些基本概念"><a href="#Superset-的一些基本概念" class="headerlink" title="Superset 的一些基本概念"></a>Superset 的一些基本概念</h3><ul>
<li>Database:一个数据源,比如 Hive 里的一个数据库 </li>
<li>Table:查询数据表,目前在 Superset 中任何一张可视化图都是基于 <strong>一个</strong> Table的。也就是说,如果需要对连表数据进行可视化,需要先通过创建相应的 Query,并把 Query 结果转化为一个 Superset 中的 Table 才行。</li>
<li>Slice:基于 Table 的一个查询。任何可视化都是基于一个 Slice 的查询结果而构建的。</li>
<li>Visualization:基于一个 Slice 实现的可视化图,官方包自带了几乎所有的常见图标类型。</li>
<li>Dashboard:一组 Visualization 的集合。</li>
<li>Metrics:对聚合(Group)数据进行处理的方法——<strong>要注意,创建表时默认的 metrics 只有 Count 一种,这比较让人困惑,因为此时在 Group By 数据以后,在 y 轴上只能选择计数,而无法选择其他处理方式比如 Avg。解决方法是直接进入表编辑,通过 SQL 语法为其创建其他 metrics,再进入可视化编辑器选择。</strong></li>
</ul>
<p>了解了这些概念,在界面上点点用用,估计你就能掌握 Superset 的基本用法啦。具体我这里就不展开了,有问题可以参考<a href="https://superset.incubator.apache.org" target="_blank" rel="external">官方文档</a>。</p>
<h3 id="Superset-与其他企业级-BI-工具的比较"><a href="#Superset-与其他企业级-BI-工具的比较" class="headerlink" title="Superset 与其他企业级 BI 工具的比较"></a>Superset 与其他企业级 BI 工具的比较</h3><p>在当前版本(0.19.x),我认为,Superset 与其他企业级 BI 工具(如 Tableau、QlickView等)相比,最大的不同在于,<strong>其目标用户更多的是数据分析师、数据科学家,而非一般企业中的业务人员,因为其对用户的数据分析基本技能(如 SQL 等),要求更高。</strong></p>
<p>长久以来,在应用企业 BI 时,我认为业界一直有一种迷思,也就是希望业务人员有能力去操作 BI 软件(比如创建不同图表类型、对不同数据维度进行组合、下钻等)。为了尽可能的让他们获取这种能力,当前的 BI 软件都尽可能得做的“非常傻瓜”,比如只要通过拖拉即可组合数据维度、通过点击即可设置各种图表属性。尽管如此,但在实际情况中,根据我的观察,有这样能力的业务用户绝对不超过 5%,以至于在所谓的 “BI” 部门中,敢说自己精通公司 BI 软件的,可能也不超过三成(明明有 BI 工具和大量数据源,每个月最后还是在离线拉数据、做 Excel 报表)。此时,公司的 IT 部门会怎么做呢?答案是用乙方——基于 BI 软件再二次开发一套报表系统出来,当中内嵌好预先设定好的数据报表。在这样的情况下,无论软件如何“傻瓜化”,没有基础技能的用户仍然不会去使用,而对数据分析师、科学家来说,这样的傻瓜化所牺牲的灵活度,又显得过于小儿科了。</p>
<p>Superset 则索性走出了这一矛盾。可以说,如果你不具备一定的基础开发能力,是很难去使用 Superset 的。不管是基于已有表去创建新的表作为数据源,还是创建 metrics,都需要用户自行去定义一些 SQL 语句。把数据分析的活儿彻底交还给数据分析专家去吧——业务人员安安心心去看 Dashboard 就好。当然,你可以说这是因为 Superset 还在早期,暂时没有顾上这方面的需求,但我对这一观点存疑——从界面上无处不在的 SQL 一词即可看出,这不是 Superset 想要发展的方向。 </p>
<p>当然,Superset 目前仍然是一个快速发展中的孵化项目,未来变化也难预料。相比其他 BI 软件,坑较多,Bug 也不少,这都是上生产需要考虑的现实因素。奈何人家是开源的不是?比起 Tableau 动辄上万的 License(别误会,我是 Tableau 的大粉丝!),自己去填填坑也是应该的。</p>
<p>最后,发张 Demo 图吧。不好意思,好像打了很多码的样子 :)</p>
<p><img src="http://7xp1ay.com1.z0.glb.clouddn.com/Screen%20Shot%202017-08-05%20at%203.22.34%20PM.png" alt="Superset Demo"></p>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<link itemprop="mainEntityOfPage" href="http://xraywu.github.io/2017/07/13/not-everyone-can-become-a-pm/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="人型叮當貓">
<meta itemprop="description" content="">
<meta itemprop="image" content="/images/default_avatar.png">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Anthroraemon | 人型叮當貓">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2017/07/13/not-everyone-can-become-a-pm/" itemprop="url">
关于“人人都是产品经理”的一点迷思
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">發表於</span>
<time title="創建於" itemprop="dateCreated datePublished" datetime="2017-07-13T10:02:23+08:00">
2017-07-13
</time>
</span>
<span class="post-category" >
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分類於</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/人月神话/" itemprop="url" rel="index">
<span itemprop="name">人月神话</span>
</a>
</span>
</span>
<span id="/2017/07/13/not-everyone-can-become-a-pm/" class="leancloud_visitors" data-flag-title="关于“人人都是产品经理”的一点迷思">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">閱讀次數 </span>
<span class="leancloud-visitors-count"></span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>这几年,随着互联网大潮的普及,加上某本著名的《人人都是产品经理》的流行,一瞬间,以<code>产品经理</code>为 title 的人好像多了起来。更有甚者,在公司里,不管你是做啥的,言不必谈几句产品就显得非常得不酷了……</p>
<p>然而,听多了各种所谓的对产品的建议,加上最近陆陆续续面试了不少“产品经理”,不得不感慨,各位还是不要侮辱<strong>产品</strong>这两个字了。不仅不是人人都能成为产品经理,更多的时候,你对所谓的产品的建议,基本就是bs…</p>
<p>来举几个例子 - </p>
<ol>
<li>面试某 candidate 时,说:<code>“我们的产品已经内部测试迭代两年了,还没有上线。”</code> 我:<code>“(WTF?) 那你们内部迭代了这么久,每次改版、优化的依据是啥?”</code>答:<code>我们通过自己调研、使用,发现问题,不断优化,blablabla。</code>我:<code>“(WTF?) 呃……”</code></li>
<li>公司推出了一个新功能,可以根据已知基因的用户数据推测其他家庭成员的遗传情况,初版设计的时候考虑了爷爷奶奶外公外婆爸爸妈妈兄弟姐妹,算法非常之牛逼……………………………………然而,没有孩子!没有孩子!没有孩子!为了弄明白到底是出于什么我考虑不到的牛逼原因,我去请教了下我们的产品经理。需求产品经理:<code>设计的时候没有考虑到还有孩子的情况。</code>。算法产品经理:<code>什么我的算法还能算孩子?</code>。我内心 OS:<code>“我就是个搞 IT 的,但我读了你的算法确实是可以算的……”</code></li>
<li>公司组织大家学习某产品分析视频,视频内通过<code>Design Thinking</code>的方法论框架对产品进行分析,方法运用熟练,分析结果一般。视频播放完毕,大家开始欢快的对某些分析结果中的细节开始各抒己见,完全忽略了整个分析的逻辑基础(比如基于<code>用户 persona</code>出发的分析)。</li>
</ol>
<p>拜托,我觉得各位产品经理还是要学习一个。</p>
<p>那么下面来说说我觉得够格的产品经理是怎么样的——</p>
<ol>
<li>你是张小龙</li>
<li>如果你不是张小龙,统计、数据建模、原型设计、用户调研方法、人机交互、心理学总得都略懂一些吧?就算你不会开发,相应的 IT 知识总得具备一些吧?要是都不懂,老老实实照着好的例子抄不要勇于发挥总可以了吧?</li>
</ol>
<p>写这么段话,可能会被认为我<em>愤世嫉俗</em>,又或者<em>刚愎自用</em>。可是拜托,古往今来,牛逼的产品经理本来都是<strong>大独裁者</strong>啊(比如很多人言必谈之的乔帮主)。</p>
<p>又比如我,从来不敢说自己是做“产品”的,因为自觉知识储备不够。有些人,真不知何来的自信呢?没人会对 IT 的工作指手画脚,也没人会对销售的工作指指点点。归根到底,大概是做产品太“容易”了吧。</p>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<link itemprop="mainEntityOfPage" href="http://xraywu.github.io/2017/02/18/docker-multi-host-networking-1/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="人型叮當貓">
<meta itemprop="description" content="">
<meta itemprop="image" content="/images/default_avatar.png">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Anthroraemon | 人型叮當貓">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2017/02/18/docker-multi-host-networking-1/" itemprop="url">
HDFS Docker 容器跨宿主机通信方式的解决方案
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">發表於</span>
<time title="創建於" itemprop="dateCreated datePublished" datetime="2017-02-18T15:39:15+08:00">
2017-02-18
</time>
</span>
<span class="post-category" >
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分類於</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Snippet/" itemprop="url" rel="index">
<span itemprop="name">Snippet</span>
</a>
</span>
</span>
<span id="/2017/02/18/docker-multi-host-networking-1/" class="leancloud_visitors" data-flag-title="HDFS Docker 容器跨宿主机通信方式的解决方案">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">閱讀次數 </span>
<span class="leancloud-visitors-count"></span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>公司本来有一套搭在单节点上的 Spark-HDFS 环境用于数据的离线计算和分析。在之前搭建的时候,为了运维和管理的方便,我们把所有依赖的服务都打包成了 Docker 镜像。部署之初,作为第一次运用容器到生产环境的我们虽然踩了不少坑,但一一解决之后,这套体系在生产中却基本没出过什么问题,运维也变得方便了不少——直到上周。因为公司业务规模变大,我们需要部署一个新的 HDFS 的 Datanode 节点到一台新的宿主机上。于是问题出现了,怎么能让新宿主机上的 HDFS Datanode 连接到原宿主机上的 HDFS Namenode 呢?为了解决这个问题,我们折腾了不少天,从 Docker 原生的网络解决方案到使用官方插件再到发现了神器 <strong>Weave</strong>,终于解决了这个问题。下面我们来看看各种方案的问题在哪里,以及是如何解决的。</p>
<h3 id="容器化的-HDFS-要如何工作?"><a href="#容器化的-HDFS-要如何工作?" class="headerlink" title="容器化的 HDFS 要如何工作?"></a>容器化的 HDFS 要如何工作?</h3><p>熟悉 HDFS 的同学们肯定知道,HDFS 有 Namenode (类似 master)及 Datanode (类似 slave)之分,它们之间通过指定 IP 的方式互相进行通讯,并在这过程中使用了 SSH 协议。如果我们的 Namenode 和 Datanode 直接在两台互通的宿主机上,那么事情非常简单——互相配好对面的 IP 地址,并各自打开 <code>22</code> 端口即可。在这个过程中,Namenode 还会定时向 Datanode 告知自己的 IP 地址。</p>
<p>然而如果它们分别在两个宿主机上的容器呢?事情就复杂了——正常情况下,两个宿主机上的容器是不能互相通讯的,不像一台宿主机上的两个容器,直接用 Docker 自带的 <code>--link</code> 参数就可以互相发现了。就这样,我们开始了艰难的网络调试……</p>
<h3 id="Docker-的默认网络模式为什么不行?"><a href="#Docker-的默认网络模式为什么不行?" class="headerlink" title="Docker 的默认网络模式为什么不行?"></a>Docker 的默认网络模式为什么不行?</h3><p>在 Docker 默认的网络模式下,每个容器有自己的内部 IP,在默认情况下互相之间不可通讯。但是,像上面说的,一台宿主机上的两个容器可以直接通过 <code>--link</code> 参数并指名来互相发现。而如果需要把一个容器内的服务暴露给外网使用,则需要通过端口映射将容器中的某个端口在宿主机上的某个端口暴露出来,外部用户通过宿主机的地址进行访问。咋一看之下,这似乎就能让两个宿主机上的两个容器通信了不是——分别暴露自己的端口给宿主机,然后两边通过宿主机的地址进行连接。看上去完全可行。</p>
<p>然而一实践,发现远没有那么简单——问题主要出在 HDFS的工作方式上。刚刚说过,Namenode 会向 Datanode 汇报自己的 IP,而一个容器中的Namenode会认为自己的 IP 是容器内部的 IP 地址,而不是宿主机的 IP,尽管我们在配置中已经给 Namenode 指定了 Datanode 所在宿主机的 IP。于是乎,我们的 Namenode 就错乱了……第一个方案就此枪毙。</p>
<h3 id="那么-Docker-的-Host-网络模式呢"><a href="#那么-Docker-的-Host-网络模式呢" class="headerlink" title="那么 Docker 的 Host 网络模式呢"></a>那么 Docker 的 Host 网络模式呢</h3><p>熟悉 Docker 的同学肯定会想,哎呀,Docker 还有好几种网络模式呢。不就是容器会分配一个内部 IP 么?我们用 Docker 的 Host 网络模式好啦——在 Host 模式下,启动的容器会直接使用宿主机的网络,并沿用宿主机 IP,同时会把容器使用的端口在宿主机上暴露。这样一来,互相指定宿主机 IP 不就没有上面说的这种问题了吗?可是新的问题又出现了。</p>
<p>这次问题仍然出现在 HDFS 的工作模式上——上面又又又说过了,Namenode 和 Datanode 是要用 SSH 协议通信的。使用了 Host 模式后,容器的 SSH 服务和宿主机的 SSH 服务又产生了冲突。当 Namenode 企图 SSH 到 Datanode 时,它只能访问到宿主机的 SSH 服务,而不是 Datanode 镜像的——我们总不能把宿主机的 SSH 服务停了吧?从实际角度,当然可以把宿主机的 SSH 端口给改了,但这显然不是一个好办法。</p>
<h3 id="再来看看-Docker-的多宿主机网络扩展方案"><a href="#再来看看-Docker-的多宿主机网络扩展方案" class="headerlink" title="再来看看 Docker 的多宿主机网络扩展方案"></a>再来看看 Docker 的多宿主机网络扩展方案</h3><p>原生的 Docker 网络解决方案看来是行不通了,于是我们开始查 Docker 的官方文档,发现现在 Docker 已经提供了多宿主机的网络扩展方案(<a href="https://docs.docker.com/engine/userguide/networking/get-started-overlay/" target="_blank" rel="external">文档</a>)了,又叫做 Overlay 模式。其大致的思路在于使用一个 Key-Value Store 的中间件注册不同宿主机上的容器,并使它们互相发现和链接。很好,很简单。</p>
<p>那就动手实践咯——按照文档里的说明,我们建了一个 Consule 的中间件,并建立了一个 overlay 网络供两边的容器加入,一切看上去都非常顺利,连通那是指日可待了,直到我们做完了所有步骤,开始 ping 的那一刻……</p>
<p>不通!不知道为什么,两边的容器甚至都已经能够解析对方 host 的虚拟 IP了,仍然不能连接到对方——使用 <code>docker network inspect</code> 查看网络,可以发现两个容器都已经注册成功了,因此它们互相能够知道对方的 host 名字。可是为啥连不通?至今我仍然不知道……我相信是我们在某些配置上出了问题,但是文档里也没有更详细的说明了,网上的教程搜了搜,好像也没找到类似问题…… 有了解的同学请留言告知……</p>
<h3 id="And-Weave-Works"><a href="#And-Weave-Works" class="headerlink" title="And Weave Works!"></a>And Weave Works!</h3><p>百般无奈之下,去求助了专门搞容器的朋友。人家说,你们还折腾什么劲啊?直接用 <a href="https://www.weave.works" target="_blank" rel="external">Weave</a> 就好啦,网上文章一搜一大把,很简单的……经过之前无数的挫折,其实我已然失去了信心……将信将疑的去试了试,嘿,成了,而且是如此简单。只恨动手前功课没做完整啊……</p>
<p>那么介绍一下 <code>Weave</code> 是啥——简单来说,Weave 通过创建虚拟子网的方式,将不同的宿主机上的容器置于同一个虚拟网络内。不同宿主机上的容器可以直接通过容器名或虚拟 IP 进行连接,就好像处在同一个物理网络下一样。与此同时,Weave 仍然支持所有的 Docker 原生功能,比如用 port mapping 暴露容器端口给宿主机等等。在整个 Weave 网络部署的过程中,也不需要对宿主机或容器的网络做任何修改,非常简便。就像官方说的一样,Weave Works!</p>
<p>具体的部署反而是非常简单的,我们基本就是按照<a href="http://tonylit.me/2016/03/29/docker-weave%E7%BD%91%E7%BB%9C%E4%BA%92%E8%BF%9E/" target="_blank" rel="external">这篇攻略</a>来进行的,没有做太多的变化。简单来说,就那么几步:</p>
<ol>
<li><a href="https://raw.githubusercontent.com/zettio/weave/master/weave" target="_blank" rel="external">下载</a> Weave 的执行脚本</li>
<li>在两台宿主机上分别启动 Weave 服务(<code>weave launch</code> 命令),在这个过程中,Weave 会自动在宿主机上配置一个虚拟网卡,以及下载启动一些 Docker 容器作为服务中间件。第二台宿主机launch Weave 时指定要加入的第一台宿主机 IP(<code>weave launch ip-of-server1</code>)。</li>
<li>在宿主机上分别用<code>weave run</code>启动容器,记得给容器一个名字。其他参数可以完全沿用 Docker 的参数。</li>
<li>到容器里 ping 对方看看吧,现在两个容器已经可以互相通信了,so easy!</li>
</ol>
<p>此外,Weave 也有更多的高级功能,比如容器可以实时加入或退出 Weave 网络,或者使用宿主机网络等。总的来说,使用 Weave 极度降低了 Docker 在多宿主机网络下使用的复杂度,对容器化 HDFS 等需要分布式环境、本身网络配置就比较复杂的服务有极大的帮助。</p>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>