以三节点为例,详细介绍mongodb高可用架构部署
1、机器列表(ip是虚构的,可根据实际情况修改)
172.16.10.1
172.16.10.2
172.16.10.3
操作系统为centos6.5
ip | 172.16.10.1 | 172.16.10.2 | 172.16.10.3 | 端口 |
组件 | mongos | mongos | mongos | 20000 |
config server | config server | config server | 21000 | |
shard1 | shard1 | shard1 | 27001 | |
shard2 | shard2 | shard2 | 27002 | |
shard3 | shard3 | shard3 | 27003 |
从上面的表格可以看出来,在机器规划时主要考虑一下几个方面
1、每个分片的三个副本分别位于三个节点服务器上,这样可以保证任意一台机器出现故障集群仍然可用
2、标绿色的为每个分片的primary节点,将是哪个分片的主节点分散到三个不同服务器,可以将数据写的压力均分
3、本教程将mongos和mongod部署在一起,实际应用时,mongos可以单独部署
2、服务器准备
1、关闭iptables
service iptables stop;
chkconfig iptables off;
2、禁止Transparent Huge Pages
mongodb官网明确指出,THP对于mongodb的性能有很大影响,具体可参考https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/的说明
(1)查看THP状态
cat /sys/kernel/mm/transparent_hugepage/defrag;
[always] madvise never
cat /sys/kernel/mm/transparent_hugepage/enabled;
[always] madvise never
上述状态说明THP是开启的
(2)禁用THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
(3)开启自动禁用
编辑/etc/rc.d/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
3、修改zone_reclaim参数
内核参数zone_reclaim_mode值为0或1,当某个节点可用内存不足时:
如果为0的话,那么系统会倾向于从其他节点分配内存;
如果为1的话,那么系统会倾向于从本地节点回收Cache内存多数时候。
使用如下命令修改zone_reclaim参数为0
echo 0 | sudo tee /proc/sys/vm/zone_reclaim_mode;
或者
sudo sysctl -w vm.zone_reclaim_mode=0;
4、修改内核参数vm.swappiness
系统默认值为vm.swappiness = 60
[root@localhost ~]# sysctl -a|grep swappiness
vm.swappiness = 60
设置为1,只有在内存可用很小的情况下,为了避免发生OOM死机才换出
echo vm.swappiness=1 >> /etc/sysctl.conf
sysctl -p
5、创建mongodb用户
举例
groupadd mongodb
useradd -d /home/mongodb -g mongodb mongodb
echo 'mongodb312' | passwd --stdin mongodb
chage -M 99999 mongodb
6、为mongodb的dataDir挂载数据卷
根据实际情况进行挂载,这里不再说明
7、修改系统ulimit
修改配置文件/etc/security/limits.conf和/etc/security/limits.d/XXXXX
* soft fsize unlimited
* hard fsize unlimited
* soft cpu unlimited
* hard cpu unlimited
* soft as unlimited
* hard as unlimited
* soft nofile 655350
* hard nofile 655350
* soft nproc 655350
* hard nproc 655350
8、创建路径
mkdir -p /home/mongodb/conf/
mkdir -p /home/mongodb/data/mongos/log/
mkdir -p /home/mongodb/data//config/data/
mkdir -p /home/mongodb/data//config/log/
mkdir -p /home/mongodb/data/shard1/data/
mkdir -p /home/mongodb/data//shard1/log/
mkdir -p /home/mongodb/data//shard2/data/
mkdir -p /home/mongodb/data//shard2/log/
mkdir -p /home/mongodb/data//shard3/data/
mkdir -p /home/mongodb/data//shard3/log/
mkdir -p /home/mongodb/mongokey/
9、添加环境变量
/etc/profile添加如下内容
export MONGODB_HOME=/home/mongodb/mongodb-linux-x86_64-3.2.11/
export PATH=$MONGODB_HOME/bin:$PATH
mongodb可执行文件路径根据实际情况修改
10、准备keyfile
使用keyfile作为集群各节点之间的认证
在一台机器生成keyfile
openssl rand -base64 100 > /home/mongodb/mongokey/mongodb-keyfile
将mongodb-keyfile拷贝到所有机器的/home/mongodb/mongokey/路径下,并修改权限为600
chmod 600 /home/mongodb/mongokey/mongodb-keyfile
3、搭建config server副本集
(1)编辑配置文件/home/mongodb/conf/config.conf
## content
systemLog:
destination: file
logAppend: true
path: /home/mongodb/data/config/log/config.log
# Where and how to store data.
storage:
dbPath: /home/mongodb/data/config/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true
pidFilePath: /home/mongodb/data/config/log/configsrv.pid
# network interfaces
net:
port: 21000
bindIp: 172.16.10.1,127.0.0.1
#operationProfiling:
replication:
replSetName: config
sharding:
clusterRole: configsvr
具体配置项请参考mongodb官网的文档
(2)分别启动三个config server
numactl --interleave=all mongod --keyFile /home/mongodb/mongokey/mongodb-keyfile --config /home/mongodb/conf/config.conf
如果没有numactl命令,使用yum进行安装即可
yum install numactl
(3)初始化config server
登录任意一个config server
mongo 127.0.0.1:21000
说明:此处使用127.0.0.1登录mongoshell而不是业务网卡的ip,是因为开启了权限认证,使用127.0.0.1可以绕过认证,后续的几个步骤使用127.0.0.1登录都是出于这个原因
登录mongoshell后,输入
config = {
... _id : "config",
... members : [
... {_id : 0, host : "172.16.10.1:21000" },
... {_id : 1, host : "172.16.10.2:21000" },
... {_id : 2, host : "172.16.10.3:21000" }
... ]
... }
然后执行初始化命令
rs.initiate(config);
查看集群状态
rs.status();
4、搭建shard副本集
编辑配置文件/home/mongodb/conf/shard1.conf
# where to write logging data.
systemLog:
destination: file
logAppend: false
path: /home/mongodb/data/shard1/log/shard1.log
# Where and how to store data.
storage:
dbPath: /home/mongodb/data/shard1/data
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 10
# how the process runs
processManagement:
fork: true
pidFilePath: /home/mongodb/data/shard1/log/shard1.pid
# network interfaces
net:
port: 27001
bindIp: 172.16.10.1,127.0.0.1
maxIncomingConnections: 2000
#operationProfiling:
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
#operationProfiling:
operationProfiling:
slowOpThresholdMs: 500
mode: slowOp
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /home/mongodb/mongokey/mongodb-keyfile
javascriptEnabled: true
setParameter:
enableLocalhostAuthBypass: true
authenticationMechanisms: SCRAM-SHA-1
重点配置项说明
- wiredTigerEngineConfigCacheSizeGB:存储引擎使用的最大内存量,如果一个节点只部署一个shard进程,建议设置为物理内存的一半;如果部署多个进程,根据实际情况进行修改。
- maxIncomingConnections:最大连接数,默认在100000,相当于不限制,建议不超过2000.
三个副本的配置类似,自行修改
分别启动三个节点上的shard1进程
numactl --interleave=all mongod --config /home/mongodb/conf/shard1.conf
登录172.16.10.1的shard1
mongo 127.0.0.1:27001
说明:为什么此处要登录172.16.10.1的shard1进行初始化?因为mongodb默认第一次选举时会选择初始化使用的这个节点作为primary节点。在上面的表格中,我们规划了172.16.10.1作为shard1的primary节点,因此在172.16.10.1上进行初始化,下面shard2和shard3的初始化也遵循这一原则。
mongo 127.0.0.1:27001
use admin
#定义副本集配置
config = {
... _id : "shard1",
... members : [
... {_id : 0, host : "172.16.10.1:27001" },
... {_id : 1, host : “172.16.10.2:27001" },
... {_id : 2, host : "172.16.10.3:27001" }
... ]
... }
#初始化副本集配置
rs.initiate(config);
#查看分区状态
rs.status();
#为shard集群的设置root密码
db.createUser(
... {
... user:"root",
... pwd: "yourPasswd",
... roles: [{ role: "root", db: "admin"}]
... }
... )
三个shard副本集的root密码建议都创建一下,以后可能会用得到。
mongodb用户管理具体的可参考官网https://docs.mongodb.com/v3.4/reference/method/js-user-management/
shard2和shard3的搭建参考shard1即可,过程都一样,配置按实际修改即可。
5、搭建mongos集群
编辑配置文件/home/mongodb/conf/mongos.conf,内容如下
systemLog:
destination: file
logAppend: false
path: /home/mongodb/data/mongos/log/mongos.log
processManagement:
fork: true
pidFilePath: /home/mongodb/data/mongos/log/mongos.pid
# network interfaces
net:
port: 20000
bindIp: 172.16.10.1,127.0.0.1
maxIncomingConnections: 2000
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
sharding:
configDB: config/172.16.10.1:21000,172.16.10.2:21000,172.16.10.3:21000
#结束
另外两个mongos配置大同小异,稍加修改即可不再赘述。
重点配置说明
- shardingConfigDB:config server集群地址
分别启动三个mongos进程
mongos --keyFile /home/mongodb/mongokey/mongodb-keyfile --config /home/mongodb/conf/mongos.conf
任意登录一个mongos
mongo 127.0.0.1:20000
设置集群root用户密码
use admin
db.createUser(
... {
... user:"root",
... pwd: "yourPasswd",
... roles: [{ role: "root", db: "admin"}]
... }
... )
6、启动分片
前面几步搭建好了配置服务器、路由服务器,各个分片服务器,但是还不能使用分片机制,需要配置分片使其生效。
登录任意一个mongos
mongo 172.16.10.1:20000
切换到admin库并登录root用户
use admin;
db.auth("root","yourPasswd");
添加分片
sh.addShard("shard1/172.16.10.1:27001,172.16.10.2:27001,172.16.10.3:27001");
sh.addShard("shard2/172.16.10.1:27002,172.16.10.2:27002,172.16.10.3:27002");
sh.addShard("shard3/172.16.10.1:27003,172.16.10.2:27003,172.16.10.3:27003")