Posts Tagged ‘Mongo-Shake’

Triển khai hệ thống Mongo-Shake

Posted: Tháng Tư 19, 2019 in MongoDB
Thẻ:, ,

1. Giới thiệu

Cho mục đích dự phòng hệ thống khi có thảm họa, như trường hợp đơn giản là mất điện ở ISP, trường hợp điển hình có thể thấy gần đây là vụ sập data center VNG tháng 9/2018, khi đó chúng ta cần dựng hệ thống tại nhiều data center khác nhau.

Trong trường hợp dự phòng hệ thống MongoDB, chúng ta cũng dựng hệ thống ở nhiều data center khác nhau. MongoDB có hỗ trợ kỹ thuật replica set để cho phép replication dữ liệu qua nhiều node với mô hình master/slave. Với replica set, hệ thống chỉ có một master, vì vậy mà mô hình cũng chỉ có một active. Để cho phép hệ thống MongoDB có nhiều master, active ở nhiều data center và có thể dự phòng được dữ liệu, chúng ta cần sử dụng một công cụ mở rộng. Trong phần này tôi sẽ giới thiệu về Mongo-Shake.

1.1 Về Mongo-Shake

Mongo-Shake là nền tảng cho phép replication dữ liệu dựa trên oplog của MongoDB. Nó đọc logs hoạt động oplog của cụm MongoDB và thực hiện nhân bản dữ liệu MongoDB và thực hiện các yêu cầu cụ thể tiếp theo dựa trên log hoạt động. Ngoài tính năng chính là đồng bộ dữ liệu cluster MongoDB, Mongo-Shake còn hỗ trợ một số tình huống khác như: nhân bản bất đồng bộ, đồng bộ cache, giám sát dựa vào log

1.2 Tính năng và mô hình hoạt động

Mongo-Shake tìm nạp oplog từ mongodb nguồn và thực hiện phát lại (replay) vào mongodb đích hoặc gửi đến các điểm khác trong các tunnel khác nhau. Mongo-Shake hỗ trợ một số tunnel sau:

  • Direct: Thực hiện ghi trực tiếp MongoDB đích

  • RPC: Kết nối qua net/rpc vào go

  • TCP: Kết nối qua TCP socket

  • File: Kết nối qua một tệp tin

  • Kafka: Kết nối qua một kênh kafka

Một số tính năng của Mongo-Shake:

  • Parallel Replication
  • High Availability

  • Filter

  • Compress

  • Gid

  • Checkpoint

  • Troubleshouting và Speed Limit

  • Conflict Detection

Ảnh dưới mô tả tổng quan luồng dữ liệu của Mongo-Shake

dataflow mongo-shake

 

dataflow_2

Source MongoDB ở đây có thể là mongod đơn, replica set hoặc sharding. Destination MongoDB có thể là mongod hoặc mongos. Nếu source là replica set, khi đó chúng ta sẽ tìm nạp dữ liệu từ secondary/hidden để giảm áp lực lên primary.

2. Triển khai Replica set MongoDB và Mongo-Shake

2.1 Mô hình thực hiện

Chúng ta thực hiện thiết lập mô hình đơn giản như sau:

sync-mongodb-in-2-datacenters

Requirement

05+ server centos 7

  • 01 server (192.168.10.110) cài go-1.9+, govendor, git và Mongo-Shake
  • 02+ server (192.168.10.111-112) thiết lập replica set mongodb (replicate set id: mongoshake1)

  • 02+ server (192.168.10.113-114) thiết lập replica set mongodb (replicate set id: mongoshake2)

2.2 Thiết lập replica set MongoDB

a. Cài đặt MongoDB 3

Chúng ta thực hiện cài đặt MongoDB 3x trên các server mà sẽ thực hiện nhiệm vụ MongoDB server.

Step1: Thực hiện tạo repo mongodb

cat >/etc/yum.repos.d/mongo.repo<<EOF
[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
EOF

Step2: Cài đặt MongoDB

Cài đặt

yum install mongodb-org -y

Cho phép truy cập mongodb server từ một số IP

sed -i 's/127.0.0.1/0.0.0.0/' /etc/mongod.conf

Step3: Thiết lập firewall

Chỉ cho phép vùng mạng hoặc những IP cần thiết được phép truy cập MongoDB

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="27017" protocol="tcp" accept'
firewall-cmd --reload

Step4: Start mongod

systemctl start mongod.service
systemctl enable mongod.service

b. Replica set MongoDB tại cụm cluster01

Thiết lập replica set mongodb với id là mongoshake1

Step1: Enable replication trên các MongoDB

Chỉnh tệp tin mongod.conf và thêm tùy chọn sau

cat >>/etc/mongod.conf <<EOF
replication:
    #replica set id
    replSetName: mongoshake1
EOF
  • Restart mongod
systemctl restart mongod

Step2: Thiết lập hostname

cat >>/etc/hosts <<EOF
192.168.10.111    mongo01
192.168.10.112    mongo02
EOF

Step3: Khởi tạo replica set

Thực hiện khởi tạo replica set mongodb trên server mongo01

mongo
>rs.initiate( { _id: "mongoshake1", members: [ { _id: 0, host: "mongo01:27017", priority: 2 } ] } )
>rs.add({ _id:2,host:"mongo02:27017",priority:1 })

c. Replica set MongoDB tại cụm cluster02

Thiết lập replica set mongodb với id là mongoshake2

Step1: Enable replication trên các MongoDB

Chỉnh tệp tin mongod.conf và thêm tùy chọn sau

cat >>/etc/mongod.conf <<EOF
replication:
    #replica set id
    replSetName: mongoshake2
EOF
  • Restart mongod
systemctl restart mongod

Step2: Thiết lập hostname

cat >>/etc/hosts <<EOF
192.168.10.113    mongo03
192.168.10.114    mongo04
EOF

Step3: Khởi tạo replica set

Thực hiện khởi tạo replica set mongodb trên server mongo01

mongo
>rs.initiate( { _id: "mongoshake2", members: [ { _id: 0, host: "mongo03:27017", priority: 2 } ] } )
>rs.add({ _id:2,host:"mongo04:27017",priority:1 })

2.3 Thiết lập Mongo-Shake

a. Cài đặt Go language

  • Download go language

Download go at https://golang.org/dl/

curl -O https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz
tar -C /usr/local -xzvf go1.12.4.linux-amd64.tar.gz
  • Thiết lập environments
cat >>~/.bashrc<<EOF
export GOPATH=/root/mongo-shake
export GOROOT=/usr/local/go
export PATH=$PATH:/usr/local/go/bin
EOF
  • Logout and login

b. Cài đặt govendor

yum install git gcc -y
go get -u github.com/kardianos/govendor
cp  mongo-shake/bin/govendor /usr/local/go/bin/
rm -rf /root/mongo-shake

c. Thiết lập Mongo-Shake

  • Download mongo-shake
cd /root
git clone https://github.com/aliyun/mongo-shake.git
  • pull all dependencies & build collector
cd /root/mongo-shake/src
govendor sync
cd /root/mongo-shake
./build.sh
  • Sửa nội dung source và destination mongodb trong tệp conf/collector.conf như sau
mongo_urls = mongodb://192.168.10.111:27017,192.168.10.112:27017
tunnel.address = mongodb://192.168.10.113:27017,192.168.10.114:27017
  • Chạy Mongo-Shake
./bin/collector -conf=conf/collector.conf

Tham khảo thêm tại:

https://github.com/alibaba/MongoShake