Thứ Bảy, 5 tháng 3, 2022

Phần 2: Lệnh quản trị redis cơ bản

Phần 2: Lệnh quản trị redis cơ bản

Seri Redis của chúng ta gồm những phần sau:

Phần 1: Cài đặt redis cơ bản + Turning redis.
Phần 2: Lệnh quản trị redis cơ bản
Phần 3: Bảo mật cho redis. (redis security)
Phần 4: Access List Redis (tính năng mới từ bản 6)
Phần 5: Các mô hình Redis replication, Ưu và nhược điểm
Phần 6: Redis Master-Salve sử dụng ACL
Phần 7: Redis Sentinel sử dụng ACL
Phần 8: Cài đặt Redis Cluster
Phần 9: Di chuyển data từ redis đơn sang cluster và ngược lại.
Phần 10: Data type trong Redis, một vài ví dụ sử dụng (String/hash/sort/list/queue/pub-sub....).
Phần 11: Một số lỗi thường gặp khi quản trị hệ thống Redis.
Phần 12: Continue...

Phần 2: Làm quen lệnh quản trị redis cơ bản

MONITOR

Đây là 1 lệnh rất hay, dùng để GIÁM SÁT realtime toàn bộ hoạt động của redis (VD trong trường hợp bạn đang không biết code đang bung lệnh gì vào redis )

#redis-cli
127.0.0.1:6379> MONITOR
1645808925.291724 [0 127.0.0.1:54180] "SET" "TUANDA" "123"
1645808928.157719 [0 127.0.0.1:54180] "GET" "TUANDA"
1645808939.043673 [0 127.0.0.1:54180] "EXPIRE" "TUANDA" "5"

hoặc
[root@master-node ~]# redis-cli MONITOR

CLIENT LIST

Giúp chúng ta liệt kê có bao nhiêu client đang kết nối vào redis-server, đang chạy command gì

127.0.0.1:6379> CLIENT LIST
id=3086 addr=192.168.88.13:35764 laddr=192.168.88.12:6379 fd=10 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=40954 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=61464 events=r cmd=set user=default redir=-1

Như trên ta thấy client có IP là 192.168.88.13:35764 đang kết nối đến server 192.168.88.12:6379 và sử dụng command cmd=SET để ghi key vào redis.

Lệnh này rất thuận tiện để cho ta debug rằng tiến trình / code tại server nào đang gọi + giữ kết nối nhiều đến redis server, làm tràn connection đến Redis > để báo DEV kiểm tra và fix close connection.

INFO

Show toàn bộ status của redis, bao gồm CPU/RAM/KEY. Các công cụ giám sát như prometheus, zabbix, nagios... đều dùng lệnh này để lấy giá trị ra giám sát:

# Clients
connected_clients:2
cluster_connections:0
maxclients:20000
# Memory
used_memory:1435904
# Replication
role:master
connected_slaves:0
#Keyspace
db0:keys=2,expires=0,avg_ttl=0

SCAN thay vì dùng KEYS

Lệnh KEYS * tốt khi dùng redis với ít key-value. Nhưng khi có vài triệu key thì KEYS * không phải là lựa chọn tốt (gây ra cao tải I/O, lệnh keys bị cấm ở Prod). Thay vào đó ta có các lựa chọn khác

- Search 5000 key ngẫu nhiên
"scan" "0" "MATCH" "*" "COUNT" "500"

- Search 1 key ngẫu nhiên
RANDOMKEY

- HOẶC dùng regex
KEYS ABC*

CONFIG GET / CONFIG SET

Chức Năng: Lấy thông tin cấu hình của redis đang chạy, phù hợp với sysadmin mới tiếp nhận redis, sẽ hiểu được toàn bộ cấu hình đang chạy. (Ví dụ: log nằm ở đâu, file rdb dump (dữ liệu) nằm ở đâu, thời gian bgsave như nào )

127.0.0.1:6379> CONFIG GET maxclients
"20000"
127.0.0.1:6379> CONFIG SET maxclients 100000
OK
127.0.0.1:6379> CONFIG GET *
hoặc
[root@master-node ~]# redis-cli  CONFIG GET "*"

SLOWLOG GET

Hiển thị các command chiếm I/O của redis

127.0.0.1:6379> SLOWLOG help
127.0.0.1:6379> SLOWLOG GET

SELECT

Chắc ít bạn sẽ biết là redis có tận 16 vùng chứa db khác nhau. Mặc dịnh tất cả các thao tác nằm ở db0. Lệnh select giúp chúng ta chuyển Namespace (giống với k8s). Dữ liệu của mỗi namespace sẽ không liên quan tới nhau, ta có thể đặt trùng tên. Dùng để tách biệt môi trường ví dụ 2 key giống tên nhau mà có value khác nhau.

BGSAVE / SAVE

Cập nhập mới toàn bộ data trên ram của redis vào dump.rdb file. (Phục vụ cho công việc upgrade redis version, restart redis node... để tránh mất dữ liệu trên ram)

- BGSAVE: 
BackGround save. Lưu toàn bộ dữ liệu thay đổi của redis được ghi đồng thời, không ảnh hưởng đến hoạt động của redis-server.
- SAVE: 
Redis sẽ LOCK toàn bộ command tác động đến dữ liệu và tiến hành lưu dữ liệu vào rdb.

Backup/Clone dữ liệu redis:

Redis lưu toàn bộ dữ liệu trên file dump.rdb, để clone dữ liệu sang 1 redis khác, có 2 cách:

  • Để redis mới thành slave của con đang chạy, sau đó ngắt slave và cho chạy làm Master.
  • Copy offline file dump.rdb, để vào thư mục data của redis mới, start redis mới là ta đã clone thành công.

Other, Sử dụng pipeline để export/import toàn bộ Key/Value (String) của redis.

(Chỉ sử dụng cho redis đang lưu String, dành cho ai cần đến, Hash/List/Sort/ZSET.. không áp dụng đc) Để import ta có thể chuẩn bị file mẫu như sau:

vi import.txt
SET TUANDA1 1231
SET TUANDA2 1232
EXPIRE TUANDA1 1001
EXPIRE TUANDA2 1002
[root@master-node ~]# redis-cli < import.txt
[root@master-node ~]# redis-cli GET TUANDA1
"1231"
[root@master-node ~]# redis-cli TTL TUANDA1
(integer) 971

Để export toàn bộ key String ta có thể làm cách sau:

[root@master-node ~]# redis-cli KEYS "*" > key_export.txt
[root@master-node ~]# cat key_export.txt 
TUANDA1
TUANDA
TUANDA2
[root@master-node ~]# sed -i -e 's/^/GET /g' key_export.txt 
[root@master-node ~]# cat key_export.txt 
GET TUANDA1
GET TUANDA
GET TUANDA2
[root@master-node ~]# redis-cli < key_export.txt > value_export.txt
[root@master-node ~]# cat value_export.txt 
1231
123
1232
[root@master-node ~]# paste key_export.txt value_export.txt 
GET TUANDA1	1231
GET TUANDA	123
GET TUANDA2	1232

Phần 1: Cài đặt redis cơ bản + Turning redis.

Phần 1: Cài đặt redis cơ bản + Turning redis.

Seri Redis của chúng ta gồm những phần sau:

Phần 1: Cài đặt redis cơ bản + Turning redis.
Phần 2: Lệnh quản trị redis cơ bản
Phần 3: Bảo mật cho redis. (redis security)
Phần 4: Access List Redis (tính năng mới từ bản 6)
Phần 5: Các mô hình Redis replication, Ưu và nhược điểm
Phần 6: Redis Master-Salve sử dụng ACL
Phần 7: Redis Sentinel sử dụng ACL
Phần 8: Cài đặt Redis Cluster + kiểm tra cluster hoạt động.
Phần 9: Thêm và xóa node redis cluster, di chuyển data đơn sang cluster và ngược lại
Phần ??: Data type trong Redis, một vài ví dụ sử dụng (String/hash/sort/list/queue/pub-sub....).
Phần ??: Một số lỗi thường gặp khi quản trị hệ thống Redis.
Phần ??: Redis RDB và AOF nên chọn cái nào?

(Các phần của mình viết sẽ khó hiểu và phức tạp hơn trên mạng 1 chút, vì sẽ chuyên sâu cho System+Dev quản trị redis)

Phần 1: Cài đặt redis cơ bản + Turning redis.

1.1 Cài đặt:

(Sao không cài yum hoặc apt mà lại cài từ tar.gz: Vì dễ quản lý file và config về sau, thuận tiện cho việc backup data file/config/logs/quản lý phân vùng lưu trữ, upgrade version...)

Bước 1: Tải redis từ trang chủ: https://redis.io/download . các bạn cứ chọn bản mới nhất mà cài. Vì redis build rất ổn định (update 7.0.8 - 2023-01-20).

Bản mới nhất (2023-01) 
# yum install gcc wget systemd-devel -y
# mkdir -p /opt/setup
# cd /opt/setup
# wget https://github.com/redis/redis/archive/7.0.8.tar.gz
# tar -xvzf 7.0.8.tar.gz
# cd redis-7.0.8
# make
Khi make install, các file chạy binary sẽ được copy sang thư mục /usr/local/bin/
# make install

Khi make install, câu lệnh sẽ thực hiện copy các file chạy redis gồm (redis-server , redis-benchmark , redis-cli ) vào thư mục /usr/local/bin/

Bước 2: Cài đặt các thư mục riêng cho redis, để quản lý về sau ( như: data , conf, log)

# mkdir -p /opt/redis/conf

# mkdir -p /opt/redis/data

# mkdir -p /opt/redis/log

# cd /opt/setup/redis-7.0.8/utils/

# vim install_server.sh (ta comment lại dòng 82 vì có exit 1 không tương thích với systemd - lỗi ko cần thiết)

Thực hiện chạy file, và khai báo như sau

$ ./install_server.sh

Tắt bật redis:

# /etc/init.d/redis_6379 status
# /etc/init.d/redis_6379 stop
# /etc/init.d/redis_6379 start
# Bạn nào muốn dùng systemd, Đọc. Phần 3: Bảo mật cho redis. (redis security) nhé.

Lệnh chạy cơ bản vào redis bằng lệnh

# redis-cli ping                           #(Dùng để kiểm tra redis alive)
# redis-cli set hello-world awesome1       #(đặt key hello-world có data value = awesome)
# redis-cli get hello-world                #(lấy giá trị value của key ra)
# redis-cli info                           #(xem thông tin status của redis)
# redis-cli config get                     #(Xem toàn bộ config của redis đang chạy)
# redis-cli monitor                        #(GIÁM SÁT các câu lệnh đang chạy real-time - RẤT hay)
# redis-cli client list                    #(Kiểm tra xem có bao nhiêu client, ip client đang kết nối, client đang dùng lệnh gì.)
# redis-cli info clients                   #(Xem số client đang kết nối tới redis server)

Ngoài việc gõ trực tiếp command trên unix. Ta có thể vào redis-cli để gõ các lệnh như sau:

[root@master-node ~]# redis-cli 
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET hello-world awmsome2
OK
127.0.0.1:6379> GET hello-world
"awmsome2"

1.2: Turning redis:

P1: Enable vm.overcommit_memory

# vim /etc/sysctl.conf
vm.overcommit_memory=1
net.core.somaxconn=65535
#sudo sysctl --system

chạy lệnh sysctl vm.overcommit_memory=1 Khi ghi dữ liệu từ RAM xuống disk, Redis sử dụng các tiến trình con. Theo mặc định, tiến trình con này cần memory tương đương tiến trình mẹ, do nó có chứa dữ liệu tương đương. Điều này dẫn tới OS không đủ RAM cho việc ghi DB xuống Disk này > lỗi. Tuy nhiên Linux có hỗ trợ Copy-on-write, nghĩa là chỉ cần cấp memory cho những gì tiến trình con khác với tiến trình mẹ, phần giống nhau thì dùng chung memory cho tiết kiệm. Để bật nó thì cần set overcommit_memory = 1

P2: net.core.somaxconn (tăng hàng đợi tối đa của linux)

sysctl -w net.core.somaxconn=65535
cat /proc/sys/net/core/somaxconn
65535

P3: Set never transparent_hugepage

Giải thích: https://kipalog.com/posts/Tinh-nang-Transparent-HugePage-trong-RHEL6-va-anh-huong

# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
# echo never > /sys/kernel/mm/transparent_hugepage/enabled


# vim /etc/rc.local (thêm vào cuối file rc.local để mỗi lần khởi động lại Linux, hugpage lại chuyển thành never)
echo never > /sys/kernel/mm/transparent_hugepage/enabled

P4: Tăng connection kết nối

Mặc định redis seting maxclients kết nối đồng thời là 10000, nếu coder tốt thì khi mở kết nối xong sẽ gọi lệnh close (cả hệ thống lớn chắc ko đến 100 kết nối đồng thời). Vẫn để phòng trường hợp quá connection khi bị miss code ở đoạn nào đó. Ta có thể tăng Maxclients lên.

Cách 1: Thay trong redis-cli

127.0.0.1:6379> CONFIG GET MAXCLIENTS
"10000"
127.0.0.1:6379> CONFIG SET MAXCLIENTS 100000
OK (thực hiện tăng maxclient tạm thời)
127.0.0.1:6379> CONFIG REWRITE
OK (Thực hiện ghi đè config hiện tại / vĩnh viễn)

Cách 2: Thay trong config

vim /opt/redis/conf/6379.conf
maxclients 100000

Mời các bạn đón đọc: Phần 2: Lệnh quản trị redis cơ bản

(Kiến thức người viết bài có thể có góc nhìn hẹp, xin các bạn góp ý đóng góp xây dựng bài.)

Thứ Ba, 1 tháng 3, 2022

Helm command cheat Sheet

Cài đặt:

https://helm.sh/docs/intro/install/ 
curl -k -O https://get.helm.sh/helm-canary-linux-amd64.tar.gz
tar -xvzf helm-canary-linux-amd64.tar.gz
chmod 7550 linux-amd64/helm ; mv linux-amd64/helm /usr/bin/

#Bash Complete for helm

yum install bash-completion 
helm completion bash > /etc/bash_completion.d/helm

Phần 1: Làm quen

# Add Repo
helm repo add bitnami https://charts.bitnami.com/bitnami --force-update
helm repo add stable https://charts.helm.sh/stable --force-update
helm repo update
helm search repo nginx
helm repo list

Tải helm .tar.gz từ ArtifactHub

helm pull bitnami/kube-state-metrics

Chạy helm

helm install kube-state-metrics bitnami/kube-state-metrics -n tuandahelm ls -A
helm status first-chart
helm delete kube-state-metrics -n tuanda

Show thông tin của chart trên ArtifactHub

helm show chart bitnami/nginx
helm show values bitnami/nginx

Liệt kê helm đang chạy (-n là namespace)

helm ls -n tuanda
helm ls -A

Đặt thêm biến - tự chỉ định khi chạy helm

helm install nginxtest bitnami/nginx --set service.port=8888 -n tuanda

Phần 3: Helm push local registry

# export HELM_EXPERIMENTAL_OCI=1
# helm registry login -u tuanda registry.tuan.name.vn:31320
# helm registry logout registry.tuan.name.vn:31320

Đẩy .tar.gz lên local registry, sau đó test pull lại (Để ý kĩ sẽ thấy md5sum push/pull không đổi):
# helm push nginx-test.tar.gz oci://registry.tuan.name.vn:31320/helm-charts
# helm pull oci://registry.tuan.name.vn:31320/helm-charts/nginx-test




Phần 2: Tự tạo Helm

Tạo self chart

helm create first-chart

Xóa tạm thư mục templates đi. Tạo file configmap.yaml để test

apiVersion: v1
kind: ConfigMap
metadata:
  name: fortune-config
  namespace: default
data:
  sleep-interval: "25"
# Để chạy helm ta vừa sửa
helm install first-chart .
kubectl get configmaps fortune-config
kubectl describe configmaps fortune-config

Nếu Chart có thêm update ta dùng upgrade để cập nhập:

helm template first-chart . --namespace=tuanda
helm upgrade first-chart .
kubectl describe configmaps fortune-config

#Để Rolback ta làm như sauhelm history ${helm_name}helm rollback ${helm_name} 1

Nếu thêm secret trong chart như configmap

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  USER_NAME: YWRtaW4=
  PASSWORD: MWYyZDFlMmU2N2Rm
helm upgrade first-chart .

#Rollback helm release

$ helm history first-chart
REVISION	           UPDATED                 	STATUS             	CHART            	APP VERSION
1       	Wed Feb 16 17:16:00 2022	superseded	first-chart-0.1.0	1.16.0     
2       	Wed Feb 16 17:21:10 2022	superseded	first-chart-0.1.0	1.16.0     
3       	Wed Feb 16 18:01:53 2022	deployed  	first-chart-0.1.0	1.16.0     


$ helm rollback first-chart (về bản trước đó) $ helm rollback first-chart 1 (về bản chỉ định)

Phần 3: Link variable vào Chart.yaml và variable.yaml

3.1 Chart.yaml

Sửa file configmap ở phần 1:
apiVersion: v1
kind: ConfigMap
metadata:
  name: fortune-config-{{.Chart.Version}}
  namespace: default
data:
  sleep-interval: "25"
  tuanda: "ahihi2"
helm upgrade first-chart .
[tuanda@master-node first-chart]$ kubectl get configmaps 
NAME                   DATA   AGE
fortune-config-0.1.0   2      68s

3.2 Values.yaml

Sửa file:
tuanda:
  ahihi: "xin chao"

replicaCount: 1
Ta có {{.Values.tuanda.ahihi}}

3.3 Dynamic if/else in helm

tuanda@master-node first-chart]$ cat templates/secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  {{if eq .Values.env "Staging"}}
  USER_NAME: Staging
  PASSWORD: M12345G
  {{else}}
  USER_NAME: YWRtaW4=
  PASSWORD: MWYyZDFlMmU2N2Rm
  {{end}}

Thêm env: "Staging" trong file values.yaml và test
helm template first-chart .
helm upgrade first-chart .


Debug exec pod with no any command support

  Một ngày đẹp trời pod bị lỗi. Bạn thử ngay lệnh "kubectl exec -it ..." vào pod kiểm tra. Nhưng quãi đạn, pod không hỗ trợ bất kỳ...