12/08/2018, 15:48

Đánh giá mongoDB với YCSB

Như 1 bài trước mình có hướng dẫn mọi người cài đặt mongodb với docker(https://viblo.asia/p/cai-dat-mongo-cluster-voi-docker-m68Z0NN25kG) hôm nay mình sẽ dùng 1 tool khá phổ biến (YCSB) để tiến hành đánh giá hiệu năng của thằng này xem sao nhé Các bạn cài ycsb theo hướng dẫn sau: ...

Như 1 bài trước mình có hướng dẫn mọi người cài đặt mongodb với docker(https://viblo.asia/p/cai-dat-mongo-cluster-voi-docker-m68Z0NN25kG) hôm nay mình sẽ dùng 1 tool khá phổ biến (YCSB) để tiến hành đánh giá hiệu năng của thằng này xem sao nhé Các bạn cài ycsb theo hướng dẫn sau: https://github.com/brianfrankcooper/YCSB Sau khi các bạn cài đặt mongodb theo như bài viết trước đó của mình. Để ý có 2 services như sau

router0:
    image: mongo
    command: mongos --configdb configRs/configsvr0:27017,configsvr1:27017,configsvr2:27017 --port 27017
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./scripts/sharding_replicaset:/scripts/sharding_replicaset
    ports:
      - 27017:27017
    links:
      - configsvr2
router1:
    image: mongo
    command: mongos --configdb configRs/configsvr0:27017,configsvr1:27017,configsvr2:27017 --port 27017
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./scripts/sharding_replicaset:/scripts/sharding_replicaset
    ports:
      - 27018:27017
    links:
      - router0

Đây là 2 routers dùng để giao tiếp với người dùng. router0 có map port 27017 (port mặc định của mongodb khi bạn cài độc lập) ra ngoài. Như vậy từ bên ngoài mình chỉ cần gọi đến url dạng như sau là có thể truy cập vào cả mạng mongodb rồi

mongodb://localhost/healthCareDB

Vì sao chúng ta không cần map cổng ở đây, vì khi gọi mongodb-url, sẽ mặc định lấy cổng là 27017, mà trong cụm docker mình tạo ra, router0 map đúng cổng mặc định của mongo, nên mặc định url sẽ nhận. healthCareDB là tên database mình tạo ra. đây sẽ là database được test. OK, đầu tiên để test, mình phải load data vào cụm trước chứ. Mọi người chạy lệnh ycsb sau:

./bin/ycsb load mongodb -P workloads/workloada -p mongodb.url="mongodb://localhost/healthCareDB?w=1" -p recordcount=100000 -s  -threads 32 > outputLoad.txt

Các tham số có ý nghĩa như sau: w = 1, nghĩa là trong 1 replica, chỉ cần ghi thành công 1 node là ok, các node khác sẽ được đồng bộ sau. recordcount là số lượng bản ghi muốn ghi vào cụm. -p có ý nghĩa là property. sau -p là hàng loạt tham số của lệnh ycsb này. -threads 32 nghĩa là có 32 client cùng ghi. Kết quả trả về file outputLoad.txt có dạng như sau:

mongo client connection created with mongodb://localhost:27017/healthCareDB?w=1
[OVERALL], RunTime(ms), 279319.0
[OVERALL], Throughput(ops/sec), 3580.135973564276
[TOTAL_GCS_PS_Scavenge], Count, 26.0
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 110.0
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.039381495709207036
[TOTAL_GCS_PS_MarkSweep], Count, 0.0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0.0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 26.0
[TOTAL_GC_TIME], Time(ms), 110.0
[TOTAL_GC_TIME_%], Time(%), 0.039381495709207036
[CLEANUP], Operations, 1.0
[CLEANUP], AverageLatency(us), 2213.0
[CLEANUP], MinLatency(us), 2212.0
[CLEANUP], MaxLatency(us), 2213.0
[CLEANUP], 95thPercentileLatency(us), 2213.0
[CLEANUP], 99thPercentileLatency(us), 2213.0
[INSERT], Operations, 1000000.0
[INSERT], AverageLatency(us), 276.660963
[INSERT], MinLatency(us), 197.0
[INSERT], MaxLatency(us), 35871.0
[INSERT], 95thPercentileLatency(us), 327.0
[INSERT], 99thPercentileLatency(us), 369.0
[INSERT], Return=OK, 1000000

Nhìn qua file kết quả, ta có các thông số cơ bản như là runtime, throughput, maxLatency và minLatency. về Latency mình đã nói ở những bài trước. Như vậy thay đổi tham số threads ta sẽ có nhiều file output khác nhau.

Như câu lệnh trên là lệnh load dữ liệu, nghĩa là thực hiện 100% ghi. Các lệnh khác (update, read) sẽ có dạng như sau:

./bin/ycsb run mongodb -P workloads/workloadc -p mongodb.url="mongodb://localhost:27017/healthCareDB?w=1" -p operationcount=100000 -s

để ý workloads/workloadc là các kịch bản test được định nghĩa ở đây: https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads Bạn hoàn toàn có thể định nghĩa 1 kịch bản test riêng cho mình bằng các truy cập thư mục ycsb/workloads và tạo ra các file workloads với nội dung như sau:

recordcount=1000
operationcount=1000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=true

readproportion=0.5
updateproportion=0.5
scanproportion=0
insertproportion=0

requestdistribution=zipfian

OK, vậy đây là kết quả sau khi chạy test với số lượng threads từ 1-120.

0