Lượm lặt những công cụ và tin tức đáng chú ý từ Hacker News
hay từ
công việc hàng ngày. Nếu bạn thấy có gì hay hãy gửi PR
nhé.
Nội dung sẽ được tự động đăng trên kênh https://t.me/linuxvn_notes.
Các bài viết của năm sau: 2020
- k8s
- Ác mộng với Helm: Phần 1 Phần 2 Phần 3
- Bắt đầu với k8s như thế nào
- Lucense, Elasticsearch
- Phần 1: Về Lucene
- Phần 2: Về giấy phép Apache: TODO
- Công cụ linh tinh
- Dịch vụ có ích
- Nghề nghiệp
- Backup
- Linh tinh
tags: #k8s #helm #panic
Mình bắt đầu gõ những dòng này thì cô gái tóc vàng với khuôn mặt thanh tú ngồi đối diện đứng lên xuống ga. Ngồi suốt một buổi mà cả hai không nói với nhau điều gì, rồi ra đi không từ biệt. Có lẽ cả hai cùng ngại nói đến helm, chăng? Phiên bản mới 3.0 mới ra có gì hay? Thôi, đành viết lại vài dòng để nhớ cô gái không quen và sẽ chẳng bao giờ quen.
Cô nhớ cho! Tới tháng 5 này thì các helm stable
trước đây sẽ không
còn được liệt kê trên kho Helm, và cuối năm 2020 nhân dịp bảo hiểm xã hội
thay đổi cách tính theo hướng có hại nhiều hơn lợi cho người lao động,
dự án quy tụ các bản chart cứng (stable) sẽ dẹp luôn.
Nhưng khoan nói về helm3. Nhiều người vẫn hạnh phúc với helm2. Cũng khoan
nói về helm2. Hãy nói tại sao có helm, và lý giải một phần tại sao
kustomize
ra đời.
Về cơ bản, các tài nguyên trên k8s có các thuộc tính cơ bản: phiên bản api,
thể loại (.kind
), tên riêng (.metadata.name
), đặc tả (.spec
). Phần
đặc tả phức tạp nhất, và người dùng phổ thông xài yaml
để viết.
Khâu cuối cùng ngay trước khi deploy là file yaml
, nhưng trước đó,
chín người mười ý, đặc biệt là 9 người từ 10 công ty khác nhau, họ cãi
nhau và bắt đầu thêm mắm muối vào file yaml
đó. Để dễ hiểu, hãy tưởng
tượng đây là file yaml
ban đầu:
apiversion: lauxanh/v1stable
kind: PornVideos
metadata:
name: demo
labels:
say: "hello, world!"
spec:
filename: demo.mp3
vip_account: true
sau đó 9 ông devops vào sửa lại như sau:
apiversion: lauxanh/v1stable
kind: {{ .Values.PornKind }}
metadata:
name: {{ .Values.PortName }}
labels:
{{ .Values.Action }}: {{ .Values.Message }}
spec:
filename: {{ .Values.PornFileName }}
vip_account: {{ .Vallues.VipIsRequired }}
{{- if .Values.OhMyLauxanh }}
{{ toYaml .Values.OhMyLauxanh | indent 2 }}
{{- end }}
{{- if .Values.Zalando.Users }}
zalando_group: {{ .Values.Zalando.group_name }}
{{- end }}
{{- if .Values.HelloFresh.Users }}
spec: {{ .Values.HelloFresh.Is.Not.Zalando }}
{{- end }}
# company X
# company Y
# company Z
Mỗi dạng thông tin trong file yalm mà k8s có thể hỗ trợ người ta bỏ luôn, thay bởi một biến của helm. Bao nhiêu kiểu đặc tả, bao nhiêu tham số thì cũng xem xem chừng đấy biến số trong tập tin giá trị của helm. Bạn xem thử tui nói đúng hông: https://github.com/helm/charts/blob/master/stable/grafana/templates/deployment.yaml Ý tuởng cơ bản là hay, từ file ban đầu, hỗ trợ nhiều công ty, nhiều môi trường, nhiều biến thể khác nhau. Mục đích tốt, nhưng sau một thời gian thì nhiều thứ quá, nhìn loạn cả óc. Đó là lý do ra đời cái gọi làm helm cứng, stable: nó stable bởi muốn thay đổi nó là chuyện chẳng dễ dàng gì, ít ai dám đụng vào.
Câu hỏi là, tại sao không xem ngay một đặc tả trong file yaml
là một
biến số luôn. Nghĩa là, trong ví dụ ở trên, ta tự động có các biến số sau
$awesome.$metadata.$name = "demo"
$awesome.$metadata.$labels.$say = "Hello, world!"
$awesome.$spec.$filename = "demo.mp3"
$awesome.$spec.$vip_account = "true"
Oh yeah, quá dễ, nhưng thật ngây thơ vì yaml parser không chịu thế đâu.
Nên từ đó, nảy sinh ra kustomize
, với ý tuởng cơ bản như vừa nói, nhưng
triển khai theo dạng patch: patch kiểu yaml đơn giản, hoặc khó hơn như
patchesJson6902
. Thay dùng biến số, ta thêm vào file patch như sau:
apiversion: lauxanh/v1stable
kind: PornVideos
metadata:
name: demo
labels:
say: "I love Maria."
spec:
filename: "Maria-Ozawa.mp3"
vào khi trộn vào tập tin gốc sẽ ra kết quả theo ý của ông devops ở Sài gòn:
apiversion: lauxanh/v1stable
kind: PornVideos
metadata:
name: demo
labels:
say: "I love Maria."
spec:
filename: "Maria-Ozawa.mp3"
vip_account: true
Ví dụ không phản ánh thực tế là tập tin gốc có thể có rất nhiều dòng,
còn tập tin để patch chỉ có vài dòng, đưa ra đúng những thứ cần thay đổi.
Giống như khi xài git diff | patch -Np1
vậy thôi:
k8s-stuff/
42-ingres-zalado/
- base/
file1.yaml
file2.yaml
file3.yaml
- deployment_in_use
patch.yaml
- deployment_in_euw
patch.yaml
- deployment_in_saigon
patch.yaml
Về cơ bản thì không khác cách deploy với Helm? Có chứ, xem đây:
your vars --> { helm vars + helm templates } --> helm --> final yaml file
{ your patches + base.yaml } --> kustomize --> file yaml file
Cách đầu bạn phải làm việc với nhiều thứ hơn (biến, cấu trúc, template), cách sau từ đầu tới cuối chỉ một cấu trúc Yaml. Chính sự rắc rối của Helm mà nhiều người nghĩ ra các kiểu template khác nhau, jsonnet, draft rồi tá lả thứ khác nhau: Nhưng chúng đều có chung rắc rối như helm thôi.
Tạm dừng ở đây, cô gái tóc vàng đã đi xa lắm rồi. Bạn xem thêm:
- https://github.com/helm/charts#deprecation-timeline
- https://github.com/kubernetes-sigs/kustomize/blob/master/docs/eschewedFeatures.md
- https://blog.hasura.io/draft-vs-gitkube-vs-helm-vs-ksonnet-vs-metaparticle-vs-skaffold-f5aa9561f948/
tags: #elasticsearch #observability #berlin
Hôm đầu tháng 10 mình có dịp tham gia workshop do công ty Elasticsearch
tổ chức. Từ khóa của sự kiện là observability
. Workshop này hoàn toàn
miễn phí, tổ chức ở một khách sạn lớn, có đồ ăn uống sáng, trưa ngon lành,
nhưng có lẽ... xa nên phòng hơi vắng. Mình gặp nói chuyện với một
anh chàng gốc Bắc Âu ở Berlin, nói rằng đi xem thế nào, tại lên chức lâu
rồi nên không còn nhanh tay lẹ mắt cài đặt gì nữa :)
Có thể, vì nhiều người lên chức quá, nên mới có Elasticsearch bản cloud, cài đặt tích hợp sẵn mọi thứ từ APM, Log, Metrics, rồi Machine Learning, nhìn cái menu mà choáng ngợp, nghĩ ngay mình còn phải học thêm 10 năm nữa chưa xong cái nghề ops này :) Bản cloud đúng khỏe, cài đặt cấu hình gì cũng có sẵn rồi, rẹt rẹt. Làm mình bồi hồi nhớ lại thuở ngồi kỳ cọ mấy cái cấu hình sao cho mấy node ES nối nhau. Khổ gì đâu.
observability
là gì? Nghe thấy lạ, khó đọc (dù sao, cũng dễ đọc hơn
high availability
), giải thích thì loằng ngoằng như ở đây
https://www.elastic.co/blog/observability-with-the-elastic-stack
. Tóm tùm lum lại, là một chỗ chung để theo dõi toàn bộ hệ thống, ở góc độ
lớn hơn của người làm ops, của developer hay quản lý.... Nói chung,
ý tưởng thì hay, còn thực hiện thì đấy, có ES lo rồi. Mới đây N26 công
ty start-up về tài chính ngân hàng cũng có workshop về observability
,
nhưng hỏng biết có gì ở trong đấy. Từ khóa này cũng khá là hot trong
sự kiện mà O'Reilly tổ chức
(tóm tắt của mình: https://gist.github.com/icy/d32c504eb1d41adea11cff4ba0865808.)
Có mấy cái lặt vặt như filebeat
, kibana
,... mình nghĩ nhiều bạn biết
rồi. Trong khi thực hiện bài lab
, thì có điều hài hước là nhiều người
gõ ngay vi/vim
rồi đứng hình, lý do trình duyệt không hỗ trợ, trong khi
về cơ bản nano
vẫn chạy ổn.
Thật chớt quớt, nhưng lượm lặt lớn nhất của buổi workshop này chính là,
mình tin rằng lựa chọn dùng nano
là hợp lý, đúng đắn. Mình bồi hồi nhớ
lại cách đây mấy năm khi mới vào ai đá tao, mấy bạn trong team hỏi thế
chú xài gì, vim hay Emacs, xong có vẻ vô cùng thất vọng vì có một thằng
trời đánh nó trả lời là ... nano
:))
À, ngoài ra còn filebeat
, tuy được quảng bá rầm rộ nhưng trong buổi
workshop bà con cài lên xuống muốn xỉu lơ luôn. Và mình cũng mất đâu gần
gần hai buổi cho nó, đơn giản là muốn nó hỗ trợ k8s thì xài bản mới,
mà xài bản mới thì nó không thèm nói chuyện với logstash hay es cũ.
Ơ hay, rảnh quá ha. Chưa kể xài mem/cpu gì nhiều. Thôi, goodbye!
Còn mấy cái cao siêu như observability
thì để dành lại cho các bạn
tự tìm hiểu thôi; mình có biết gì đâu. Nếu cần thì mình chỉ đơn giản bỏ
devops
mà chuyển qua opssex
thôi, đổi job title, đổi lương, công
việc vẫn như cũ.^^
PS: Nhờ workshop mà mình còn gặp bạn T. cũng ở Sài gòn qua Bá linh tìm ngoại tệ . Rồi từ đó phát hiện nguyên băng Lazada bên này luôn. Điều này làm mình có chút cảm hứng để viết tiếp một chút về Bá linh, mà bạn sẽ được đọc thêm sau.
tags: #pair #debugging #problem #solving #hdfs
Chắc các bạn đã nghe về pair programming
, phương pháp phổ biến từ lâu;
chậm nhất đâu khoảng 2007, vì lúc đó mình được biết một job yêu cầu
PP
với RoR
.
Hôm nay mình giới thiệu với các bạn về PD
, hay pair debugging
. Có thể
bạn đã đọc đâu đó trong sách vở và/hay từ các blogger lập trình viên nổi
tiếng. Còn mình kể lại chuyện thực tế thôi ha, có gì cứ coi như mình là
kẻ thất học vậy.
Hệ thống big data
chỗ mình bị đầy đĩa. Trong đó nào là kafka, nào là
hdfs, nào là yarn manager tá lả thứ. Sau khi đĩa mới được thêm vào, đảm
bảo cấu hình được chỉnh rồi các tiến trình được khởi động lại theo đúng
bài vở, thì hệ thống vẫn báo là một trong 5 node của cluster rớt ra ngoài.
Thế là mình ngồi mò tìm mãi chẳng hiểu sao. Thực ra mình cũng không phát
hiện ra lỗi như vậy, công việc của mình đã xong như vừa nói.
Một bạn data engineer tò mò ngồi xem trên Grafana rồi báo lại.
Mình cực chẳng đã phải kiểm tra, thấy hdfs
báo ngon lành hết, xanh lè.
Mà sao bạn data engineer cứ thắc mắc. Một hồi chát có vẻ không hiểu nhau
nên thôi cả hai quyết định dọn về gần nhau cho tiện. Hai cái ghế, một
màn hình, một bàn phím, một console, tình anh em đồng nghiệp nào mình
cùng thực hiện PD
hay là pair debugging
.
Do mình còn lơ tơ mơ về PD
và cả big data
platform, nên mình quyết
định theo phương án là bạn engineer
có ý tưởng gì là hai bên cùng thử
hết. Nào là khởi động lại prometheus
exporter phòng khi có lỗi,
khởi động lại các tiến trình hdfs
trên tất cả các node. Rồi khởi động
lại các ứng dụng, .... với hy vọng rằng sẽ giải quyết được vấn đề.
Cũng có vẻ hiệu quả. Khi vừa mới restart thì hệ thống xanh, nhưng sau đó
vài phút thì hệ thống lại báo có một node rớt ra ngoài. Điều này khiến
cả hai bạn nghĩ rằng do app tịt chỗ nào đó. Nên cứ tha hồ restart.
Mỗi lần vậy cũng không dễ dàng gì, vì phải restart xong là ngồi đợi
cho đến khi log sạch sẽ mới chuyển qua restart node khác.
Ừ, về log thì biết rồi, các ứng dụng java nó quăng ra qua nhiều thứ nhưng điều quan trọng thì tìm không thấy đâu.
Rồi đi xem trang wiki, xem các tài liệu chỉ dẫn để lại. À, tại vì bạn engineer ngồi setup xong bộ big data cluster này phải đi nghỉ phép vài tháng rồi, không ai biết thực sự chuyện gì đang xảy ra.
Mò, hai bạn ngồi trên đống lửa production, từ 9h sáng cho tới gần 1h chiều. Có ý kiến gì thì cứ thử. Mệt quá, hai bạn cùng nghỉ.
Khi bạn kia đi rồi thì mình ngồi coi lại log, và cấu hình, và trong 3 phút đã phát hiện ra vấn đề tại đâu: Còn thiếu một file cấu hình nữa, quên update. Chỉ việc thêm đĩa mới vào đó, khởi động lại. Khỏe re.
Bài học là gì? PD
nó tai hại nếu hai ông thần cứ giả bộ như không biết
gì cứ ngồi thử / sai. Khi vấn đề xảy ra, chỉ cần hít một hơi thật sâu,
coi chính xác lỗi gì, đọc log kỹ rồi fix thôi. Khi giải quyết vấn đề
thì cần tập trung, chứ nhiều ý kiến linh tinh không có cơ sở thử cho
khỏi mất tình đồng nghiệp chẳng ăn nhằm gì đâu.
Hehe.
tags: #git #devops #trick #diff
Hôm nay trên @linuxvn
(https://t.me/linuxvn/55674) có bạn hỏi làm thế nào
để quay lại một commit cũ/tốt trên master, sau khi lỡ nhầm merge nhánh dev
vào nhánh master
. Sau câu hỏi này là một màn tranh luận sôi nổi, dài lê
thê mà mình chưa kịp coi. Người hỏi muốn reset
, bỏ đi các commit lỗi
để quay lại cái cũ, một kiểu Undo
giống khi soạn thảo văn bản.
Vấn đề này hay gặp, bạn có thể xem trao đổi trên SO
:
https://stackoverflow.com/questions/4114095/how-do-i-revert-a-git-repository-to-a-previous-commit
tất nhiên là trên đó cũng miên man đủ thứ giải pháp, mà thật ra mình coi
nhiều lần vẫn không hiểu thế nào là tốt, hoặc là cũng chả cần hiểu nhắm
mắt làm theo.
Sau đây, mình giới thiệu cho bạn cách truyền thống, cực kỳ chính xác.
Thứ nhất, sau khi commit, đã merge, thì bạn không nên Undo
, xóa bỏ
commit bằng git reset
, một khi thay đổi đã được push
lên kho hay chỗ
nào đó. Lời nói gió bay, chỉ có thể sửa chữa chứ không rút lại được.
Trong DevOps cũng có vài nguyên tắc sống hay vậy.
Tiếp theo, về cơ bản, giữa hai commit
bất kỳ trong kho git của bạn
là một khoảng cách khác biệt, mà bạn luôn thấy được bằng lệnh git diff
.
Phục hồi commit
cũ, tức là xóa đi các khác biệt này, hay là áp dụng khác
biệt đó theo chiều ngược (bạn sẽ rõ hơn ở phần sau).
Giả sử, bạn đang ở master
và cần quay lại commit 3323e5b
tốt. Hãy chuẩn
bị bước đầu tiên là clone/checkout
nhánh master
ra một thư mục sạch sẽ,
là thư mục mà khi bạn gõ git status -u
thì không thấy gì ở đó.
$ git status -u # đảm bảo không thấy gì
$ git checkout master # chắc chắn bạn đang ở master
$ git diff HEAD..3323e5b > patch.diff
Trong lệnh cuối cùng, thứ tự rất quan trọng. Commit
tốt của bạn phải
nằm sau cùng (đi ngược về quá khứ). Sau đó, bạn áp dụng bản diff này
$ patch -p1 < patch.diff
$ git status -u
Kiểm tra lại xem các file nào mới chưa được commit trong kết quả
của lệnh git status -u
ở trên. Nếu có, bạn thêm vào: đó là các tập tin
có trong commit cũ (3323e5b
):
$ git add some/new/files.txt
$ git commit -a "Revert to 3323e5b, thanks to @linuxvn"
Để chắc chắn, bạn kiểm tra lại kết quả
$ git diff 3323e5b..
lần này cần phải hiện ra ... không gì cả, tức là bạn đã hoàn toàn phục
hồi lại commit
cũ của bạn.
Cách này lúc nào cũng thành công, đơn giản, thậm chí bạn có thể tranh thủ
điều chỉnh vài thứ. Và hơn hết, thay vì phải đi hiểu một đống lệnh như
là git revert
, git reset
, ...bạn chỉ việc tập trung hiểu bản chất
của vấn đề là, diff
, diff
, và diff
;)
tags: #dns #bot #theslinux
Ngắn gọn: Bạn có thể có tên miền con ở theslinux.com với hỗ trợ dynamic dns. Ví dụ, foobar.theslinux.com với địa chỉ IP internet nhà bạn.
Để bắt đầu, bạn trò chuyện với bot foor3_bot. Tài khoản Telegram của bạn phải có nickname, và bạn là thành viên của @linuxvn. Bắt đầu với lệnh sau
/dns help
: luôn có kết quả;/dns help full
: chỉ có kết quả chi tiết hơn.
Nếu ở lệnh /dns help full
bạn thấy ngắn, tức là nick của bạn chưa được
xác nhận, hãy nhờ bạn Đức hoặc Anh trên @linuxvn.
Sau đó, bạn tạo một gist bí mật (hay công cộng tùy bạn), như ví dụ sau https://gist.github.com/icy/b3c600d2bec2994c429f2bbe09a4267d. Rồi gõ lệnh push:
/dns push https://gist.github.com/icy/b3c600d2bec2994c429f2bbe09a4267d
và ngồi chờ vài phút. Dùng /dns get
hay /dns log
để xem thông tin
mà hệ thống xử lý thông tin của bạn.
Để dùng dynamic dns
, bạn chỉ việc dùng git clone
, cập nhật và
push liên tục lên Github thôi:
$ git clone https://gist.github.com/icy/b3c600d2bec2994c429f2bbe09a4267d mydns
$ cd mydns # edit...
$ git push
Mã nguồn sẽ được tải về tự động. Tất cả các tập tin trong mã nguồn của bạn được duyệt qua, nên bạn có thể đặt tên sao cho dễ nhớ.
Nào cùng nghịch thôi.
tags: #notes #random #retrospective #linuxvn
Hôm nay là ngày đen tối, buồn quá nên ngồi kể linh tinh chuyện. Chuyện như thế này https://t.me/linuxvn/51920, không phải là chuyện buồn, đó là chuyện ... cay đắng. Buồn bực là một cách bộ não đang tự cải tiến, nên thật ra đó cũng là điều may mắn. Đành tự an ủi, lâu lắm rồi ngày xưa là do lỗi mình, nhưng lần này cũng lỗi cho mình nốt.
Nhóm Telegram @linuxvn đâu có 400 nick tụ tập rồi. Admin có Kỳ Anh, Đức, Quang, Nhâm, Vũ Nhân, (và DuyDo) cũng không phải làm gì phức tạp, trừ Đức dành nhiều thời gian cho mirror. Hy vọng sang năm số Admin lên được 300. Một số thành viên siêu nhân mới xuất hiện gần đây, là điều rất đáng yêu. Còn vài điều hấp dẫn nữa, kể dịp khác. Cảm ơn tất cả các bạn đã tham gia vào nhóm.
Có kênh đăng tin công việc https://t.me/devopsjobs nhưng do mình không còn liên lạc với thị trường trong nước, mình nghĩ bạn nào đó có thể phụ trách giúp. Xin hãy liên lạc trên nhóm @linuxvn.
Thang-Man có hỏi https://t.me/linuxvn/50223 và các bạn chú ý https://t.me/linuxvn/50228. Gần tuần nay đội BI+ops chỗ mình đi cài Sqoop mãi không xong, mới thấy giá trị của AWS EMR thế nào :)
Trước đó thì cả tuần mình ướt mồ hôi trán với uwsgi+python nằm sau Apache.
Các worker sau khi reload sẽ khiến phát sinh lỗi 500 trên Apache.
Sau khi phát hiện ra phải bật thread lên (https://t.me/linuxvn/51063),
thì vẫn còn lỗi 500, mà mình đoán là do Apache bị mất kết nối tới socket của
uwsgi. Thôi mệt, mình đi nuôi con chó giữ nhà (watchdog), đọc apache log
(dùng tail -F
, với F viết hoa, không phải thường nhé), phát hiện thấy
lỗi 500 là lập tức restart apache worker (apache2ctl -k graceful
);
thế là ngủ ngon, lỗi 500 vẫn đầy nhưng hầu như không ai phát hiện ra, trừ mình.
Sau khi được chào mừng thì Huy-Ngo và An-stk lặn mất tăm. Điều đáng tiếc là Huy-Ngo bận rộn nên không chăm sóc cho mirror được nữa. Có bạn nào có thể giúp audit mirror xin giơ một tay.
Bạn nào dùng proxy trước k8s để ý tới haproxy+SNI và chủ đề này https://t.me/linuxvn/50112 (https://t.me/linuxvn/50117). haproxy quả thật thú vị và đơn giản hơn nginx ;)
Sau 8 năm mua máy ảnh (và chụp ảnh, tất nhiên :D) mình mới phát hiện ra mình thích chụp cái gì. Sau cũng hơn chừng đó năm làm admin+devops, tóm lại là mình vẫn không hiểu mình thích được cái gì. Thiệt là điên, nhỉ ;)
tags: #berlin #relocation #devops #bluecard
Mình chính thức thông báo, mình đã chuyển qua làm việc lâu dài tại Berlin. Mình chuẩn bị khá lâu nhưng lúc đi thì cái vù, chỉ vài người biết. Một phần vì các thủ tục giấy tờ ở đây phức tạp, có thể tuyển thẳng mình về Saigon bất kỳ lúc nào nên mình không dám hó hé, sợ quê.
Berlin năng động, không như kiểu Sài gòn hay Singapore. Nhiều bạn cũng sắp qua đây, hỏi tùm lum thứ. Nên mình viết sơ vài ý quan trọng để bạn lên kế hoạch. Người Đức thích và giỏi lập kế hoạch, nên đầu tiên bạn cần luyện kỹ năng đó. Việc gì tới sẽ phải tới, vậy thôi.
-
Xin việc
: Bạn apply qua LinkedIn, nên đăng ký một tài khoản Premium miễn phí tháng đầu, 30 Mỹ kim mỗi tháng kế tiếp (nếu vẫn xài) Trên đó, có khóa họcGet things done
cực hay, bạn nên xem qua nhé. Khi xin việc, cần hết sức chú ý hỏi về môi trường và phong cách làm việc. Càng cởi mở càng tốt; vì người Đức nổi tiếng kỷ luật mà. Ví dụ, bạn nên hỏi tao muốn làm ở nhà được không;) -
Mức lương
: Khó mà giàu ở đây. Muốn giàu, bạn đi Singapore hay Mỹ nhé. Còn để cân bằng sống và làm việc chả theo giương ai hết, Berlin là nơi khá tốt cho bạn đấy. Mức lương của mình thì bạn có thể hỏi riêng, nhưng bạn nên biết điểm khởi đầu của mình để khỏi tự bắn vào chân nhé. -
Bằng cấp
: Bạn nên có một bằng đại học được Đức công nhận. Mình may mắn có bằng mát-tơ ở Việt nam, trường đại học mình được công nhận, nhưng bằng của mình thuộc dạng dỏm, phải gửi qua Đức cho họ kiểm tra, ký giấy công nhận. Mất ít phí. Nhưng kết quả là tờ giấy còn đẹp hơn cả cái bằng gốc của mình hehe. -
Thủ tục visa
: Hơi khó, bạn xin visa làm việc (bluecard), nhưng lãnh sự quán Đức ở Sài gòn cấp visa ngắn hạn 3 tháng để bạn qua Đức xin tiếp visa dài hạn. Việc khó đầu tiên là đặt lịch hẹn làm thủ tục visa, thường việc này phải tiến hành trước vài tháng, trước cả khi bạn có offer từ các công ty đấy. Bạn sẽ phải gửi email để hỏi (xem trên https://vietnam.diplo.de/), còn trước đây mình canh mãi mới được, và lịch hẹn của mình có sau thời gian bắt đầu hợp đồng đến mấy tháng. Công ty có thể có visa agent hỗ trợ, nhưng bạn nên chủ động tìm hiểu hoàn chỉnh giấy tờ, thủ tục, đặt lịch hẹn,... nhé. Và quan trọng là thông báo đầy đủ tình trạng cho công ty để họ biết mà hỗ trợ hoặc ... chờ bạn onboard. -
Qua tới Đức
: Do bạn ở lâu hơn 2 tuần, bạn sẽ phải làm thủ tục đăng kýhộ khẩu
(Anmeldung). Việc nàydễ
, làm trong 10 phút là xong, nhưng oái ăm là bạn phải có một địa chỉ ổn định để bạn có thể nhận giấy tờ (rất nhiều) và làm các thủ tục tiếp theo (mở tài khoản ngân hàng, bảo hiểm, thuê nhà, ...) Bạn có thể ở tạm Airbnb và nhờ ai quen cho/thuê mượn địa chỉ đăng ký.Không phải chỗ ở Airbnb nào cũng cho bạn giấy Wohnungsgeberbestätigung, mà có cho thì cũng phập phù khi bạn chuyển đi nơi khác (nhưng hay cái là bạn có thể đăng ký dịch vụ bưu điện tự động chuyển thư của bạn qua địa chỉ mới; cái này còn xịn hơn routing bằng iptables nhé.)
Thuê nhà ở Berlin khó hơn mua nhà ở quận 7 sài gòn, một phần vì quá đông người thuê, và phần chủ yếu là bạn mới qua đây, chưa ai biết bạn là ai, thu nhập thế nào: Một khi đã thuê nhà ở, chủ nhà rất khó có lý do để đuổi bạn đi, nên nhiều chủ nhà hỏi bảng lương của bạn trong vòng mấy tháng cuối thì mới cho thuê nhà đấy (nên nhớ, chính công ty bạn sắp xin vào cũng không dám hỏi bảng lương của bạn nhé.) Nhưng có nhà rồi, coi như khỏe re rè re luôn. Mình thuê nhà 65 mét vuông, hai phòng, hết khoảng 760e mỗi tháng.
Chúc bạn may mắn.
Các câu hỏi thường gặp, cho người đến Berlin:
-
Có vấn đề gì không, nếu lịch hẹn ở lãnh sự quán sau thời gian bắt đầu hợp đồng?
: Bạn chỉ việc báo lại công ty để làm lại hợp đồng sau này thôi. Công ty sẽ chờ bạn, việc này thường nằm trong kế hoạch dự tính rồi -
Không có bằng đại học được không?
: Tiêu chuẩn chung của châu Âu, chứ không chỉ riêng Đức, là bạn có bằng đại học, hoặc một bằng tương đương (được công nhận) ở châu Âu. Bạn cần ghi rõ và trao đổi thẳng thắn với công ty (hoặc visa agent của họ) để họ hỗ trợ, đỡ mất thời gian đôi bên. -
Bao lâu thì có visa?
: Cái này lãnh sự quán Đức trả lời cho bạn mới phải. Việc cần làm là bạn chuẩn bị kỹ càng giấy tờ thủ tục, khi nào nộp lên đầy đủ thì họ làm lẹ cho bạn thôi. Mình có visa trong khoảng dưới 2 tuần. -
Mua bảo hiểm gì trước khi qua Đức?
: Bạn phải có bảo hiểm y tế khi đặt chân vào Đức. Bạn có thể hỏi mua các gói bảo hiểm Du lịch ứng với thời gian của visa (ví dụ 3 tháng). Mình thì liên hệ công ty bảo hiểm TK (tk.de) ở Đức để họ làm bảo hiểm cho mình luôn, nên không phải tốn đồng nào, y chang như là mình đã đi làm tại công ty đóng bảo hiểm xã hội ở Việt Nam ấy. -
Chọn hãng bảo hiểm nào
: Mình chọn TK, khá phổ biến ở Đức. Đó là bảo hiểm công. Nếu chọn bảo hiểm tư ngay từ đầu thì bạn không có cơ hội chuyển ngược lại bảo hiểm công, nên bạn cần lưu ý chọn đúng loại. Bảo hiểm của bạn có thể mua thêm cho vợ, con mà không tốn quá nhiều. -
Mua simcard ở Đức dễ không?
: Mua đúng luật thì dễ rồi, mua trái luật cũng không khó lắm. Các tiệm bán sim khá phổ biến, việc kích hoạt sim đôi khi... không cần cả passport của bạn, do đã có người kích hoạt sẵn (giống ở Việt Nam). Mình cũng mua loại sim này, sau đó viết email gửi cho nhà mạng bảo họ đổi lại cho đúng tên mình -- việc này chỉ thực hiện được nếu bạn có Anmeldung ở Đức. Chi phí khá rẻ, khoảng 20 - 25e có đủ xài đỡ rồi. Mình dùng mạngortelmobile
họ có trang tiếng Anh và hỗ trợ rất tốt :) -
Đăng ký tài khoản ngân hàng thế nào?
: Trước đây, mình đăng ký ở N26, nhưng hiện nay họ không hỗ trợ visa ngắn hạn (3-tháng) từ Việt Nam. Mình đi hỏi vài ngân hàng khác (Commerzbank, Postbank) họ đều yêu cầu visa 6 tháng trở lên. Đây đúng là trở ngại: Không có tài khoản ngân hàng thì một số thủ tục sẽ bị tắt nghẽn, và bạn sẽ không thể nhận lương trong vài tháng đầu. Quả thật là, trong vòng 3 tháng đầu mình không nhận được tiền từ công ty, nên toàn phải ăn không khí thôi à. -
Bao lâu thì có PR?
: Đã nói trong phần 1. Nếu có bằng B1 tiếng Đức thì tối thiểu 21 tháng. Không thì chờ 3 năm. Sau 8 năm bạn có quyền xin quốc tịch Đức (nhưng đồng thời bạn phải bỏ quốc tịch Việt Nam.) -
Thử việc bao lâu, nếu mất job thì sao?
: Thời gian thử việc có thể đến 6 tháng, như trường hợp của mình. Trong thời gian đó, hai bên có quyền kết thúc hợp đồng sau khi báo trước 2 tuần. Sau thời gian thử việc, thời gian đó (notice period) lâu hơn, đến 3 tháng.Nếu mất job, bạn phải báo với cơ quan quản lý, và bạn có thể ở lại Đức 3 tháng sau đó tìm việc mới. Tìm không ra thì ... xin mời về.
-
Bluecard có thời hạn bao lâu?
: Tối đa 4 năm, và không lâu hơn hợp đồng của bạn (cộng thêm 3 tháng như vừa nói ở trên). Các công ty ổn định về tài chính có thể cấp cho bạn hợp đồng vô thời hạn, khi đó thì bạn có ngaybluecard
4 năm. -
Mua vé tàu điện thế nào?
: Bạn chưa có tài khoản ngân hàng thì không mua được vé năm (trung bình trả 64 euro mỗi tháng). Mua vé tháng mất khoảng 81 euro. Nếu không phải đi lại thường xuyên, bạn có thể mua từng set 4 vé một chiều (mỗi vé chỉ được đi một chiều, không được quay ngược lại) giá 9 euro. Nếu có con nít đi kèm bạn tìm hiểu thêm vé ngày ;) -
Thuê nhà ở Berlin khó thế nào?
: Đã nói sơ sơ ở vài chỗ rồi, luật của Đức khiến chủ nhà không dễ đuổi bạn một khi bạn đã dọn vào ở; nên việc đầu tiên là ... tiền đâu, bạn phải chứng minh khả năng tài chính bằng bảng lương của các tháng trước. Có rất nhiều người có nhu cầu thuê, trong khi không có nhiều chỗ, nên giá thuê tăng chóng mặt, các chủ nhà càng được cớ làm chảnh.Việc thuê nhà thành công sẽ giúp bạn có tờ giấy Wohnungsgeberbestätigung, là xác nhận của chủ nhà cho bạn vào ở (và khi bạn rời đi, bạn lại phải xin cái giấy tương tự để rời nhà, phức tạp ghê.) Giấy này làm cơ sở cho rất nhiều thủ tục khác nhau, từ đăng ký tài khoản ngân hàng, sim điện thoại, ... và cũng là điều kiện tiên quyết để có thể đăng ký Anmeldung. Muốn Anmeldung phải có Wohnungsgeberbestätigung, muốn có Wohnungsgeberbestätigung phải có tiền thuê nhà, muốn có tiền thuê nhà phải chứng minh bằng tài khoản ngân hàng, muốn mở tài khoản ngân hàng ở Đức phải có ... Anmeldung. Nó lòng vòng giống Việt Nam vậy.
Các công ty có thể giúp bạn thuê nhà tạm trong thời gian ban đầu. Vì địa chỉ thuê nhà sẽ nhận rất nhiều thư từ (một cách để xác thực) nên bạn cần cân nhắc thời gian thuê để ổn định trong vài tháng đầu, nếu không sẽ bị lạc thư. Như mình đây trong 6 tháng đầu tiên ở Berlin, rất thường xuyên nhận thư của vài ba người khác từng ở, trong đó có cả thư trát bắt người =))
Việc thuê được nhà ổn định là việc rất khó, bạn nên để thứ tự ưu tiên cao nhất. Thuê nhà rồi chuyển đi càng điên hơn. Tiền cọc trung bình ba tháng, và sau khi rời nhà thì có khi đến một năm sau bạn mới có thể nhận lại tiền cọc, theo luật mới nhất.
tags: #linux #vn #saigonlug
ArchLinuxVn
chào mừng sự trở lại của các bạn An stk và Huy-Ngo trên
nhóm telegram @linuxvn. Sau thế chiến thứ ba, các bạn đã lưu lạc quá lâu,
đi làm kinh tế ở đâu không biết nhưng lúc trở lại đã tăng gấp đôi băng
thông cho hệ thống mirror (f.archlinuxvn.org) là điều thật đáng trân trọng.
ArchLinuxVn
chỉ còn là cái tên từ hồi xưa. Nhiều bạn giờ nâng cấp lên
phiên bản MacOS của ArchLinux
. Giờ ngồi với nhau người ta không hỏi
Linux là gì, mà hỏi Docker là gì, rồi k8s là gì.... Kể ra, không phải vì
ai cũng đã hiểu Linux, chẳng qua Linux không còn phải là cách dễ kiếm
cơn như ngày xưa nữa.
Sự trở lại của An stk và Huy Ngo còn được đánh dấu bởi việc phiên bản kế
tiếp của MacOS chuyển qua shell mặc định trên hệ thống là zsh
, thay vì
Bash-3
. Mình đã gặp rất nhiều trục trặc khi hỗ trợ cho người dùng Bash
trên máy MacOS, giờ chắc đau đầu hơn. Nhưng thật sự GPL có vấn đề với
bọn
nhà giàu. Biết sao, buồn một phút.
Cảm ơn các bạn An stk và Huy Ngô.
tags: #devops #strategy #murphy #essential
Trang wiki tóm tắt luật Murphy: "Anything that can go wrong will go wrong". Câu tiếng Anh này ngắn gọn đến nỗi không cần phải dịch, ai cũng hiểu.
Mình không nhớ biết đến luật này tự bao giờ. Nhưng rõ ràng nhiều bạn vẫn chưa biết luật này. Mình không rõ có tài liệu tiếng Việt nào viết về nó. Điều đáng ngạc nhiên là, rất khó để chứng minh cho bạn thông luật này. Dù nó được xác nhận nhiều bởi thực nghiệm, nó là một luật thống kê. 99 phảy với một trăm số chín xếp hàng ngay ngắn theo sau, vẫn không phải 100 (phần trăm).
Mình muốn viết bài về luật này rất lâu. Trong bài trước đây chẳng hạn
root-is-rut
, đã có nhiều ví dụ. Có thể hù bạn,
mức độ kinh nghiệm của bạn trong nghề devops
đo được bằng mức độ bạn
hiểu và áp dụng luật Murphy tới đâu trong hệ thống của bạn =))
Trong ví dụ mà bạn đã biết về sao lưu postgresql
:
Tất cả các khách hàng không sao, chỉ trừ một chú bị trục trặc với kịch bản
mà đội ops giải gần hai tháng chưa xong triệt để triệt để (k8s/stolon.)
Từ khi ngay lúc định hướng viết hỗ trợ sao lưu, vấn đề này đã được nêu ra.
Nhưng với tất cả các lý do, thiết kế hướng tập trung để né tránh xung đột
với ứng dụng bị bỏ qua. Một cách vi phạm luật Murphy rõ ràng :P
Một chuyện hài khác. Ai đi tàu không có vé, coi như đi lậu, sẽ bị phạt 60e một lần. Anh bạn cùng chỗ làm kể, anh ta đi 4 năm trời không sao hết. Đúng bữa anh ấy hết vé, lại quên đi nạp tiền, thì bị ngay đội tuần bắt. Mất ngay 60e tiền ngu chứ sao =)) Luật Murphy đây áp dụng chính xác quá luôn haha.
Luật Murphy áp dụng cho hệ thống nfs là nản lòng nhất. Các hệ thống nfs
phụ thuộc vào hạ tầng mạng, thường nằm tách biệt với các tầng ứng dụng
phía trên. Năm 2013, mình nhớ cty cũ bị lỗi liên quan nfs, cả đội ngoác mõm
ra chờ mấy tiếng đồng hồ. Còn mới đây thôi, hôm sáng thứ hai đầu tuần, đội
Noc ngồi nâng cấp core switch, dù có đầy đủ backup, failover, nhưng một chú
switch nào đó hỏng đơ phải reboot lại, thế là tạch luôn cả bọn, tạch luôn
hệ thống nfs. Cả một hệ thống đâu mấy chục máy và dịch vụ phải khởi động lại,
mất hai ngày mới xong hết các lỗi, nhưng các hệ quả vẫn còn lại
-- xem random-notes-1
.
Luật này cũng liên quan tới phép quy nạp không hoàn toàn, xem đây:
https://icy.theslinux.org/m/kyanh.net/2016/03/22/sau-1-2-3-4-5-6-se-la-gi/index.html
Trong ngành ngân hàng hay ở mức quản lý cao cấp, có chuyện risk management
.
Trong cuộc sống có ngành bảo hiểm. Áp dụng cực đoan luật Murphy, bạn sẽ
thấy chỉ còn hai thứ có thể cứu vãn, niềm tin và sự may mắn của bạn :)
Nếu để ý tới luật Murphy, rất nhiều bài toán Ops sẽ được sáng tỏ :)
tags: #berlin #relocation #devops #bluecard
Mình viết bài này lâu rồi, nhưng để xó vì dự tính khác; hôm qua thôi, biết có bạn đang chuẩn bị hành lý qua Berlin, nên mình thấy nên viết lại, nhưng theo kiểu khác.
Bạn biết là, mình đi công tác ở đây vài tháng rồi. Xa bạn bè gia đình, xa những ngày nắng nóng hay những lúc mưa buồn của sài gòn. Hay nhớ những quán nhậu, cà phê vỉa hè. Ôi, nhớ nhất là những quán cà phê, chắc không nơi đâu trên thế giới có kiểu như sài gòn vậy =^^
Berlin không đẹp như Paris. Sau thế chiến hai, thành phố bị san phẳng, các tòa nhà ở đây tuổi đời đâu 70 trở lại thôi. Nhưng berlin nhiều cây cối công viên tàu điện và xe đạp (số xe vẫn thua Hà Lan?) Một bạn chỗ mình làm mỗi ngày hai cuốc xe đạp đi về, mỗi chiều 32 km. Tốc độ xoàng xoàng 41km/h. Quá khiếp. Mình từng đi làm với xe đạp ở Sài gòn, 7km hết chừng 1 tiếng, tốc độ rùa khỏi chê.
Ôi lan man thế, cho biết bạn mình cũng có khiếu văng nghệ không thua
ai. Còn về kỹ thuật: Berlin khá cởi mở trong việc tuyển người các ngành
công nghệ. Nếu có công ty ở đây nhận làm, hầu như bạn sẽ có thể bay qua
đây trong hai tháng. Tìm việc khá dễ, bạn vào LinkedIn tìm thôi, nếu bạn
chịu bỏ ra 30 đồng ông tơn (usd) thì bạn có nhiều job ngon nữa cơ;
mà cũng chả cần mất số đó, tháng đầu LinkedIn cho miễn phí. Bạn cũng sẽ
biết mức lương của senior devops engineer
ở đây vào khoảng chính (phân
phối chuẩn) từ 65k đến 70k euro mỗi năm trước thuế. Chế độ lao động thì
tuyệt vời. Mỗi năm có ít nhất 24 ngày phép, chưa kể ngày nghỉ lễ công cộng,
chỗ mình làm cho hẳn 29 ngày luôn, tha hồ đi chơi. Sau giờ làm việc
thì khỏi ai dám gọi bạn nếu không muốn phạm luật hay trả tiền. Bia Đức
tuyệt ngon. Ở Berlin, mại dâm cũng được luật cho phép. Thiên đường thế
còn gì =))
Nếu nhận lương chừng 65k/năm, thì bạn còn lại nhiêu? Tiền thuế độc thân đâu khoảng 38 - 40%. Mỗi tháng bạn tiêu cơ bản đâu 300e (mỗi ngày 10e), nếu bạn chịu khó nấu ăn uống. Đắt nhất tiền nhà, tùy bạn muốn ở bao nhiêu, mình phải trả 760e mỗi tháng chưa kể điện nước internet. Nhưng nói chung, con số dư ra chả nhiêu, không thể giàu như mấy ku ở Việt Nam được.
Ở 21 tháng bạn thi bằng B1 tiếng Đức (giống ielts 6), thì được quyền định cư vĩnh viễn (nhưng bạn không được liên tục rời khỏi Đức quá 6 tháng). Nếu lười, bạn cứ việc chờ 3 năm, quyền đó tự động có cho bạn. Sau 8 năm, bạn có quyền đổi màu quốc tịch (ôi, chắc mình không ham, nhỉ) Nhưng chưa vội xa vời; chỉ cần có quyền làm việc với Bluecard bạn đã có thể đi khắp châu Âu không bị xách mé rồi. Nhưng nếu bạn ăn thịt heo, thịt chó, thì nhớ nói nhỏ tí, vì niềm tin của người khác sẽ khác bạn nhiều lắm lắm.
Gần đây Úc mới mở ra visa 482 thay cho visa 587 xưa kia dường như chỉ ưu tiên cho du học sinh. Với 482 bạn có thể xin việc dễ dàng hơn ở Úc, chỉ với trình độ ietls tối thiểu 5.5. Mình ghét Úc là vậy, tao đây qua châu Âu sống khỏe re, việc gì phải bỏ tiền ra thi cái bằng chỉ có giá trị hai năm để chỉ chứng minh ta có thể nói tiếng Anh ở Úc?
Còn nhiều thứ lắm; nhưng lời khuyên là trước khi bước chân qua đây,
nên nghĩ đến các vấn đề chiến lược lâu dài. Berlin và châu Âu dân số già đi.
Người trẻ nuôi người già, nên hàng năm, mức chi trả cho bảo hiểm xã hội
giảm dần, hiện nay là 48% và sẽ còn giảm tiếp. Dù luật có cơ chế để hạn chế
rủi ro
này, bạn cũng nên tính tới. Con gái nhỏ ở đây học ở trường công
tiếng Đức, được duy nhất nước Đức nói thôi:) Từ 1/8, con nít được miễn
vé tàu điện, ngoài khoản trợ cấp 200e mỗi tháng.
Người Sài gòn ít nhất là dân kỹ thuật giỏi, có thể đi khắp thế giới nhỉ. Chứ bọn tây, ít người qua Việt Nam làm Devops đó. Deal lương hơi khó. Có một số bạn chia sẻ trên kênh https://t.me/g7expat, có khi giúp ích cho bạn khỏi thiệt, không phải để bạn đứng núi này trông núi nọ. Chỗ mình, có các kỹ sư 50 60 tuổi vẫn lập trình PHP hay Java. Quan trọng là hạnh phúc, không phải tiền lương bạn nhé.
tags: #notes #random #retrospective #puppet #salt #ansible
Bữa có mẹo dùng nmap
, giờ mình ghi lại kết quả để so sánh. Kịch bản cũ dò
hơn 450 host, mỗi máy dò 33 cổng, thời gian mất từ 1h đến 2h mới xong.
Kịch bản nmap
mất dưới 1 phút, tìm ra khoảng 730 target cho Prometheus.
Trong ghi chú trước về sao lưu postgresql
, cách dùng disk snapshot
vẫn ổn chưa gặp sai sót gì; việc sao lưu vào lúc khoảng 5h chiều (gmt+2).
Có thể giải thích là do database hoạt động ít quá, mỗi ngày tăng
trung bình 1gb - 5gb theo mình nhớ. Còn team vẫn loay hoay đủ cách để
chạy pg_basebackup
; dùng stolon
lại thêm k8s
thiệt khổ đời.
Cách hai của việc sao lưu postgresql
, là dùng rsync
. Cách này yêu cầu
phải tắt dịch vụ postgresql
như đề cập trong tài liệu của chính thức,
với các ghi chú về hạn chế, điều kiện và biến thể. Tuy nhiên, nếu từng
triển khai barman
, sẽ thấy barman
dùng rsync
thôi, không cần tắt
dịch vụ gì trước đó. Như thế tốt quá. Nhưng phải đọc mã nguồn của barman
(viết bằng Python) mới hiểu được cặn kỹ. Ai rảnh không?
Hôm qua mình chạy dry-run
cho một thay đổi nhờ salt
xong, rồi chạy
thiệt. Hệ thống production
tạch luôn, báo động ầm ầm: Lúc thử thì bình
thường, lúc apply
thiệt thì có thêm thay đổi do một bạn khác, làm việc
khác, broadcast các thay đổi về nfs
. Bị cho lên trụ điện nhưng may mình
có log làm bằng chứng, nên leo xuống được ngay. Hú hồn. Chuyện gì cũng
có thể xảy ra, anh em cứ thi nhau đẩy hàng vào master
, test một chỗ apply
chỗ khác, im im làm không thông báo ai, thì có ngày bắn vào chân mình thôi.
puppet
, salt
, ansible
... bạn chọn cái nào? Ví dụ vừa rồi giúp bạn
hiểu, hãy chọn cách mà bạn có thể làm đúng đắn nhất. Một số tình huống
có tính chiến lược thì mình không bàn tới. Trong hệ thống của mình có
hơn 450 host, một nửa quản lý bằng salt
, nửa còn lại bằng puppet
:)
Nên để cho tiện, mình bí mật dùng ansible
trị cả hai :))
tags: #database #pgsql #backup #snapshot #googlecloud
Hệ thống mình phục vụ khá nhiều khách hàng; mỗi triển khai (deployment)
gồm nhiều loại database khác nhau, chạy trên k8s
. Các kịch bản sao lưu
chạy tốt cho tất cả triển khai, ngoại trừ một khách hàng A có dữ liệu khá
lớn và tăng liên tục, trên postgresql
. Do một quyết định thiết kế cũ
mà triển khai dựa trên Stolon (https://github.com/sorintlab/stolon),
nhưng hỡi ôi, nhiều thứ Stolon còn chưa sẵn sàng, ví dụ không hỗ trợ
rsync
sorintlab/stolon#389.
Trong hệ thống của A, khi kịch bản sao lưu chạy thì ứng dụng ngất ngư.
Về bản chất, kịch bản sao lưu dùng pg_basebackup
, dựa trên streaming
protocol của pgsql
; không có nhiều tùy chọn khi dùng công cụ đó,
kể cả việc nén khi gửi dữ liệu giữa các máy. Các kiểu sao lưu khác,
xem thêm tại https://www.postgresql.org/docs/9.1/backup-file.html:
-
Dump dump dumb...
-
Dùng
rsync
để gửi bin/WAL log ra chỗ khác (đây là một trong hai cách mà công cụ nhưbarman
hỗ trợ) -
Dùng
file-system
backup (sao lưu nguyên cục/var/lib/psql/data/
)
Dùng pgsql
trong k8s nghe phát mệt; quá tuyệt vọng với sự phức tạp của
các phương án khác, mình đã thử phương án đơn giản nhất, là lấy snapshot
của đĩa slave
trong Stolon cluster. Trong lòng đầy nghi hoặc, bởi đảm bảo
cho snapshot này tốt, dữ liệu có thể phục hồi được nghe nó xa vời quá.
Xưa giờ, chưa bao giờ mình tin vào việc lấy snapshot của đĩa chạy database;
thế nên, mình đã thiết kế kịch bản rất kỹ như sau:
-
Xác định chính xác pod
slave
trong Stolon cluster. (Tóm tắt cho bạn chưa biết, Stolon nó bật một nodemaster
, vài nodeslave
, và nó có cơ chế hoán đổi tự động;) -
Lấy đúng đĩa ứng với
pvc (persistent volume claim)
đang dùng bởi pod đó. -
Tạo snapshot từ đĩa trên, tạo một đĩa mới cùng kích thước,
-
Sau đó, kết nối đĩa mới tạo ra vào một máy tạm thời trên GCE, dùng một docker image được chỉnh riêng để kiểm tra đĩa này. Docker container được tạo ra gồm một tiến trình cho để chạy
postgres
, một tiến trình khác theo dõi log sinh ra từpostgres
. -
Sau khi xác định điểm lỗi hay điểm dừng, toàn bộ đĩa và máy tạm thời được xóa đi, và gửi thông báo tới các kênh theo dõi.
Kết quả rất bất ngờ như sau:
-
Việc tạo snapshot rất nhanh. Nếu tạo mới hoàn toàn (base), mất khoảng 10 phút. Các snapshot sau đó còn nhanh hơn nữa, do nó chỉ phải gồm các thay đổi so với bản snapshot trước đó. Tất cả các snapshot đều được
nén
, nên kích thước nhỏ đáng kinh ngạc (mặc dù cũng xem xem kết quả nén khi dùngpg_basebackup
) -
Khi chạy
postgres
kiểm tra, do dữ liệu gốc ở podslave
, nên xuất hiện tập tinrecover.conf
trong thư mục/var/lib/pgsql/data/
, cần phải xóa đi. Sau đó,postgres
tự phục hồi lại dựa theo thông tin binary cuối cùng đang có, có thể bỏ qua WAL log cuối cùng. (Thực ra, bộ snapshot hầu như không có thêm WAL log nào ghi kèm, do mình chưa bật.) -
Việc chạy phục hồi (restore) thử chưa gặp trường hợp nào lỗi; và cũng khá nhanh, mất khoảng dưới 20 phút, trong đó, thời gian chủ yếu ở chỗ tạo snapshot mới, và tạo đĩa mới từ snapshot đang có.
So với việc tốn hơn 6 tiếng đồng hồ khi dùng pg_basebackup
, thì việc
dùng snapshot của google cloud quá đơn giản, ổn định, nhanh nữa, và
muốn PITR
thì chỉ việc tạo snapshot thường xuyên hơn.
Tất nhiên, điều mình trông đợi nhất, là phương án này bị lỗi, bị sai một lúc nào đó. Bởi khi đó mới có chuyện để viết tiếp à.
tags: #hadoop #metadata #backup
Hệ thống tập tin
của Hadoop
, gồm hai phần cơ bản là datanode
và namenode
. Như con trỏ trong lập trình C, namenode
là về địa chỉ (metadata),
còn datanode
là về nội dung con trỏ lưu trữ.
Hệ thống có hai namenode
chẳng hạn, thì chỉ có một active
thôi,
còn lại ở chế độ chờ standby
; chuyện gì xảy ra nếu cả hai cùng sập?
Không địa chỉ đồng nghĩa với lạc đường, bạn chỉ còn nước format và nạp lại
hệ thống hdfs
hoàn toàn mới.
Sao lưu sao lưu sao lưu. Các hướng dẫn trên mạng đầy ra, bạn cứ thử gõ
hdfs metadata backup
rồi làm theo, đại ý:
$ hdfs dfsadmin -fetchImage backup_dir
Đọc theo làm theo, y chang vậy, thì rắc rối bắt đầu. Thật sự chỗ backup_dir
,
phải thỏa mãn điều kiện tiên quyết: Đó là một thư mục đã tồn tại. Nghĩa
là, lệnh chính xác phải như sau
$ mkdir -pv backup_dir/
$ hdfs dfsadmin -fetchImage backup_dir/
Kết quả là các tập tin fsimage_*
được tạo ra trong backup_dir/
.
Nội dung giống như trong thư mục, ví dụ, /home/hdfs/data/nn/current/*
,
tùy vào cấu hình của bạn, là nơi lưu trữ metadata của hdfs
đang chạy.
Một số tài liệu chỉ nói đơn giản là bạn chép nguyên cục đó ra
$ tar cfvz my_nn_backup.tgz /home/hdfs/data/nn/current/
Tại sao có hai cách, kết quả khác nhau thế nào? Có vẻ như việc dùng lệnh
hdfs dfsadmin
trông sang chảnh và hợp lý hơn. Đúng thế, cho tới khi
bạn phải phục hồi hệ thống thật sự. Trời đất, các tài liệu mình tìm được
đều nói tới việc chép lại các tập tin ảnh đó ra thôi. Thế nên mình thử
$# giả sử không có namenode nào đang chạy
$# giả lập nhờ systemctl stop hadoop-* trên tất cả các namenode
$# nn chính là viết tắt của namenode
$ rm -rf /home/hdfs/data/{nn,snn}/current/
$ mkdir -pv /home/hdfs/data/{nn,snn}/current/
$ cp /backup/fsimage_* /home/hdfs/data/nn/current/
$ systemctl start hadoop-namdenode
$# tạch toàn tập, không lên nổi. Viagra bó tay.
Tới đây bạn sẽ gần như tuyệt vọng. Hệ thống báo là namenode
chưa
được format. Nếu chọn format mới hdfs namenode -format
đồng nghĩa
với việc xóa sạch cài lại cluster mới (FIXME), đó không phải là phục hồi
từ bộ sao lưu.
Nào google tìm, thật may bạn thấy bài viết này, bởi vì có thể tất cả các bài trước đây đều thiếu hai điều rất quan trọng như sau:
-
Bạn phải backup
/home/hdfs/data/nn/current/VERSION
-
Bạn phải tạo checksum cho từng tập tin
fsimage_*
Hai việc này không hề có khi dùng hdfs dfsadmin -fetchImage ...
$ cd /home/hdfs/data/nn/current/
$ cp /backup/fsimage_* ./
$ cp /backup/VERSION ./
$ for _file in fsimage_*; do md5sum $_file > $_file.md5; done
Rốt cuộc, mình chả hiểu lệnh với -fetchImage
để làm gì nữa luôn:
nó tạo ra ảo tưởng rằng mọi thứ đã sẵn sàng cho trường hợp tệ nhất,
nhưng thực ra, cách đơn giản phải làm chính là cách thứ hai
tar cfvz my_nn_backup.tgz /home/hdfs/data/nn/current/
.
Tập tin VERSION
là gì, tại sao nó quan trọng? Từ từ, việc cần làm
trước là thử phục hồi từ bộ backup bạn đang có. You will never know
if you don't go -- một câu trong bài hát phim hoạt hình Shrek.
Sau đó, đọc thêm: https://hortonworks.com/blog/hdfs-metadata-directories-explained/
tags: #prometheus #nmap #network #scanning #lua
Mình có vài trăm hosts cần quét nhanh để lấy danh sách target
cho
Prometheus. Script hiện có chạy tuần tự, dùng curl
để kiểm tra, ví dụ
http://foo:9100/metrics, có trả về mã 200 hay không; toàn bộ script chạy
gần 2h mới xong.
Dùng nmap chắc chắn nhanh hơn:
$ _ports="9100,9168,9200,9400,"
$ nmap \
>/dev/null \
-iL "hosts" \
-p "$_ports" \
-oN "_discovery.tmp" \
--script +"http-headers.nse" \
--script-args \
"http-headers.path='/metrics', http-headers.useget='true'"
trong đó, hosts
là file liệt kê tất cả các hosts cần quét,
và _ports
lưu danh sách tất cả các port (dư ra dấu phảy ở cuối không
quan trọng lắm; khi bạn tạo danh sách các port bằng bash
thì dễ dư ra
như vậy đó.)
Chỗ +http-headers.nse
có dấu cộng đằng trước. Cái này mình mất chút
thời gian để hiểu tại sao. Kịch bản http-headers
đi kèm với bộ cài
đặt của nmap
, không phải lo lắng tải ở chỗ khác. Kết quả dò lưu vào
tập tin _discovery.tmp
như sau
$ Nmap 7.70 scan initiated ...
Nmap scan report for k8s-001.lauxanh.net (10.0.0.2)
Host is up (0.0069s latency).
Not shown: 31 closed ports
PORT STATE SERVICE
9100/tcp open jetdirect
| http-headers:
| Content-Length: 143114
| Content-Type: text/plain; version=0.0.4
| Date: Tue, 30 Apr 2019 14:44:54 GMT
| Connection: close
|
|_ (Request type: GET)
Việc còn lại là làm sao đọc ra danh sách cách target từ _discovery.tmp
?
Việc này không hề đơn giản, chưa kể kết quả của nmap
chỉ cho biết
cổng mở mà không biết thực sự exporter
có trả về 200 hay không.
Làm sao đây? Điều chỉnh trực tiếp kịch bản http-headers.nse
(/usr/share/nmap/scripts/http-headers.nse), ví dụ
https://gist.github.com/icy/191de6e6a30e7ac8f8068d288264d51a/revisions#diff-8a0ced239ddcc2ee44a526a3e5fd8163
sau đó chạy
$ sudo nmap --script-updatedb
$ nmap ...
$ grep service/200 _discovery.tmp
|_ service/200: k8s-001.lauxanh.net:9100/metrics
|_ service/200: k8s-002.lauxanh.net:9100/metrics
$# ...
Tuyệt vời ông mặt trời. Điều đáng buồn là mình viết vầy cho bạn xài, còn mình vì một lý do thiên địa trời đánh, không xài được những gì viết trên đây cho hệ thống thật sự. Khi nào uống cà phê kể sau ha.
Cuối cùng, curl
đọc là si du a eo
(see-url
) nhe các bạn. Nếu bạn
biết tác giả của curl
nói điều này ở đâu thì cho mình xin cái link.
Cảm ơn bạn nhiều.
tags: #root #shell #linux #rut
Nhiều chỗ phải xài root
shell, không né được. Không phải do công ty
to nhỏ gì, không phải sản phẩm tốt xấu gì. Chẳng qua... xài root
thì
quá tiện, giống đi xe máy ở Sài Gòn vậy, chỗ nào cũng tới được.
Ông ops/admin
trước lười thì ông sau lãnh đủ, vậy thôi.
Phần dưới nêu vài chuyện vui khi nghịch với lửa đây.
-
hostname -f
nhầm thànhhostname f
: Một số bàn phím trời đánh, nhả phím không được, nên sau lệnhhostname f
thì toi, bạn phải đi lục tunghistory
lên coi hostname cũ thế nào mà phục hồi lại. -
copy-&-paste
: thế kỷ21
rồi nhỉ, nhưng copy một chỗ rồi paste ra chỗ khác không phải lúc nào cũng đúng ý đâu nhe :) Cẩn thận nhất, trước khi dán vàoterminal/shell
, bạn thử dán ra chỗ nào đó trước. Không thì lâu lâu gà gà gật gật là y như rằng một mớ thứ nhảy múa trongterminal
. Bạn thử chép nội dung log sau vào dán vàoterminal
xem: https://gist.github.com/icy/d8d2598acc31523317b93547d35bb304 :) -
shutdown
nhầm: thôi khỏi cần nói gì thêm nhe, mất công haha -
Mất
/dev/zero
hay/dev/null
hay/dev/log
: Nghe buồn cười nhưng chuyện kỳ dị này cũng có thể xảy ra: Ví dụ nè https://icy.theslinux.org/m/kyanh.net/2015/06/06/the-slig-returns/index.html#slig29. Vấn đề là nhiều khi khó nhận biết cho tới khi .. khá trễ. Khi mất/dev/null
thì bạn vẫn xài nó khá bình thường, ví dụcat foo > /dev/null
, cho tới khi... đĩa đầy chẳng hạn. -
Lock down
: hihi,sudo
có cú pháp trời đánh để nạp cấu hình bên ngoài, ví dụ#includedir /etc/sudoers.d
. Nhiều bạn gà gà gật gật cho mình là siêu nhân, chỉnh lại cho đúngincludedir /etc/sudoers.d
, xong đi uống cà phê, ăn trưa rồi tắt server mount lên chỗ khác fix lại. -
/etc/nginx/sites-enabled/:wq
: Ơ, bạn đoán ra cái gì đây không? Là do một chuyên giavi/vim
xàinano
. Thiệt tình là sau khi lưu file đó xuống đĩa rồi thì anh em đi fix cả ngày không biết tại sao cấu hình mới không ăn =))
Lưu ý nhỏ nhẹ cuối cùng, nohup
luôn là biên giới trong cuộc chiến
giữa dev
và admin
. Lần nào đĩa đầy là admin
phải lọ mọ vào xài lsof
soi lên nohup
nằm ở đâu (file đó cũng hay bị xóa cho gọn đĩa ấy mà.)
Tạm dừng ở đây, khi nào nhớ ra viết tiếp.
tags: #awk #text #manipulation #shell
gawk
ra phiên bản 5 với thay đổi đáng chú ý là, hỗ trợ namespace
nhờ
đó viết và nạp thêm các module vào chương trình awk
chính dễ dàng hơn.
Bạn có thể xem vài lời của tác giả của thay đổi này ở địa chỉ
http://www.skeeve.com/awk-sys-prog.html.
Phần tiếp theo giới thiệu với bạn kỹ thuật đơn giản rất có ích
cho nghề ốp (ops), tất nhiên là dùng (g)awk
để xử lý. Bài toán thế này,
bạn có chương trình xyz
nào đó, chạy bằng docker cho có vẻ sang trọng,
ghi liên tục các thông báo ra thiết bị STDOUT
, STDERR
. Và bạn
muốn biết khi nào xuất hiện dòng lỗi, ví dụ có chữ ERROR
. Dễ thôi nhỉ,
$ /lauxanh/bin/xyz 2>&1 | grep ERROR
Cách này có cái dở là, tất cả các dòng không có ERROR
đều biến mất tiêu.
grep
không giúp được gì rồi
(thực ra cũng có thể, khi bạn dùng coproc
với Bash
;
nhưng như thế thì quá cao siêu rồi).
Đơn giản là dùng awk
$ /lauxanh/bin/xyz 2>&1 \
| awk '
BEGIN {
found_error = 0
}
{
printf("%s\n", $0);
if ($0 ~ /ERROR/) {
printf(":: Cá mập cắn cáp rồi. Lỗi lỗi lỗi.\n");
found_error = 1;
}
}
END {
exit(found_error);
}
'
$ ret="$?"
$ if [[ $ret -ge 1 ]]; then
echo >&2 ":: Đụng cá mập thì thôi, bó tay."
fi
Chương trình gawk
này đơn giản là đọc tất cả tin gửi đi từ chương
trình xyz
, in ra STDOUT
, và khi xyz
ghi ra dòng nào có ERROR
,
sẽ có thêm thông báo về cá mập, và đồng thời gán kết quả trả về của
dòng lệnh là found_error
, hay là 1
, để bạn xử lý tiếp.
Đơn giản nhỉ. Bạn có thể làm phức tạp hơn bằng Ruby
hay Python
đấy :D
Vài ứng dụng khác từ ý tưởng của đoạn mã awk
ở trên
-
Poll để biết khi nào container sẵn sàng, ví dụ https://t.me/linuxvn/39876
-
Trả về các kết quả (exit code) khác nhau tùy vào các mẫu khác nhau
-
Đếm lỗi, ví dụ xử lý tập tin
acces.log
theo cách thô sơ. -
Xử lý kết quả trả về của
curl
,wget
và trả về mã lỗi tương ứng với nội dung thu được.
tags: #search #browser #gogreen
Bữa giờ mình không khỏe, nên không viết gì dù có khá nhiều thứ cần coi
và ghi chú lại. Mình định viết về giấy phép Apache
, về ý tưởng phân tán
trong (dev)ops
, vài công cụ khác. Ngoài ra, tìm cách dọn dẹp lại cách
gửi bài lên Telegram: Như bạn thấy hiện giờ bài khá dài và khó tìm kiếm.
Bạn luôn có thể đọc lại dễ dàng trên Github, trước khi có bản Web
hy
vọng khá hơn.
Bài này giới thiệu về dịch vụ tìm kiếm ecosia
.
Khá chắc là mình biết nó khi đọc HackerNews. Nó như Google, Yahoo, Bing,
Cốc Cốc / Lauxanh thôi. Bạn cần tìm gì, gõ vào, nhấn Enter thì ra kết
quả.
Khác biệt lớn nhất ở chỗ, ecosia
là dự án có mục tiêu rất xanh
:
Mỗi khi bạn tìm kiếm, ecosia
sẽ phát sinh thông tin để điều hướng dịch
vụ quảng cáo, trên đó ecosia
thu tiền, và dùng phần lớn số tiền thu
được để trồng cây xanh ở khắp nơi trên thế giới.
Đừng lo, ecosia
tuyên bố rất rõ ràng về sử dụng thông tin riêng tư của
bạn, xem ở https://info.ecosia.org/privacy . Cách dịch vụ này kiếm tiền
có ở https://info.ecosia.org/what. Công ty phát triển ecosia
có trụ
sở tại Berlin
nhé. Đọc kỹ phần privacy
bạn sẽ thấy ecosia
là
partner của Bing
.
Theo con số từ trang chính của dịch vụ lúc mình viết bài này, số cây đã được trồng là hơn 54 triệu. Không rõ mình đóng góp được bao nhiêu: Mình dùng dịch vụ này khi làm việc trên công ty mà;)
Sau khi gây lộn với Google, Duckduckgo, mình đã chuyển qua dùng Bing.
Và khi nào tiện mình sẽ chuyển thiết bị cá nhân qua dùng ecosia
.
tags: #k8s #hardway #helm #learning #devops
Nếu bạn đang bắt đầu tìm hiểu về k8s
thì mình có luôn lời khuyên là
đừng lặp lại sai lầm như mình=) Mình đã bắt đầu với mấy cái khóa
học linh tinh trên edX
, coursera
và cả safaribooksonline
.
Mình coi rất nhiều rồi không hiểu gì hết luôn. Haha. Từ đâu 2016
mình bắt đầu thử với kops
, rồi mãi tới cuối 2018, vẫn còn loay hoay
với minikube
tùm lum. Rốt cuộc, có quá nhiều thứ, tốn rất nhiều
thời gian.
Thế bắt đầu từ đâu? Hãy thử luôn với k8s the hard way
https://github.com/kelseyhightower/kubernetes-the-hard-way
do một kỹ sư của Google
nấu ra. Tài liệu này chỉ có thể thực hành theo
khi bạn có thẻ credit/debit
, có tài khoản Google
.
Bạn nhắm mắt
làm theo là được.
Nếu dùng aws
, bạn có thể theo dõi
https://github.com/slawekzachcial/kubernetes-the-hard-way-aws.
Với Virtualbox
trên máy Linux 64 bạn có thể theo dõi triển khai
do mình viết: https://github.com/icy/k8s-vbox-the-hard-way.
Ối, lại linh tinh lang tang. Bạn phải theo dõi tài liệu gốc
,
viết ra các kịch bản, rồi thêm thắt vào phần tự động hóa cho phù hợp
hệ thống của bạn (terraform
, script
, ansible
, ...)
Có cần thiết như vậy không? Cần chứ, tại k8s
có hai phần
-
Phần cốt lõi,
k8s
: Nó giúp trả lời các câu hỏi như,k8s
có liên quan gì tớiDocker (container)
? Mà tại sao người ta không dùngDocker Swarm
cho rồi? Rồik8s
so sánh với ảo hóa ra sao (sống lâu rồi cũng có người hỏi bạn như vậy). -
Phần tảng băng nổi bên trên, nơi bạn triển khai ứng dụng. Phần này khá là dễ, bạn chỉ việc làm theo mấy tài liệu bập bập là xong ngay luôn. Yêu cầu cơ bản là biết
copy
vàpaste
thôi :)
Tại vì phần 2 dễ, nên trước đây mình đã học nó trước tiên. Hóa ra là chỉ theo bóng, mất thời gian mà không hiểu bản chất vấn đề. Nay viết ra hy vọng giúp bạn có thể tiết kiệm được 3 năm kinh nghiệm =))
tags: #devops #jobs
Bài này dành cho [dev]ops
... tàng tàng :)
Mình đã làm việc với nhiều công ty. Số long đong lận đận. May trong cái rủi, mình gặp nhiều người, làm việc với họ, hiểu họ một chút :) Rốt cuộc, đó chẳng phải là điều rất có giá trị sao? Mỗi người một vẻ, một kiểu, không thể nói ai hơn ai được.
Thế có vẻ trớt quớt, huề vốn nhỉ? Thì đó là chuyện đã qua mà.
Còn trước mắt, nếu bạn đang boăn khoăn không biết chọn công ty nào,
trên tay có hai, ba cái offer
, thì dưới đây là vài mẹo rất hay
để bạn loại khỏi vòng chiến những boss / leader
tào lao hehe :)
Cuối buổi phỏng vấn, hay vòng cuối, thường bạn sẽ được đề nghị có
câu hỏi gì cho công ty. Có một số câu hỏi có thể khiến người đi hỏi
bể đầu, ví dụ, tại sao công ty lại tuyển thêm vị trí này?
,
hay hệ thống của anh (chị) bị sập bao nhiêu lần rồi?
. Với câu hỏi cuối,
hầu hết các trường hợp là trả lời cho qua chuyện, chẳng ai muốn vạch
áo cho người ta xem lưng, nhỉ Nhưng câu hỏi này thật sự giúp bạn
biết được bạn đã 101%
vượt qua tất cả các vòng gửi xe chưa đấy.
Một câu hỏi khác nghe đơn giản nhưng phản ánh gần như toàn bộ cách làm
việc của đội ops
. Đó là,
anh (chị) có dùng tài khoản **root** để quản lý các máy không
.
Một nơi toàn root
không phải để chỗ cho lính lơ tơ mơ nghịch,
hoặc có thể là một hệ thống hoàn toàn mất kiểm soát.
Bạn thử hỏi một câu nhẹ nhàng hơn, liên quan tới luật Murphy
.
Ví dụ, anh (chị) có cho rằng bộ sao lưu dữ liệu của anh (chị) đã bị hỏng hết không
? Câu này sẽ cho bạn biết mức độ quan tâm tới chi
tiết trong hệ thống, và một người kỹ tính như bạn sẽ rất phù hợp.
Vài câu hỏi vậy, nhưng đó là chuyện kỹ thuật. Quan trọng là bạn
chọn được job
để bạn thỏa sức bay cao, bay xa.
(Viết tự an ủi, tự nhiên nhớ Toàn Miami ^.^)
tags: #telegram
Telegram
vừa ra phiên bản với các tính năng rất đáng chú ý,
chưa từng có trong các dịch vụ nhắn tin phổ biến hiện nay.
Bài viết này tóm tắt vài ý có thể bạn chưa biết khi xài Telegram
.
Các tính năng mới yêu cầu bạn phải cài phiên bản Telegram
mới nhất.
-
Khi người khác chọn
Forward
(chuyển hướng) tin nhắn của bạn vào nhóm / người khác, Tên của bạn xuất hiện như là tác giả của nội dung đó. Để bên thứ ba không truy ra được thủ phạm, bạn vào phầnPrivacy + Security
, chọnForwarded Messages
, rồi chọn lạiNobody
hoặcMy contacts
,... thêm các ngoại lệ nếu cần. -
Các dịch vụ như
Facebook
,Viber
,Whatsapp
,... đều yêu cầu truy cập vào danh bạ của bạn. Nhưwhatsapp
sẽ không chạy nếu quyền đó bị từ chối (sic). CònViber
,Skype
, ... ngay cả khi bạn chặn, thì hóa ra trênserver
của các dịch vụ này đã có một phần Danh bạ của bạn (đố bạn tại sao đấy!) Và bạn không có cách nào xóa được nội dung đó, trừ khi bạn xóa hẳn tài khoản của bạn (?!)
Với Telegram
, bạn chỉ việc vào Privacy + Security
, chọn phần
Contacts
và chọn Delete Synced Contacts
để xóa đi phần danh bạ
bạn đã lỡ tay đồng bộ lên máy của Telegram
vì bất kỳ lý do gì.
- Bạn có thể xóa bài bạn đã gửi, bất kể bài đó đã được gửi bao lâu. Trước đây, bạn không thể xóa các bài đã viết quá 48 giờ. Tính năng mới giúp bạn an toàn hơn, nhưng với các nhóm, có lẽ là một điều bất tiện, nhỉ?
Câu hỏi to nhất khi dùng Telegram
, là mô hình kinh doanh của Telegram
là gì, sao lại có một tỉ phú bỏ nhiều tiền ra làm dịch vụ khơi khơi vậy :)
Chịu, bạn có thể tin tưởng, hay không, vào Telegram
. Dù sao thì các
tính năng mới nhất của Telegram
khiến cho nhiều ứng dụng luôn hô hào
đảm bảo an ninh người dùng phải chạy theo bốc khói.
tags: #k8s #helm #panic
Định luật Murphy, tóm tắt Anything that can go wrong will go wrong
.
Định luật này được chứng minh bởi những công ty lớn, như VNG dạo
tháng 9 / 2018. Một công ty nhỏ xíu vẫn chứng minh được nhé.
Chỗ mình dùng Helm
để triển khai ứng dụng,
và Helm
có điều tuyệt vời, là nếu có gì sai sót chỉ việc quay lại
cấu hình cũ, cái vèo :)
Mới thứ ba, tính năng nhỏ xíu của đội ops
được thêm vào ứng dụng.
Có khoảng chục dự án, cái nào cũng ngon hết, chỉ một cái có tí sai
là dùng 2GB
thay vì 2Gi
. Lỗi này bé quá, Helm lint
không thèm bắt cho qua, nên lúc triển khai bản mới
hệ thống bị lỗi. Mình đổi lại, merge
, xong vào ngồi soi pod
.
Chạy ngon lành, mọi thứ đúng mong đợi. Về nhà :)
Sáng thứ tư, đội dev
la ối ối, deploy (triển khai?) mãi không xong,
lỗi tùm lum. Vào xem, trời đất, chỗ ngon lành
lại
có lỗi: Liên tục ba build
cuối cùng đều lỗi trên Gitlab (lạ cái là
chẳng ai biết; mình đã nói là mình ngồi soi pod
rồi đấy nhé:D)
Ôi dào, dễ, vào chạy helm rollback
là xong:
$ helm ugprade foo # ... failed?
$ helm rollback foo 0 # quay về bản còn tốt cuối cùng
Bạn biết không, lệnh helm history foo
chỉ còn mỗi ba dòng,
và dòng nào cũng cho biết trạng thái lỗi.
$ helm history foo
UPDATED STATUS ...
... FAILED
... FAILED
... FAILED
Nghĩa là trong trường hợp của mình, helm rollback foo 0
không thể
thực hiện được. Sao lại có chuyện này? Một bạn trong đội trước khi
nghỉ phép đã đặt biến TILLER_MAX_HISTORY
thành 3, với mục đích giảm
tải trên các máy chạy etcd
. Và giờ hệ quả là helm
bó tay toàn tập,
không thể cài mới, cũng không thể rollback
, không thể upgrade
.
Mình gần như bị shock:
Ứng dụng đang chạy live
, có database (stateful, có dùng pvc
,
hay persistent volume claim
để lưu dữ liệu), không thể nào
cho bay luôn cài lại từ đầu. Mình bỏ 200 Euro gọi đường dây nóng của
đại lý k8s
ở Sài Gòn, @mrtux
, để được hỗ trợ khẩn cấp. Nhưng đại
lý cũng bó tay, bày những chiêu gì siêu quá, không giải quyết được
chuyện pvc
ngay/rõ ràng. Mất toi 200 Euro;) Mình cho vào TODO list.
tags: #k8s #helm #panic
Qua ngày thứ 4, mấy bạn trong đội quá sốt, không biết làm sao nên
chỉ còn mỗi mình bám theo. Ai hỏi gì, cũng bảo tao đang backup;
thật sự là thế, xài pg/stolon
backup được mà không biết restore
lại làm sao cả đâu ^.^ Sau có một bạn bảo là hồi xưa tao làm
thế này thế này. Mình làm theo thấy không khả thi lắm. Một số bạn đề
nghị ép
helm upgrade foo --force
mình chạy với --dry-run
không ăn thua. Cuối cùng, 20 phút trước khi
bắt đầu kế hoạch tệ nhất (xóa cài lại), mình quyết định
quay lại mã nguồn helm chart
cũ trước khi gặp lỗi, bỏ đi cấu hình
cho các pod
mới,... và merge
vào, thì phát hiện ra là build
thành công. Trời đất, mất hai ngày lên kế hoạch, kể cả cuối cùng
là xóa sạch, chuẩn bị downtime
20 phút cài lại và khôi phục
dữ liệu từ bộ sao lưu, rồi nói qua nói lại giữa các đội phát mệt.
Nhưng công toi, vì mọi việc sao quá đơn giản vậy luôn.
Bạn biết tại sao không? Bất kể là lệnh helm history
thể hiện kết
quả thế nào. Bạn vào dashboard
của cluster vào không gian của k8s
kube-system
, chọn phần ConfigMap
, chọn tới phiên bản cuối cùng
của foo
, mở lên và chọn Edit, sau đó chỗ nào có chữ FAILED
bạn
sửa lại thành DEPLOYED
. Rồi chọn lưu. Rồi helm upgrade
sẽ chạy
ngon lành.
Haha, xin lỗi đã làm bạn thất vọng. Cách giải quyết đơn giản vậy
đã làm mình shock không kém lúc phát hiện ra helm history
chỉ
còn 3 dòng lỗi :)
Cảm ơn @mrtux
, konrad***
đã hỗ trợ trong lúc dầu sôi lửa bỏng;)
Trong lúc lên kế hoạch khắc phục sự cố, mình còn phải đọc tí mã
nguồn của helm
có dịp sẽ chia sẻ với bạn.
Nếu đang dùng helm-2.11
, hãy nâng cấp ngay lên bản 2.12
hoặc
cao hơn: Xem thêm helm/helm#4978.
Hãy dùng ngay helm rollback
khi gặp lỗi trong hệ thống CI
.
Bài này được soạn bằng editor ne
.
tags: #lucene #apache #elasticsearch #apache #solr
Nhân dịp có tranh cãi về opendistro
vs elasticsearch
, thử tìm hiểu
về Lucene
là thư viện cốt lõi dựng lên elasticsearch
và apache solr
.
Đây là phần 1, viết sơ lược. Các phần sau cũng sơ lược nốt vì tác giả
cũng không rành lắm đâu nhé:)
Nếu bạn thấy bối rối khi có nhiều tên vậy, thì đây là so sánh
quen thuộc với người dùng Linux: Lucene
như là phần nhân (kernel
),
Apache Solr
là Debian linux
còn Elasticsearch
là Ubuntu
,
trong khi Opendistro
có thể là phiên bản Linux Mint
.
Tất nhiên, chẳng có cái nào trong số chúng là Mac
cả.
Để hiểu bài toán Lucene
giải quyết, bạn có thể tưởng tượng đang bước
chân vào thư viện của trường đại học, và cùng lúc phân thân ở một nhà
sách to nhất nhì ở quận 1. Muốn tìm cuốn sách ở một trong hai nơi này,
theo bạn nơi nào sẽ ra kết quả nhanh hơn? Nhớ rằng ở thư viện thường
chỉ có một vài thủ thư khá thờ ơ, thậm chí còn không quan tâm bạn là ai nhé.
Trong thư viện có một hệ thống rất hay là chỉ mục, index
, để phân loại sách
theo các tiêu chí và và cuối cùng là theo tên ABC. Nó cũng giống như
Mục lục
sách, ở mục đích giúp bạn tìm ra điều cần tìm nhanh nhất
có thể. Các sách khoa học kỹ thuật nước ngoài nếu bạn có dịp mua về thì
nhớ mở ngay những trang cuối cùng, rất hay có một phần Index
dài lê thê
gồm các từ khóa. Chỉ cần nhớ từ khóa thì có ngay liệt kê vài trang liên quan.
Quay lại Lucene
: bài toán gốc đơn giản là làm sao tìm kiếm cho nhanh
và chính xác một phần bất kỳ trong kho lưu trữ dữ liệu.
Có rất nhiều cách tiếp cận khác nhau, và Lucene
là một trong số đó thôi.
Tài liệu -- [index]
--> Lưu vào kho
--> Tìm lại cho nhanh/chính xác
<--- Lucene ---->
Lucene
đặt ra các nguyên tắc cho quá trình thu nhận, phân loại (phân rã),
tạo ra phần chỉ mục (index
), lưu trữ tài liệu, lưu trữ chỉ mục,
và các nguyên tắc để tìm kiếm lại các phần nhỏ bất kỳ trong tài liệu ban đầu
nhanh và chính xác nhất có thể.
Lucene
là trái tim, phần khó nhất, của một cỗ máy tìm kiếm (search engine
).
Apache Lucene
chỉ cung cấp những API
ở dạng thô nhất,
và hơn nữa nó cũng chỉ có ích cho các ứng dụng Java
thôi.
Vẫn có PyLucene
nhưng phát triển chậm hơn tí, là giao diện Lucene cho Python.
Và bạn biết rồi, để đi một chiếc xe đạp thì hầu hết chúng ta không quan tâm
và cũng không thể bắt đầu bằng việc xây dựng một nhà máy luyện thép.
Cứ việc đến cửa hàng xe và mua xe thôi. Apache Solr
cung cấp giao diện
đơn giản hơn, dễ dàng hơn cho người viết ứng dụng. Để né tránh chuyện
Java
, Solr
chạy dịch vụ cung cấp REST~
API cho ứng dụng cuối.
Như vậy dù bạn viết bằng Python
, Golang
hay gì thì vẫn xài được
thư viện cuối là Lucene
:
Ứng dụng Ruby -- [Người thông dịch Solr] --> [Lucene/Java]
Đại khái Apache Solr
như anh chàng Debian Linux
với nhân Linux
.
Ngạo nghễ, oai phong cho tới khi trai đẹp Elasticsearch
xuất hiện
thì gái làng cả xóm nhao nhao. Elasticsearch
giới thiệu giao diện
tìm kiếm
(Search
), Kibana
, Logstash
, giống như là anh ta có sẵn nhà,
sẵn xe hơi, sẵn mọi thứ đều cho đám cưới; cô nào chả mê nhỉ.
Chính nhờ sự tiện lợi này mà nhiều người tiếp cận với Elasticsearch
nhanh chóng, hiệu quả.
Và thế là nhiều người quên luôn Apache Solr
:) Elasticsearch
gần như đồng nghĩa với ELK
, nhưng từ sâu thẳm thì Solr
và Elasticsearch
cũng không khác lắm nhau đâu nhỉ ^.^ Không có Lucene
thì lấy đâu ra
cả hai chứ.
Điều thú vị là Elastic
mua lại Kibana
và Logstash
để phát triển nên bộ ELK
.
Tạm dừng ở đây, hẹn kỳ sau. Cảm ơn bạn đã đọc một bài rất dài.
tags: #rsync #devops #linux #migration
Có thể dùng rsync
để chuyển bộ cài đặt Linux qua một đĩa cứng mới
(cùng máy) hoặc qua một máy hoàn toàn khác. Tóm tắt bước cơ bản
-
(tùy chọn) tắt hết các dịch vụ đang ghi vào ổ cứng nguồn (A)
-
Chạy
rsync
với (option
) phù hợp để chép qua đĩa đích (B) -
Fix
/etc/fstab
vàbootloader
Bước cuối cùng thì dễ, giống như khi bạn cài máy mới. Lưu ý là
phải đảm bảo /etc/mtab
là một symlink
$ ls -ld /etc/mtab
... /etc/mtab -> ../proc/self/mounts
Chạy rsync
trong phần lớn trường hợp có thể dùng như sau,
với quyền root:
$ mount /dev/new_device /mnt/new_disk_B/
$ rsync -avx \
--progress \
/ \
/mnt/new_disk_B/ \
--exclude="/dev/*" \
--exclude="/proc/*" \
--exclude="/sys/*"
Ý nghĩa vài tham số quan trọng: -a
để chép ở chế độ archive
, tham số
này là viết tắt cho tổ hợp -rlptgoD
, trong đó
-
-r
: chép mọi thư mục, thư mục con và tập tin của chúng -
-l
: chép cácsymlink
-
-p
,-o
,-g
,-t
: bảo toàn các quyền cơ bản (cấp bởichmod
,chown
), các mốc thời gian liên quan đến tập tin hay thư mục, không bao gồm các quyền mở rộng (extended attributes (-X
) hay thông tin phân quyền ACL (-A
), cũng không bảo toàn cáchardlink
(-H
)), -
-x
: chỉ chép các nội dung được kết nối (mount
) vào các thư mục con của thư mục/
. -
Các tham số
--exclude
để bỏ qua mấy thứ không cần thiết (thực ra thì nếu không có chúng bạn sẽ phải chờ rụng râu.)
Nếu hệ thống cũ (A) của bạn có nhiều phân vùng, ví dụ /boot
, /home
, /usr/
thì sau lệnh ở trên nội dung của chúng không được chép qua ổ mới do tham
số -x
ngăn cản việc này. Bạn có thể lặp lại, ví dụ
rsync -avx --progress /boot/ /mnt/new_disk_B/boot/
Xong, đơn giản quá nhen. Ồ không, còn tập hai là điều bạn phải lưu ý:
- Nếu bạn xài docker với
overlayfs
, bạn có thể bỏ nó ra khỏi lệnhrsync
đầu tiên (--exlude=/var/lib/docker/*
), lý do là cáchardlink
haysparse
file bên trong/var/lib/docker/
(hoặc thư mục khác tùy do bạn cấu hình trong/etc/docker/daemon.json
) sẽ khiến bạn chờ rất lâu.
Sau đó, dùng rsync
riêng cho thư mục /var/lib/docker
với tham số
tương tự trên, bổ sung thêm -HSX
.
Ở đây, -S
(hay --sparse
) là tùy chọn để chép các tập tin sparse
.
Nếu không có gì quan trọng bạn cứ xóa luôn /var/lib/docker/
cho khỏe.
- (Tùy chọn)
Nếu có các tập tia đĩa ảo dùng với
Virtualbox
,qemu
gì đó, bạn cũng gặp các tập tinsparse
như trên. Khi đó bạn dùng tùy chọn-S
trước, rồi tiếp theo, bỏ đi tùy chọn này, chạy lại cùng lệnhrsync
nhưng với tùy chọn--inplace
. Tùy chọn-S
chạy lần đầu tiên sẽ tạo ra cácblock
cần thiết trên ổ đĩa mớiB
, còn lần sau sẽ chỉ chép cácblock
có thay đổi nội dung.
Nếu dữ liệu ít bạn có thể ngồi chờ. Nếu nhiều bạn cứ việc dùng máy
thoải mái, sau khi chạy rsync
lần đầu thì bạn thực hiện bước 1
tắt mạng, tắt tất cả các chương trình đang ghi vào ổ đĩa A
rồi chạy
lại các lệnh rsync
cần thiết. Khi đó với các tập tin sparse
thì việc dùng --inplace
rất mau lẹ, nếu không bạn phải chờ
chép 20G hay cả 100G gồm toàn những block không có dữ liệu =))
Về các tập tin Sparse bạn có thể tham khảo ArchLinux wiki hay https://gergap.wordpress.com/2013/08/10/rsync-and-sparse-files/
tags: #browser #cli #file #tools
Dịch vụ gửi / nhận file có đầy, có quá nhiều. Nếu chỉ quan tâm gửi nhận và quên luôn thì chắc bạn không cần đọc tiếp.
Khi file gửi lên server, trước khi tới người nhận, chuyện gì xảy ra? Sau khi người nhận file chọn xóa trên server, file đó đi đâu? Và các công ty đứng sau dịch vụ gửi / nhận file kiếm tiền bằng cách nào? Ôi có rất nhiều câu hỏi. Nếu bạn chỉ có thắc mắc chút xíu thôi và đọc đến đây rồi, thì https://send.firefox.com/ có ích cho bạn đấy.
Khi không có tài khoản riêng, bạn có thể gửi file tối đa 1GB
,
có thể đặt kèm password
, và giới hạn số lần tải xuống.
Sau đó, file sẽ bị xóa khỏi server của Mozilla
-- vâng,
Mozilla
hứa như vậy.
Dùng trình duyệt theo địa chỉ đã ghi ở trên, thậm chí có thể dùng
Chrome
nhé. Giao diện đơn giản mẹ của bạn cũng có thể
sử dụng, hay cài cli
: https://github.com/timvisee/ffsend#install
$ wget https://github.com/timvisee/ffsend/releases/download/v0.2.29/ffsend-v0.2.29-linux-x64 -O ffsend
$ chmod 755 ffsend
$ ./ffsend upload ./Notes-2019.md
Upload complete Share link:
https://send.firefox.com/download/fd9ad60bd4/#OpGSkeYY21geHgRgGPF08A
$ ./ffsend download "https://send.firefox.com/download/fd9ad60bd4/#OpGSkeYY21geHgRgGPF08A"
error: failed to download the requested file
caused by: the file has expired or did never exist
Nếu bạn muốn làm cái trang tương tự như send.firefox.com,
xem mã nguồn ở đây: https://github.com/mozilla/send.
Các metrics liên quan
https://github.com/mozilla/send/blob/master/docs/metrics.md
(tức cách Mozilla
kiếm tiền.)
Nếu muốn làm tới bến luôn, bạn có thể thử ví dụ https://github.com/micahflee/onionshare
tags: #license #opensource #aws #elasticsearch
Xài elasticsearch
bực nhất là nhiều thứ rất cơ bản chỉ được bật lên sau
khi trả mớ tiền. Ví dụ, phân quyền không cho ai xóa nhầm.
Gần đây, x-pack
mới được mở ra tí xíu, cho bà con xài ké vài thứ
miễn phí
. Chẳng nhẽ các công ty to có tiền thì có quyền an toàn,
những chú start-up cỏn con thì có quyền bị xóa nhầm sao :@@
Toshi nghe đâu viết bằng Rust
để cạnh tranh với elasticsearch
, nhưng chắc còn lâu lắm mới được tiếp
nhận phổ biến. Trong khi chờ đợi thì aws
coi như phá lệ, khởi động
bản phân phối theo giấy phép apache 2.0
cho elasticsearch
cùng nhiều
đồ chơi gói sẵn (và tất nhiên, dựa trên elasticsearch
, bản 6.5.4
).
Động cơ của việc này như sau
-
elasticsearch
được dùng phổ biến (và do đó trở nên quan trọng) trong việc xử lý dữ liệu phát sinh; -
Nhiều
plugin
choelasticsearch
được phát triển mới nhưng với giấy phép đóng, ngăn cản sự tiếp cận của đại chúng (à, chính xác là của những người thích xài đồ chùa ;)
Việc này tất nhiên sẽ có lợi cho cộng đồng, và làm công ty đứng sau
elasticsearch
chột dạ. Về kỹ thuật, tính năng thì ban đầu sẽ chưa có
gì khác biệt mới, nhưng bạn sẽ tiết kiệm được rất nhiều thời gian bằng
cách dùng một bộ cài đặt có sẵn nhiều thứ. Ví dụ, công cụ phân tích
performance
của bộ cài đặt
https://opendistro.github.io/for-elasticsearch/features/analyzer.html
(Ở trên, nói aws
phá lệ vì aws
nổi tiếng đóng cửa bảo nhau, ít khi cởi mở
về các dự án của họ, như cách làm của microsoft
, google
, linkedin
, ...;)
tags: #tools #devops #json #yaml
Là ngôn ngữ mẫu phát sinh (template language
), kiểu như Ruby erb
(dùng với Puppet
chẳng hạn), jinja2
(dùng với Saltstack
, Ansible
),
hay là k8s yaml sh****
,... Ý tuởng cơ bản là ngôn ngữ mẫu phát sinh
hợp nhất vai trò của các ngôn ngữ mẫu trước đây, theo quy trình
jsonnet -- [phát sinh] --> .json, .ini, .yaml, .sh
và như thế có thể thống nhất được cách làm việc bất kể ứng dụng cuối
cùng là gì. Rất hữu ích cho devops
,
bạn có thể bắt đầu xem ở đây https://jsonnet.org/learning/tutorial.html .
Là ngôn ngữ nên jsonnet
cũng có các implementation
khác nhau,
một của Google viết bằng C++
,
một của databricks viết với Java/Scala
chạy nhanh hơn nhưng cài đặt mệt hơn ;)
tags: #cicd #gitlab #configmanagement
Cài đặt một số hook
cho các dự án khác nhau trên Gitlab
không đơn
giản là click chuột bấm bấm nhấn nhấn. Nếu có cách gì đó quản lý tập
trung và theo dõi được vẫn tốt hơn. Và còn rất nhiều cài đặt khác nhau
cho dự án. Bạn có thể dùng Terraform
, nhưng gitlabform
vẫn đơn giản
hơn, nhiều hỗ trợ hơn, dễ patch
hơn ;) Có thể tham khảo cấu hình
https://github.com/egnyte/gitlabform/blob/master/config.yml
dùng YAML
này, và với một tí khôn khéo bạn có thể dùng anchor
và reference
để làm gọn tập tin này cho bộ setup Gitlab
vài trăm
dự án đấy.
Hai điểm lưu ý là gitlabform
viết bằng Python 3
, và token dùng
để truy cập vào Gitlab API
phải khai báo trực tiếp trong file cấu hình.
Bạn có thể thoát cách này, chẳng hạn khi sử dụng chính Gitlab
để
chạy gitlabform
tự cập nhật cấu hình
Biến môi trường TOKEN |
+-- [envsubst] --> config.yml
Tập tin mẫu config.yml.in |
tags: #proxy #ssh #tools #devops
Mỗi ngày đều có thêm công cụ mới viết ... bằng Go
, nhưng vẫn còn đó
những thứ cổ xưa, tạo ra cách đây mười mấy năm, vẫn chạy tốt:)
tsocks
là thư viện được nạp đè bằng LD_PRELOAD
, ép các kết nối
từ ứng dụng của bạn đi qua một SOCKS
proxy đã có. Ví dụ,
$# echo "server 1.2.3.4" > /etc/tsocks.conf
$# echo "server_port 20000" >> /etc/tsocks.conf
$ ssh secret_server -D 20000 -fN
$ tsocks firefox
Trong ví dụ này, bạn mới tạo một máy bí mật secret_server
mua ở
Digital Ocean
chẳng hạn, rồi dùng ssh
tạo một SOCKS
proxy ở
laptop của bạn, sau đó dùng lệnh tsocks
mở firefox
: khi đó, mọi
kết nối từ firefox
sẽ chạy qua máy bí mật ở Digital Ocean
:)
Cách này nhanh gọn hơn dùng VPN
nhỉ :)
Bạn cũng có thể cấu hình tsocks
để các kết nối cho các ứng dụng
trên một máy dịch vụ, chẳng hạn, chảy ngược về laptop của bạn.
Trang web dự án đây http://tsocks.sourceforge.net/faq.php, và ở
https://aur.archlinux.org/packages/?K=tsocks bạn thấy có nhiều link
liên quan. Lưu ý quan trọng là tsocks
không mở được các ứng dụng
có setuid
, trừ khi bạn dùng mẹo.
tags: #about #linuxvn #help
Giới thiệu về kênh tin này @linuxvn_notes
.
Cảm ơn các bạn đã theo dõi kênh tin tức này. Sau khoản một tuần thử nghiệm mình thấy khá ổn, viết bài trên Github và gửi ngay vào Telegram. Một cronjob chạy mỗi giờ một lần để đồng bộ. Blog cá nhân mình sẽ dành cho mấy thứ rất vụn vặt.
Hiện tại mình là người viết chính, tranh thủ thời gian rỗi đọc tin tức, ngồi soi rồi tóm tắt lại. Vừa khỏi quên tiếng Việt vừa tiết kiệm thời gian sau này coi lại hoặc thời gian của bạn. Cuối tuần mình dự tính có một bài review, tổng hợp.
Nếu bạn có ý tưởng gì, hoặc có vấn đề gì cần biết/viết về nó, hãy tạo ticket https://github.com/linuxvn/about/issues.
Mình cũng mong có bạn nào dành chút thời gian cùng viết với mình cho vui.
Do hạn chế của định dạng Markdown
mà Telegram hỗ trợ, nên việc viết bài
sẽ hơi phiền chút. Khi bạn gửi pull request
, mình sẽ giúp review
về định dạng nếu cần. Bài viết sẽ được gửi tự động vào một group riêng để
kiểm tra trước (liên hệ mình để lấy thông tin), nhờ TravisCI
.
Các bài viết được xuất bản với giấy phép
CC BY-ND 4.0
trừ khi bạn có yêu cầu riêng.