attachNode()
语法
rg.attachNode( <host>, <service>, <options> )
将一个已经创建完成但不属于任何分区组的节点加入到当前分区组。可以搭配 rg.detachNode() 使用。目前可以支持加入到数据组或者编目组。
参数描述
参数名 | 参数类型 | 描述 | 是否必填 |
---|---|---|---|
host | string | 节点的主机名或者主机 IP。 | 是 |
service | string | 节点服务名或者端口。 | 是 |
options | Json 对象 | 详见options选项说明。 | 是 |
options选项
参数名 | 参数类型 | 描述 | 默认值 |
---|---|---|---|
KeepData | bool | 是否保留新加节点原有的数据。 | 无默认值,需用户显式指定。 |
Note:
- 参数 options 中的 KeepData 字段为必填项,需用户显式指定。由于该选项会决定新节点数据是否继续被保留,用户应该谨慎考虑。
- 如果新加的节点原本不属于当前组,建议用户将 KeepData 设置为 false。否则,一旦发生主备切换及全量同步,当前组原有节点的数据将有可能被新加节点的数据覆盖。
- 节点配置文件中角色(role)指定为编目(catalog)的节点只能加入编目组中;角色指定为数据(data)的节点只能加入到数据组中。
返回值
无返回值,出错抛异常,并输出错误信息。可以通过 getLastErrMsg 获取错误信息,或通过 getLastError 获取错误码。关于错误处理可以参考 常见错误处理指南 。
错误
错误信息记录在节点诊断日志(diaglog)中,可参考错误码。
错误码 | 可能的原因 | 解决方法 |
---|---|---|
-15 | 网络错误 | 1. 检查 sdbcm 状态是否正常,如果状态异常,可以尝试重启; 2. 检查填写的 host 是否正确。 |
-146 | 节点不存在 | 检查节点是否存在。 |
-157 | 节点已存在于其他复制组 | 检查节点是否已加入到当前或其他复制组,如果已属于任何复制组将不支持该操作。注意:编目节点不能加入到数据组中,数据节点也不能加入到编目组中。 |
示例
将一个节点从 group1 中分离,加入到 group2 中,方法如下:
attachNode 前的节点信息:
- > db.listReplicaGroups()
- {
- "Group": [
- {
- "HostName": "hostname1",
- "Status": 1,
- "dbpath": "/opt/sequoiadb/database/data/11830/",
- "Service": [
- {
- "Type": 0,
- "Name": "11830"
- },
- {
- "Type": 1,
- "Name": "11831"
- },
- {
- "Type": 2,
- "Name": "11832"
- }
- ],
- "NodeID": 1007
- }
- ......
- ],
- "GroupID": 1002,
- "GroupName": "group1",
- "PrimaryNode": 1002,
- "Role": 0,
- "Status": 1,
- "Version": 7,
- "_id": {
- "$oid": "580adfd531ae32109e38ca29"
- }
- }
- ......
- {
- "Group": [
- {
- "HostName": "hostname2",
- "Status": 1,
- "dbpath": "/opt/sequoiadb/database/data/11840/",
- "Service": [
- {
- "Type": 0,
- "Name": "11840"
- },
- {
- "Type": 1,
- "Name": "11841"
- },
- {
- "Type": 2,
- "Name": "11842"
- }
- ],
- "NodeID": 1000
- }
- ......
- ],
- "GroupID": 1000,
- "GroupName": "group2",
- "PrimaryNode": 1000,
- "Role": 0,
- "Status": 1,
- "Version": 7,
- "_id": {
- "$oid": "580adfd531ae32109e38ca27"
- }
- }
将“hostname1:11830” 节点从 group1 分区组中分离:
- > db.getRG('group1').detachNode('hostname1', '11830', { KeepData: true } )
将“hostname1:11830” 节点加入到 group2 分区组中,由于节点原本不属于 group2, 此处将其原本的数据清空:
- > db.getRG('group2').attachNode('hostname1', '11830', { KeepData: false } )
查看 attachNode 后的节点信息,group1 分区组中已不存在“hostname1:11830” 节点,group2 分区组存在“hostname1:11830” 节点:
- > db.listReplicaGroups()
- {
- "HostName": "hostname3",
- "Status": 1,
- "dbpath": "/opt/sequoiadb/database/data/11830/",
- "Service": [
- {
- "Type": 0,
- "Name": "11830"
- },
- {
- "Type": 1,
- "Name": "11831"
- },
- {
- "Type": 2,
- "Name": "11832"
- }
- ],
- "NodeID": 1002
- }
- ],
- "GroupID": 1002,
- "GroupName": "group1",
- "PrimaryNode": 1002,
- "Role": 0,
- "Status": 1,
- "Version": 7,
- "_id": {
- "$oid": "580adfd531ae32109e38ca29"
- }
- }
- ......
- {
- "Group": [
- {
- "HostName": "hostname1",
- "Status": 1,
- "dbpath": "/opt/sequoiadb/database/data/11830/",
- "Service": [
- {
- "Type": 0,
- "Name": "11830"
- },
- {
- "Type": 1,
- "Name": "11831"
- },
- {
- "Type": 2,
- "Name": "11832"
- }
- ],
- "NodeID": 1010
- },
- {
- "HostName": "hostname2",
- "Status": 1,
- "dbpath": "/opt/sequoiadb/database/data/11840/",
- "Service": [
- {
- "Type": 0,
- "Name": "11840"
- },
- {
- "Type": 1,
- "Name": "11841"
- },
- {
- "Type": 2,
- "Name": "11842"
- }
- ],
- "NodeID": 1000
- },
- ......
- ],
- "GroupID": 1000,
- "GroupName": "group2",
- "PrimaryNode": 1000,
- "Role": 0,
- "Status": 1,
- "Version": 7,
- "_id": {
- "$oid": "580adfd531ae32109e38ca27"
- }
- }