1.简介
MongoDB集群有三种方式:Replica Set、Sharding、Master-Slaver。Replica Set是副本集的方式做高可用集群,Sharding是数据分片,如果数据量大可以使用这种方式。Master-Slaver官方已经不推荐使用了。
本篇只介绍Replica Set的方式。数据分片将来单独写一篇介绍。
1.2 Replica Set的两种节点
Replica Set的节点分为两种:Primary和Secondary。他们都包含完整的数据,Primary节点为客户端提供读写服务,Secondary节点作为数据备份。如果Primary节点挂了,集群会选出一个Secondary节点作为Primary节点继续提供读写服务。
1.3. Replica Set的读写分离
默认Secondary节点不提供读服务,如果读的量非常大,并且允许客户端读取过时的脏数据,那么客户端可以直接连接到Secondary节点,设置Secondary节点可读(不设置读取会失败),就可以实现读写分离。
2. 搭建Replica Set步骤
2.1. 准备三台机器
mongo01.dev.oracleot.com
mongo02.dev.oracleot.com
mongo03.dev.oracleot.com
2.2. 使用docker启动mongodb
三台机器分别执行下列命令
# 创建volumn
docker volumn create mongo_data_db
# 创建证书
docker run -rm -d mongo:3.6.1 bash
cd /data/db/
openssl rand -base64 756 > keyfile
chmod 400 keyfile
# 启动mongodb
docker run --name mongo1 -p 27017:27017 -v mongo_data_db:/data/db --privileged -d mongo:3.6.1 mongod --replSet mongo-set --keyFile /data/db/keyfile
2.3. 配置集群
需要在primary机器上运行
docker exec -it mongo1 mongo
> config = {
"_id" : "mongo-set",
"members" : [
{
"_id" : 0,
"host" : "mongo01.dev.oracleot.com:27017",
"priority":2
},
{
"_id" : 1,
"host" : "mongo02.dev.oracleot.com:27017",
"priority":1
},
{
"_id" : 2,
"host" : "mongo03.dev.oracleot.com:27017",
"priority":1
}
]
}
> rs.initiate(config)
{
"ok" : 1,
"operationTime" : Timestamp(1515652730, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1515652730, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
2.4 创建账户
2.4.1 创建超级账户
use admin
> db.createUser(
{
user: "root",
pwd: "mongo_root_test",
roles: [ { role: "root", db: "admin" } ]
}
)
2.4.2 创建管理员账户
use admin
> db.createUser(
{
user: "admin",
pwd: "mongo_admin_test",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
2.4.3 创建普通账户
use mt
db.createUser(
{
user: "mt",
pwd: "mongo_mt_test",
roles: [ { role: "readWrite", db: "mt" } ]
}
)
2.5 解决警告
启动后有可能会出现下面的警告
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten]
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten]
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten]
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-01-17T05:35:04.275+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
第一条WARNING: Access control is not enabled for the database.
是没有创建用户导致的警告,如果创建了用户就可以了,不过mongodb的鉴权比较费CPU,如果应用使用短连接则不建议在mongodb中创建用户。
第二三条是Centos7开启了transparent_hugepage导致的,虽然开启transparent_hugepage本意是提升内存性能,不过像orale、mongodb等厂商均建议关闭。下面是关闭方法
禁用transparent_hugepage,重启后无效
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never> /sys/kernel/mm/transparent_hugepage/defrag
开机就禁用transparent_hugepage
$ vim /etc/rc.d/rc.local
# 加上下面的话
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
设置执行权限
$ chmod +x /etc/rc.d/rc.local