Script nén log file, sau đó move sang thư mục backup

Gồm 2 script, cơ chế:
– Dọn nén các file .log trong folder chứa log, ở đây là /opt/batch/<tên batch>/log (Điều chỉnh tron file chạy chính)
– Sau khi nén xong thì đưa lên file server để chứa: ở đây đã mount file server vào /net/filesv (cấu hình điều chỉnh trong file thứ cấp)
– Các file log được dọn là các file log có từ tháng trước, và hiện tại không có tiến trình nào đang đọc ghi: ví dụ: hnay là tháng 8 thì sẽ dọn các file có timestamp là tháng 7

File chạy chính, clean_all_log.sh

#!/bin/bash

## find all directory named log or logs and call clean_log_batch.sh script 


START=$(date +%s)

function timecal {
        END=$(date +%s)
        TOTAL=$(expr $END - $START)
        HOURS=$(expr $TOTAL / 3600)
        MINUTES=$(expr $TOTAL % 3600 / 60)
        RUNNING_TIME="$MINUTES minute(s)"
        [[ $HOURS -gt 0 ]]&&{ RUNNING_TIME="$HOURS hour(s), $RUNNING_TIME"; }
        echo "[INFO] Total time: $RUNNING_TIME"
}

trap "timecal" EXIT

BASEDIR=$(dirname $0)
## batch dir, value must be absolute path
BATCH_DIR=/opt/batch
[ ! -d $BATCH_DIR ]&&{ echo $BATCH_DIR not found; exit 1; }
LOG_DIRS=$(find $BATCH_DIR -type d -name 'log' -or -name 'logs')
for LOG_DIR in $LOG_DIRS
do
	echo "[INFO] Clean log path $LOG_DIR"
	./clean_log_batch.sh $LOG_DIR	
done

File thứ cấp: clean_log_batch.sh

#!/bin/bash

## This script requires autofs installed on the running machine
## and read/write on REMOTE_HOST via nfs share
## LOG_DIR must be absolute path

## Log file must have timestamp in its name with format YYYY[.-_]mm[/-_]dd
## Log file must have .log in its name
## Log file must have its name pattern placed before timestamp
## Even so, cover all the log pattern generated by developers on a whim without a standard still be painful

LOG_DIR=$1
TEMP_DIR=${LOG_DIR}/temp
REMOTE_HOST=filesv
REMOTE_FOLDER=/net/${REMOTE_HOST}/drbd/applog/applicationserver/`hostname`${1}
MONTHS_TO_KEEP=1  # months to keep log, the older ones will be archived. e.g: if current month is Sep, and month to keep is 1, the logs from August and older will be archived.

[[ ! -d $1 ]]&&{ echo "[ERROR] $1 not found";exit 1; }
[[ ! -d /net/${REMOTE_HOST} ]]&&{ echo "[ERROR] remote dir /net/${REMOTE_HOST} not found"; exit 1; }
[[ ! -d $TEMP_DIR ]]&&{ mkdir -p ${TEMP_DIR}; }   # Create temp folder if it doesn't exist
TIMELINE=$(date -d "$(date +%Y-%m-15) -$MONTHS_TO_KEEP months" +'%Y%m')

cd $LOG_DIR

# move all .gz files to temp dir if they 're available in LOG_DIR
find . -maxdepth 1 -type f -name "*.gz" -exec mv {} $TEMP_DIR/ \;

PATTERNS=$(ls -p | awk -F'[._-]20[0-9][0-9]|20[0-9][0-9]' '/.log/ {print $1}' | uniq | sed 's/\.log//' | grep -v /)
for PATTERN in $PATTERNS
do
 RETRY=$(ls $LOG_DIR/${PATTERN}* 2>/dev/null | wc -l) # Times of retry until exit from loop. This value is equal to the number of files with PATTERN in LOG_DIR. 
 OLDEST_TIME_STAMP=$(ls -p | grep -m1 "^${PATTERN}[._-]\{0,1\}\(log[._-]\)\{0,1\}20[0-9][0-9]" 2>/dev/null | sed "s/${PATTERN}//" | tr -cd '[:digit:]')
 if [[ ${#OLDEST_TIME_STAMP} -lt 8 ]]; then
  echo "[WARN] Timestamp extracted from file name $OLDEST_TIME_STAMP is invalid. Ignore pattern $PATTERN"
  continue
 fi
 RETRY_TIME=0
# while the 6 first characters of time stamp (e.g: 201607) is greater than current time
# and $RETRY_TIME is less than $RETRY
 while [[ "${OLDEST_TIME_STAMP}" ]]&&[[ ${OLDEST_TIME_STAMP:0:6} -le ${TIMELINE} ]]&&[[ $RETRY_TIME -lt $RETRY ]]
 do
# TIME_STAMP_PATTERN format: YYYY-mm
  YEAR=${OLDEST_TIME_STAMP:0:4}
  MONTH=${OLDEST_TIME_STAMP:4:2}
  TIME_STAMP_PATTERN=${YEAR}-${MONTH}
  echo "[INFO] Archiving ${PATTERN}_${TIME_STAMP_PATTERN}"
# files with PATTERN and TIME_STAMP_PATTERN
  LOG_FILES=$(find . -maxdepth 1 -type f -regextype sed -regex "\./${PATTERN}[-_.]\{0,1\}${YEAR}[-._]\{0,1\}${MONTH}.*" -or -regextype sed -regex "\./${PATTERN}.*[-_.]\{0,1\}${YEAR}[-_.]\{0,1\}${MONTH}.*")
# Check if log files is being used by any process
  fuser $LOG_FILES && {
    echo "[WARNING] There 're files being used. Abort archive ${PATTERN}_${TIME_STAMP_PATTERN}"
    RETRY_TIME=$(($RETRY_TIME + 1))
    continue
  }
  tar -cvzf ${TEMP_DIR}/${PATTERN}_${YEAR}-${MONTH}.tar.gz ${LOG_FILES} --remove-files
# Reset the OLDEST_TIME_STAMP variable
  OLDEST_TIME_STAMP=$(ls -p | grep -m1 "${PATTERN}[._-]\{0,1\}\(log[._-]\)\{0,1\}20[0-9][0-9]" 2>/dev/null | sed "s/${PATTERN}//" | tr -cd '[:digit:]')
  RETRY_TIME=$(($RETRY_TIME + 1)) # increase value of RETRY_TIME by 1
 done
done
# Exit if TEMP_DIR empty
[[ "$(ls -A $TEMP_DIR)" ]]||{ exit 0; }
# copy all archived file from TEMP_DIR to remote host
# and delete if copy is successful
mkdir -p $REMOTE_FOLDER && \
rsync -have --progress --backup --backup-dir=${REMOTE_FOLDER} --remove-source-files ${TEMP_DIR}/* ${REMOTE_FOLDER} && rmdir ${TEMP_DIR}

 

Tích hợp cảnh báo qua telegram với PRTG

Bước 1: cần có 1 con bot trên telegram, cách tạo bot các bạn chat với @botfather và làm theo hướng dẫn. Sau khi thực hiện, sẽ có token trả về, sử dụng để authen đối với các request tới bot
token có dạng đại loại như:
481775980:NAGtU-UYFQfYhufthedUAwMB2XWzRc8F6AA
Bước 2: tạo 1 room chat với con bot chúng ta vừa tạo, cứ tạo cuộc trò chuyện mới sau đó add con bot mới vào.
Bước 3: Lấy chat ID của cuộc trò chuyện vừa tạo
sử dụng URL có định dạng:
https://api.telegram.org/bot<token của bot>/getUpdates
VD: https://api.telegram.org/bot481775980:NAGtU-UYFQfYhufthedUAwMB2XWzRc8F6AA/getUpdates
call lên url mới có với header: “Content-Type: application/json”

curl -H "Content-Type: application/json" https://api.telegram.org/bot481775980:NAGtU-UYFQfYhufthedUAwMB2XWzRc8F6AA/getUpdates

chúng ta sẽ nhận được chuỗi json trả về, với chatID tương ứng

{
  "ok": true,
  "result": [
    {
      "update_id": 911858273,
      "message": {
        "message_id": 15396,
        "from": {
          "id": 432109061,
          "is_bot": false,
          "first_name": "some name",
          "last_name": "ハンサム",
          "username": "some username",
          "language_code": "en"
        },
        "chat": {
          "id": -359110891,
          "title": "GmsABD",
          "type": "group",
          "all_members_are_administrators": true
        },
        "date": 1566359213,
        "new_chat_participant": {
          "id": 471543210,
          "is_bot": true,
          "first_name": "SexyBot",
          "username": "damducbot"
        },
        "new_chat_member": {
          "id": 471543210,
          "is_bot": true,
          "first_name": "SexyBot",
          "username": "damducbot"
        },
        "new_chat_members": [
          {
            "id": 471543210,
            "is_bot": true,
            "first_name": "SexyBot",
            "username": "damducbot"
          }
        ]
      }
    },
    {
      "update_id": 911858274,
      "message": {
        "message_id": 15397,
        "from": {
          "id": 432109061,
          "is_bot": false,
          "first_name": "some name",
          "last_name": "ハンサム",
          "username": "some username",
          "language_code": "en"
        },
        "chat": {
          "id": -359110891,
          "title": "GmsABD",
          "type": "group",
          "all_members_are_administrators": true
        },
        "date": 1566359341,
        "new_chat_photo": [
          {
            "file_id": "AgADBQADsqcxG5SuihmFyQGf595pCVSo-TIABAEAAwIAA2EAAz3VAQABFgQ",
            "file_size": 5297,
            "width": 160,
            "height": 160
          },
          {
            "file_id": "AgADBQADsqcxG5SuihmFyQGf595pCVSo-TIABAEAAwIAA2IAAz7VAQABFgQ",
            "file_size": 11196,
            "width": 320,
            "height": 320
          },
          {
            "file_id": "AgADBQADsqcxG5SuihmFyQGf595pCVSo-TIABAEAAwIAA2MAAz_VAQABFgQ",
            "file_size": 25020,
            "width": 640,
            "height": 640
          }
        ]
      }
    },
    {
      "update_id": 911858275,
      "message": {
        "message_id": 15398,
        "from": {
          "id": 442710299,
          "is_bot": false,
          "first_name": "Mr Dam",
          "username": "Damnnvn"
        },
        "chat": {
          "id": -359110891,
          "title": "GmsABD",
          "type": "group",
          "all_members_are_administrators": true
        },
        "date": 1566359505,
        "new_chat_participant": {
          "id": 867065125,
          "is_bot": false,
          "first_name": "Mr du",
          "username": "mrdu"
        },
        "new_chat_member": {
          "id": 867065125,
          "is_bot": false,
          "first_name": "Mr du",
          "username": "mrdu"
        },
        "new_chat_members": [
          {
            "id": 867065125,
            "is_bot": false,
            "first_name": "Mr du",
            "username": "mrdu"
          }
        ]
      }
    }
  ]
}

Theo như ở trên, chúng ta có nhóm

"chat": {
          "id": -359110891,
          "title": "GmsABD",
          "type": "group",
          "all_members_are_administrators": true
        },

Đã có chat ID
Bước 4:
Điền thông tin vào PRTG, truy cập PTRG, setup –> notify template
Sửa or add 1 template
Phần Execute HTTP Action
URL dạng: https://api.telegram.org/bot481775980:NAGtU-UYFQfYhufthedUAwMB2XWzRc8F6AA/sendMessage
HTTP Method: POST
Payload:

chat_id= số chat ID lấy được ở bước trên&text=
[%sensor](%linksensor)
*Last Value* %lastvalue
*Last Message* %lastmessage 
*Down since* %since
*Device* %device
*Group* %group&parse_mode=Markdown

Ví dụ hoàn chỉnh

chat_id=-359110891&text=
[%sensor](%linksensor)
*Last Value* %lastvalue
*Last Message* %lastmessage 
*Down since* %since
*Device* %device
*Group* %group&parse_mode=Markdown

Lưu tất cả lại.
Sau đó khi add trigger notifycation, chọn template này là OK

 

Tìm hiểu về DRBD – hệ thống lưu trữ trên linux

1. DRBD là gì?

DRBD viết tắt của Distributed Replicated Block Device, là một tiện ích sử dụng để nâng cao tính sẵn sàng của hệ thống. Nó là được xây dựng trên nền ứng dụng mã nguồn mở để đơn giản hóa việc chia sẻ các dữ liệu trong hệ thống lưu trữ với nhau qua đường truyền mạng. Chúng ta có thể hiểu nôm na rằng đây là RAID-1 sử dụng các giao tiếp mạng để trao đổi dữ liệu cho nhau.

Về tổng quan, DRBD gồm 2 server cung cấp 2 tài nguyên lưu trữ độc lập, không liên quan gì với nhau. Trong một thời điểm, một server sẽ được cấu hình làm node primary đọc và ghi dữ liệu; node còn lại là secondary làm nhiệm vụ đồng bộ dữ liệu từ node primary để đảm bảo tính đồng nhất dữ liệu 2 node.

2. Quá trình hoạt động cơ bản của DRBD

Nhìn chung, các dịch vụ đồng bộ dữ liệu hoạt động ở chế độ Active – Passive. Ở chế độ này, node chính (primary) sẽ lắng nghe toàn bộ các thao tác (đọc, ghi) của người dùng. Node phụ (secondary) sẽ được kích hoạt thành node chính khi một giải pháp cluster nào đó phát hiện node chính down. Việc ghi dữ liệu sẽ được xảy ra đồng thời trên cả 2 node. DRBD hỗ trợ 2 kiểu ghi dữ liệu là fully synchronous and asynchronous.

DRBD cũng có thể hỗ trợ chế độ Active – Active, điều đó có nghĩa là việc ghi dữ liệu sẽ đồng thời xảy ra trên 2 node. Mode này được dựa trên một hệ thống chia sẻ tập tin, chẳng hạn như Global File System (GFS) hoặc các phiên bản Oracle Cluster File System 2 (OCFS2), trong đó bao gồm khả năng phân phối và quản lý file.

3. Các chế độ replication của DRBD

DRBD hỗ trợ 3 chế độ replication, cụ thể như sau:

3.1 Protocol A

  • Giao thức đồng bộ không đồng thời. Các thao tác ghi dữ liệu trên node chính sẽ được thực thi đến khi nào hoàn thành tác vụ, các gói tin replication được lưu trữ ở bộ đệm TCP. Trong trường hợp fail-over, dữ liệu này có thể bị mất.

3.2 Protocol B

  • Giao thức đồng bộ đồng thời trên RAM (semi-synchronous), các thao tác ghi được thực hiện trên node chính ngay khi có yêu cầu, các gói tin replication được gửi ngay khi node chính đã ghi xong. Khi fail-over, dữ liệu sẽ bị mất.

3.3 Protocol C

  • Giao thức đồng bộ, dữ liệu được ghi hoàn thiện chỉ khi nào 2 node chính và phụ xác nhận là đã hoàn thành. Giao thức này đảm bảo tính an toàn dữ liệu và được sử dụng phổ biến khi cấu hình DRBD.

4. Cấu trúc của DRBD

DRBD được chia làm 2 thành phần:

  • Module trong kernel có nhiệm vụ thiết lập các space-user dùng để quản lý các disk DRBD, nó thực hiện các quyền điều khiển với các thiết bị virtual block (khi replicate dữ liệu local với sang máy remote). Giống như một virtual disk, DRBD cung cấp một mô hình linh loạt cho hầu hết các loại ứng dụng đều có thể sử dụng.
  • Các module DRBD khởi tạo những chỉ dẫn các điểu khiển cơ bản được khai báo trong brbd.conf, ngoài ra còn phân định ra các thành phần được xác định bởi IP và Port

Một vài câu lệnh dùng để quản lý cài đặt DRBD:

  • DRBDadm: Công cụ quản trị DRBD cao nhất
  • DRBDsetup: Cấu hình DRBD nạp vào kernel
  • DRBDmeta: Cho phép tạo, dump, khôi phục và chỉnh sửa cấu trúc của meta-data.

Hướng dẫn thêm ổ đĩa mới vào máy chủ centos – How to add new hard disk to Centos server

Môi trường thực hiện: Centos 7
ổ cứng mới = 80GB
mount point = /net

kiểm tra ổ đĩa mới thêm bằng fdisk -l

[root@localhost ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b1107

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    41943039    19921920   8e  Linux LVM

Disk /dev/sdb: 85.9 GB, 85899345920 bytes, 167772160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-root: 18.2 GB, 18249416704 bytes, 35643392 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@localhost ~]#

Thấy phần ổ đĩa mới: Disk /dev/sdb: 85.9 GB, 85899345920 bytes, 167772160 sectors
gõ: fdisk /dev/sdb

[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xa07e2d9e.

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-167772159, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-167772159, default 167772159):
Using default value 167772159
Partition 1 of type Linux and of size 80 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]#

Đã tạo xong phân vùng, tiến hành format sang định dạng ext4, lưu ý, phân vùng mới tạo từ sdb ở trên giờ là sdb1

[root@localhost ~]# mkfs -t ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
5242880 inodes, 20971264 blocks
1048563 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2168455168
640 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

Giờ ổ đĩa đã sẵn sàng, chỉ cần mount vào đâu đó thì chúng đã sẵn sàng sử dụng, ví dụ mount vào /net1

[root@localhost ~]# mount /dev/sdb1 /net1/
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   17G  1.5G   16G   9% /
devtmpfs                 478M     0  478M   0% /dev
tmpfs                    489M     0  489M   0% /dev/shm
tmpfs                    489M  6.7M  482M   2% /run
tmpfs                    489M     0  489M   0% /sys/fs/cgroup
/dev/sda1               1014M  125M  890M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/sdb1                 79G   57M   75G   1% /net1

Đã thêm thành công

Để tự động mount ổ khi reboot, có thể thao tác bằng nhiều cách:
– Chạy tự động lệnh mount /dev/sdb1 /net1/ mỗi lần khởi động
– thêm vào /etc/fstab

/dev/sdb1 /net1                       ext4     noauto        0 0

 

 

Hướng dẫn cài đặt mapr cluster 3 node – How to install cluster mapr 3 nodes

Thông tin hệ thống:
Gồm 3 node:
c2s-mapr-01 10.0.0.117
c2s-mapr-02 10.0.0.118
c2s-mapr-03 10.0.0.119
OS: centos 6
mapr version: 5.0

Hướng dẫn phân vùng ổ đĩa để thực hiện việc cài đặt:
Trên mỗi máy centos, thực hiện phân vùng ổ đĩa như hình dưới, phần dung lượng không được mount vào đâu cả trong lvm sẽ được sử dụng bởi mapr trong quá trình cài đặt.
Lưu ý: Volume Group Name phải đặt tên giống nhau trên cả 3 máy.

Đi vào cài đặt:
Thao tác trên máy c2s-mapr-01.
1. Tạo /etc/hosts hoặc đăng ký DNS

vi /etc/hosts
10.0.0.117 c2s-mapr-01
10.0.0.118 c2s-mapr-02
10.0.0.119 c2s-mapr-03
127.0.0.1 localhost localhost.localdomain

2.Cấu hình kết nối bằng SSH key
#Chạy lần lượt từng lệnh dưới đây , nếu được hỏi password thì điền password

ssh-keygen
ssh-copy-id c2s-mapr-01
ssh-copy-id c2s-mapr-02
ssh-copy-id c2s-mapr-03

3. Cài clustershell để đồng thời chạy command trên tất cả các máy
#chỉ chạy trên con mapr1

yum install -y epel-release && yum install -y clustershell
echo 'all: c2s-mapr-0[1-3]' > /etc/clustershell/groups

4. Đồng bộ file host tới toàn bộ các máy

clush -a --copy /etc/hosts

5. Cài đặt service đồng bộ thời gian với timeserver

clush -a yum install -y chrony
clush -a service chronyd start
clush -a chkconfig chronyd on

6. Tắt tường lửa

clush -a service iptables stop
clush -a chkconfig iptables off

7. Tạo thư mục làm việc và người dùng cho mapr

clush -a mkdir /root/work
clush -a groupadd -g 1003 mapr
clush -a useradd -u 1003 -g mapr mapr
clush -a 'echo mapr:mapr | chpasswd'
clush -a useradd -u 1004 -g mapr mruser
clush -a 'echo mruser:mruser | chpasswd'

8.Đặt SSH key cho người quản lý mapr

su - mapr
ssh-keygen
ssh-copy-id c2s-mapr-01
ssh-copy-id c2s-mapr-02
ssh-copy-id c2s-mapr-03
exit

9. Cài đặt jdk cho tất cả các máy

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Download file jdk linux x64.rpm
Sau khi download xong copy lên máy 01, chạy lệnh cài đặt bên dưới, đường dẫn, tên file tự thay đổi lại cho phù hợp
clush -a --copy /root/work/jdk-8u102-linux-x64.rpm
clush -a rpm -ivh /root/work/jdk-8u102-linux-x64.rpm

10. Cài repo MapR 5.0

#Run on c2s-mapr-01

vi /etc/yum.repos.d/mapr.repo
[maprtech]
name=MapR Technologies
baseurl=http://package.mapr.com/releases/v5.0.0/redhat/
enabled=1
gpgcheck=1
protect=1

[maprecosystem]
name=MapR Technologies
baseurl=http://package.mapr.com/releases/ecosystem-all/redhat
enabled=1
gpgcheck=1
protect=1
clush -a --copy /etc/yum.repos.d/mapr.repo
clush -a rpm --import http://package.mapr.com/releases/pub/maprgpg.key

11. Cài các gói MapR

clush -a yum install -y mapr-fileserver mapr-zookeeper mapr-webserver mapr-resourcemanager mapr-nodemanager mapr-gateway
clush -w c2s-mapr-02 yum install -y mapr-cldb mapr-nfs
clush -w c2s-mapr-03 yum install -y mapr-historyserver

12. Cấu hình cluster ban đầu

clush -a /opt/mapr/server/configure.sh -N c2s-MapR -C c2s-mapr-02 -Z c2s-mapr-01,c2s-mapr-02,c2s-mapr-03 -RM c2s-mapr-01,c2s-mapr-02,c2s-mapr-03 -HS c2s-mapr-03

13. Định dạng đĩa

clush -a lvdisplay
clush -a lsblk
clush -a lvcreate -L 349G -n MaprVol vg_c2smapr
clush -a lsblk
echo /dev/vg_c2smapr/MaprVol > /root/work/disks.txt
clush -a --copy /root/work/disks.txt
clush -a /opt/mapr/server/disksetup -W 4 -F /root/work/disks.txt

dòng vg_c2smapr giống như dòng VG Name khi chạy lệnh “lvdisplay” trên từng máy
clush -a lvcreate -L 136G -n MaprVol vg_c2smapr –> số 349GB là số dung lượng trống còn lại của ổ đĩa, Con số 349GB ở trên thay đổi lại theo tình hình thực tế.

14. Thiết lập các biến môi trường
Thêm 2 dòng sau vào file /opt/mapr/conf/env.sh

export JAVA_HOME=/usr/java/latest
export MAPR_SUBNETS=10.0.0.0/23

Thay đổi lại subnet cho đúng, sau đó đồng bộ file vừa sửa sang 2 máy còn lại

clush -a --copy /opt/mapr/conf/env.sh

15. Thiết lập mapr fstab
Mounting NFS to MapR-FS on a Cluster Node
Để tự động mount NFS vào MapR-FS trên cluster

echo "localhost:/mapr /mapr hard,intr,nolock,actimeo=1,noatime" >> /opt/mapr/conf/mapr_fstab
clush -a --copy /opt/mapr/conf/mapr_fstab
clush -a mkdir /mapr

16. Bật dịch vụ trên các máy, kiểm tra dịch vụ CLDB

clush -a service mapr-zookeeper start
clush -a service mapr-zookeeper qstatus
clush -a service mapr-warden start
clush -a "jps | grep CLDB"
maprcli node cldbmaster
maprcli license showid -cluster c2s-MapR

Bước “clush -a “jps | grep CLDB”” có thể mất 1 lúc CLDB mới có thể khởi động, chịu khó đợi 1 chút.
Sau khi chạy showid, sẽ có ID hiện ra, ghi lại thông tin này, để đăng ký license

17. Đăng ký license
Truy cập: https://www.mapr.com/user
Đăng ký tài khoản, nhập ID ở bước 16, ghi lại nội dung license được cấp vào file license.txt
Tiến hành add vào cluster

maprcli license add -cluster c2s-MapR -license /root/work/license.txt -is_file true
clush -a service mapr-warden restart

18. Tạo phân vùng hadoop

hadoop fs -mkdir /user/mapr
hadoop fs -chown mapr:mapr /user/mapr
hadoop fs -mkdir /user/mruser
hadoop fs -chown mruser:mapr /user/mruser

19.

su - mapr
$ hadoop fs -mkdir -p /user/hive/warehouse
$ hadoop fs -chmod 1777 /user/hive/warehouse
$ hadoop fs -mkdir /apps/spark
$ hadoop fs -chmod 777 /apps/spark
$ exit

20.

clush -a service mapr-warden stop
clush -a service mapr-zookeeper stop

21. Cài ứng dụng Spark

clush -a rpm -ivh http://archive.mapr.com/releases/ecosystem-all/redhat/mapr-hbase-0.98.12.201507081709-1.noarch.rpm
clush -a rpm -ivh http://archive.mapr.com/releases/ecosystem-all/redhat/mapr-hive-0.13.201511180922-1.noarch.rpm
clush -a rpm -ivh http://archive.mapr.com/releases/ecosystem-all/redhat/mapr-spark-1.4.1.201509021818-1.noarch.rpm

22.

clush -w c2s-mapr-01 rpm -ivh http://archive.mapr.com/releases/ecosystem-all/redhat/mapr-hivemetastore-0.13.201511180922-1.noarch.rpm
clush -w c2s-mapr-01 rpm -ivh http://archive.mapr.com/releases/ecosystem-all/redhat/mapr-hiveserver2-0.13.201511180922-1.noarch.rpm

23.

clush -w c2s-mapr-03 yum install -y http://archive.mapr.com/releases/ecosystem-all/redhat/mapr-spark-historyserver-1.4.1.201509021818-1.noarch.rpm
clush -a /opt/mapr/server/configure.sh -N c2s-MapR -C c2s-mapr-02 -Z c2s-mapr-01,c2s-mapr-02,c2s-mapr-03 -RM c2s-mapr-01,c2s-mapr-02,c2s-mapr-03 -HS c2s-mapr-03 -R

24. Cài MySQL cho Hive.

vi /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
clush -a --copy /etc/yum.repos.d/mysql-community.repo
yum install -y mysql-community-server-5.6.25 mysql-community-common-5.6.25 mysql-community-client-5.6.25 mysql-community-libs-5.6.25 mysql-community-libs-compat-5.6.25
vim /etc/my.cnf
# add "user=mysql" after line 'socket=/var/lib/mysql/mysql.sock'
service mysqld start
chkconfig mysqld on
mysql_secure_installation
mysql -u root -p
Enter password:*******
mysql> CREATE USER hivemetastore IDENTIFIED BY 'c2shive';
mysql> CREATE DATABASE hive DEFAULT CHARACTER SET 'latin1';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'hivemetastore'@'%' IDENTIFIED BY 'c2shive';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'hivemetastore'@'localhost' IDENTIFIED BY 'c2shive';
mysql> show grants for 'hivemetastore'@'%';
mysql> show grants for 'hivemetastore'@'localhost';
mysql> exit

23.

ln -s /opt/mapr/lib/mysql-connector-java-5.1.25-bin.jar /opt/mapr/hive/hive-0.13/lib/mysql-connector-java-5.1.25-bin.jar

Thêm cấu hình sau cho /opt/mapr/hive/hive-0.13/conf/hive-site.xml

# vim /opt/mapr/hive/hive-0.13/conf/hive-site.xml
<!--## <configure></configure>内に Sheet19-2 の内容を追記する ##-->
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://c2s-mapr-01:3306/hive?createDatabaseIfNotExist=true</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
  <description>Driver class name for a JDBC metastore</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hivemetastore</value>
  <description>username to use against metastore database</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>c2shive</value>
  <description>password to use against metastore database</description>
</property>
<property>
  <name>hive.metastore.uris</name>
  <value>thrift://c2s-mapr-01:9083</value>
</property>
<property>
  <name>hive.server2.enable.doAs</name>
  <value>true</value>
</property>
<property>
  <name>hive.metastore.execute.setugi</name>
  <value>true</value>
</property>
<property>
  <name>hive.server2.authentication</name>
  <value>NOSASL</value>
</property>

<!-- Hive - MapR-DB Integration -->
<property>
  <name>hive.aux.jars.path</name>
  <value>file:///opt/mapr/hive/hive-0.13/lib/hive-hbase-handler-0.13.0-mapr-1510.jar,file:///opt/mapr/hbase/hbase-0.98.12/lib/hbase-common-0.98.12-mapr-1506.jar,file:///opt/mapr/hbase/hbase-0.98.12/lib/zookeeper-3.4.5-mapr-1406.jar</value>
  <description>A comma separated list (with no spaces) of the jar files required for Hive-HBase integration</description>
</property>

<property>
  <name>hbase.zookeeper.quorum</name>
  <value>c2s-mapr-01,c2s-mapr-02,c2s-mapr-03</value>
  <description>A comma separated list (with no spaces) of the IP addresses of all ZooKeeper servers in the cluster.</description>
</property>

<property>
  <name>hbase.zookeeper.property.clientPort</name>
  <value>5181</value>
  <description>The Zookeeper client port. The MapR default clientPort is 5181.</description>
</property>

Đồng bộ sang các máy khác:

clush -a --copy /opt/mapr/hive/hive-0.13/conf/hive-site.xml

25. Làm tương tự đối với /opt/mapr/hadoop/hadoop-2.7.0/etc/hadoop/core-site.xml

# vim /opt/mapr/hadoop/hadoop-2.7.0/etc/hadoop/core-site.xml
<!--## <configure></configure>内に以下を追記する ##-->
<property>
  <name>hadoop.proxyuser.mapr.hosts</name>
  <value>*</value>
  <description>The superuser can connect from any host to impersonate a user</description>
</property>

<property>
  <name>hadoop.proxyuser.mapr.groups</name>
  <value>*</value>
  <description>Allow the superuser mapr to impersonate any member of any group</description>
</property>
# clush -a --copy /opt/mapr/hadoop/hadoop-2.7.0/etc/hadoop/core-site.xml
# clush -a touch /opt/mapr/conf/proxy/mruser

26.

# echo "spark.serializer        org.apache.spark.serializer.KryoSerializer" >> /opt/mapr/spark/spark-1.4.1/conf/spark-defaults.conf
# clush -a --copy /opt/mapr/spark/spark-1.4.1/conf/spark-defaults.conf

27.

# cp /opt/mapr/hive/hive-0.13/conf/hive-site.xml /opt/mapr/spark/spark-1.4.1/conf/
# clush -a --copy /opt/mapr/spark/spark-1.4.1/conf/hive-site.xml

29. Thay đổi thông tin /opt/mapr/spark/spark-1.4.1/mapr-util/compatibility.version

hive_versions=0.13.1
hbase_versions=0.98.12
clush -a --copy /opt/mapr/spark/spark-1.4.1/mapr-util/compatibility.version

30.

# vim /opt/mapr/hadoop/hadoop-2.7.0/etc/hadoop/yarn-site.xml
<!--## <configure></configure>内に以下を追記する ##-->
<property>
  <name>yarn.resourcemanager.connect.retry-interval.ms</name>
  <value>1000</value>
</property>
<property>
  <name>yarn.resourcemanager.am.max-attempts</name>
  <value>3</value>
</property>
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>

31.

# clush -a --copy /opt/mapr/hadoop/hadoop-2.7.0/etc/hadoop/yarn-site.xml
# clush -a --copy /opt/mapr/hadoop/hadoop-2.7.0/etc/hadoop/yarn-site.xml
# clush -a yum install -y rpcbind
# clush -a chkconfig rpcbind on
# clush -a service rpcbind start

32. Cài patch

clush -a yum install -y http://archive.mapr.com/patches/archives/v5.0.0/redhat/mapr-patch-5.0.0.32987.GA-39045.x86_64.rpm

33. Bật mọi thứ lên:

# clush -a service mapr-zookeeper start
# clush -a service mapr-warden start

34. Đã xong, trang quản trị mapr:
https://10.0.0.117:8443
user/pass = mapr/mapr

Simple monitoring – Chương trình monitor mạng đơn giản.

Chương trình được viết bằng python

Hướng dẫn cài đặt:

Cài đặt python3, và các gói cần thiết
yum install epel-release -y & yum install python36 python36-pip.noarch -y && pip3 install requests

Cách chạy app, sau khi thay cấu hình trong file config.py
cd <đường dẫn thư mục app>
python3 monitor_simple.py

Cách thiết lập chạy mỗi phút 1 lần:
crontab -l
Thêm vào dòng sau:
* * * * * /usr/bin/python3 <đường dẫn file monitor_simple.py>

Download:

https://github.com/khachuy2705/monitor_simple

Thêm custom rule firewall cho ESXi

Tương tự ufw, iptable của centos, ubuntu, ESXi cũng có firewall của riêng mình. Mặc định ESXi đã tạo sẵn 1 số rule, chúng ta có thể thao tác với các rule này trên web quản trị Tuy nhiên một có một số hạn chế như: chỉ đi ra ngoài qua outgoing port mặc định: 80, 22, 443.v.v Khi đó cần tạo thêm rule mới cho nhu cầu của mình. Cách mở thêm rule như sau: SSH vào máy chủ ESXi, sửa file /etc/vmware/firewall/custom.xml nếu không có thì tạo mới. Thêm rule vào theo định dạng sau:
<ConfigRoot>
  <service id='0100'>
    <id>sshClient-2222</id>
    <rule>
      <direction>outbound</direction>
      <protocol>tcp</protocol>
      <porttype>dst</porttype>
      <port>2222</port>
    </rule>
    <enabled>true</enabled>
    <required>false</required>
  </service>

  <service id='0101'>
    <id>NFSClient-2049</id>
    <rule>
      <direction>outbound</direction>
      <protocol>tcp</protocol>
      <porttype>dst</porttype>
      <port>2049</port>
    </rule>
    <enabled>true</enabled>
    <required>false</required>
  </service>

</ConfigRoot>
Sau đó refresh lại firewall
esxcli network firewall refresh
 

Regular Expressions cơ bản

Cú pháp cơ bản:

.             1 ký tự bất kỳ, ngoại trừ xuống dòng
\.            dấu chấm (\ thể hiện escape)
\d            Một ký tự số
\D            Một ký tự không phải là số
\w            Một chữ hoặc số
\W            Một ký tự không phải là chữ
\s            một Dấu cách
\S            Một ký tự không phải dấu cách
\b            1 từ nguyên vẹn
\n            Xuống dòng
\t            Tab

Modifiers

$             Bắt đầu chuỗi
^             bắt đầu chuỗi
ab|cd         Matches ab hoặc cd.
[ab-d]	      Match a và match các ký tự từ b --> d = bcd
[^ab-d]	      One character except: a, b, c, d
()            Items within parenthesis are retrieved
(a(bc))       Items within the sub-parenthesis are retrieved

Repetitions

[ab]{2}       Exactly 2 continuous occurrences of a or b
[ab]{2,5}     2 to 5 continuous occurrences of a or b
[ab]{2,}      2 or more continuous occurrences of a or b
+             One or more
*             Zero or more
?             0 or 1