1
Hệ thống chịu tải cao
Pham Van Dong
2 2
LB
API
CACHE
memcached
DB
WEB・・・
master
・・
CACHE
Redis
slave
s/m
slave backup
s/m
slave backup
s/m
slave backup
s/m
slave backup
UserDB01 UserDB02 LogDB02LogDB01
MasterDB01
3 3
LB
API
CACHE
memcached
DB
WEB・・・
master
・・
CACHE
Redis
slave
s/m
slave backup
s/m
slave backup
s/m
slave backup
s/m
slave backup
UserDB01 UserDB02 LogDB02LogDB01
MasterDB01
Scaleout
Replication
Chia dọc
Chia ngang
Giảm access DB
bằng Cache
Scaleout
Replication
Ranking
Nội dung
• DB Sharding
– Giới thiệu
– Sử dụng trong dự án game
– Replication
• Cache
– Memcache
– Redis
4
5
DB Sharding
DB Sharding
• DB không sharding
6
A Table
B Table
C Table
D Table
F Table
垂直分割
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
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
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 ?
DB Sharding
• Để DB scale tốt chia Master, Slave
10
Master
Slave SlaveSlave
UPDATE
SELECT SELECT SELECT
… xN
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
DB Sharding
• Dẫn tới Lock wait sụp đổ server
12
Master
Slave SlaveSlave
UPDATE
SELECT SELECT SELECT
… xN
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
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
15
Chia nhiều Master/Slave
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
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
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
19
DB Sharding trong C2
DB Sharding trong C2
20
udb01 udb05udb03 udb07
udb00 udb04udb02 udb06
DB01
DB02
DB Sharding trong C2
2121
udb01 udb05udb03 udb07
udb00 udb04udb02 udb06
DB01
DB02
User_id%8
22
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'database_name',
'prefix' => '',
//'encoding' => 'utf8',
);
public $test = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'test_database_name',
'prefix' => '',
//'encoding' => 'utf8',
);
DB Sharding trong C2
23
public function __get($name)
{
// $name: user_master, user_slave, mst_master,
tdb_master,...
// $user_id = Configure::read('User.Id')
return array(
'datasource' => 'Database/MysqlEx',
'persistent' => false,
'host' => $host,
'login' => $user,
'password' => $password,
'database' => $db_schema,
'prefix' => '',
'encoding' => 'utf8mb4',
);
}
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
DB Sharding trong C2
User1 User2
UPDATE
COMMIT
UPDATE
COMMIT
25
User1 User2
UPDATE
UPDATE
COMMIT
COMMIT
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;
}
DB Sharding trong C2
User Log
UPDATE
COMMIT
UPDATE
COMMIT
27
User Log
UPDATE
UPDATE
COMMIT
COMMIT
28
public function executeTransaction($callback, $log_callback = null)
{
$user_db = ConnectionManager::getDataSource('user_master');
try {
$user_db->begin();
$callback();
$this->updateMissionState();
$user_db->commit();
} catch (Exception $e) {
$user_db->rollback();
throw $e;
}
if ($log_callback == null) {
return 0;
}
$log_db = ConnectionManager::getDataSource('log_master');
try {
$log_db->begin();
$log_callback();
$log_db->commit();
} catch (Exception $e) {
$log_db->rollback();
return 2;
}
return 0;
29
Replication
Replication
• Ví dụ với Master/Slave
30
master
slave
Replication
• 3 layer
31
master
slaveslave/m
aster
slave backup
SlaveDB có thể trùng
MasterDB
Replication
32
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;
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;
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
36
Cache
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
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
Cache
• Các cache engine
– Memcache
– Redis
– File
– Amazon ElastiCache
– DynamoDB
– Apache Cassandra
– etc
39
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
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
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
43
Cảm ơn các bạn đã lắng
nghe
44

He thong chiu tai cao

  • 1.
    1 Hệ thống chịutải cao Pham Van Dong
  • 2.
    2 2 LB API CACHE memcached DB WEB・・・ master ・・ CACHE Redis slave s/m slave backup s/m slavebackup s/m slave backup s/m slave backup UserDB01 UserDB02 LogDB02LogDB01 MasterDB01
  • 3.
    3 3 LB API CACHE memcached DB WEB・・・ master ・・ CACHE Redis slave s/m slave backup s/m slavebackup s/m slave backup s/m slave backup UserDB01 UserDB02 LogDB02LogDB01 MasterDB01 Scaleout Replication Chia dọc Chia ngang Giảm access DB bằng Cache Scaleout Replication Ranking
  • 4.
    Nội dung • DBSharding – Giới thiệu – Sử dụng trong dự án game – Replication • Cache – Memcache – Redis 4
  • 5.
  • 6.
    DB Sharding • DBkhông sharding 6 A Table B Table C Table D Table F Table
  • 7.
    垂直分割 Chia theo chiềudọ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ềukiệ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 • ServerWeb 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 • Tuynhiê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ẫntới Lock wait sụp đổ server 12 Master Slave SlaveSlave UPDATE SELECT SELECT SELECT … xN
  • 13.
    DB Sharding Vậy nênnà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 GaleraCluster – 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
  • 15.
  • 16.
    Chia theo User 16 Mst MstDB Khôngliê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ănvề 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ănvề 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
  • 19.
  • 20.
    DB Sharding trongC2 20 udb01 udb05udb03 udb07 udb00 udb04udb02 udb06 DB01 DB02
  • 21.
    DB Sharding trongC2 2121 udb01 udb05udb03 udb07 udb00 udb04udb02 udb06 DB01 DB02 User_id%8
  • 22.
    22 public $default =array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'database_name', 'prefix' => '', //'encoding' => 'utf8', ); public $test = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'test_database_name', 'prefix' => '', //'encoding' => 'utf8', );
  • 23.
    DB Sharding trongC2 23 public function __get($name) { // $name: user_master, user_slave, mst_master, tdb_master,... // $user_id = Configure::read('User.Id') return array( 'datasource' => 'Database/MysqlEx', 'persistent' => false, 'host' => $host, 'login' => $user, 'password' => $password, 'database' => $db_schema, 'prefix' => '', 'encoding' => 'utf8mb4', ); }
  • 24.
    DB Sharding trongC2 • $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 trongC2 User1 User2 UPDATE COMMIT UPDATE COMMIT 25 User1 User2 UPDATE UPDATE COMMIT COMMIT
  • 26.
    DB Sharding trongC2 • 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 trongC2 User Log UPDATE COMMIT UPDATE COMMIT 27 User Log UPDATE UPDATE COMMIT COMMIT
  • 28.
    28 public function executeTransaction($callback,$log_callback = null) { $user_db = ConnectionManager::getDataSource('user_master'); try { $user_db->begin(); $callback(); $this->updateMissionState(); $user_db->commit(); } catch (Exception $e) { $user_db->rollback(); throw $e; } if ($log_callback == null) { return 0; } $log_db = ConnectionManager::getDataSource('log_master'); try { $log_db->begin(); $log_callback(); $log_db->commit(); } catch (Exception $e) { $log_db->rollback(); return 2; } return 0;
  • 29.
  • 30.
    Replication • Ví dụvới Master/Slave 30 master slave
  • 31.
    Replication • 3 layer 31 master slaveslave/m aster slavebackup SlaveDB có thể trùng MasterDB
  • 32.
  • 33.
    Cấu hình Masterserver 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 Slaveserver 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 • Commonhó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
  • 36.
  • 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
  • 39.
    Cache • Các cacheengine – Memcache – Redis – File – Amazon ElastiCache – DynamoDB – Apache Cassandra – etc 39
  • 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
  • 43.
    43 Cảm ơn cácbạn đã lắng nghe
  • 44.