MySQL體系結(jié)構(gòu)
庫:database
表:table
列:column
行:row
MongoDB體系結(jié)構(gòu)
庫:database
集合(表);collection
文檔:(json)
{
id:101
name:zhangsan
}
1粪小、系統(tǒng)準(zhǔn)備
(1)redhat或centos6.2以上系統(tǒng)
(2)系統(tǒng)開發(fā)包完整
(3)ip地址和hosts文件解析正常
(4)iptables防火墻&SElinux關(guān)閉
(5)關(guān)閉大頁內(nèi)存機制
########################################################################
root用戶下
在vi /etc/rc.local最后添加如下代碼
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
2丢间、mongodb安裝
創(chuàng)建所需用戶和組
useradd mongodbb
passwd mongodbb
創(chuàng)建mongodb所需目錄結(jié)構(gòu)
mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data
上傳并解壓軟件到指定位置
[root@db01 data]# cd /data
[root@db01 data]# tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz
[root@db01 data]# cp -r /data/mongodb-linux-x86_64-rhel70-3.6.12/bin/ /mongodb
設(shè)置目錄結(jié)構(gòu)權(quán)限
chown -R mongod:mongod /mongodb
設(shè)置用戶環(huán)境變量
su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile
設(shè)置用戶環(huán)境變量
su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile
啟動mongodb
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
登錄mongodb
[mongod@server2 ~]$ mongo
3.使用配置文件
YAML模式
NOTE:
YAML does not support tab characters for indentation: use spaces instead.
--系統(tǒng)日志有關(guān)
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式記錄
--數(shù)據(jù)存儲有關(guān)
storage:
journal:
enabled: true
dbPath: "/mongodb/data" --數(shù)據(jù)路徑的位置
-- 進(jìn)程控制
processManagement:
fork: true --后臺守護(hù)進(jìn)程
pidFilePath: <string> --pid文件的位置第焰,一般不用配置巍实,可以去掉這行晦墙,自動生成到data中
--網(wǎng)絡(luò)配置有關(guān)
net:
bindIp: <ip> -- 監(jiān)聽地址
port: <port> -- 端口號,默認(rèn)不配置端口號敞掘,是27017
-- 安全驗證有關(guān)配置
security:
authorization: enabled --是否打開用戶名密碼驗證
/------------------以下是復(fù)制集與分片集群有關(guān)----------------------
replication:
oplogSizeMB: <NUM>
replSetName: "<REPSETNAME>"
secondaryIndexPrefetch: "all"
sharding:
clusterRole: <string>
archiveMovedChunks: <boolean>
---for mongos only
replication:
localPingThresholdMs: <int>
sharding:
configDB: <string>
mongodb 使用systemd管理
[root@db01 ~]# cat > /etc/systemd/system/mongodb.service <<EOF
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongodb
Type=forking
ExecStart=/mongodb/bin/mongodb --config /mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongodb --config /mongodb/conf/mongo.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
[root@db01 ~]# systemctl restart mongod
[root@db01 ~]# systemctl stop mongod
[root@db01 ~]# systemctl start mongod
3邑蒋、mongodb常用基本操作
3.0 mongodb 默認(rèn)存在的庫
test:登錄時默認(rèn)存在的庫
管理MongoDB有關(guān)的系統(tǒng)庫
admin庫:系統(tǒng)預(yù)留庫,MongoDB系統(tǒng)管理庫
local庫:本地預(yù)留庫,存儲關(guān)鍵日志
config庫:MongoDB配置信息庫
show databases/show dbs
show tables/show collections
use admin
db/select database()
3.1 命令種類
db 對象相關(guān)命令
db.[TAB][TAB]
db.help()
db.oldboy.[TAB][TAB]
db.oldboy.help()
rs 復(fù)制集有關(guān)(replication set):
rs.[TAB][TAB]
rs.help()
sh 分片集群(sharding cluster)
sh.[TAB][TAB]
sh.help()
4. mongodb對象操作
mongo mysql
庫 -----> 庫
集合 -----> 表
文檔 -----> 數(shù)據(jù)行
4.1 庫的操作
> use test ?(創(chuàng)建數(shù)據(jù)庫)
>db.dropDatabase() (刪除當(dāng)前庫)
{ "dropped" : "test", "ok" : 1 }
show dis(查詢)
db ( 當(dāng)前所在庫)
4.2 集合的操作
app> db.createCollection('a')
{ "ok" : 1 }
app> db.createCollection('b')
方法2:當(dāng)插入一個文檔的時候歇竟,一個集合就會自動創(chuàng)建长窄。
查詢
show tables
show collection
刪除
db.oldboy.drop
插入數(shù)據(jù)
> use oldboy
switched to db oldboy
> db.t1.insert({id:101})
WriteResult({ "nInserted" : 1 })
> show tables;
t1
4.3 文檔操作
數(shù)據(jù)錄入:
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}
查詢數(shù)據(jù)行數(shù):
> db.log.count()
全表查詢:
> db.log.find()
每頁顯示50條記錄:
> DBQuery.shellBatchSize=50;
``
按照條件查詢
> db.log.find({uid:999}
以標(biāo)準(zhǔn)的json格式顯示數(shù)據(jù)
{
"_id" : ObjectId("5cc516e60d13144c89dead33"),
"uid" : 999,
"name" : "mongodb",
"age" : 6,
"date" : ISODate("2019-04-28T02:58:46.109Z")
}
``
刪除集合中所有記錄
app> db.log.remove({})
查看集合存儲信息
app> db.log.totalSize() //集合中索引+數(shù)據(jù)壓縮存儲之后的大小
5. 用戶及權(quán)限管理
5.1 注意
驗證庫: 建立用戶時use到的庫滔吠,在使用用戶時纲菌,要加上驗證庫才能登陸。
對于管理員用戶,必須在admin下創(chuàng)建.
- 建用戶時,use到的庫,就是此用戶的驗證庫
- 登錄時,必須明確指定驗證庫才能登錄
- 通常,管理員用的驗證庫是admin,普通用戶的驗證庫一般是所管理的庫設(shè)置為驗證庫
- 如果直接登錄到數(shù)據(jù)庫,不進(jìn)行use,默認(rèn)的驗證庫是test,不是我們生產(chǎn)建議的.
- 從3.6 版本開始疮绷,不添加bindIp參數(shù)翰舌,默認(rèn)不讓遠(yuǎn)程登錄,只能本地管理員登錄冬骚。
5.2 用戶創(chuàng)建語法
use admin 選定驗證庫
db.createUser
{
user: "<name>",
pwd: "<cleartext password>",
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
基本語法說明:
user:用戶名
pwd:密碼
roles:
role:角色名
db:作用對象
role:root, readWrite,read
驗證數(shù)據(jù)庫:
mongo -u oldboy -p 123 10.0.0.53/oldboy
5.3 用戶管理例子
創(chuàng)建超級管理員:管理所有數(shù)據(jù)庫(必須use admin再去創(chuàng)建)
$ mongo
use admin
?db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
驗證用戶
db.auth('root','root123')
配置文件中椅贱,加入以下配置
security:
authorization: enabled
重啟mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown
mongod -f /mongodb/conf/mongo.conf
登錄驗證
mongo -uroot -proot123 admin
mongo -uroot -proot123 10.0.0.53/admin
或者
mongo
use admin
db.auth('root','root123')
查看用戶:
use admin
db.system.users.find().pretty()
創(chuàng)建應(yīng)用用戶
use oldboy
db.createUser(
{
user: "app01",
pwd: "app01",
roles: [ { role: "readWrite" , db: "oldboy" } ]
}
)
mongo -uapp01 -papp01 app
查詢mongodb中的用戶信息
mongo -uroot -proot123 10.0.0.51/admin
db.system.users.find().pretty()
5.3創(chuàng)建應(yīng)用用戶
use oldboy
db.createUser(
{
user: "app01",
pwd: "app01",
roles: [ { role: "readWrite" , db: "oldboy" } ]
}
)
登陸
mongo -uapp01 -papp01 app
查詢mongodb中的用戶信息
mongo -uroot -proot123 10.0.0.53/admin
db.system.users.find().pretty()
5.4 刪除用戶(root身份登錄,use到驗證庫)
刪除用戶
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})
mongo -uroot -proot123 10.0.0.52/admin
use oldboy1
db.dropUser("app02")
5.5 用戶管理注意事項
- 建用戶要有驗證庫只冻,管理員admin庇麦,普通用戶是要管理的庫
- 登錄時,注意驗證庫
mongo -uapp01 -papp01 10.0.0.52:27017/oldboy
- 重點參數(shù)
net:
port: 27017
bindIp: 10.0.0.51,127.0.0.1
security:
authorization: enabled
6. MongoDB復(fù)制集RS(ReplicationSet)
6.1 基本原理
基本構(gòu)成是1主2從的結(jié)構(gòu)喜德,自帶互相監(jiān)控投票機制(Raft(MongoDB) Paxos(mysql MGR 用的是變種))
如果發(fā)生主庫宕機山橄,復(fù)制集內(nèi)部會進(jìn)行投票選舉,選擇一個新的主庫替代原有主庫對外提供服務(wù)舍悯。同時復(fù)制集會自動通知
客戶端程序航棱,主庫已經(jīng)發(fā)生切換了。應(yīng)用就會連接到新的主庫萌衬。
6.2 Replication Set配置過程詳解
6.2.1 規(guī)劃
三個以上的mongodb節(jié)點(或多實例)
6.2.2 環(huán)境準(zhǔn)備
注意修改ip
多個端口:
28017饮醇、28018、28019秕豫、28020
多套目錄:
su - mongod
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log
多套配置文件
/mongodb/28017/conf/mongod.conf
/mongodb/28018/conf/mongod.conf
/mongodb/28019/conf/mongod.conf
/mongodb/28020/conf/mongod.conf
配置文件內(nèi)容
cat > /mongodb/28017/conf/mongod.conf <<EOF
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 10.0.0.52,127.0.0.1
port: 28017
replication:
oplogSizeMB: 2048
replSetName: my_repl
EOF
\cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/
\cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/
\cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/
sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i
sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i
sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i
啟動多個實例備用
mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf
netstat -lnp|grep 280
6.3 配置普通復(fù)制集:
1主2從朴艰,從庫普通從庫
mongo --port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.52:28017'},
{_id: 1, host: '10.0.0.52:28018'},
{_id: 2, host: '10.0.0.52:28019'}]
}
rs.initiate(config)
查詢復(fù)制集狀態(tài)
rs.status();
6.4 1主1從1個arbiter
mongo -port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.52:28017'},
{_id: 1, host: '10.0.0.52:28018'},
{_id: 2, host: '10.0.0.52:28019',"arbiterOnly":true}]
}
rs.initiate(config)
6.5 復(fù)制集管理操作
6.5.1 查看復(fù)制集狀態(tài)
rs.status(); //查看整體復(fù)制集狀態(tài)
rs.isMaster(); // 查看當(dāng)前是否是主節(jié)點
rs.conf(); //查看復(fù)制集配置信息
6.5.2 添加刪除節(jié)點
rs.remove("ip:port"); // 刪除一個節(jié)點
rs.add("ip:port"); // 新增從節(jié)點
rs.addArb("ip:port"); // 新增仲裁節(jié)點
例子:
添加 arbiter節(jié)點
1混移、連接到主節(jié)點
[mongod@db03 ~]$ mongo --port 28018 admin
2祠墅、添加仲裁節(jié)點
my_repl:PRIMARY> rs.addArb("10.0.0.52:28020")
3、查看節(jié)點狀態(tài)
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"10.0.0.53:28017",
"10.0.0.53:28018",
"10.0.0.53:28019"
],
"arbiters" : [
"10.0.0.53:28020"
],
rs.remove("ip:port"); // 刪除一個節(jié)點 ```要從主節(jié)點刪除```
例子:
my_repl:PRIMARY> rs.remove("10.0.0.52:28019");
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
rs.add("ip:port"); // 新增從節(jié)點
例子:
my_repl:PRIMARY> rs.add("10.0.0.52:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
注意:所有的從庫都允許讀寫
rs.slaveOk() 臨時打開從庫節(jié)點讀寫功能沫屡。
6.5.3 特殊從節(jié)點
arbiter節(jié)點:主要負(fù)責(zé)選主過程中的投票饵隙,但是不存儲任何數(shù)據(jù),也不提供任何服務(wù)
hidden節(jié)點:隱藏節(jié)點沮脖,不參與選主金矛,也不對外提供服務(wù)。
delay節(jié)點:延時節(jié)點勺届,數(shù)據(jù)落后于主庫一段時間驶俊,因為數(shù)據(jù)是延時的,也不應(yīng)該提供服務(wù)或參與選主免姿,所以通常會配合hidden(隱藏)
一般情況下會將delay+hidden一起配置使用
介紹:
arbiter節(jié)點:主要負(fù)責(zé)選主過程中的投票饼酿,但是不存儲任何數(shù)據(jù),也不提供任何服務(wù)
hidden節(jié)點:隱藏節(jié)點,不參與選主故俐,也不對外提供服務(wù)想鹰。
delay節(jié)點:延時節(jié)點,數(shù)據(jù)落后于主庫一段時間药版,因為數(shù)據(jù)是延時的辑舷,也不應(yīng)該提供服務(wù)或參與選主,所以通常會配合hidden(隱藏)
一般情況下會將delay+hidden一起配置使用
配置延時節(jié)點(一般延時節(jié)點也配置成hidden)
cfg=rs.conf()
cfg.members[2].priority=0
cfg.members[2].hidden=true
cfg.members[2].slaveDelay=120
rs.reconfig(cfg)
取消以上配置
注意:member里面的數(shù)字要看情況填寫槽片,如果最開始沒有改過的話就寫標(biāo)注的id,如果有改變就從0開始數(shù)即可何缓。
cfg=rs.conf()
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
rs.reconfig(cfg)
配置成功后,通過以下命令查詢配置后的屬性
rs.conf();
6.5.4 副本集其他操作命令
查看副本集的配置信息
admin> rs.conf()
查看副本集各成員的狀態(tài)
admin> rs.status()
++++++++++++++++++++++++++++++++++++++++++++++++
--副本集角色切換(不要人為隨便操作)
admin> rs.stepDown()
注:
admin> rs.freeze(300) //鎖定從还栓,使其不會轉(zhuǎn)變成主庫
freeze()和stepDown單位都是秒碌廓。
+++++++++++++++++++++++++++++++++++++++++++++
設(shè)置副本節(jié)點可讀:在副本節(jié)點執(zhí)行
admin> rs.slaveOk()
eg:
admin> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }
查看副本節(jié)點(監(jiān)控主從延時)
admin> rs.printSlaveReplicationInfo()
source: 192.168.1.22:27017
syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
OPlog日志(備份恢復(fù)章節(jié))