不愿透露昵称
假设机器是sdbserver1,sdbserver2
复制组为datagroup,数据节点端口号为11830
配置协调节点选择数据节点的优先级需要做到以下几点:
1 已经给datagroup中的每个节点都成功配置了instanceid
可以通过如下命令查看
sdblist -p 11830 --expand --detail|grep -i instanceid
如果显示 instanceid : 0说明你还没配置好。
需要使用如下命令配置一下:
sdbserver1上执行:
var db = new Sdb("localhost",11830)
db.updateConf({instanceid:2});
然后重启对应节点。
sdbserver2上执行:
var db = new Sdb("localhost",11830)
db.updateConf({instanceid:1});
然后重启对应节点。
2 配置协调节点的参数,你的配置参数语句写错了,应该如下:
db.updateConf({preferedinstance:"2,1",preferedinstancemode:"ordered"},{"NodeName":"sdbserver1:11810"});
配置完成后新连接生效,需要db=Sdb()新建一个会话。
db.getSessionAttr()看一下会话的参数是不是上一步设置的值,如果不是,就是你设置的有问题。
3 最后一步,测试
为了证明会按照你设定的顺序读,你先把主节点选举到sdbserver2上,然后测试会不会到sdbserver1上去读。
随便找一个集合(该集合最好只在你操作的复制组上),对该集合进行查询,查看执行计划。如:
db.test.test.find().explain({run:true})
{
"NodeName": "sdbserver1:11830",
"GroupName": "datagroup",
"Role": "data",
"Name": "test.test",
"ScanType": "tbscan",
"IndexName": "",
"UseExtSort": false,
"Query": {
"$and": []
},
"IXBound": null,
"NeedMatch": false,
"ReturnNum": 0,
"ElapsedTime": 0.000117,
"DataRead": 0,
"IndexRead": 0,
"UserCPU": 0,
"SysCPU": 0
}
关注NodeName字段,发现是在2上读的(sdbserver1:11830),2不是主节点,测试成功。