Header Ads Widget

Ticker

6/recent/ticker-posts

Di chuyển cơ sở dữ liệu từ ổ cứng truyền thống sang all-flash storage

Chúng ta ai cũng hiểu là SSD và NVMe dĩ nhiên nhanh hơn ổ cứng truyền thống. Trước đây khi SSD còn quá đắt tiền, ít helpdesk nào trong chúng ta nghĩ là có một ngày IT sẽ dùng all-flash array để chứa dữ liệu. Bây giờ, khi mà giá cả của SSD, NVMe rẻ hơn, chúng ta đã có thể sở hữu all-flash storage để chứa cơ sở dữ liệu cho các ứng dụng quan trọng của doanh nghiệp.

Thử thách đặt ra là khi helpdesk đã có all-flash array, bước tiếp theo sẽ di chuyển cơ sở dữ liệu từ ổ cứng truyền thống sang all-flash storage. Nhưng, di chuyển thế nào đây? Rủi ro gì khi di chuyển? Roll-back plan? Sysadmin liệu có cho phép helpdesk làm chuyện đó không? May thay, SSMS(SQL Server Management Studio) có những công cụ rất thuận tiện cho helpdesk lần đầu làm chuyện ấy.

Hôm nay, mình chia sẻ cách thức mà helpdesk chúng ta sẽ di chuyển các bảng của cơ sở dữ liệu từ ổ cứng truyền thống sang all-flash array. Các bước gồm

1. Xác định các bảng có tần suất read/write/delete nhiều nhất
Chúng ta cần phải xác định các bảng có tần suất read/write/delete để làm cơ sở xác định bảng nào cần move qua read intesive storage hay write intensive storage. Read và Write intensive phụ thuộc vào RAID level mà các bạn đã xây dựng ban đầu. Script sau đây sẽ giúp các bạn xác định chúng (chạy trên Database các bạn muốn tinh chỉnh)

SELECT OBJECT_NAME(IXOS.OBJECT_ID) Table_Name
,IX.name Index_Name
,IX.type_desc Index_Type
,SUM(PS.[used_page_count]) * 8 IndexSizeKB
,IXOS.LEAF_INSERT_COUNT NumOfInserts
,IXOS.LEAF_UPDATE_COUNT NumOfupdates
,IXOS.LEAF_DELETE_COUNT NumOfDeletes
FROM SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL,NULL,NULL,NULL ) IXOS
INNER JOIN SYS.INDEXES AS IX ON IX.OBJECT_ID = IXOS.OBJECT_ID AND IX.INDEX_ID = IXOS.INDEX_ID
INNER JOIN sys.dm_db_partition_stats PS on PS.object_id=IX.object_id
WHERE OBJECTPROPERTY(IX.[OBJECT_ID],'IsUserTable') = 1
GROUP BY OBJECT_NAME(IXOS.OBJECT_ID), IX.name, IX.type_desc,IXOS.LEAF_INSERT_COUNT,
IXOS.LEAF_UPDATE_COUNT,IXOS.LEAF_DELETE_COUNT

2.Xác định chỉ mục (index) của bảng dữ liệu
Có 2 cách để xác định chỉ mục của một bảng dữ liệu. Hoặc các bạn dùng script dưới đây
select i.[name] as index_name,
substring(column_names, 1, len(column_names)-1) as [columns],
case when i.[type] = 1 then 'Clustered index'
when i.[type] = 2 then 'Nonclustered unique index'
when i.[type] = 3 then 'XML index'
when i.[type] = 4 then 'Spatial index'
when i.[type] = 5 then 'Clustered columnstore index'
when i.[type] = 6 then 'Nonclustered columnstore index'
when i.[type] = 7 then 'Nonclustered hash index'
end as index_type,
case when i.is_unique = 1 then 'Unique'
else 'Not unique' end as [unique],
schema_name(t.schema_id) + '.' + t.[name] as table_view,
case when t.[type] = 'U' then 'Table'
when t.[type] = 'V' then 'View'
end as [object_type]
from sys.objects t
inner join sys.indexes i
on t.object_id = i.object_id
cross apply (select col.[name] + ', '
from sys.index_columns ic
inner join sys.columns col
on ic.object_id = col.object_id
and ic.column_id = col.column_id
where ic.object_id = t.object_id
and ic.index_id = i.index_id
order by key_ordinal
for xml path ('') ) D (column_names)
where t.is_ms_shipped <> 1
and index_id > 0
order by i.[name]

hoặc đơn giản hơn, các bạn phải chuột vào table --> click vào dấu + rê con trỏ đến mục Index --> Properties.
SSMS sẽ cho các bạn biết chỉ mục đó là CLUSTER hay NONCLUSTER, unique hay không unique, các cột dữ liệu nào hợp thành chỉ mục?
Việc xác định chỉ mục rất quan trọng, bảng sẽ chỉ có thể di chuyển sang tổ hợp flash-array khi và chỉ khi các bạn rebuild TẤT CẢ chỉ mục thành công.

3. Tạo ra file group.
Ở bước này, công việc các bạn cần làm là tạo ra có rổ để chứa bảng dữ liệu. Nó còn gọi là File Group chứa một hay nhiều file.Quan trọng hơn, bước này cho phép các bạn quyết định partition nào chứa file group đó. Dĩ nhiên là chúng ta sẽ đưa file group vào partition all-flash để giúp cho việc truy xuất dữ liệu trên bảng đó hiệu quả hơn. Các bạn tạo file group bằng script sau. Trong ví dụ này, mình dùng chính sample db của Microsoft là NorthWind2016

USE [master]
GO
ALTER DATABASE [AdventureWorks2016] ADD FILEGROUP [FG1]
GO
USE [master]
GO
ALTER DATABASE [AdventureWorks2016]
ADD FILE ( NAME = N'AdventureWorks2016_01', FILENAME = N'C:\temp\FG1\AdventureWorks2016_01.ndf' , SIZE = 102400KB , FILEGROWTH = 102400KB ) TO FILEGROUP [FG1]

mình tạo ra 1 file group tên là FG1 gồm 1 file tên AdventureWorks2016_01.ndf, và để nó ở partition C: (giả sử C: thuộc all-flash) có dung lượng ban đầu là 100GB và mỗi lần vượt dung lượng ban đầu 100GB, SQL sẽ tăng dung lượng thêm 100GB.

4. Khởi tạo index của bảng TRÊN FILE GROUP
SSMS cho phép các bạn tạo script tự động trên giao diện SQL query. Các bạn click phải chuột lên Index và chọn Script Index as DROP and CREATE --> New query editor windows. Việc này vừa dễ dàng vừa tránh lỗi chính tả khi viết script.
Lưu ý: đối với bảng có khóa chính ánh xạ đến khóa phụ của MỘT BẢNG KHÁC, các bạn phải drop khóa phụ ở bảng khác trước thì các bạn mới được phép drop khóa chính ở bảng muốn khởi tạo lại khóa chính.
Script để khởi tạo index trên file group mới. Ở đây, mình dùng ví dụ NorthWind2016, bảng Department. Các bạn lưu ý chỗ FG1

USE [AdventureWorks2016]
GO

EXEC sys.sp_dropextendedproperty @name=N'MS_Description' , @level0type=N'SCHEMA',@level0name=N'HumanResources', @level1type=N'TABLE',@level1name=N'Department', @level2type=N'CONSTRAINT',@level2name=N'PK_Department_DepartmentID'
GO

ALTER TABLE [HumanResources].[Department] DROP CONSTRAINT [PK_Department_DepartmentID] WITH ( ONLINE = OFF )
GO

ALTER TABLE [HumanResources].[Department] ADD CONSTRAINT [PK_Department_DepartmentID] PRIMARY KEY CLUSTERED
(
[DepartmentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [FG1]
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key (clustered) constraint' , @level0type=N'SCHEMA',@level0name=N'HumanResources', @level1type=N'TABLE',@level1name=N'Department', @level2type=N'CONSTRAINT',@level2name=N'PK_Department_DepartmentID'
GO

Lưu ý: Chỉ khi các bạn khởi tạo lại TẤT CẢ index thành công thì lúc này bảng dữ liệu mới được di chuyển thực sự qua all-flash-array.

Trên đây là cách di chuyển một bảng dữ liệu của csdl. Không phải tất cả các bảng dữ liệu trong csdl đều có tần suất read/write/delete lớn nên các bạn chỉ tập trung các bảng có tính chất bào ổ cứng và latency cao mà thôi. Những bảng còn lại không cần bận tâm. Sau khi làm xong các bảng như vậy, các bạn sẽ thấy hiệu quả của ứng dụng doanh nghiệp chạy nhanh hơn từ 30% -> 40%. Chưa kể, tác vụ sao lưu và dự phòng cũng nhanh hơn rất nhiều nhờ low latency của all-flash all-flash-array.

Đăng nhận xét

0 Nhận xét