mangreen / Some-Note

Development Memo
1 stars 0 forks source link

MongoDB #1

Open mangreen opened 9 years ago

mangreen commented 9 years ago

1. 準備private ssh key

image

2. 連線到 a.vm5apis.com

image image

3.

$ mongodump -u analytics -p 67890 -d log
$ mongodump -u dashboard -p 67890 -d dash

4. 下載 dump

image

5. 開啟mongodb

至dump所在位置
$ mongorestore

image

6. 建立index

安裝 PIP http://blog.longwin.com.tw/2014/08/python-setup-pip-package-2014/

$ sudo apt-get install python-pip

安裝dex https://github.com/mongolab/dex

$ sudo pip install dex

執行

$ dex -f /var/log/mongodb/mongodb.log mongodb://myUser:myPass@myHost:12345/myDb

產生建立index建議格式如下

{
    'runStats': {
        'linesRecommended': 74,
        'linesProcessed': 144,
        'linesPassed': 57825
    },
    'results': [
        {
            'queryMask': '{"$query":{"_id":"<val>","campaign_id":"<val>","createdAt":"<val>","device":"<val>","ip":"<val>"}}',
            'namespace': 'analytics-log.postback',
            'recommendation': {
                'index': '{"campaign_id": 1, "device": 1, "ip": 1, "createdAt": 1, "_id": 1}',
                'namespace': 'analytics-log.postback',
                'shellCommand': 'db["postback"].ensureIndex({"campaign_id": 1, "device": 1, "ip": 1, "createdAt": 1, "_id": 1}, {"background": true})'
            },
            'details': {
                'count': 53,
                'totalTimeMillis': 274285,
                'avgTimeMillis': 5175
            }
        }
    ]
}

進入mongo db執行其中的'shellCommand'

7. 設定replication

http://blog.toright.com/posts/4508/mongodb-replica-set-%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7%E6%9E%B6%E6%A7%8B%E6%90%AD%E5%BB%BA.html http://tcrct.iteye.com/blog/2108099 設定所有的replSetName同樣的名稱

net:
  bindIp: "0.0.0.0"
replication:
  replSetName: prod-rs0
storage:
  dbPath: /var/lib/mongodb
  engine: wiredTiger
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongodb.log

8. 用戶認證

$vim /etc/mongod.conf 修改#security為

security:
  authorization: enabled

http://ls-la.me/2015/07/29/mongo-04/

管理員

關閉auth配置(默認就是這樣),打開mongod服務,並在本機(即localhost)使用mongo連接到數據庫:

// 超管,管理用戶,role是userAdminAnyDatabase。需要注意的是,master只能管理用戶,沒有查詢數據權限。
use admin;
db.createUser({
    user: "master", // 這個名字可以隨便取
    pwd: "testpw",
    roles: [
        {
            role: "userAdminAnyDatabase",
            db: "admin"
        }
    ]
});

// 系統管理,role是root。這個權限很牛,跟linux的root一樣牛,除了system系統相關的集合,其他都能任意讀寫。
// root可以在一開始創建,也可以被master創建。
// master就相當於可以任免CEO的人事部經理,但也只是一個人事部經理。
db.createUser({
    user: 'root', // 這個名字可以隨便取
    pwd: 'testpw',
    roles: [
        {
            role: 'root',
            db: 'admin'
        }
    ]
});

角色

# 新建一個role
db.createRole({
    role: 'rolename',
    privileges: [
        {
            resource: { db: 'articles', collection: 'magazine' }, # 能精確控制到集合
            actions: ['find', 'update', 'insert', 'remove']
        }
    ],
    roles: [ # 從這些role中繼承
        { role: 'read', db: 'admin'}
    ]
})

# 更新role,參數和新建一樣,更新會完全覆蓋之前記錄
db.upadteRole()

db.dropRole(rolename) # 刪除一個role
db.dropAllRoles() # 刪除當前db下所有role

# 給role添加操作
db.grantPrivilegesToRole(rolename, [{
    resource: {db: 'comments'}, actions: ['read']
}])

# 給role取消操作
revokePrivilegesFromRole(rolename, [{
    resource: {db: 'comments'}, actions: ['read']
}])

db.grantRolesToRole(rolename, (array)roles) # 合併role,也可以理解為繼承,把多個role的職責歸於一身
db.revokeRolesFromRole(rolename, (array)roles) # 與上一條相反,移除另一個role所擁有的權限
db.getRole(rolename) # 查看指定role權限
db.getRoles() # 查看當前db所有自定義role的權限

9. 定時備份

https://sheharyar.me/blog/regular-mongo-backups-using-cron/

建立 /home/username/bin/mongo_backup.sh

#!/bin/bash

MONGO_DATABASE="your_db_name"
APP_NAME="your_app_name"

MONGO_HOST="127.0.0.1"
MONGO_PORT="27017"
MONGO_USERNAME=""
MONGO_PASSWORD=""

TIMESTAMP=`date +%F-%H%M`
MONGODUMP_PATH="/usr/bin/mongodump"
BACKUPS_DIR="/home/username/backups/$APP_NAME"
BACKUP_NAME="$APP_NAME-$TIMESTAMP"

# mongo admin --eval "printjson(db.fsyncLock())"
# $MONGODUMP_PATH -h $MONGO_HOST:$MONGO_PORT -d $MONGO_DATABASE -u  $MONGO_USERNAME -p  $MONGO_PASSWORD
$MONGODUMP_PATH -d $MONGO_DATABASE
# mongo admin --eval "printjson(db.fsyncUnlock())"

mkdir -p $BACKUPS_DIR
mv dump $BACKUP_NAME
tar -zcvf $BACKUPS_DIR/$BACKUP_NAME.tgz $BACKUP_NAME
rm -rf $BACKUP_NAME

讓mongo_backup.sh變成可執行

$ chmod +x mongo_backup.sh
$ bash mongo_backup.sh

編輯 crontab

$ sudo su
$ crontab -e
00 00 * * * /bin/bash /home/username/bin/mongo_backup.sh

10.連接實例

http://www.runoob.com/mongodb/mongodb-connections.html

#連接本地數據庫服務器,端口是默認的。
mongodb://localhost

#使用用戶名fred,密碼foobar登錄localhost的admin數據庫。
mongodb://fred:foobar@localhost

#使用用戶名fred,密碼foobar登錄localhost的baz數據庫。
mongodb://fred:foobar@localhost/baz

#連接replica pair, 服務器1為example1.com服務器2為example2。
mongodb://example1.com:27017,example2.com:27017

#連接replica set 三台服務器(端口27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019

#連接replica set 三台服務器, 寫入操作應用在主服務器並且分佈查詢到從服務器。
mongodb://host1,host2,host3/?slaveOk=true

#直接連接第一個服務器,無論是replica set一部分或者主服務器或者從服務器。
mongodb://host1,host2,host3/?connect=direct;slaveOk=true

#當你的連接服務器有優先級,還需要列出所有服務器,你可以使用上述連接方式。
#安全模式連接到localhost:
mongodb://localhost/?safe=true

#以安全模式連接到replica set,並且等待至少兩個複制服務器成功寫入,超時時間設置為2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000

11. sharding設定

http://tsl.logdown.com/posts/2014/04/28/probe-into-mongodb-sharding http://tsl.logdown.com/posts/2014/04/29/mongodb-sharding-set-b

#1. 開啓config server
mongod --configsvr --dbpath <path> --port 27017

#2. 開啟query router
mongos --configdb IP{1,3}

#3. 將shard加入叢集
#    在router中輸入
sh.addShard([IP|HOST NAME]:27017)

#4. partition database
#    新建的collection會放到不同的shard上,但單個collection還是整體放在一個shard上
db.runCommand({enablesharding : "db_name"});

#5. partition collection
db.runCommand({shardcollection :"db_name.collection_name", key : {_id : 'hashed'}});

#最後可以用db.printShardingStatus指令來確認分散的狀況