attachNode()

语法

rg.attachNode( <host>, <service>, <options> )

将一个已经创建完成但不属于任何分区组的节点加入到当前分区组。可以搭配 rg.detachNode() 使用。目前可以支持加入到数据组或者编目组。

参数描述

参数名参数类型描述是否必填
hoststring节点的主机名或者主机 IP。
servicestring节点服务名或者端口。
optionsJson 对象详见options选项说明。

options选项

参数名参数类型描述默认值
KeepDatabool是否保留新加节点原有的数据。无默认值,需用户显式指定。

Note:

  1. 参数 options 中的 KeepData 字段为必填项,需用户显式指定。由于该选项会决定新节点数据是否继续被保留,用户应该谨慎考虑。
  2. 如果新加的节点原本不属于当前组,建议用户将 KeepData 设置为 false。否则,一旦发生主备切换及全量同步,当前组原有节点的数据将有可能被新加节点的数据覆盖。
  3. 节点配置文件中角色(role)指定为编目(catalog)的节点只能加入编目组中;角色指定为数据(data)的节点只能加入到数据组中。

返回值

无返回值,出错抛异常,并输出错误信息。可以通过 getLastErrMsg 获取错误信息,或通过 getLastError 获取错误码。 关于错误处理可以参考 常见错误处理指南

错误

错误信息记录在节点诊断日志(diaglog)中,可参考错误码

错误码可能的原因解决方法
-15网络错误1. 检查 sdbcm 状态是否正常,如果状态异常,可以尝试重启;
2. 检查填写的 host 是否正确。
-146节点不存在检查节点是否存在。
-157节点已存在于其他复制组检查节点是否已加入到当前或其他复制组,如果已属于任何复制组将不支持该操作。注意:编目节点不能加入到数据组中,数据节点也不能加入到编目组中。

示例

将一个节点从 group1 中分离,加入到 group2 中,方法如下:

attachNode 前的节点信息:

  1. > db.listReplicaGroups()
  2. {
  3. "Group": [
  4. {
  5. "HostName": "hostname1",
  6. "Status": 1,
  7. "dbpath": "/opt/sequoiadb/database/data/11830/",
  8. "Service": [
  9. {
  10. "Type": 0,
  11. "Name": "11830"
  12. },
  13. {
  14. "Type": 1,
  15. "Name": "11831"
  16. },
  17. {
  18. "Type": 2,
  19. "Name": "11832"
  20. }
  21. ],
  22. "NodeID": 1007
  23. }
  24. ......
  25. ],
  26. "GroupID": 1002,
  27. "GroupName": "group1",
  28. "PrimaryNode": 1002,
  29. "Role": 0,
  30. "Status": 1,
  31. "Version": 7,
  32. "_id": {
  33. "$oid": "580adfd531ae32109e38ca29"
  34. }
  35. }
  36. ......
  37. {
  38. "Group": [
  39. {
  40. "HostName": "hostname2",
  41. "Status": 1,
  42. "dbpath": "/opt/sequoiadb/database/data/11840/",
  43. "Service": [
  44. {
  45. "Type": 0,
  46. "Name": "11840"
  47. },
  48. {
  49. "Type": 1,
  50. "Name": "11841"
  51. },
  52. {
  53. "Type": 2,
  54. "Name": "11842"
  55. }
  56. ],
  57. "NodeID": 1000
  58. }
  59. ......
  60. ],
  61. "GroupID": 1000,
  62. "GroupName": "group2",
  63. "PrimaryNode": 1000,
  64. "Role": 0,
  65. "Status": 1,
  66. "Version": 7,
  67. "_id": {
  68. "$oid": "580adfd531ae32109e38ca27"
  69. }
  70. }

将“hostname1:11830” 节点从 group1 分区组中分离:

  1. > db.getRG('group1').detachNode('hostname1', '11830', { KeepData: true } )

将“hostname1:11830” 节点加入到 group2 分区组中,由于节点原本不属于 group2, 此处将其原本的数据清空:

  1. > db.getRG('group2').attachNode('hostname1', '11830', { KeepData: false } )

查看 attachNode 后的节点信息,group1 分区组中已不存在“hostname1:11830” 节点,group2 分区组存在“hostname1:11830” 节点:

  1. > db.listReplicaGroups()
  2. {
  3. "HostName": "hostname3",
  4. "Status": 1,
  5. "dbpath": "/opt/sequoiadb/database/data/11830/",
  6. "Service": [
  7. {
  8. "Type": 0,
  9. "Name": "11830"
  10. },
  11. {
  12. "Type": 1,
  13. "Name": "11831"
  14. },
  15. {
  16. "Type": 2,
  17. "Name": "11832"
  18. }
  19. ],
  20. "NodeID": 1002
  21. }
  22. ],
  23. "GroupID": 1002,
  24. "GroupName": "group1",
  25. "PrimaryNode": 1002,
  26. "Role": 0,
  27. "Status": 1,
  28. "Version": 7,
  29. "_id": {
  30. "$oid": "580adfd531ae32109e38ca29"
  31. }
  32. }
  33. ......
  34. {
  35. "Group": [
  36. {
  37. "HostName": "hostname1",
  38. "Status": 1,
  39. "dbpath": "/opt/sequoiadb/database/data/11830/",
  40. "Service": [
  41. {
  42. "Type": 0,
  43. "Name": "11830"
  44. },
  45. {
  46. "Type": 1,
  47. "Name": "11831"
  48. },
  49. {
  50. "Type": 2,
  51. "Name": "11832"
  52. }
  53. ],
  54. "NodeID": 1010
  55. },
  56. {
  57. "HostName": "hostname2",
  58. "Status": 1,
  59. "dbpath": "/opt/sequoiadb/database/data/11840/",
  60. "Service": [
  61. {
  62. "Type": 0,
  63. "Name": "11840"
  64. },
  65. {
  66. "Type": 1,
  67. "Name": "11841"
  68. },
  69. {
  70. "Type": 2,
  71. "Name": "11842"
  72. }
  73. ],
  74. "NodeID": 1000
  75. },
  76. ......
  77. ],
  78. "GroupID": 1000,
  79. "GroupName": "group2",
  80. "PrimaryNode": 1000,
  81. "Role": 0,
  82. "Status": 1,
  83. "Version": 7,
  84. "_id": {
  85. "$oid": "580adfd531ae32109e38ca27"
  86. }
  87. }