借助于 docker 提供便利的服务环境,本来建个集群需要多个 host 的问题得到很好的解决(或者同一机子上运行时也指定不同端口也可以搞定集群),当然传统的在 virtual box 上创建多个 vm 也可以,但这样不仅繁琐又耗费资源。
在 docker 所运行的每一个 container 中都有自己的一个 ip,这些 container 的连接同一个 nat 网络下,这样 container 与 container 之间就可以像两台独立的 host 进行网络数据的传输。
mongo 集群 #
- mongod 集群是什么样子的模型?
primary:arbiter:second 对应为 1:1:n
primary 可读可写
arbiter 用作根据 priority 选举 second 产生 primary, 理论不可读写
second 只可读 - 如何运行
mongod以支持 replication 功能?
mongod --fork --logpath xxxx.log --replSet "xxx-Name"
注意,各个 Host 上mongod运行时--replSet指定的名字要相同
- 如何使 mongod 成为
primary,second,arbiter?
在各个 host 上运行 Mongodr 后,在 ip-master 的操作
rs.initiate()
rs.config()
这时 ip-master 上就成为了 primary,此时只有一个 replica set, 也就是自己,接着在 primary 中加入下个 replica set 作为 second
rs.add("ip-second:port")
rs.config()
可能要等几秒到几十秒,此时 ip-second 上的 mongod 就成为这个集群中的 second 节点,second 结点可有多个,重复这个步骤加入多个 second 结点。
有了 primary 和多个 second,可加入 arbiter 作为在当前 primary 结点不可用时在现有的 second 结点中选举 primary 结点。
- 设置 aribter 时要注意什么?
要先设定各个 second 结点的 priority, 不要限相同,否则 arbiter 无法选举 primary 造成只有 second 结点整个集群处于只读的困境。
在 primary 上操作
cfg=rs.config()
cfg.members[i].priority=integer
rs.reconfig(cgf)
或者
rs.reconfig(cgf,{force:true})
再增加 arbiter 结点
rs.addArb("ip-arbiter:port")
-
怎么让其中一个 second 脱离集群?
shutdown 掉那个 second,重新启动时不加--replSet选项,然后清除 local.system.replset(), 即 local 库中 system 集中 relpset 相关的数据
其它库中的其它数据和未脱离集群前 primary 结点的数据相同,不会被清除掉 -
about mgo
正常规定下 secondary 的结点是只读不写的 (read only), 只有 primary 结点才能读写 (read and write); 如果使用了 mgo 库对数据进行 CRUD 操作,mgo 在需要执行写数据时会通过 cluster 的信息连接到 primary 结点完成数据写入,而读数据会根据 Session.SetMode 的不同从不同的结点或者连接中完成数据读取操作。“Even if provided the address to a single server in the cluster, mgo will figure out the cluster topology and communicate with any of the servers as necessary.”
-
tips
- 通过
rs.status()中的lastHeartbeat和lastHeartBeatRecv来获取 primary 和 second 之间通信 laterncy(延时) - 可通过执行
rs.initite(cfg), 直接设定集群中各结点的配置,cfg 的配置模板如下: - 可通过 replica set 来替代
mongo export和mongo import导数据
cfg={ "_id" : "rs0", "version" : 2, "members" : [ { "_id" : 0, "host":"172.17.0.4:27017", "priority" : 1 }, { "_id" : 1, "host" : "172.17.0.3:28017", "priority" : 0.5 }, { "_id" : 2, "host":"172.17.0.2:29017", "arbiterOnly" :true, "priority" : 1 } ] } - 通过
配置完成,可以直接关掉 primary 或者在 primary 中执行rs.stepdown(),这样其它 second 就可以成为 primary

riak 集群 #
-
riak 集群模型?
riak 多个 Node 连接在一起形成环,环中的各个 Node 可读可写 -
怎么往 riak 集群中加入一个 Node?
如果是 2.0 以上的版本且使用的是 app.config 作为配置文件,直接修改 app.config 上的[email protected]为riak@ip
若使用的 riak.conf 作为配置文件,则从 vm.args 中修改riak@xxxx
然后在被加入的 Node 中操作
riak-admin cluster join ip-basic-node
riak-admin plang
riak-admin commit
设置完后,可通过往任意一个 Node 写数据,在其它 Node 中 get 数据
riak 部分写得有点少,以后有空再补充
