主从架构不考虑,现在基本没人用
复制集(ReplicaSet)架构
硬件需求:
至少需要三台机器,2台做主从,1台做仲裁(arbiter),最好不要将仲裁放在主从上(虽然可以)
这样当仲裁所在的服务器损坏,只要修复一下就可以,并不影响主从的使用
主从的配置要求:内存至少128G(一般都是256G),SSD硬盘或者pciessd
但这里实验环境没必要,只用2台机器就可以,仲裁放在主上
主机名+IP地址:
node1,192.168.2.239
node2,192.168.2.240
--注:这里将239做主,240做从,arbiter(仲裁)放在239上面
1、上传软件包到/root目录下并解压(实验需求,应该放在/usr/local/src下面),两台都要做
tar -xvzf mongodb-linux-x86_64-2.6.10.tg
2、创建目录,并创建一些子目录(bin、conf、data、log、arbiter、key)命令、配置、数据、日志、仲裁、密钥,两台都要做,注:240不需创建arbiter
3、将解压出来的软件包下面的bin目录下面的所有命令都拷贝到新建目录的bin目录下,两台都要做
4、239,进入到conf目录下,编辑主库和仲裁的配置文件
vim mongod.conf(编辑主库)
port=20011——————mongodb默认的端口号是27017,不要用这个,随便一个就行,5位的
dbpath=/export/mongodb/data————数据目录
logpath=/export/mongodb/log/mongod.log————日志目录
fork=true
keyFile=/export/mongodb/key/mongod————密钥,一样证明在一个集群里面
nohttpinterface=true————默认是27017,再加100,会开启一个网络端口,不让其开启,为了更加的安全
replSet=shard1————备份集的名称
vim arbiter.conf(编辑仲裁)
port=20012
dbpath=/export/mongodb/arbiter
logpath=/export/mongodb/log/arbiter.log
fork=true
logappend=true————追加日志
keyFile=/export/mongodb/key/arbiter
nohttpinterface=true
replSet=shard1
5、239的主库mongodb和仲裁arbiter分配密钥并授权
--注:密钥必须大于等于6位,分配的权限一定要是600
6、240从库,进行1-5的操作(从库没有放仲裁,所以不用进行一些中仲裁操作)
7、239启动mongodb和arbiter(仲裁);240只启动mongodb就可以
主库启动mongodb
主库启动仲裁
主库查看进程
从库启动mongodb
!!!注意:如果启动的时候有以下报错:(查看log下的文件,看是什么报错)
一种错的解决方案:
cd /export/mongodb/data下将mongod.lock这个文件删了
8、239、240都登录到mongodb
9、配置复制集(主从都要配)
配置:
定义一个变量config,名字可以随便起
--注:_id后面的0,数字越小,优先级越高,0后面是101,那么101就是主,由0来决定,而不是由写的先后顺序
可以试一下,将id_0和id_1的顺序修改一下,看有什么现象
config={_id:'shard1',members:[{_id:0,host:'192.168.2.239:20011'},{_id:1,host:'192.168.2.240:20011'},{_id:2,host:'192.168.2.239:20012',arbiterOnly:true}]}
加载:(主库)
> rs.initiate(config)————应用变量
"ok" : 1----ok是1,表示加载成功
敲击回车,就会看到239和240的变化
239
240
主库239操作
从库240操作
报错是因为从库还未应用slave
主库239插入一条数据
从库查看这张表,可以显示这条数据
主从切换测试
239主库正常关闭mongodb(必须在admin库下关闭)
shard1:PRIMARY> db.shutdownServer()————正常关闭(温柔的方式)
--注:可以尝试使用暴力一些的方式,直接关主机,再看看是否会切换到从库上
[root@node2 bin]# ps -ef | grep mongo————mongod服务已经关闭
240会自动切换为主
239启动并登陆mongodb(239已经变为从了)
240降级,使239重新变为主库
shard1:PRIMARY> rs.stepDown()
239重新为主库,240变回从库
239
240
--注意!(没有从升级,主降级以后从自动就升级了)
怎么看复制集的状态?
239主库
"health" : 1,——————是1,表示健康状态
"stateStr" : "PRIMARY",——————主
"stateStr" : "SECONDARY",——————从
"stateStr" : "ARBITER",——————仲裁
小知识:密钥是时刻变化的
[root@node2 bin]# cat /dev/urandom | LC_ALL=C tr -dc "[:alnum:]" | fold -w 10 | head -1