Chuyện của sys

DevOps Blog

Tối ưu hệ thống để tăng performance cho Elasticsearch trên Centos 7 May 27, 2018

Sau bài hướng dẫn cài đặt và cấu hình cơ bản, chúng ta tiếp tục đi tới phần nâng cao để có 1 hệ thống Elasticsearch đáp ứng được performance tốt hơn, bài viết này cóp nhặt với nhiều nguồn khác nhau, hi vọng giúp bạn có thêm những cách tối ưu cho hệ thống đang chạy của bạn.
1. Tăng số lượng file descriptors lên 64K
vi /etc/security/limits.conf
elasticsearch – nofile 65536
elasticsearch – memlock unlimited
su – elasticsearch
ulimit -n
65536
ulimit -l
unlimited
2. Tăng virtual memory
Elasticsearch sử dụng thư mục mmapfs theo mặc định để lưu trữ các chỉ số của nó. Giới hạn hệ điều hành mặc định về số lượng mmap có thể quá thấp, điều này có thể dẫn đến các lỗi của bộ nhớ. Vì vậy ta có thể tăng số lượng lên bằng câu lệnh sau trên Centos 7.
sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
3. Tắt swap
Mặc định thì hệ điều hành Centos 7 để swappiness bằng 30, tuy nhiên để tối ưu cho Elasticsearch hoàn toàn không sử dụng swap nên chúng ta sẽ tắt nó đi.
sysctl vm.swappiness=0
vm.swappiness = 0
4. Tối ưu config/jvm.options
Chúng ta luôn set giá trị min và max JVM heap size bằng nhau, thường ở mức 1/2 tổng bộ nhớ RAM physical, tối đa không vượt quá 30.5GB

## IMPORTANT: JVM heap size
################################################################
##
## You should always set the min and max JVM heap
## size to the same value. For example, to set
## the heap to 4 GB, set:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##

Cấu hình GC, log4j cũng ở trong config này, ( cái này expert quá nên mình chưa thử)
5. Cấu hình Elasticsearch 
vi config/elasticsearch.yml
Lock toàn bộ memory khi khởi động
bootstrap.mlockall: true

# Lock the memory on startup:
#
#bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#

Một số cấu hình khác:
“indices.memory.index_buffer_size”: “30%”
“index.translog.flush_threshold_ops”: 50000
“index.refresh_interval”: “5s”
“index.store.type”: “mmapfs”
Trên đây là 1 số cấu hình cần được tối ưu để chạy Elasticsearch, hi vọng có thể giúp bạn lúc bắt đầu, tuy nhiên, có thể 1 số cấu hình không được chính xác và mang tính chủ quan, hi vọng được sự góp ý của các bạn.
 

1 Comment on Tối ưu hệ thống để tăng performance cho Elasticsearch trên Centos 7
Categories: Tài liệu

Hướng dẫn cài đặt và cấu hình Elasticsearch trên Centos 7

Giới thiệu
Elasticsearch là một phần mềm mã nguồn mở và miễn phí  của Elastic, dựa trên Apache Lucene, là platform được sử dụng cho việc phân phối tìm kiếm và phân tích dữ liệu trong thời gian thực, được sử dụng rộng rãi do tính dễ sử dụng, tính năng mạnh mẽ và khả năng mở rộng tốt, bạn có thể sử dụng các phương thức HTTP để giao tiếp qua RESTful để thao tác với dữ liệu, thân thiện với người sử dụng cũng như các nhà phát triển.
Elasticsearch được sử dụng rộng rãi cho các dự án cá nhân cũng như là search engine chính trong các công ty lớn.
Tuy có rất nhiều bài viết, tutorial đề cập tới việc hướng dẫn cài đặt cũng như cấu hình, nhưng hi vọng bài viết này sẽ cung cấp cho bạn 1 cách chi tiết và trọn vẹn nhất để thực hiện trên bản Centos 7 và Elasticsearch phiên bản mới nhất 6.2
Các bước cài đặt
1. Cài đặt Java 8
Do Elasticsearch được viết bằng Java nên bạn cần có 1 JRE để chạy nó, ở đây mình sử dụng JDK 8 bản update 171 mới nhất.
Link download:

wget http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.tar.gz
tar -xvzf jdk-8u171-linux-x64.tar.gz
mv jdk1.8.0_171 /opt/

Cấu hình biến môi trường cho toàn bộ user:

vi /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_171
export PATH=$PATH:$JAVA_HOME/bin
. /etc/profile

Verify:
java -version
java version “1.8.0_171”
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
2. Download và cài đặt Elasticsearch
 
Vào trang chủ https://www.elastic.co/downloads và download bản mới nhất hiện tại là 6.2.4

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
tar -xvzf elasticsearch-6.2.4.tar.gz
mv elasticsearch-6.2.4 /data/elastic/elasticsearch

Tạo user elasticsearch và thư mục /data/elatic/

adduser elasticsearch
chown -R elasticsearch. /data/elastic/
su – elasticsearch
cd /data/elastic/elasticsearch/

Cấu trúc thư mục như sau:

ls
bin lib logs NOTICE.txt README.textile
config LICENSE.txt modules plugins

3. Cấu hình Elasticsearch
Các file cấu hình cần chú ý:

ls config/
elasticsearch.yml jvm.options log4j2.properties

Bạn có thể sửa lại theo ý mình cho các file config này, nếu không cần thiết thì để nguyên và thực hiện sau trong phần tunning cho Elasticsearch.
Khởi chạy Elasticsearch

./bin/elasticsearch

Sample output:
[2018-05-28T02:56:03,739][INFO ][o.e.n.Node ] [] initializing …
[2018-05-28T02:56:03,846][INFO ][o.e.e.NodeEnvironment ] [zqsXYde] using [1] data paths, mounts [[/ (rootfs)]], net usable_space [10.4gb], net total_space [17.4gb], types [rootfs]
[2018-05-28T02:56:03,846][INFO ][o.e.e.NodeEnvironment ] [zqsXYde] heap size [1007.3mb], compressed ordinary object pointers [true]
[2018-05-28T02:56:03,850][INFO ][o.e.n.Node ] node name [zqsXYde] derived from node ID [zqsXYdeEQ8ifax0sYq72gg]; set [node.name] to override
[2018-05-28T02:56:03,850][INFO ][o.e.n.Node ] version[6.2.4], pid[1624], build[ccec39f/2018-04-12T20:37:28.497551Z], OS[Linux/3.10.0-693.5.2.el7.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_171/25.171-b11]
[2018-05-28T02:56:03,851][INFO ][o.e.n.Node ] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/tmp/elasticsearch.BOVwKawi, -XX:+HeapDumpOnOutOfMemoryError, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Des.path.home=/data/elastic/elasticsearch, -Des.path.conf=/data/elastic/elasticsearch/config]
….
[2018-05-28T02:56:09,185][INFO ][o.e.t.TransportService ] [zqsXYde] publish_address {127.0.0.1:9300}, bound_addresses {[::1]:9300}, {127.0.0.1:9300}
[2018-05-28T02:56:09,200][WARN ][o.e.b.BootstrapChecks ] [zqsXYde] max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2018-05-28T02:56:09,201][WARN ][o.e.b.BootstrapChecks ] [zqsXYde] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2018-05-28T02:56:12,290][INFO ][o.e.c.s.MasterService ] [zqsXYde] zen-disco-elected-as-master ([0] nodes joined), reason: new_master {zqsXYde}{zqsXYdeEQ8ifax0sYq72gg}{3MVumgkjQGK04HXp82FPCA}{127.0.0.1}{127.0.0.1:9300}
[2018-05-28T02:56:12,311][INFO ][o.e.c.s.ClusterApplierService] [zqsXYde] new_master {zqsXYde}{zqsXYdeEQ8ifax0sYq72gg}{3MVumgkjQGK04HXp82FPCA}{127.0.0.1}{127.0.0.1:9300}, reason: apply cluster state (from master [master {zqsXYde}{zqsXYdeEQ8ifax0sYq72gg}{3MVumgkjQGK04HXp82FPCA}{127.0.0.1}{127.0.0.1:9300} committed version [1] source [zen-disco-elected-as-master ([0] nodes joined)]])
[2018-05-28T02:56:12,361][INFO ][o.e.g.GatewayService ] [zqsXYde] recovered [0] indices into cluster_state
[2018-05-28T02:56:12,368][INFO ][o.e.h.n.Netty4HttpServerTransport] [zqsXYde] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}
[2018-05-28T02:56:12,368][INFO ][o.e.n.Node ] [zqsXYde] started
Trong output trên có warning những thứ cần phải tunning cho phù hợp, mình sẽ đề cập ở bài viết sau.
4. Kiểm tra hoạt động
Ctrl + Z để thoát và bg để chạy backgroud

^Z
[1]+ Stopped ./bin/elasticsearch
bg
[1]+ ./bin/elasticsearch &

Verify process đang chạy:

ps aux |grep elastic |grep java
elastic+ 1624 11.3 66.0 3626528 1233032 pts/0 Sl 02:55 0:20 /opt/jdk1.8.0_171/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch.BOVwKawi -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Des.path.home=/data/elastic/elasticsearch -Des.path.conf=/data/elastic/elasticsearch/config -cp /data/elastic/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch

Verify port đang lắng nghe

netstat -aonp |grep java |grep 9*00
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 1624/java off (0.00/0/0)
tcp6 0 0 ::1:9200 :::* LISTEN 1624/java off (0.00/0/0)
tcp6 0 0 127.0.0.1:9300 :::* LISTEN 1624/java off (0.00/0/0)
tcp6 0 0 ::1:9300 :::* LISTEN 1624/java off (0.00/0/0)

Bằng HTTP

curl -X GET ‘http://localhost:9200’
{
“name” : “zqsXYde”,
“cluster_name” : “elasticsearch”,
“cluster_uuid” : “jvbM2A4XRhmYoDgD_tmzSg”,
“version” : {
“number” : “6.2.4”,
“build_hash” : “ccec39f”,
“build_date” : “2018-04-12T20:37:28.497551Z”,
“build_snapshot” : false,
“lucene_version” : “7.2.1”,
“minimum_wire_compatibility_version” : “5.6.0”,
“minimum_index_compatibility_version” : “5.0.0”
},
“tagline” : “You Know, for Search”
}

Testing:
Thử POST 1 document
curl -X POST -H ‘Content-Type: application/json’ ‘http://localhost:9200/chuyencuasys/elastic_note/1’ -d ‘{ “message”: “Hello World!” }’
[2018-05-28T03:04:24,379][INFO ][o.e.c.m.MetaDataCreateIndexService] [zqsXYde] [chuyencuasys] creating index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []
[2018-05-28T03:04:24,814][INFO ][o.e.c.m.MetaDataMappingService] [zqsXYde] [chuyencuasys/tpb7MoIpRSqLobimaUFVZg] create_mapping [elastic_note]
{“_index”:”chuyencuasys”,”_type”:”elastic_note”,”_id”:”1″,”_version”:1,”result”:”created”,”_shards”:{“total”:2,”successful”:1,”failed”:0},”_seq_no”:0,”_primary_term”:1}
Sau đó GET:
curl -X GET ‘http://localhost:9200/chuyencuasys/elastic_note/1’
{“_index”:”chuyencuasys”,”_type”:”elastic_note”,”_id”:”1″,”_version”:1,”found”:true,”_source”:{ “message”: “Hello World!” }}
View cho dễ nhìn hơn với pretty
curl -X GET ‘http://localhost:9200/chuyencuasys/elastic_note/1?pretty’
{
“_index” : “chuyencuasys”,
“_type” : “elastic_note”,
“_id” : “1”,
“_version” : 1,
“found” : true,
“_source” : {
“message” : “Hello World!”
}
}
Như vậy là chúng ta đã xong phần cơ bản với cài đặt và cấu hình Elasticsearch, rất đơn giản và dễ hiểu phải không nào? Phần tiếp theo mình sẽ viết thêm về tunning và cấu hình nâng cao, cũng như một số thành phần có liên quan để xây dựng 1 hệ sản phẩm Elastic.

No Comments on Hướng dẫn cài đặt và cấu hình Elasticsearch trên Centos 7

Tôi đã pass vị trí System Engineer tại Zalo như nào ? Part 3 May 26, 2018

Khó khăn mới bắt đầu ?

“Chặng đường nào trải bước trên hoa hồng bàn chân cũng thấm đau vì những mũi gai”
Series bài viết này cũng như một hồi kí mà tôi muốn nhắc mình phải cố gắng hơn thế cố gắng không ngừng nghỉ để phát triển mình hơn không được chùn bước với bất kì lí do gì .
Dạo gần đây bắt đầu công việc khi mới vào làm khá là nhiều và phải học nhiều thứ nên hôm nay mới có thời gian để lên đây viết vài lời tâm sự cùng anh em :))
Tiếp tục với câu chuyện ở Part2 khi mới bắt đầu tiếp xúc với linux …
Trước đó khoảng 1 năm sau khi sếp mình giao task nghiên cứu về mail ZIMBRA thì mình đã tiếp xúc với linux và có tham gia 1 số cộng đồng mã nguồn mở lên đó nghe ngóng tình hình rồi thấy ai làm gì hay hay thì mình cũng mày mò tự cài đặt những service đơn giản trên linux như DNS , DHCP , APACHE , NGINX , PHP , MYSQL …
Lúc bấy giờ thì chưa biết gì cả chỉ step by step search ở mạng rồi làm theo nhưng khi cài được 1 service nó chạy thì vui lắm cứ thế dần dần nó thành thói quen rồi khi có bug thì bắt đầu search hỏi rồi dần dần skill linux của mình cũng đỡ đỡ hơn rồi sau đó bắt đầu cài những service phức tạp hơn như NAGIOS , ZABBIX , REVERSE PROXY , HAPROXY …
Đặc biệt sau đó mình làm mail và ở đây là ZIMBRA mình tìm hiểu cái này cũng phải hơn 1 năm , khi làm mail ZIMBRA này mình quen rất nhiều anh em bạn bè tốt ở mọi miền họ đã giúp đỡ mình rất nhiều trong kỹ thuật cũng như là cuộc sống , mình rất biết ơn những người đã giúp đỡ mình trong những bước đi đầu đời bởi nếu không gặp được họ liệu rằng mình sẽ không thể đi nhanh và xa như vậy.
Việc làm một hệ thống mail rất phức tạp đặc biệt là làm sao để mail khi build không bị spam , không bị vào junk , hệ thống backup mailbox cũng như HA hệ thống … Mình đã biết khái niệm thế nào là SPF , DKIM , DRMAC , PTR cách gỡ spam , cách xử lí khi bị spam , thế nào là muilt server zimbra , HA , cluster hệ thống … những việc này tăng cho mình kinh nghiệm rất nhiều trong việc quản trị linux .
Vậy đó mình đã tiếp xúc với linux như vậy hãy cứ làm việc mà mình thích làm những cái nhỏ nhất rồi từ từ các bạn sẽ thấy những chuyện này chẳng nhỏ chút nào . Mình có nghe ai đó nói 1 câu rằng “Tìm cho mình một công việc yêu thích, và rồi bạn sẽ chẳng phải làm việc thêm bất cứ một ngày nào nữa.
Thôi lan man đến đây coi như là hồi kí sau này đọc lại tự cảm thấy mình đã cố gắng như nào Part sau mình sẽ viết cho các bạn mình đã chuẩn bị CV như nào gửi cho ZALO , rồi được gọi phỏng vấn và phỏng vấn với các anh làm việc ở ZALO như nào . Chào các bạn mình viết report cuối tuần đây , chúc các bạn cuối tuần vui vẻ .

No Comments on Tôi đã pass vị trí System Engineer tại Zalo như nào ? Part 3
Categories: Linh tinh

Tôi đã pass vị trí System Engineer tại Zalo như nào ? Part 2 May 20, 2018

Mọi chuyện đã diễn biến ra sao vỡ mộng thế nào ?

Lúc bấy giờ khi còn là một sinh viên khi đã học cho mình xong CCNA cứ tưởng rằng khi ra đi làm sẽ được ngồi cấu hình những thiết bị Cisco , Juniper … nhưng các bạn sẽ không biết ngày đầu tiên mình đi làm công việc của mình như thế nào đâu ?
Hôm đó mình vẫn nhớ như in năm 2015 hồi tháng 11 cuối đông ở Đà Nẵng , tối hôm đó mình nhận được tin nhắn của anh ” Sáng mai 8h tới nhà anh đi cùng anh có việc nha em ” đúng thật là hôm đó mình ngủ không được cảm giác nửa lo nửa sợ không biết có làm được không ? mãi đến 2 3h sáng mới ngủ được .
Sáng hôm sau tôi tới nhà anh gọi điện cho anh tầm 10p thì anh ra cùng trên người là một balo và một hộp chứa thiết bị và lên đường ( Lúc bấy giờ tôi cũng chưa hiểu việc gì xảy ra ? ).
Tôi và anh cùng nhau đi trên con đường biển chạy về hướng Hội An tầm 20km thì dùng tại 1 nhà máy may công nghiệp khá là lớn . Đến nơi tôi cùng anh làm giấy tờ rồi đi vào trong và task đầu tiên trong nghề này của tôi là phải leo thang kiểm tra tính hiệu cable của một số camera trong nhà máy .
Sau những lần đó là tôi và anh có khi một mình tôi đi làm về việc những kiểu triển khai camera,hệ thống báo cháy,thi công mạng cho toà nhà…Rồi từ đó kĩ năng của tôi được nâng cao lên rất là nhiều ví dụ như ( Nối điện, bấm cáp,leo thang , đục tường , khoan nền , thi công cáp , trám xi măng … ) Vì trước đó tôi không hề biết làm những công việc trên bởi thửa nhỏ được mẹ rất là cưng chiều .
Nhưng tôi học được gì ? Được thực hành được làm thực tế nối cáp , bấm cáp , được tự tay cấu hình camera các loại , được tự tay thực hành cơ chế NAT khi còn học CCNA trong các router của nhà mạng ( TP-Link ,ZTE,GPON…), được cấu hình cho một thiết bị router có thể connect internet , được vọc các thiết bị báo động , biết được chia IP thực tế sẽ như nào , biết được những thủ thuật thi công mạng ( Dùng rệp để đấu nối cable , dùng chì để nối cable , dùng đèn thông mạch để đo tín hiệu mạng đã thông mạng  ) , cách xử lí tình huống , cách tư duy trong lúc làm việc , cách mà các bạn nói chuyện với khác hàng …
Nhưng đặc biệt nhất trong khi làm việc vẫn là được quen biết những người anh , những người thầy trong nghề mà sau này đã cho tôi những định hướng và giúp đỡ tôi cực kì nhiều để tôi có thể có được những bước chuyển mình đúng đắn trong nghề này .
Đấy những công việc trên tôi đã làm suốt gần nửa năm , một buổi chiều tôi với anh đi làm về rồi anh rủ mình đi đến quán cháo lòng ở đường Hoàng Hoa Thám =)) . Trong lúc ăn cùng nhau thì tôi có nói với anh.
Tôi: ” Anh à , anh có định hướng gì cho em không chứ em thấy làm như này hoài cũng không ổn lắm ? ”
Anh: ” Sắp tới anh cũng có định hướng triển khai một số hệ thống mail cho khách hàng ở Đà Nẵng không biết em có tìm hiểu gì nó chưa ? Anh có một người bạn mà chỉ triển khai hệ thống mail zimbra thôi mà nuôi cả công ty ở Hà Nội đấy .
Tôi: “Dạ vậy anh cứ giao cho em đi để em tìm hiểu thêm”
Anh:”OK vậy em về cài centos 6 rồi cài mail zimbra lên nhé ”
Tôi:”Dạ vâng OK anh ạ”
….
Và rồi trong lúc cài mail zimbra tôi đã quen những người anh mà sau này có sức ảnh hưởng đến tôi đến tận bây giờ …
Nhưng mình mới thi MARX-LENIN tốt nghiệp về nên hơi mệt cần được ngủ nên hẹn các bạn ở bài viết sau tôi sẽ nói thêm và nhiều hơn về tôi việc đã tiếp xúc với linux như thế nào ?  và chọn nó là con đường đi của mình cho đến tận bây giờ .
Câu nói mình dành tặng cho các bạn ở cuối bài viết này là : “Hãy làm gì đó đi ? Phải làm thì mới biết các bạn muốn gì và thích gì “

2 Comments on Tôi đã pass vị trí System Engineer tại Zalo như nào ? Part 2
Categories: Linh tinh

Tôi đã pass vị trí System Engineer tại Zalo như nào ? Part 1 May 17, 2018

Đây là một trải nghiệm rất tuyệt vời và tôi cảm thấy may mắn rằng nỗ lực của mình đã được đền đáp. Do vậy, tôi quyết định viết thứ gì đó về nó. Tôi sẽ chia sẻ với bạn về cách tôi đã chuẩn bị những gì, trước khi tôi bắt đầu đủ tự tin để nộp CV vào Zalo với vị trí System Engineer.

Mọi chuyện bắt đầu như thế nào?

Tôi hiện tại một sinh viên năm cuối của một trường đại học tư thục về công nghệ thông tin ở Đà Nẵng , ngược dòng xa xôi một chút về những ngày đầu tiên khi bắt đầu vào trường đại học tất cả các kiến thức về chuyên ngành được nhét vào đầu cùng một lúc C, C++, Java, OSI , TCP/IP… Chưa kể những môn đại cương lý hóa lịch sử bla bla … Làm cho tôi cảm thấy rối và không biết đang lạc ở đâu trong thế giới này , các bạn biết rồi đấy khi ngồi trên ghế nhà trường thì chỉ được học những kiến thức cơ bản nhất và cũng sẽ chẳng các thầy cô giáo cầm tay chỉ việc cho các bạn về bất cứ vấn đề gì đâu nên các bạn cứ yên tâm mà tự học nhé .
Được giác ngộ và cảnh tỉnh sớm về việc ở trên vì vậy khi còn là sinh viên năm 2 tôi đã quyết định đi học 1 khóa CCNA tại một trung tâm duy nhất lúc bấy giờ ở Đà Nẵng , trong quá trình đi học có tầm 10 thành viên thì mình là người nhỏ tuổi nhất còn lại toàn những anh chị 8x đời đầu cũng có đời cuối cũng có 9x đời đầu cũng có luôn =))  làm cho mình cảm thấy khá là ngạc nhiên lẽ nào mình học nhầm lớp rồi sao .
Nhưng trong quá trình học thì mình cảm thấy được dạy những kiến thức cơ bản nhất về network (OSI, TCP/IP, Route , NAT …) hiểu rõ hơn về mô hình mạng của một doanh nghiệp nhỏ vừa hoạt động như nào ? và đây cũng là những bước đi đầu tiên trong con đường trở thành một System Engineer .
Sau khi hoàn tất khóa học thì mình nhận được một lời mời về làm việc tại công ty làm về hạ tầng của thầy giáo mình và anh cũng là một người thầy một người anh đã dẫn dắt mình trong những ngày đầu tiên khi bắt vào nghề . Thời gian đó quả là một thời gian cực kì stress đối với mình khi vừa phải đi học vừa phải đi làm và sắp xếp lịch học và đi làm một cách cực kì hợp lí để làm sao học vừa đủ qua môn là được ( ở đây mình không khuyên các bạn là phải học vừa đủ qua môn là được đâu nhé hí hí )
Và rồi mình đã làm việc cùng anh gần 2 năm trong khoảng thời gian đó mình đã làm những công việc nào khó khăn như nào và mình đã học được những gì trong khoảng thời gian 2 năm đó thì ở part sau mình sẽ nói tiếp nhé cảm ơn các bạn đã nghe những dòng tâm sự của mình hí hí
… Còn tiếp

No Comments on Tôi đã pass vị trí System Engineer tại Zalo như nào ? Part 1
Categories: Linh tinh

Hướng dẫn fix lỗi "not enough physical memory" trên VMWare Workstation/Player trên Ubuntu March 29, 2018

VMWare Player là 1 phần mềm ảo hóa được sử dụng rộng rãi trong cộng đồng system admin, phục vụ cho việc làm lab cũng như thử nghiệm những hệ điều hành mới mà không cần phải cài đặt trên máy host và đây là phần mềm ưa thích của mình thay vì cài VirtualBox hay VMWare Workstation.
Thông tin về hệ thống, VMWare Player 14.0.0 trên OS kernel 4.13.0-37-gerenic

Tuy nhiên, sau khi cài đặt bản VmWare Workstation 14 Player trên Ubuntu 16.04 thì mình gặp phải lỗi sau khi tạo 1 VM.

Mặc dù RAM của host còn available rất nhiều 😕

Sau khi search google thì mình được biết đây là bug của VMWare trên host kernel 4.13 và mình đã follow thực hiện hotfix theo các bước sau.
Thông tin hotfix ở đây https://github.com/mkubecek/vmware-host-modules/commit/770c7ffe611520ac96490d235399554c64e87d9f
cd /tmp/
sudo cp -r /usr/lib/vmware/modules/source/vmmon.tar .
tar xf vmmon.tar
sudo rm -rf vmmon.tar
wget https://raw.githubusercontent.com/mkubecek/vmware-host-modules/fadedd9c8a4dd23f74da2b448572df95666dfe12/vmmon-only/linux/hostif.c
mv -f hostif.c vmmon-only/linux/
tar cf vmmon.tar vmmon-only
sudo mv -f vmmon.tar /usr/lib/vmware/modules/source/
sudo vmware-modconfig –console –install-all
Như vậy là đã fix xong lỗi trên rồi, tiếp tục làm việc thôi 🙂
 
 

No Comments on Hướng dẫn fix lỗi "not enough physical memory" trên VMWare Workstation/Player trên Ubuntu

Hướng dẫn compile nginx support gRPC trên Centos 7 March 26, 2018

Nginx đã bắt đầu hỗ trợ gRPC từ bản 1.13.10, tuy nhiên vẫn trang trên mainline, chưa stable, thông tin được cập nhật từ trang chủ https://www.nginx.com/blog/nginx-1-13-10-grpc/
Sau đây, mình sẽ hướng dẫn các bạn complie nginx từ source theo document https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/ trên Centos 7.
Fact:
cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
Cài các gói phụ thuộc cần thiết bao gồm, openssl, zlib, pcre

$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz
$ tar -zxf pcre-8.41.tar.gz
$ cd pcre-8.41
$ ./configure
$ make
$ make install
$ wget http://zlib.net/zlib-1.2.11.tar.gz
$ tar -zxf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure
$ make
$ make install
$ wget http://www.openssl.org/source/openssl-1.0.2k.tar.gz
$ tar -zxf openssl-1.0.2k.tar.gz
$ cd openssl-1.0.2k
$ ./config–prefix=/usr
$ make
$ make install

Download source

$ wget http://nginx.org/download/nginx-1.13.10.tar.gz
$ tar zxf nginx-1.13.10.tar.gz
$ cd nginx-1.13.10
Nhớ thêm 2 module –with-http_ssl_module –with-http_v2_module
./configure –sbin-path=/usr/local/nginx/nginx –conf-path=/usr/local/nginx/nginx.conf –pid-path=/usr/local/nginx/nginx.pid –with-http_ssl_module –with-stream –with-pcre=../pcre-8.41 –with-openssl=../openssl-1.0.2k –with-zlib=../zlib-1.2.11 –with-http_v2_module
$make
$make install

/usr/local/nginx/nginx -v
nginx version: nginx/1.13.10
Như vậy là đã hoàn thành.

No Comments on Hướng dẫn compile nginx support gRPC trên Centos 7
Categories: Tài liệu

Top 11 sai lầm người Quản trị hệ thống hay mắc phải March 9, 2018

Top 11 sai lầm người Quản trị hệ thống hay mắc phải

Một người Quản trị hệ thống (System Admin) giữ một vai trò trong lĩnh vực Công nghệ thông tin/Mạng máy tính. Họ chịu trách nhiệm về các hoạt động của máy chủ dịch vụ làm sao để không bị gián đoạn và ảnh hưởng đến việc kinh doanh của công ty. Nhận thức của một quản trị viên hệ thống về các lỗ hỏng bảo mật hệ thống và việc ảnh hưởng đến các máy chủ liên quan hoạt động công ty là một đức tính rất cần cho bất kỳ tổ chức/công ty nào đang thuê họ. Trong công việc của mình các Quản trị viên thường mắc phải 11 sai lầm sau, cùng Cuongquach.com tìm hiểu nhé.
top 11 sai lầm người quản trị hệ thống hay mắc phải

Có thể bạn cũng quan tâm chủ đề khác:
– Top 14 DevOps Blog bạn nên theo dõi mỗi ngày
– Top 8 Email Blacklist bạn nên quan tâm khi email bị dính spam
– Top 11 công cụ mã nguồn mở giám sát hệ thống trên Linux
– Top 11 công cụ thay thế chương trình Google Analytics
– Top 10 công cụ mã nguồn mở kiểm tra tải website

Contents

  • 1. Thực thi scripts với quyền root
  • 2. Sử dụng lại mật khẩu trong hệ thống quản lý
  • 3. Chia sẻ tài khoản quản trị
  • 4. Quên gia hạn SSL
  • 5. Không theo dõi log file
  • 6. Lưu trữ mật khẩu dạng plain-text
  • 7. Báo cáo lỗi
  • 8. Không giữ hệ thống cập nhật thường xuyên
  • 9. Superuser tasks
  • 10. Không chấm dứt các tài khoản đang hoạt động
  • 11. Thực thi các script không rõ nguồn gốc
  • Tổng kết

1. Thực thi scripts với quyền root

Một trong những vấn đề về bảo mật quan trọng nhất là hạn chế cho người dùng đặc quyền quá cao. Các ứng dụng cũng như vậy, chỉ cần đáp ứng theo đúng requirement của ứng dụng yêu cầu là được.

Khi một ứng dụng thực thi với quyền root, đồng nghĩa nó có thể kiểm soát máy chủ của bạn. Nếu đó là ứng dụng nhiễm mã độc thì hacker hoặc kẻ xấu có thể truy cập được vào máy chủ của bạn và kiểm soát nó.

2. Sử dụng lại mật khẩu trong hệ thống quản lý

Đôi khi máy chủ được thiết lập với mật khẩu yếu, hoặc theo thói quen quản trị viên hệ thống thường sử dụng cùng một mật khẩu trên cùng hệ thống. Điều này là không nên tí nào. Việc sử dụng cùng mật khẩu dẫn đến nguy cơ tiềm tàng rất cao.
Brute force là dạng tấn công đoán mật khẩu, nếu sử dụng cùng mật khẩu thì việc có được một mật khẩu đồng nghĩa có cả một hệ thống trong tay. Hacker có thể làm bất cứ điều gì nguy hiểm mà ta không lường trước được.

Thay vì sử dụng mật khẩu, quản trị viên nên cân nhắc sử dụng private/public key để đăng nhập vào máy chủ. Bằng cách sử dụng mật mã bất đối xứng, public key được lưu trên server và người quản trị giữ private key thì kẻ tấn công còn lâu mới khai thác được ta.

3. Chia sẻ tài khoản quản trị

Các tài khoản quản trị thường có đặc quyền rất cao, quản trị viên thường hay sử dụng tài khoản quản trị mà không kiểm soát tốt. Nhiều người còn chia sẻ tài khoản quản trị cho nhau. Rồi đến một thời điểm nào đó, khi người quản trị rời khỏi công ty, mật khẩu cũng không thay đổi hoặc không thu hồi tài khoản. Vì vậy các tài khoản này thường có khả năng bị truy cập trái phép vào hệ thống.

Quản trị viên nên thay đổi mật khẩu định kỳ, bất kỳ ai rời khỏi tổ chức nên rà soát và thu hồi tài khoản.

4. Quên gia hạn SSL

Các chứng chỉ SSL certificate đều có thời gian hết hạn, sau khi hết hạn kết nối sẽ không còn đảm bảo tính bảo mật, người truy cập sẽ thấy cảnh báo bảo mật ngay. Hacker có thể tận dụng trang web hết hạn này để khai thác để lấy dữ liệu khách hàng hoặc sử dụng cho mục đích xấu. Quản trị viên thường là những người thực hiện việc xin cấp SSL, nhưng họ lại quên gia hạn và khách hàng của tổ chức họ trở thành nạn nhân khi web mất SSL.

5. Không theo dõi log file

Duy trì file log và theo dõi nó rất quan trọng đối với quản trị hệ thống. Các file này sẽ có ích khi khắc phục sự cố, cho phép quản trị viên thấy vấn đề xảy ra. Quản trị viên nên theo dõi file log và khi nào chúng được tạo, phải biết chúng chứa thông tin gì và sao lưu để khi cần sử dụng.

6. Lưu trữ mật khẩu dạng plain-text

Việc lưu trữ mật khẩu dạng ký tự thường không được mã hóa dễ dẫn đến rủi ro bị khai thác. Vì mật khẩu dạng thường bất ký ai cũng có thể đọc được và sử dụng để truy cập trái phép tài nguyên. Quy tắc quản lý mật khẩu đòi hỏi rằng mật khẩu không nên được lưu dưới dạng text như vậy. Các quản trị viên có thể xem xét sử dụng các extension hoặc app tích hợp ở các trình duyệt như Lastpasss, Dashlane, KeePass, Roboform 8 để ghi nhớ password giúp mình.

7. Báo cáo lỗi

Khi mọi người báo cáo vấn đề của hệ thống thông qua email hay các ứng dụng chat nhóm, trong mô tả vấn đề quản trị viên thường cung cấp thông tin đăng nhập vào hệ thống, điều này không nên. Khi có vấn đề về hệ thống thì phải được chuyển tiếp đến bộ phận liên quan để nhóm này giải quyết.

8. Không giữ hệ thống cập nhật thường xuyên

Một vài quản trị viên không chú ý đến cập nhật bảo mật thường xuyên khi có, như lỗi Meltdown và Spectre gần đây mình xin hỏi các bạn đã update hay chưa? Mình cá rằng chắc cũng 30% chưa đâu. Bất kỳ khi nào có bản vá bảo mật, quản trị viên nên kiểm tra các nghiên cứu các lỗi đó ảnh hưởng ra sao đến hệ thống mình và xem xét cập nhật.

9. Superuser tasks

Quản trị viên không nên cho người dùng khả năng truy cập hoặc sử dụng các lệnh đặc quyền. Đặc biệt khi lỡ như người dùng bị tấn công, hacker có thể leo thang đặc quyền chiếm quyền kiểm soát hệ thống, lấy đi các thông tin quan trọng.
Người dùng nên đăng nhập bằng tài khoản cá nhân của mình và sử dụng lệnh SUDO (Linux) cho các lệnh được chỉ định khi cần.

10. Không chấm dứt các tài khoản đang hoạt động

Với các tài khoản không sử dụng nữa, hacker có thể nhắm mục tiêu đến những tài khoản này và khai thác chúng, đặc biết là nếu họ có mật khẩu mặc định. Quản trị viên nên vô hiệu hóa các tài khoản không sử dụng nữa bằng cách chỉnh sửa tệp mật khẩu và thay bằng chuổi mã hóa.

11. Thực thi các script không rõ nguồn gốc

Ngay cả khi có nguồn gốc tin cậy, quản trị viên cũng nên biết rằng việc tải script về qua internet là không an toàn. Vì vậy khi thực thi bạn nên xem các lệnh thực hiện trong script có dẫn đến hành động bất chính nào không nhé.
sudo task

Tổng kết

Hy vọng qua bài viết “Top 11 sai lầm người Quản trị hệ thống hay mắc phải” này các quản trị viên hệ thống sẽ có thêm kiến thức trước các vấn đề bảo mật như hiện tại. Tin tặc ngày càng phát triển và tinh vi hơn, điều quan trọng là luôn bổ sung kiến thức bảo mật để bảo đảm hệ thống mình luôn ổn định. Cám ơn các bạn đã theo dõi.
Nguồn: https://cuongquach.com/top-11-sai-lam-nguoi-quan-tri-he-thong-hay-mac-phai.html

No Comments on Top 11 sai lầm người Quản trị hệ thống hay mắc phải
Categories: Chuyện nghề

[Virtualization ] Docker Ecosystem November 5, 2017

Kết quả hình ảnh cho docker
 
I.Tổng quan về docker
I.1 Khái niệm về docker
Docker là một hệ thống mã nguồn mở, hỗ trợ đóng gói và tự động triển khai phần mềm trong các container. Nó cung cấp một cách nhanh, gọn để tạo môi trường hoạt động cho phần mềm, giảm thiểu rủi ro giữa dev và ops khi developper phát triển trên cùng một môi trường như môi trường vận hành, giúp dễ dàng tự động hóa và tăng tốc chu trình phát triển phần mềm (dev, test, deploy…).
Ưu điểm:

  •  Triển khai ứng dụng nhanh chóng : container bao gồm các yêu cầu tối thiểu để chạy của ứng dụng , làm giảm kích thước của chúng và cho phép chúng được triển khai nhanh chóng .
  •  Khả năng di chuyển linh động : một ứng dụng và tất cả các phụ thuộc của nó có thể được gói vào một container duy nhất , độc lập với các phiên bản máy chủ của Linux kernel , phân phối nền tảng , hoặc mô hình triển khai.Container này có thể được chuyển sang một máy chạy Docker, và được thực hiện mà không hề có vấn đề tương thích hay không.
  •  Kiểm soát phiên bản và tái sử dụng.
  •  Dễ dàng chia sẻ : với Docker Hub hoặc 1 public Registry việc chia sẻ container rất dễ dàng thực hiện và thân thiện với mọi người kể cả developer, tester, admin system.
  •  Nhẹ và chi phí tối thiểu : Docker image thường rất nhỏ , tạo điều kiện cho việc kiểm thử và giảm thời gian để triển khai các ứng dụng mới container.

I.2 Khi nào sử dụng docker

  • Tách biệt các cài đặt cho từng ứng dụng, không gây ảnh hưởng lẫn nhau.
  • Xây dựng môi trường làm việc mà không quá tốn nhiều thời gian cho việc cài đặt.
  • Đồng nhất môi trường phát triển.
  • Đóng gói môi trường thực thi một cách nhỏ gọn kèm theo cho dự án.

I.3 Kiến trúc của Docker

Docker sử dụng kiến trúc client-server:

  • Client: Là bộ công cụ ở dạng dòng lệnh dùng để pull/push/search các templates dựng sẵn từ registry công cộng hoặc riêng một tổ chức nào đó thông qua Restful API và tập hợp các lệnh khác để tương tác với container.
  • Server: chạy trên nền hệ điều hành của máy chủ dưới dạng một daemon, chịu trách nhiệm cho các tác vụ như đóng gói, thực thi, tải về container image.

I.4 Các thành phần của docker

Docker được tạo bởi 3 phần chính : Container, Image, Registry

  • Container: dùng để tách biệt ứng dụng và các thành phần thưc thi của ứng dụng đó với các container khác trên cùng 1 máy chủ và với chính máy chủ chứa container đó.
  • Image: là các template dựng sẵn đã chứa đủ các thành phần của môi trường thực thi cần cho ứng dụng và được dùng để tạo các container. Chẳng hạn một image chứa hệ điều hành Ubuntu đã cài đặt sẵn Apache và ứng dụng web
  • Registry : Là kho chứa images. Người dùng có thể tạo ra các images của mình và tải lên đây hoặc tải về các images được chia sẻ (Docker Hub)


Hình 1.1 Mô hình tương tác giữa các thành phần docker
 

Docker Daemon

 Như thế hiện trên hình vẽ , Docker daemon chạy trên các máy host. Người dùng sẽ  không tương tác trực tiếp với các daemon, mà thông qua Docker Client.

Docker Client

Là giao diện người dùng của Docker, nó cung cấp cho người dùng giao diện dòng lệnh và thực hiện phản hồi với các Docker daemon.

Docker images

Là một template chỉ cho phép đọc, ví dụ một image có thể chứa hệ điều hành Ubuntu và web app. Images được dùng để tạo Docker container. Docker cho phép chúng ta build và cập nhật các image có sẵn một cách cơ bản nhất, hoặc bạn có thể download Docker images của người khác.

Docker Container

Docker container có nét giống với các directory. Một Docker container giữ mọi thứ chúng ta cần để chạy một app. Mỗi container được tạo từ Docker image. Docker container có thể có các trạng thái run, started, stopped, moved và deleted.

I.5 Sự khác nhau giữa Docker và Máy Ảo

Hình 1.2 Mô hình docker và máy ảo

  • Cùng xét mô hình kiến trúc của VM: Mỗi ứng dụng được ảo hóa bao gồm chính ứng dụng đấy và cũng chứa các phụ thuộc của nó giống như bên container. Tuy nhiên bên VM sẽ kèm theo thêm 1 guest OS. Điều này dẫn tới việc đóng gói ứng dụng được ảo hóa sẽ có dung lượng lên tới hàng GB.
  • Khác với container là chia sẻ host OS đồng nghĩa với việc các container sẽ có OS giống nhau thì với máy ảo, mỗi một VM có thể có OS khác so với các VM khác và thậm trí OS của các VM hoàn toàn có thể khác với host OS.
  • Xét về tính linh hoạt: Nếu như bạn muốn bảo trì máy host, với container thì khi bảo trì mà buộc phải khởi động lại máy thì đồng nghĩa với việc hoạt động của các container có trong máy đó sẽ bị gián đoạn. Tuy nhiên với VM, bạn hoàn toàn có thể di chuyển các VM có trong máy cần được bảo dưỡng sang tạm các máy tính khác. Điều này giúp ứng dụng có trong các VM hoạt động mà không bị gián đoạn.
  • Xét về tính an toàn: Với container, do dùng chung OS nên nếu có lỗ hổng nào đấy ở kernel của host OS thì nó sẽ ảnh hưởng tới toàn bộ container có trong host OS đấy
  • Sử dụng Docker tạo và xóa container nhanh, dễ dàng, trong khi Virtual Machine yêu cầu cài đặt đầy đủ và sử dụng nhiều tài nguyên của máy để thực thi việc cài đặt đó
  • Container ưu điểm là lightweight, có thể chạy nhiều container hơn VM khi triển khai trên cùng một máy chủ. Container bật tắt nhẹ nhành, nhanh chóng
  •  VM có thể migrate giữa các máy chủ trong lúc chạy. Container thì phải dừng hẳn thì mới migrate được.
  •  Hypervisor có thời gian khởi động trung bình là 20s, thay đổi phụ thuộc vào tốc độ của ổ đĩa.
  •  Containers khởi động và làm cho ứng dụng sẵn sàng chạy trong 500ms, mang lại tính khả thi cao cho những dự án cần sự mở rộng nhanh.

I.6 Quy trình thực thi của một hệ thống sử dụng Docker.

Như hình vẽ trên , một hệ thống Docker được thực thi với 3 bước chính :

Build -> Push -> Pull,Run

a, Build.

Đầu tiên chúng ta sẽ tạo một dockerfile, trong dockerfile này chính là code của chúng ta.

Dockerfile này sẽ được Build tại một máy tính đã cài đặt Docker Engine.

Sau khi build ta sẽ thu được Container, trong Container này chứa bộ thư viện và ứng dụng của chúng ta.

b, Push.

Sau khi có được Container, chúng ta thực hiện push Container này lên đám mây và lưu trữ ở đó.Việc push này có thể thực hiện qua môi trường mạng Internet.

c, Pull, Run

Giả sử một máy tính muốn sử dụng Container chúng ta đã push lên đám mây (máy đã cài Docker Engine) thì bắt buộc máy phải thực hiện việc Pull container này về máy. Sau đó thực hiện Run Container này.

II.Cấu trúc của một Docker File
II.1 Docker File

  Dockerfile là 1 file text chứa các lệnh thực thi để build 1 image cho docker. Với dockerfile chúng ta có 1 phương tiện để build các image 1 cách tự động và share với nhau 1 cách dễ dàng, 1 team của 1 dự án có thể dung dockerfile để tạo các môi trường dev và test đồng nhất với nhau

 II.2 Cấu trúc tập lệnh của một Docker File

    + FROM <image>

    Đây là lệnh phải có với bất kỳ 1 dockerfile nào, và phải nằm ở line đầu tiên của file

    Mục đích của lệnh là set image làm cơ sở để từ đó tạo nên image muốn build

    Ví dụ: FROM ubuntu:12.04

    =>Nếu image cơ sở này không tồn tại trong local thì docker sẽ tự pull image này từ Docker Hub

    + MAINTAINER <name>

     Lệnh dùng để set tác giả của image, có thể có hoặc không

    + RUN <command>

       Lệnh dùng để thực thi 1 command trên hệ thống(của image)

    + CMD <command>

      Trong 1 dockerfile chỉ có thể có 1 lệnh CMD. Lệnh này để tạo command được thưc thi khi khởi chạy image

    + ADD <src> <dest>

     Lệnh dùng để copy file từ remote hoặc local file được chỉ định ở <src> vào path trên container được chỉ đinh ở <dest>

   + EXPOSE <port> [<port>]

Lệnh dùng để chỉ định rằng containner của image sẽ listen trên các port nào đó trong khi chạy

III. Một số tập lệnh làm việc với Docker ( Docker Engine)

+Pull một image từ Docker Hub
 $ docker pull {image_name}

+Liệt kê các images hiện có
 $ docker images

+Xóa một image
 $ docker rmi {image_id/name}

+Liệt kê các container đang chạy
 $ docker ps
 $ docker ps -a #Liệt kê các container đã tắt

+Xóa một container
 $ docker rm -f {container_id/name}

+Đổi tên một container
 $ docker rename {old_container_name} {new_container_name}

+Khởi động một container
 $ docker start {new_container_name}
 $ docker exec -it {new_container_name} /bin/bash

+Tạo mới một container, đồng thời khởi động với tùy chọn cổng và volume
 $ docker run –name {container_name} -p {host_port}:{container_port} -v {/host_path}:{/container_path} -it {image_name} /bin/bash

+Xem các thay đổi trên container
 $ docker diff {container_name}

+Commit các thay đổi trên container và image
 $ docker commit -m “message” {container_name} {image_name}

+Save image thành file .tar
 $ docker save {image_name} > {/host_path/new_image.tar}

+Tạo một image mới từ file .tar
 $ cat musashi.tar | docker import – {new_image_name}:latest

+Xem lịch sử các commit trên image
 $ docker history {image_name}

+Khôi phục lại images từ IMAGE_ID
 $ docker tag {iamge_id} {image_new_name}:{tag}

+Build một image từ container
$ docker build -t {container_name} .
Dấu . ở đây có thể hiểu là Dockerfile đang nằm trong thư mục hiện tại.

Tham khảo phần demo tạo 1 Docker file & container qua link github sau:

https://github.com/lieunn/docker-lamp

IV. Docker Storage

Volume trong Docker

=>Volume trong Docker được dùng để chia sẻ dữ liệu cho container. Để sử dụng volume trong docker dùng cờ hiệu (flag) -v trong lệnh docker run.

Có thể sử dụng Volume trong Docker trong những trường hợp sau

  • Chia sẻ giữa container và container.
  • Chia sẻ giữa container và host.
  • Sử dụng volume để gắn (mount) một thư mục nào đó trong host với container.

Sử dụng volume để chia sẻ dữ liệu giữa host và container

Trong tình huống này thư mục trên máy host (máy chứa container) sẽ được mount với một thư mục trên container, dữ liệu sinh ra trên thư mục được mount của container sẽ xuất hiện trên thư mục của host.

* Có 2 chế độ chia sẻ volume trong docker, đó là read-write (rw) hoặc read-only (ro). Nếu không chỉ ra cụ thể thì mặc định sử dụng chế độ read-write. Ví dụ chế độ read-only, sử dụng tùy chọn ro.

$ docker run -it -v $(pwd)/bindthis:/var/www/html/webapp:ro ubuntu bash

Các lưu ý về volume trong Docker

  • Đường dẫn trong cờ hiệu -v phải là đường dẫn tuyệt đối, thường dùng $(pwd)/ten_duong_dan để chỉ đúng đường dẫn.
  •  Có thể chỉ định việc mount giữa thư mục trên host và thư mục trên container ở các chế độ read-wirte hoặc read-only, mặc định là read-write.
  •  Để chia sẻ volume dùng tùy chọn –volumes-from

Sử dụng Docker với một số storage khác

=>Nhu cầu về lưu trữ data ngày càng tăng => cần 1 giải pháp storage hợp lý, có thể kể đến Ceph, Glusterfs, Openfiler ….

=> Có thể xây dựng một hệ thống storage ceph, gluster tách riêng sau đó sẽ mount các volume share tương ứng về volume local trên docker container

  Hình 3.1.Mô hình lưu trữ Ceph-Docker

Như hình trên thì ta sẽ xây dựng một hệ thống ceph cluster  chứa các volume cần share, client sẽ xây dựng 2 host docker để map volume share về local và mount vào các docker container

+ Một số bài viết tham khảo:

http://hustcat.github.io/run-docker-on-ceph/

https://hub.docker.com/r/ceph/rbd-volume/

https://hub.docker.com/r/jsafrane/glusterfs-mounter

V. Network Docker

  1. Cấu trúc của Virtual Bridge

Network của docker được quản lý thông qua một virtual bridge gọi là docker0. Mục đích của việc này là để tạo ra một network độc lập, tách biệt với môi trường khác.

Khi chúng ta khởi động docker deamon (thông qua sudo service docker startchẳng hạn) thì những step dưới đây sẽ diễn ra:

+ Virtual bridge docker0 sẽ được tạo ra=>Docker tự dộng tìm ra một khoảng ip range còn trống từ trong route của máy host=>Chọn ra random một khoảng ip bất kì=>Assign khoảng ip đó cho docker0

Sau đó khi chúng ta khởi động một container bất kì, thì container đó sẽ được assign những thứ dưới đây:

+ veth (Virtual Eithernet) interface gắn với docker0

+ một ip bất kì trong range mà docker0 vừa thu được ở trên

  1. Networking giữa các container với nhau

Để kiểm soát việc các container có làm việc được với nhau hay không, chúng ta thông qua parameter -icc của docker daemon.

+ Khi -icc = true thì container có thể nói chuyện được với nhau.

+ Khi -icc = false thì các container sẽ bị tách biệt với nhau

Ngoài ra để public một port nào đó ra ngoài chúng ta cũng phải chỉ định EXPOSE <port> trong Dockerfile hoặc là –expose <port> khi khởi động container.

Cụ thể hơn, để các container nói chuyện được với nhau, docker0 sử dụng một tính năng gọi là –link. Khi khởi động một container nào đó chúng ta phải chỉ định –link containerName:containerAlias , nhờ đó mà service trong container đó sẽ tìm thấy service muốn kết nối đến thông qua biến môi trường.

  1. Kết nối từ network ở ngoài vào container

Để kết nối từ network ở ngoài vào container thì chúng ta phải mapping port của máy host với port mà container expose thông qua docker0.
Ví dụ chúng ta muốn map port 8080 của máy host vào port 80 của docker , sử dụng apache container:

$ ID=$(docker run -d -p 8080:80 tcnksm/apache)

caad0cfc2a0

Chúng ta có thể kiểm tra mapping như sau

$ docker ps

CONTAINER ID        IMAGE                  COMMAND                CREATED              STATUS              PORTS                  NAMES

caad0cfc2a03        tcnksm/apache:latest   /usr/sbin/apache2 -D   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   elegant_thompson

$ docker port $ID 80

0.0.0.0:8080

$ ID=$(docker run -d -p 80 tcnksm/apache)

$ docker port $ID 80

0.0.0.0:49156

$ curl `docker port $ID 80`

Hello, docker

4. Bridge network trong Docker

Về native, docker hỗ trợ 3 loại network:

[root@localhost ~]# docker network ls

NETWORK ID          NAME                DRIVER

f163f5a13de0        bridge              bridge

4cf5b3a8120b        host                host

d33d2260ad2c        none                null

=>Mặc định, docker dùng bridge network. Khi cài đặt docker, bạn sẽ thấy một interface docker0 trên host. Khi khởi chạy một container trong host, một interface mới đại diện cho nó sẽ được sinh ra trên host:

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

    link/ether 02:42:f1:59:1a:46 brd ff:ff:ff:ff:ff:ff

    inet 172.17.0.1/16 scope global docker0

       valid_lft forever preferred_lft forever

    inet6 fe80::42:f1ff:fe59:1a46/64 scope link

       valid_lft forever preferred_lft forever

92: vethc4c9915@if91: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP

    link/ether de:bf:41:5b:54:f6 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet6 fe80::dcbf:41ff:fe5b:54f6/64 scope link

    valid_lft forever preferred_lft forever

=>Có thể xem ip của docker container qua:

[root@localhost ~]# docker inspect 992f2635e59f | grep IPAddr

            “SecondaryIPAddresses”: null,

            “IPAddress”: “172.17.0.2”,

            “IPAddress”: “172.17.0.2”,

Tất cả các container đều nhận host làm gateway.Do các container đều dùng host làm gateway nên bridge network cho phép:

+ Container trên cùng host giao tiếp với nhau được

+ Container có thể gửi packet ra bên ngoài host được.

=>Để đảm bảo host forward được IP thì cần cấu hình NAT và cho phép ip forward.

Trên host cấu hình ip forward:
vi /etc/sysctl.conf
net.ipv4.conf.all.forwarding = 1
sysctl -p

[root@localhost Docker_Centos6]# docker run -it -p 81:80 image_name
ở đây port trong container 80 sẽ được map đến 81 trong host.

Có thể tham khảo chi tiết hơn ở link sau:

http://kipalog.com/posts/Co-ban-ve-docker-network

VI. Docker-Compose

Compose là công cụ giúp định nghĩa và khởi chạy multi-container Docker applications. Trong Compose, chúng ta sử dụng Compose file để cấu hình application’s services. Chỉ với một câu lệnh, lập trình viên có thể dễ dàng create và start toàn bộ các services phục vụ cho việc chạy ứng dụng.

  • Compose là một công cụ tuyệt vời không chỉ dùng cho development, testing, staging environments, mà còn ứng dụng trong CI workflows. Việc sử dụng Docker Compose được tóm lược trong 3 bước cơ bản sau:
  • Khai báo app’s environment với Dockerfile.
  • Khai báo các services cần thiết để chạy app trong docker-compose.yml.
  • Run docker-compose up và Compose sẽ start và run app.

Setup Docker-Compose tham khảo qua link github sau:

https://github.com/lieunn/docker-compose

VII. Docker-Swarm

Docker swarm là một công cụ giúp chúng ta tạo ra một clustering Docker. Nó giúp chúng ta gom nhiều Docker Engine lại với nhau và ta có thể “nhìn” nó như duy nhất một virtual Docker Engine.

  • Trong phiên bản v1.12.0, Docker Swarm là một tính năng được tích hợp sẵn trong Docker Engine.

Trong phần này, tôi sẽ tạo ra 1 cụm cluster gồm 1 manager và 2 worker chạy dịch vụ web-server.

  • node manager sẽ là node quản lý cluster.
  • node worker là các node chạy dịch vụ. Nếu mà node worker die thì node manager sẽ run container trên chính nó.

Tham khảo mô hình setup sau:

  • https://github.com/lieunn/summary-docker/blob/master/docs/docker-swarm.md
  • https://asciinema.org/a/94625 ( deploy production)

VIII. Monitoring Docker

Giám sát tình trạng trên docker host

Có thể tham khảo bài viết sau:

https://github.com/monitoringartist/zabbix-docker-monitorin

http://logz.io/blog/docker-monitoring-dockercon-2016/

https://stefanprodan.com/2016/a-monitoring-solution-for-docker-hosts-containers-and-containerized-services/

Tìm hiểu về Docker Containers và Azure Container Service (Phần 1)

https://blog.nimbleci.com/2016/08/17/how-to-set-up-and-deploy-to-a-1000-node-docker-swarm/

https://www.vishnu-tech.com/blog/

https://viblo.asia/p/cac-van-de-ve-docker-tren-production-DzVkpmMwvnW

Docker cho người mới bắt đầu (P1)

https://blog.topdev.vn/su-dung-docker-va-ca-docker-compose-cho-du-an-django/

https://viblo.asia/p/tai-sao-nen-dua-docker-lam-chuan-khi-phat-trien-MdZkAYBakox

2 Comments on [Virtualization ] Docker Ecosystem
Categories: Tài liệu

Hazelcast IMDG In-Memory Data Grid November 4, 2017


1> Đôi nét về Hazelcast.

  •  Hazelcast là một mạng lưu trữ dữ liệu trên bộ nhớ Ram (in-memory data grid). Hazelcast đưa ra cài đặt của các interface trong Java như: Map, Queue, Excecutor Service, Lock… Nó được thiết kế rất nhẹ và dễ sử dụng.
  • Hazelcast được cài đặt bằng ngôn ngữ Java, client hỗ trợ các ngôn ngữ Java, C/C++, C# , Python…
  • Hazelcast cũng có thể được xem như một giao thức lưu đệm (memcache protocol).
  • Hazelcast sử dụng cơ chế mạng ngang hàng, không có master và slave. Tất cả các node lưu số lượng dữ liệu như nhau, và xử lý bằng nhau.
  • Hazelcast lưu trữ mọi thứ trên Ram (in-memory). Nó được thiết kế để thực thi rất nhanh các thao tác đọc và cập nhật (read/update) dữ liệu.
  • Hazelcast lưu các bản sao (backup) của mỗi mảnh dữ liệu trên các node khác nhau. Khi một node bị lỗi, dự liệu trên node đó sẽ được khôi phục lại từ bản sao (bản backup) và cụm Hazelcast vẫn hoạt động bình thường, không có thời gian ngừng hoạt động (downtime = 0).
  •  Sharding(các mảnh dữ liệu) trong Hazelcast được gọi là các Partition. Mặc định Hazelcast có 271 partition. Các partition được phân tán trên tất cả các node của cụm. Hazelcast cũng tạo bản backup của các partition và phân tán chúng trên các node.

2> Một số Use Case Hazelcast.

  • Application scaling
  • Cache-as-a-service
  • Cross-JVM communication and shared storage
  • Distributed cache, often in front of a database
  • In-memory processing and Analytics
  • In-memory computing
  • Internet of Things infrastructure
  • Key-value database
  • Memcached alternative with a protocol compatible interface[4]
  • Microservices infrastructure
  • NoSQL data store
  • Spring Cache
  • Web Session clustering

3> Kiến trúc Client-Server  Hazelcast.

  • Hazelcast cung cấp một kiến trúc phân mảnh & phân tán dữ liệu qua  cluster node.

+ Hazelcast IMDG  có những đặc điểm sau:

  • Dữ liệu được lưu trữ trên RAM.
  • Nhiều bản sao được lưu trữ trên nhiều node để auto-recovery dữ liệu  trong trường hợp một hoặc nhiều node fail.
  • Mô hình dữ liệu hướng đối tượng và là kiểu dữ liệu không quan hệ(non-relational).
  • Resource có thể được tự động thêm hoặc gỡ bỏ để tăng lượng CPU và RAM.
  • Dữ liệu có thể được duy trí từ một hazelcast node  đến một cơ sở dữ liệu quan hệ hoặc NoSQL.
  • Một Java API Map có thể truy xuất vào kho dữ liệu phân tán key-value.

HAZELCAST EMBEDDED ARCHITECTURE

HAZELCAST CLIENT-SERVER ARCHITECTURE

4> Setup Hazelcast Cluster.
Mô hình 3 node:

  • Node 01: IP 192.168.175.128
  • Node 02: IP 192.168.175.129
  • Management: IP 192.168.175.130

Step 1: Download Hazelcast 3.9

Link: https://hazelcast.org/download/archives/

Step 2: Install hazelcast-3.9

$  unzip hazelcast-3.9.zip

$ cp -R hazelcast-3.9 /build

Step 3: Configuration, Start & Stop Node01 (192.168.175.128)

$ cd /build/hazelcast-3.9

$ vim hazelcast.xml

– update management-center data
– update multicast data
– update tcp-ip data
<group>
<name>sandbox</name>
<password>abcd@#1234</password>
</group>
<management-center enabled=”true”>http://192.168.175.130:8080/mancenter</management-center>
<network>
<port auto-increment=”true” port-count=”100″>5701</port>
<outbound-ports>
<!–
Allowed port range when connecting to other nodes.
0 or * means use system provided port.
–>
<ports>0</ports>
</outbound-ports>
<join>
<multicast enabled=”false”>
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
<tcp-ip enabled=”true”>
<interface>192.168.175.128</interface>
<member-list>
<member>192.168.175.128</member>
<member>192.168.175.129</member>
</member-list>
</tcp-ip>
<aws enabled=”false”>

$ cd /build/hazelcast-3.9/bin

$ chmod +x *.sh

$ ./start.sh => check port default 5701 is listen and join cluster (member list)

Step 4: Configuration, Start & Stop Node02 (192.168.175.129)

$ cd /build/hazelcast-3.9

$ vim hazelcast.xml

– update management-center data
– update multicast data
– update tcp-ip data
<group>
<name>sandbox</name>
<password>abcd@#1234</password>
</group>
<management-center enabled=”true”>http://192.168.175.130:8080/mancenter</management-center>
<network>
<port auto-increment=”true” port-count=”100″>5701</port>
<outbound-ports>
<!–
Allowed port range when connecting to other nodes.
0 or * means use system provided port.
–>
<ports>0</ports>
</outbound-ports>
<join>
<multicast enabled=”false”>
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
<tcp-ip enabled=”true”>
<interface>192.168.175.129</interface>
<member-list>
<member>192.168.175.128</member>
<member>192.168.175.129</member>
</member-list>
</tcp-ip>
<aws enabled=”false”>

$ cd /build/hazelcast-3.9/bin

$ chmod +x *.sh

$ ./start.sh => check port default 5701 is listen and join cluster (member list)

Step 5:  Start & Stop Node Management (192.168.175.130)

$ wget https://download.hazelcast.com/management-center/management-center-3.9.zip

$ unzip management-center-3.9.zip

$ cp -R management-center-3.9 /build

$ cd /build/management-center-3.9/bin/

$ chmod +x startManCenter.sh

$ ./startManCenter.sh ( listen port default is 8080)

Acess link Web UI: http://IP:8080/mancenter

5> Một số link tham khảo

https://hazelcast.com/resources/benchmark-redis-vs-hazelcast-original/

http://www.tothenew.com/blog/caching-what-why-and-how-with-hazelcast/

https://hazelcast.org/download/archives/

 

No Comments on Hazelcast IMDG In-Memory Data Grid
Categories: Tài liệu