Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions NguyenLanAnh/Grafana.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Grafana

### 1. Cài đặt, cấu hình Grafana với Docker

- Cài đặt: Grafana dễ dàng được cài đặt bằng Docker với câu lệnh:

$ docker run -d -p 3000:3000 grafana/grafana

- Cấu hình: Các thay đổi cấu hình được thiết lập thông qua các biến môi trường ENV. Đồng thời cũng có 2 volumns, sqlite3 database trong /var/lib/grafana, file cấu hình trong /etc/grafana, có thể map những volumns này vời folders tại máy host bằng cách chạy container với câu lệnh:

$ docker run -d -p 3000:3000 \
-v /var/lib/grafana:/var/lib/grafana \
-e "GF_SECURITY_ADMIN_PASSWORD=secret" \
grafana/grafana

Theo như câu lệnh trên, biến ENV đã được sử dụng để cấu hình Grafana. Các lựa chọn cấu hình được định nghĩa trong file conf/grafana.ini. Thay đổi cấu hình thông qua biến ENV bằng cách dử dụng theo cú pháp:

GF_<SectionName>_<KeyName>

Chi tiết các options của cấu hình có tại: [options](http://docs.grafana.org/installation/configuration/)

- Plugins:

Grafana là một công cụ với mục đích chính là "visualize" dữ liệu ( phần lớn là dữ liệu time series). Cơ bản Grafana không hỗ trợ lưu trữ dữ liệu như Graphite có thể làm, hay cũng không thể thu thập dữ liệu như Prometheus, nhưng Grafana lại có nhiều plugins để mở rộng thêm tính năng. Gồm những plugins data sources: CloudWatch, Elasticsearch, Graphite, Prometheus, InfuxDB,...; plugins applications: Zabbix, Clock,...; hay những plugins dashboard editing.

Cài đặt plugin cho Grafana bằng cách sử dụng biến môi trường GF_INSTALL_PLUGINS, như ví dụ dưới đây:

$ docker run \
-d \
-p 3000:3000 \
--name=grafana \
-e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource" \
grafana/grafana



### 2. Các quyền người dùng trong Grafana

- Người sử dụng Grafana có các quyền (Permission) được xác định thông qua 4 yếu tố sau:

- Vai trò tổ chức (Organization Role): Admin, Editor, Viewer
- Thông quá các thành viên trong nhóm đã được xác định quyền cụ thể
- Thông qua các quyền đã được chỉ định trực tiếp đến người dùng ( sử dụng trên folder hoặc dashboard)
- Sử dụng cờ Grafana Admin ( ví dụ: Super Admin)

- Một người dùng có thể thuộc về 1 hay nhiều tổ chức (organization), có những vai trò (role) riêng trong mỗi tổ chức, mà trong đó:

- Admin:
Có thể làm mọi thứ như : Thêm, sửa data sources; Thêm, sửa người sử dụng trong tổ chức, nhóm; Cấu hình các plugins hay thiết lập các cài đặt.
- Editor:
Có thể khởi tạo, sửa đổi dashboards hoặc các luật cảnh báo (Có thể bị disabled trên những folders hay dashboards đặc biệt; Không thể khởi tạo hay sửa đổi data sources cũng như không thể thêm người dùng.
- Viewer:
Có thể xem các dashboards ( Có thể bị disabled trên những folders hay dashboards đặc biệt); Không thể khởi tạo hay sửa đổi dashboards hay data sources. Trong một vài trường hợp, Viewer cũng có thể sửa đổi dashboards những không thể lưu thay đổi.

- Đối với trường hợp khi sử dụng cờ Grafana Admin, người dùng sẽ trở thành Super Admin, có thể truy cập Server Admin, nơi mà có thể thấy danh sách người dùng, tổ chức được quản trị.
- Có một trang cấp quyền cho các folders, dashboards, có thể thay đổi các vai trò mặc định cho Editor và Viewer.
- Sử dụng cơ chế hạn chế truy cập (Restricting Access) bằng cách thay đổi ACL (Access Control List ).


### 3. Các thành phần cơ bản


Các thành phần có thể kể đến của Grafana như: Data sources, dashboards, panels, alerting. Trong đó:

- Data sources:

Đó là những storage backends như: Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, CloudWatch. Mỗi data source sẽ có những query editor riêng biệt.

- Panel:

Là phần hiển thì cơ bản trong Grafana. Mỗi Panel cung cấp 1 Query Editor (tùy thuộc vào data sources) cho phép trích xuất thông tin để hiển thị trên panel.
Các loại panels là: Graph, Singlestat, Dashlist, Table,and Text, có thể được sắp xếp, kéo thả cho phù hợp trên dashboard. Chi tiết về các loại panels tại [panels](http://docs.grafana.org/features/panels/)

Dưới đây là hình ảnh về 1 graph panel:

![graph](https://i.imgur.com/AMt5Ts3.png)


- Dashboards:

Một dashboards có thể hiểu đơn giản là tập hợp của tất cả các panels, có thể chia thành 1 hay 2 dòng,... chứa các panels tùy ý. Chi tiết tại [dashboards](http://docs.grafana.org/reference/templating/)











19 changes: 19 additions & 0 deletions NguyenLanAnh/Microservice/Microservice.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
## Microservice giữa hai tầng fog và cloud
### 1. Mô hình
Microservice trong hệ thống có nhiệm vụ như một bộ lọc(filter), lọc dữ liệu từ tầng fog gửi lên và chuyển lên tầng cloud.
Mô hình như dưới đây:

![mohinh](http://imageshack.com/a/img924/1986/h1yTcH.png)

Dữ liệu sẽ được chuyển dưới dạng message queue, qua 1 mqtt broker( như trong mô hình sử dụng Rabbitmq). Dữ liệu được lọc tại Filter, qua mqtt broker tiếp đó, và được gửi tới Cloud.

### 2. Thực hiện
Bước 1: Tạo 2 container Rabbitmq trên Docker

Bước 2: Tạo Filter, Filter vừa có khả năng nhận message từ Rabbitmq1, xử lí dữ liệu, vừa gửi dữ liệu tới Rabbitmq2. Tức nó sẽ vừa là consumer, vừa là producer. Nó phải biết cả hai địa chỉ của 2 broker để thực hiện nhiệm vụ.
Sử dụng thư viện Pika của Python.

Bước 3: Build image filterdata,
Tạo một file config.cfg để chứa địa chỉ các broker, file config này mount với image filterdata, để cập nhật những thay đổi. Build image filterdata sử dụng chương trình lọc tạo ở bước 2, và file config.cfg.

### End.
12 changes: 12 additions & 0 deletions NguyenLanAnh/Microservice/filterdata/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM python:2.7
MAINTAINER lananh loglamo@gmail.com
RUN apt-get update
RUN mkdir /filterdata
RUN mkdir /config
ADD ./filterdata/filterdata.py /filterdata
ADD ./config/config.cfg /config
RUN apt-get install -y python python-pip
RUN pip install pika
WORKDIR /filterdata
VOLUME /config
CMD [ "python", "./filterdata.py"]
4 changes: 4 additions & 0 deletions NguyenLanAnh/Microservice/filterdata/config/config.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#dia chi rabbitmq1
r1="172.17.0.2"
#dia chi rabbitmq2
r2="172.17.0.3"
47 changes: 47 additions & 0 deletions NguyenLanAnh/Microservice/filterdata/filterdata/filterdata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import os, os.path
#!/usr/bin/env python
import pika

url = "/config/config.cfg"
openFile = open(url)
lines = openFile.readlines()
lineUrl1 = lines[1]
lineUrl2 = lines[3]
strLineUrl1 = str(lineUrl1)
strLineUrl2 = str(lineUrl2)
url1 = strLineUrl1[4:14]
url2 = strLineUrl2[4:14]
#url1 = "'" + url1 + "'"
#url2 = "'" + url2 + "'"
print url1
print url2

connection1 = pika.BlockingConnection(pika.connection.ConnectionParameters(host= url1))
channel1 = connection1.channel()
connection2 = pika.BlockingConnection(pika.connection.ConnectionParameters(host= url2))
channel2 = connection2.channel()
def callback(ch, method, properties, body):
print("Received %r" % body)
print "filtering continuously ...",body
newstr = ""
for i in body:
if i == "1":
newstr += "1"
else:
continue
print "du lieu sau khi loc: ",newstr
print "-----------"
channel2.basic_publish(exchange='test1.exchange',
routing_key='111',
body= newstr)

# loc du lieu tu body, duoi, not done
# tiep
channel1.basic_consume(callback,
queue='test',
no_ack=True)

print('Waiting for messages. To exit press CTRL+C')
channel1.start_consuming()


84 changes: 84 additions & 0 deletions NguyenLanAnh/TBA.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# TBA

## 1. 4 mô hình truyền thông trong hệ thống IOT

Truyền thông trong 1 hệ thống IOT chủ yếu liên quan đến việc truyền thông giữa 3 nhóm: Thiết bị, gateways, cloud. Việc truyền thông này chủ yếu liên quan đến trao đổi thông điệp( message). Dựa vào cách thức trao đổi message, có thể chia mô hình truyền thông IOT thành 4 nhóm là:

- Telemetry: Message di chuyển 1 chiều, từ thiết bị đến hệ thống. Mục đích là gửi trạng thái của thiết bị lên hệ thống.
Giao thức triển khai mô hình này phổ biến nhất là: MQTT, MQTT implements luôn cả mô hình publish/subscribe. Với MQTT, các thiết bị được xem như publisher - người xuất bản. Nội dung xuất bản là các dữ liệu mà thiết bị đó thu thập hoặc xử lý được. Đích đến của các dữ liệu đó là các brokers. Để gom nhóm các dữ liệu thành 1 "kênh", MQTT sử dụng khái niệm topic. Các hệ thống/thiết bị khác muốn lấy thông tin thì sẽ hoạt động như subscriber - người theo dõi. Hành động theo dõi này và các message tương ứng được giới hạn theo từng topic.
Đồng thời, MQTT cũng được hỗ trợ đầy đủ các QoS level.

Một giao thức đáng chú ý khác cũng implement mô hình này, đó là AMQP. AMQP cung cấp cả 2 phương pháp trao đổi message là request/reply và publish/subscribe.
So với MQTT, AMQP có một lợi thế lớn. Đó là khả năng thiết đặt một luồng logic điều khiển cho 2 mức khác nhau: mức byte và mức message.

Nói về nhược điểm, MQTT không hỗ trợ xử lý logic. Vì không hỗ trợ xử lý logic nên một broker có thể bị quá tải (flooded) bởi các messages mà không làm cách nào để dừng nhận các messages này.
- Inquiry: Gửi các requests từ thiết bị lên hệ thống. Các requests này liên quan đến việc thu thập các thông tin mà thiết bị hiện tại không thu thập được. Và hệ thống lại gửi trả lại response.

Việc implement MQTT theo mô hình Inquiry khó khăn hơn vì ta sẽ phải define các ngữ nghĩa mới ở tầng ứng dụng để đảm bảo việc truyền thông giữa device và hệ thống tuân thủ đúng mô hình Inquiry.

Khác với MQTT và HTTP, AMQP đáp ứng tốt yêu cầu của việc implement mô hình Inquiry.

Một điểm mạnh của AMQP khi implements mô hình Inquiry là tính asynchronous của giao thức này. Nhờ đặc tính asynch vốn có, các thông điệp hồi đáp từ phía hệ thống có thể đến thiết bị theo bất kỳ thứ tự nào mà không làm mất đi sự tương quan của message hồi đáp với request yêu cầu nó.

- Command: Hệ thống gửi message tới thiết bị.

Với giao thức MQTT, nếu muốn implements theo mô hình Command, ta cũng phải đưa ra một số ngữ nghĩa mới ở tầng ứng dụng.

Bản thân MQTT không hỗ trợ kiểu truyền thông request/reply nên ta cần đưa ra một số ngữ nghĩa mới như: thiết bị subscribe một topic để nhận command, hệ thông sẽ gửi command vào topic đó. Phần payload của command (từ phía hệ thống) sẽ phải chứa request ID. Sau khi thực thi mệnh lệnh, thiết bị publish kết quả kèm theo request ID tương ứng.

Nếu thiết bị offline, ta có thể dùng "retain" flag, nhờ đó, mệnh lệnh cuối cùng từ phía hệ thống sẽ được chuyển đến khi device online trở lại.

![anh1](https://i.imgur.com/xiFPqvZ.png)

Một lần nữa, AMQP lại tỏ ra vượt trội hơn khi implements mô hình Command.

Hệ thống có thể gửi message chứa mệnh lệnh, kèm theo message ID và thuộc tính reply-to. Sau khi thực thi mệnh lệnh, thiết bị gửi kết quả trong một message khác, kèm theo ID tương ứng với message ID của mệnh lệnh từ phía hệ thống. Message từ phía thiết bị sẽ được gửi đúng về địa chỉ mà hệ thống mong muốn nhờ thuộc tính reply-to. Việc truyền thông này cũng diễn ra không đồng bộ (asynchronous), do đó hệ thống có thể gửi hàng loạt mệnh lệnh mà vẫn nhận được response tương ứng của từng mệnh lệnh đã gửi.

Nếu thiết bị offline và ta chỉ muốn nó thực thi mệnh lệnh mới nhất từ phía hệ thống? Để giải quyết tình huống này, sử dụng thuộc tính TTL (Time To Live) cho các mệnh lệnh gửi đi từ hệ thống.

![anh2](https://i.imgur.com/ErMe2Nt.png)

- Notification:

Với giao thức MQTT, thiết bị sẽ subscribe một topic. Server publish notification vào topic đó. Mọi thứ diễn ra suôn sẻ vì mô hình Notification này rất gần với cơ chế publish/subscribe của MQTT. Tuy nhiên, nếu không define thêm phần logic xử lý ở tầng ứng dụng, thiết bị có thể bị quá tải do liên tục nhận các notification từ topic đang subscribe.

Cuối cùng, với AMQP, thiết bị vừa có thể nhận notificaiton vừa có thêm phần logic xử lý giúp thiết bị ngừng nhận notification khi không đủ khả năng xử lý.

## 2. MQTT protocol(Message Queuing Telemetry Transport)

- MQTT là một giao thức publish/subscribe thông điệp, được thiết kế cho công nghệ M2M (Machine to Machine) 1 cách gọn nhẹ.

- Kiến trúc:

MQTT có mô hình client/server, các cảm biến là clients và kết nối đến một máy chủ, có thể hiểu như một nhà môi giới (broker), thông qua giao thức TCP (Transmission Control Protocol)

MQTT là giao thức định hướng thông điệp. Mỗi thông điệp là một đoạn rời rạc của tín hiệu và broker không thể nhìn thấy.

Mỗi thông điệp được publish một địa chỉ, có thể hiểu như một kênh. Client đăng kí vào một vài kênh để nhận/gửi dữ liệu, gọi là subscribe. Client có thể subscribe vào nhiều kênh. Mỗi client sẽ nhận được dữ liệu khi bất kì trạm nào khác gửi dữ liệu vào kênh đã đăng kí. Khi một client gửi một thông điệp đến một kênh vào đó, gọi là publish.

Ví dụ:

![anh3](https://i.imgur.com/8h5boBg.png)

Bên trên là hình ảnh ví dụ về 3 clients A,B,C kết nối tới broker. 2 kênh B và C cùng đăng kí kênh temperature.

![anh4](https://i.imgur.com/ZPgMjsD.png)

Khi clientA gửi tới broker giá trị mới tới topic temperature, thì lúc này broker sẽ chuyển message tới tất cả clients đã đăng kí kênh temperature.

## 3. MQTT brokers

- MQTT brokers rất đa dạng: mosquitto, HiveMQ, Apache Apollo, Apache ActiveMQ, RabbitMQ, MQTT.js,...

- Thực hành với Apache ActiveMQ:

Sử dụng JMS(Java Message Service) cho phép gửi, nhận tin nhắn giữa 1 hay nhiều client. Ví dụ A và B gửi thông điệp cho nhau. Với JMS, chúng sẽ không cần kết nối trực tiếp với nhau, mà thông điệp được gửi tới JMS provider và được đặt vào 1 hàng đợi cho đến khi client khác nhận thông điệp.

![hinh5](https://i.imgur.com/pJ4A8fD.png)

message producer là 1 chương trình java gửi JMS message tới hàng đợi trên JMS provider, message consumer là 1 chương trình Java khác cái mà có nhiệm vụ nhận message. 2 chương trình này có thể nằm tại 2 máy riêng biệt nhưng để giao tiếp được chúng phải có được URL của JMS provider. Provider giống như 1 server (như JBoss, Glassfish), ActiveMQ broker sẽ giữ vai trò tương tự thế (1 broker trung gian hay còn gọi là MOM_Message Oriented Middleware).

[install ActiveMQ](http://activemq.apache.org/getting-started.html)


# end.