PRD环境即便只有一台服务器,为了未来平滑扩容及维护,也应配置为单节点复制集。
复制集应含有奇数个成员。
最基础的复制集架构是由三个成员组成的。这样的架构为复制集提供了冗余与故障切换的余地。根据应用的需求来设计复制集的架构,尽量避免不必要的复杂化。
最基础的复制集架构是由三个节点组成的。在这样的复制集中,三个节点可以都拥有数据集,也可以是由两个拥有数据集的节点加上一个投票节点组成。
包含三个带有数据集的节点组成的复制集拥有:
这样的架构中除了主节点外还一直拥有两个包含完整数据集的从节点。这样架构的复制集提供了 高可用性 与故障容灾的功能。一旦主节点不可用了,复制集会将一个从节点选举为新的主节点来继续对外服务。之前的主节点将在其可用后再次加入复制集中。
一个主节点、一个从节点和一个投票节点
包含三个节点其中两个带有数据集的复制集拥有:
由于投票节点不包含数据集,所以这样的复制集架构仅有一份数据集的备份。投票节点需要的资源很少
但是,在拥有一个主节点,一个从节点和一个投票节点的复制集架构中,如果主节点 或者 从节点不可用了,复制集还是可以正常提供服务的。如果主节点不可用了,那么复制集会将从节点升职为主节点。
准备好服务器,安装好操作系统(64位Linux操作系统,RedHat、CentOS、Ubuntu均可)
配置好服务器网络,多服务器间网络可互通
操作系统上创建好安装配置用户(此文档以 parim 用户为例)
mongodb安装
如无特殊说明,以下各步骤所有服务器均需执行。
Ubuntu 1604 操作系统安装包下载
下载如下安装包,并上传到要安装的服务器 ~/setup 目录:
mongodb-linux-x86_64-ubuntu1604-3.4.10.tgz
在可访问外网的服务器上,可直接使用如下命令创建安装包文件夹并下载安装包:
mkdir -p ~/setup
cd ~/setup
wget http://res.parim.net/yy/setup/mongodb-linux-x86_64-ubuntu1604-3.4.10.tgz
下载如下安装包,并上传到要安装的服务器 ~/setup 目录:
mongodb-linux-x86_64-rhel62-3.4.11.tgz
在可访问外网的服务器上,可直接使用如下命令创建安装包文件夹并下载安装包:
mkdir -p ~/setup
cd ~/setup
wget http://res.parim.net/zjrb/setup/mongodb-linux-x86_64-rhel62-3.4.11.tgz
按实际情况创建安装目录,并给安装配置用户授予读写权限。
此处以 ~/apps 为例,执行如下命令授权:
mkdir -p ~/apps
安装 mongodb
Ubuntu 1604 操作系统解压安装
进入安装目录,执行解压安装。
cd ~/apps
tar xzvf ../setup/mongodb-linux-x86_64-ubuntu1604-3.4.10.tgz
mv mongodb-linux-x86_64-ubuntu1604-3.4.10/ mongodb
进入安装目录,执行解压安装。
cd ~/apps
tar xzvf ../setup/mongodb-linux-x86_64-rhel62-3.4.11.tgz
mv mongodb-linux-x86_64-rhel62-3.4.11/ mongodb
仅Ubuntu操作系统执行:
[ ! -f ~/.bash_profile ] && cp -vf ~/.profile ~/.bash_profile
以下所有操作系统执行:
cat >> ~/.bash_profile << EOF
export MONGODB_HOME=/home/parim/apps/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
EOF
source ~/.bash_profile
创建配置、数据、日志文件夹
cd $MONGODB_HOME
mkdir -p conf logs data
此处选择数据文件存放目录为安装目录下的data目录,可按需修改。
创建、修改配置文件
使用如下命令创建配置文件:
cd $MONGODB_HOME/conf
mongod.conf
for documentation of all options, see:
http://docs.mongodb.org/manual/reference/configuration-options/
Where and how to store data.
storage:
dbPath: /home/parim/apps/mongodb/data
journal:
enabled: true
engine:
mmapv1:
wiredTiger:
where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/parim/apps/mongodb/logs/mongo.log
network interfaces
net:
port: 30000
bindIp: 0.0.0.0
how the process runs
processManagement:
fork: true
pidFilePath: /home/parim/apps/mongodb/data/mongod.pid
# timeZoneInfo: /usr/share/zoneinfo
security:
authorization: enabled
keyFile: /home/parim/apps/mongodb/conf/.keyFile
operationProfiling:
replication:
oplogSizeMB: 20480
replSetName: qimooc
secondaryIndexPrefetch:
enableMajorityReadConcern:
sharding:
Enterprise-Only Options:
auditLog:
snmp:
EOF
bindIp
port
dbPath
replSetName
pidFilePath
systemLog.path
oplogSizeMB
生成、拷贝keyFile
在其中一台服务器上执行如下命令,生成keyFile:
openssl rand -base64 102 > MONGODBHOME/conf/.keyFilechmod600 M O N G O D B H O M E / c o n f / . k e y F i l e c h m o d 600 MONGODB_HOME/conf/.keyFile
将刚生成的keyFile复制到其他服务器的对应目录。
scp MONGODB_HOME/conf/.keyFile {other_server_ip}:{ MONGODB_HOME/conf/.keyFile {other_server_ip}:{ MONGODB_HOME}/conf/.keyFile
注意:
执行复制前请缺保其他服务已完成安装及配置文件的修改。
请替换 {other_server_ip} 和 {$MONGODB_HOME} 为对应服务器的 ip 地址和 mongodb 的安装目录。
启动 mongodb
使用如下命令启动 mongodb :
mongod –config MONGODBHOME/conf/mongod.conf停止mongodb(仅说明停止命令,无需执行)mongod–config M O N G O D B H O M E / c o n f / m o n g o d . c o n f 停 止 m o n g o d b ( 仅 说 明 停 止 命 令 , 无 需 执 行 ) m o n g o d – c o n f i g MONGODB_HOME/conf/mongod.conf –shutdown
配置 mongodb 自动启动
以 parim 用户登录执行:
cat >> ~/bin/sys_init_startup.sh << EOF
mongod –config $MONGODB_HOME/conf/mongod.conf
EOF
chmod 750 ~/bin/sys_init_startup.sh
以 root 用户登录,编辑 /etc/rc.local 文件,在exit 0所在行前面添加如下行:
su - parim -c “/home/parim/bin/sys_init_startup.sh”
注意:如果文件中已有此行,则无需再次添加。
配置复制集及业务数据库
配置复制集前,请确认各服务器已按前述说明安装、配置、启动。
初始化复制集
mongodb启动后,在其中一台服务器上,使用如下命令登录mongodb:
mongo –port 30000
依次执行如下命令:
use admin
rs.initiate()
完成后,提示符中有 PRIMARY> 字样。
为复制集添加节点:
rs.add(“{another_server_ip}:30000”)
如果选择的复制集架构包含投票节点,使用如下命令添加投票节点。
为复制集添加投票节点:
rs.addArb(“{another_server_ip}:30000”)
注意:
将 {another_server_ip} 替换为其他服务器的 IP 地址,如果端口号不是 30000,也做对应修改。
有几台其他服务器,就修改执行几次。
查看复制集状态:
rs.status()
输出json中”members”属性包含所有添加的复制集成员,且 “ok” 属性值为 1 则正常。
创建管理用户
在主服务器上执行如下命令创建管理用户:
use admin
db.createUser(
{
user: “root”,
pwd: “PassW0rd”,
roles: [ { role: “__system”, db: “admin” } ]
}
)
密码请按实际情况修改。
第一个用户创建后,所有服务器都需要登录后才可操作。可使用如下命令登录刚创建的 root 用户:
use admin
db.auth(‘root’,’PassW0rd’);
其他用户登录方法类似,需先选择用户所在的库,此处为admin。
创建业务数据库及用户
以管理用户 root 登录 PRIMARY 库后执行如下命令:
use qimoocdb
db.createUser(
{
“user”: “qimooc”,
“pwd”: “anOtherPassW0rd”,
“roles”:[
{ role: “dbOwner”, “db”: “qimoocdb” },
{ role: “readWrite”, db: “qimoocdb” },
{ role: “read”, db: “qimoocdb” }
]
}
)
复制验证
创建验证数据
以管理用户 root 登录PRIMARY 库后执行如下命令:
use qimoocdb
db.qimoocdb.user.insert({name:”piccy”})
db.qimoocdb.user.find()
以管理用户 root 登录任意一个 SECONDARY 库后执行如下命令:
rs.slaveOk(true)
use qimoocdb
db.qimoocdb.user.find()
能查到类似如下记录则说明复制成功:
qimooc:PRIMARY> db.qimoocdb.user.find()
{ “_id” : ObjectId(“5a5c4e68869e45e735b5099c”), “name” : “piccy” }
以 parim 用户登录当前 PRIMARY 主库库操作系统,手动停止主库:
mongod –config $MONGODB_HOME/conf/mongod.conf –shutdown
登录之前的其他 SECONDARY 库会发现其中一个已经切换为主库。
以 parim 用户登录之前手动停止的服务器,启动 mongodb:
mongod –config $MONGODB_HOME/conf/mongod.conf