🚫 Ad Blocker Detected

Please disable your AD blocker to continue using this site. Ads help us keep the content free! please press keyboard F5 to refresh page after disabled AD blocker

請關閉廣告攔截器以繼續使用本網站。廣告有助於我們保證內容免費。謝謝! 關閉後請按 F5 刷新頁面

0%

前言

執行計畫代表此次查詢要怎麼樣的演算法查詢我們的資料,而成本是決定使用哪個執行計畫的重要因素

在 postgreSQL DB query optimizer 會選擇成本最低的執行計劃,當作查詢資料使用算法

在 Sql-sevrer 成本計算封裝在程式內部,我們無法透過一些因子來調整,但 postgreSQL 可以

我認為 query optimizer 判斷成本概念有點類似 google map 在找尋最佳路徑

我對於資料庫有定義一個,地圖理論來說明 RDBMS 執行計畫相關的事情

本篇成本因子效能調教會涉 Linux kernel systemtap ,國中數學,postgreSQL 運作模型,篇幅可能會有點多且複雜

但我認為本篇學會可以對於 query optimizer 有更進一步了解

預設成本因子潛在問題

下面我使用一個例子來

Read more »

前言

AWS 在有眾多服務,其中我對於 Lambda 最有興趣 (因為 .net 有一個 Lambda 表達式 )

最近申辦帳號可以使用 12 個月部分免費服務(有條件限制),看我還不玩爆 AWS XD

經過了解得知 Lambda 是一個 EDA 架構並幫我們解決開發時需要煩惱硬體上配置(記憶體要多少,CPU,是否需要 load balance scale out…),做一個 serverless 服務

讓我們可以專心開發程式,本篇會針對 .net core 建立一個 sample 專案到上傳到 AWS Lambda 服務上說明

安裝aws cli & 設定 profile

首先我們需要先安裝 aws cli,如果是 windows 我們可以透過 powershell,來完成

1
C:\> msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
1
2
$ aws --version
aws-cli/2.2.44 Python/3.8.8 Windows/10 exe/AMD64 prompt/off

確定安裝完後我們可以執行 aws configure 設定我們 AWS 服務相關 IAM 資訊

Read more »

前言

WAL 是一種 Tx Log實踐機制

WAL 核心概念是先寫 tx log,在把資料寫資料,資料的修改必须發生在寫入 Tx Log之後,使用 WAL 紀錄資料庫系統在commit transaction

使用 WAL 機制後我們不需要在每次 Commit Transaction 後就把資料 flush 到 Disk 上(提高IO效率), WAL 需要保證 Dirty Block flush 到 Disk 之前,該 Block 對應 Tx log 紀錄已經 flush 到 Disk 中

因為假如系統突然崩潰我們可以藉由 WAL 寫入 Tx Log 來 roll-forward recovery (REDO)

WAL 寫入時機簡介

LSN序號是一個 globale 變數(透過 info_lck 輕量鎖設計避免同一時間取得同一個 LSN )

寫入資料會經由下面幾個步驟

  1. Log (LSN–Log) 是一個有順序性標誌的紀錄 (可以想像是一個 sequence ) ,一開始存在 RAM 中,在 RAM 中有一個 flushLSN 位置會記錄 log LSN 寫入 Disk 最後位置.
  2. 每個 block 在 pageheader 會有一個欄位 PageXLogRecPtr pd_lsn; 指到 log 紀錄位置,此位置在 Dirty Block 存在 buffer Pool 時就會決定
  3. 最後把 Dirty Block flush 到 Disk 之前 postgresSQL 會檢查是否滿足此條件 pd_lsn <= flushLSN ,確保 Log 已經寫入 Disk 上才會把資料 flush 到資料庫中
  4. 如果是 synchronous_commit = ON 代表同步提交,在 Transaction commit 時會把對應的 Tx Log 馬上 flush 進 Disk中才能返回成功

經過上面步驟我們就可以確保 先寫 Tx Log 歷程,後寫 Dirty Block

Read more »

前言

Postgresql DB 目前預設在更新資料時會在 Heap Table 新增一條新版本資料,舊版本會先存在直到使用 VACUUM 回收

HOT update 作用在,當資料更新時通過 Heap Block 內部串聯所有 tuple 版本,則 Index 索引不變

HOT update 必須滿足以下兩個條件:

  1. 索引欄位值不變。(其中任意一個索引字段的值發生了變化,則所有索引都需要新增版本)
  2. 新版本資料和舊版本資料在同一個HEAP Block中。

在測試前我們要先開啟 pageinspect 了解查看 block 底層訊息

sample data

1
create extension pageinspect -- 打開可以查看底層 Page 功能,需要有 admin 權限
1
2
3
4
5
6
7
CREATE TABLE tt2(id int,a int,b int);  

INSERT INTO tt2
SELECT generate_series(1,10), random()*100, random()*100;

CREATE INDEX ix_tt2_id ON tt2 (ID);
CREATE INDEX ix_tt2_a ON tt2 (a);

接著我們透過 bt_page_items 查看 Index 儲存資料,heap_page_items 查看 heap table 儲存資料

Read more »

前言

因為工作需要最近在研究 postgresql DB,發現跟 sql-server 相比有許多不同之處,所以一開始就先研究 Page 差別,沒想到還真的有不少細節上的差異

在postgresql DB Page size 預設是 8KB

我們想要看page使用大小在 Sql-Server 可以用 DBCC命令在 postgresql DB 沒有 DBCC 還好有其他方式可以查看 Page 儲存原理

如果要了解存儲怎麼辦呢?

關於 page 存儲

使用sample data

1
2
3
4
CREATE TABLE t1 (id int PRIMARY KEY);

insert into t1 select generate_series(1,2000);
insert into t1 select generate_series(2001,4000);

建立完表後我們透過 \d+ t1 指令查看資料表訊息,可以看到PK成功被建立

1
2
3
4
5
6
7
postgres=# \d+ t1
Table "public.t1"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+---------+---------+--------------+-------------
id | integer | | not null | | plain | |
Indexes:
"t1_pkey" PRIMARY KEY, btree (id)
Read more »

前文

在處理高併發系統架構時,非同步是一個很好的手段和提升效率的方式.

我今天跟大家分享,如何利用 MQ 搭配 Worker Pool 來提高系統吞吐量且又不失彈性

原始碼連結 MQ Woker

本篇會包含兩個部分解說

  1. 如何使用 k3d (k8s) 和 docker-compose 來 Run 起我們 MQ 服務
  2. 主要核心程式解說

系統簡介

我們透過 MQ 來幫系統作解耦合,前台要處理事情都會先統一打到 MQ 中之後就可以先回覆,使用者結果,後續處理就交給 MQ 來幫我們派發任務到我們指定的 Worker 上處理業務邏輯,這樣可以把原本架構前台後台高偶合的問題解決提供可承受且快速響應的架構.

目前支援兩種 Worker.

  • ThreadPool:使用 Thread 當作 Worker 來幫我們處理任務
Read more »

前言

在 Rabbitmq 官方 Github 有開源一個 k8s 操作管理 RabbitMQ clusters 環境 cluster-operator.

這個專案在2020啟動,我個人覺得官方有些說明還沒很完善,本篇文章跟大家介紹如何去使用

建立 operator

1
kubectl apply -f https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml

下面的yaml檔案是建立一個RabbitmqCluster

1
2
3
4
5
6
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
name: hello-world
spec:
replicas: 3

透過 kubectl apply -f {your yaml filename} 後就可以透過 kubectl get all 查看 RabbitMQ cluster 是否建立完成

如果建立完成會出現類似下圖

Read more »

前文

k8s前身是Google開發borg系統,用於管理Google系統,後面由許多borg核心開發人用利用Go語言改寫就造就Kubernetes

可以根據聲明式設定,管理、擴展我們的容器化應用編排系統

  • 有效安全幫我們執行Container Rollout
  • 能夠因應系統流量變化,進行伸縮擴容(Scaling)
  • Health check實現自動偵測故障及重啟功能
  • 透過Namespace有效幫我們做資源隔離

k8s協助我們方便掌控複雜容器系統架構,具有良好伸縮性

建議在閱讀k8s文章前先要有Docker相關知識,不然許多點會有看沒有懂

我們練習會使用k3d使用Docker建議k8s來練習

k8s 主要組件介紹

先來張圖(此圖來自wiki)wiki畫的很棒,我拿來借用一下XDD

Read more »

前文:

我們在撰寫C#時常常會聽到CLR(Common Lnguage Rumtime),但對於CLR又認知多少呢?

本篇會跟大家介紹CLR基本且核心的物件

CLR 簡介

編譯器在編譯時把(C#,VB,F#….)進行編譯檢查跟把程式碼轉成MSIL中繼資料,在運行期間透過JIT(just in time)會在程式運行期間把MSIL轉成每個機器可以執行組合語言

大概可以理解為下圖

這邊我不探討Management和UnManagement物件
MSIL也算是微軟開發語言的一個抽象

SOS Debuger

注意你的電腦是 x86 or x64

Read more »

前言

你知道object lock底層怎麼實作,可重入鎖是底層是怎麼運作的嗎?

本篇就跟大家分享這些細節.

可重入鎖Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Program
{
static object _object = new object();

static void Main(string[] args)
{
Task.WaitAll(Task.Run(() => { TryLockDemo(); }), Task.Run(() => { TryLockDemo(); }));

Console.WriteLine("Hello World!");
}

public static void TryLockDemo() {
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"[{threadId}] {DateTime.Now:HH:mm:ss} TryLockDemo Start");
try
{
Monitor.Enter(_object);
Console.WriteLine($"[{threadId}] {DateTime.Now:HH:mm:ss} get first lock");
try
{
Thread.Sleep(3000);
Monitor.Enter(_object);
Console.WriteLine($"[{threadId}] {DateTime.Now:HH:mm:ss} get second lock");
}
finally
{
Monitor.Exit(_object);
Console.WriteLine($"[{threadId}] {DateTime.Now:HH:mm:ss} release second lock");
}
}
finally
{
Thread.Sleep(3000);
Monitor.Exit(_object);
Console.WriteLine($"[{threadId}] {DateTime.Now:HH:mm:ss} release first lock");
}
}
}

上面這段程式碼,同時間會由2個Thread來呼叫處理TryLockDemo方法.

主要是演示lock中在對於同一個object lock一次且在multiple-Thread中會怎麼運作

為什麼Thread 1釋放first lock時,Thread 2會繼續blocking並等待Thread 1釋放second lock?

object中Syncblk

Read more »