Mongodb在启动时会发出若干的警告,今天好好看了下网上大牛们的讨论,发现这些警告很可能会是以后问题的导火索。遂,一个个慢慢解决。
在没有完全进行任何处理的情况下,启动mongo,提示如下:
Server has startup warnings: 2016-09-17T18:28:05.646+0800 I CONTROL [initandlisten] 2016-09-17T18:28:05.646+0800 I CONTROL [initandlisten] ** WARNING: Insecure configuration, access control is not enabled and no --bind_ip has been specified. 2016-09-17T18:28:05.646+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted, 2016-09-17T18:28:05.646+0800 I CONTROL [initandlisten] ** and the server listens on all available network interfaces. 2016-09-17T18:28:05.646+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2016-09-17T18:28:05.646+0800 I CONTROL [initandlisten] 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine. 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems: 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options] 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-09-17T18:28:05.647+0800 I CONTROL [initandlisten] |
问题如下:
1、 没有使用-bind ip
2、 读写没有限制
3、 服务器监听所有网络中的可用端口
4、 使用root用户
5、 建议使用 numactl –interleave选项
6、 建议关闭大页面内存
从后往前走,解决大页面内存。
1、 hugepage
消耗大内存,关闭方法:
echo never >/sys/kernel/mm/redhat_transparent_hugepage/enabled
echo never>/sys/kernel/mm/transparent_hugepage/defrag
查看配置后的
cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
已经是never
那么大内存是什么?没有swap,块表的负载减轻。但是很多配置都需要手动的配置,在mongodb中非常的不推荐。占用的内存过大。有一个非常值得注意的地方,在3.0以上cache的size是默认的一半的系统内存。一旦你尝试在一台电脑中运行两个shard的时候,内存分分钟会爆了。
2.numactl –interleave
首先了解NUMA,它是一种多核CPU架构,每个CPU都访问自身的内存插槽,但是访问其他的节点会非常慢。一个数据库进程是非常耗内存的,因此在NUMA架构下,会经常出现swap页面的情况。命中率过低,swap的速度也很慢。但是其他的节点却在空闲的状态。
使用numactl指定进程的策略,允许从其他节点分配内存。因此,在启动的时候,我们的命令为:
numactl –interleave=all mongod –f /etc/mongodb/mongodb_s0.conf
3.访问控制
在集群搭建的时候,因为服务器硬盘资源的原因,所以,我采用的是:
serverA:mongos+config+shard0
serverB:mongos+config+shard1
serverC:mongos+config+shard2
在3台服务器中跑数据存储层的代码。为admin中分配一个只有我使用的账号,包括的权限有用户管理、集群管理等。在数据库中为其它用户分配的是一个普通的账号,可读可写。当然也可以用特权进行授予只有若干表的查看权限。
use admin
db.createUser({
user:"XXX",
pwd:"XXX",
roles:[
{role:"clusterAdmin",db:"admin"},
{role:"dbOwner",db:"admin"},
{role:"dbOwner",db:"test"}
]
})
use test
db.createUser({
user:"XXX",
pwd:"XXX",
roles:[
{role:"readWrite",db:"test"}
]
})
在分配权限的时候,尤其是我们搭建分片集群的时候,有时候希望去查看shard中的数据,那么你必须在shard中也加入用户的权限,否则如果你使用的是mongos配置的权限,你将无法进入。