借助于 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 部分写得有点少,以后有空再补充