6. DB Sharding
• DB không sharding
6
A Table
B Table
C Table
D Table
F Table
7. 垂直分割
Chia theo chiều dọc
DB Sharding
7
Master
Slave SlaveSlave
Master
Slave SlaveSlave
Master
Slave SlaveSlave
Master
Slave SlaveSlave
Master
Slave SlaveSlave
水平分割
Chia theo chiều ngang
8. DB Sharding
• Điều kiện
– Số connect: vài chục nghìn đến hàng trăm
nghìn connect
– Số lượng connect đồng thới lớn
– Những trường hợp khó dự đoán, bất ngờ
– Bắt đầu với số lượng nhỏ server
– Thêm server trong tương lai
=> Khi cần hê thống Scale out tốt
8
9. DB Sharding
• Server Web có thể dễ dàng thêm server
• Thêm DB có đơn giản?
9
Web WebWebWeb … xN
DB x ?
10. DB Sharding
• Để DB scale tốt chia Master, Slave
10
Master
Slave SlaveSlave
UPDATE
SELECT SELECT SELECT
… xN
11. DB Sharding
• Tuy nhiên Master Server chỉ có một
• Update dữ liệu sẽ bị giới hạn
11
Master
Slave SlaveSlave
UPDATE
SELECT SELECT SELECT
… xN
12. DB Sharding
• Dẫn tới Lock wait sụp đổ server
12
Master
Slave SlaveSlave
UPDATE
SELECT SELECT SELECT
… xN
13. DB Sharding
Vậy nên nào như nào
• Sử dụng storage như Fusion-io
– Không hản có thể chuẩn bị được
– Dù áp dụng vào nhưng chua chắc giải quyết được
• Cluster
– Vẫn còn nhiều hạn chế
– Việc đưa vào sử dụng trở nên nguy hiểm
13
14. Cluster
• MariaDB Galera Cluster
– https://mariadb.com/kb/en/library/what-is-mariadb-
galera-cluster/
– Các node chứa 100% data
• MySQL Cluster
– https://www.mysql.com/products/cluster/
– Các node chưa 1/n data
14
16. Chia theo User
16
Mst
MstDB
Không liên quan đến User, chứa common data
User1 User3User2
Log1 Log3Log2
…
…
Data không
tăng
Log hành động
của user. Log
chia đêu các
server
Data user
User chia đều
các server
17. DB Sharding
Khó khăn về thiết kế
• Không thể JOIN giữa 2 DB
– Chia tách biệt data của các user
– Tất cả các DB phải có Mst data
• Chia nhỏ quá sẽ làm giảm performance
17
18. DB Sharding
Khó khăn về sử dụng thư viện
• Tìm tất cả các User
– Hiển thị danh sách trên trang Admin rất khó
• Quản lý các transaction rất khó
18
24. DB Sharding trong C2
• $name: user_master, user_slave, mst_master,
tdb_master,...
– use_slave_01, use_slave_02 cũng được
• Trường hợp tìm trong bản ghi khác
– find($query, ‘user_slave_02’);
– setDbConfig(‘user_slave_02’);
24
25. DB Sharding trong C2
User1 User2
UPDATE
COMMIT
UPDATE
COMMIT
25
User1 User2
UPDATE
UPDATE
COMMIT
COMMIT
26. DB Sharding trong C2
• Transaction cho trường hợp update tất cả
các user
26
try {
for ($db_num = 0; $db_num < Configure::read('DB_COUNT'); $db_num++) {
$db = ConnectionManager::getDataSource('user_master_0' . $db_num);
$db->begin();
// UPDATE, CREATE
}
for ($db_num = 0; $db_num < Configure::read('DB_COUNT'); $db_num++) {
$db = ConnectionManager::getDataSource('user_master_0' . $db_num);
$db->commit();
}
} catch (Exception $e) {
// 例えば$db_num=3まで失敗しました、db01->db03だけロールバックします
for ($i = 0; $i < $db_num; $i++) {
$db = ConnectionManager::getDataSource('user_master_0' . $i);
$db->rollback();
}
return;
}
27. DB Sharding trong C2
User Log
UPDATE
COMMIT
UPDATE
COMMIT
27
User Log
UPDATE
UPDATE
COMMIT
COMMIT
33. Cấu hình Master server
33
sudo nano /etc/mysql/my.cnf
bind-address = 127.0.0.1 sửa thành ip của server
server-id = 1
binlog_do_db = <db càn nhân bản>
sudo service mysql restart
# phân quyền cho các slave
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED
BY 'password';
FLUSH PRIVILEGES;
34. Cấu hình Slave server
34
CREATE DATABASE newdatabase;
# Import DB nếu lần đầu config
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = <db càn nhân bản>
CHANGE MASTER TO
MASTER_HOST='12.34.56.789',MASTER_USER='slave_user',
MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-
bin.000001', MASTER_LOG_POS= 107;
35. Tổng hợp
• Common hóa được và chia bao nhiêu DB cũng
được
• Tốc độ đã được cải thiện đáng kể
• Nhiều DB nên tự động hóa càng nhiều càng tốt
• Quá trình code rất là vất vả
– Test debug ở local
– Cần thực hiện lại các thể loại test
– Ảnh hưởng đến logic sử dụng memcached
– Giải thích cái mình làm cho member khác cũng rất
khó
35
37. Cache
• Thượng sách để tăng tốc độ truy cập
• Giảm thiểu hoạt động mạng
• Giảm CPU, RAM, tăng hiệu suất phần cúng
37
38. Cache
• Cache Page
– Giảm toàn bộ tính toán của server
• Cache Fragment
– Một phần HTML được lưu vào cache
• Cache Action
– Kết quả của action được lưu vào cache
• Cache Object
– Lưu kết quả tính toán mà trả về object
• Cache SQL
– Lưu kết quả câu truy vấn SQL
38
40. Memcache
• Dữ liệu được tham chiếu nhanh chóng
• Dữ liệu chỉ tồn tại một thời gian nhất định
• Sẽ tự xóa nếu đầy dữ liệu
• Có thể lưu theo kiểu pool cho nhiều server
– Server1 -> server2 -> ..
40
41. Redis
• Dữ liệu được tham chiếu nhanh chóng
• Thích hớp cho việc tính Ranking (sort set)
• Dữ liệu lưu vào ram và sẽ tự backup ra ổ cứng
• Có thể chia theo master/slave
41
42. Cache chú ý
• Memory
– Memcached sẽ tự xóa
– Redis sẽ lưu ra ổ cứng
• Cạn kiệt port
– Truy cập quá nhiều
– Cache server = 1/5 Web server
• Logic để nhất quán dữ liệu rất dễ lỗi
42