GBase 8a南大通用数据库节点替换

原文链接:www.gbase.cn/community/p...

更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

节点替换的理论

1.节点故障

2.集群硬件升级

替换的节点类型:

kotlin 复制代码
 1.coordinator节点
      原理:替换安装程序会修改corosync的配置文件,使得新节点能够在集群内代替旧节点
      清除ddl恢复日志
 2.data节点
      原理:替换安装程序会创建用户数据库,设置所有的用户数据全同步标志;
      清除ddl恢复日志,dml恢复日志和dml全同步日志(以前节点的同步信息没作用)
 3.复合节点(coordinator+data)

注:节点替换会执行清除同步日志信息,同步元数据信息等操作,随后数据同步由自动恢复服务完成

准备替换节点设备硬件-->重新安装集群软件-->进行数据同步操作

注:节点替换的过程中,集群不支持写操作,只能执行select等读操作0

节点替换过程中集群模式的变化:

css 复制代码
 NORMAL -> READONLY -> NORMAL
 同步元数据前:集群模式为 NORMAL,集群可以正常操作
 同步元数据期间:集群模式为 READONLY,只允许进行查询操作,不允许任何 dml、 ddl 以及加载操作,此 时进行数据表结构的同步操作,对用户数据表设置全同步标志
 同步完成后:集群模式为 NORMAL,集群可以正常操作
 替换完成后,集群可以正常进行操作。

节点替换过程中节点的变化:

rust 复制代码
 OFFLINE -> UNAVAILABLE(无效) -> REPLACE -> ONLINE
 替换开始前:节点损坏,节点的状态为 OFFLINE,用户必须设置节点状态为 UNAVAILABLE;
 替换开始后:节点状态转换为 REPLACE
 替换成功后:节点状态转换为 ONLINE
 替换执行失败:节点状态回滚为 UNAVAILABLE
注:数据不会丢失

节点替换的步骤

1.检查网络状态

保证集群内网络畅通,带宽充裕

2.设置要替换的节点的状态为unavailable;

在操作系统的gbase用户下(demo.options文件中dbauser参数指定的用户)下运行 gcadmin setnodestate 命令设置要替换的节点状态为unavailable(改成unavailable之后,只能做替换操作,不能改成其他模式)

如:gcadmin setnodestate 192.168.18.11 unavailable

3.准备用于节点替换的机器

1).新机器安装和原节点机器的操作系统相同, ip地址设置相同

将原节点关闭,然后将替换节点的ip地址改为被替换节点ip,删除原ssh信任关系

2).符合集群的安装要求,如:关闭防火墙,关闭selinux等

4.查看集群各项状态

objectivec 复制代码
    CLUSTER STATE:    ACTIVE
    VIRTUAL CLUSTER MODE:    NORMAL
    节点状态为unavailable    

5.replace.py对节点进行替换安装

ini 复制代码
[gbase@gbaseman gcinstall]$ python replace.py --help
Usage: replace.py [options] 3
Options:
   -h, --help            show this help message and exit
   -a                    do not prompt the user for confirmation
   --host=HOSTLIST       replaced nodes' ip splitting by comma   指定要替换的节点ip, 用','隔离
  --rootPwd root 用户的密码, 要求所有节点 root 密码一致。
  --root_pwd_file 该参数支持 root 用户在多节点不同密码方式, 与参数rootPwd 不能同时使用, 否 则报错。
   --type=NODETYPE       replaced nodes' type,value:coor,data     替换节点的类型
   --freenode=FREENODE   cluster freenodes' ip splitting by comma
   --dbaUser=DBAUSER     dba user
   --dbaUserPwd=DBAPWD   dba user password
   --generalDBUser=GENDBUSER                        cluster database user
   --generalDBPwd=GENDBPWD
                               cluster database user password
   --overwrite           new and complete overwrite   强制覆盖,参数可选
   --sync_coordi_metadata_timeout=SYNC_COORDI_METADATA_TIMEOUT    设置coor节点替换的超时时 间,默认为15
                                sync coordinators' metadata timeout,default 15mins
   --parallel_pack=PARALLEL_PACK              节点替换并行打包开关
                                whether to parallel packaging,value<0 |1>,default 0
   --retry_times=RETRY_TIMES                   节点替换时同步系统表retry次数默认为3,最小值 为1,最大值为2147483647
                                replace node retry times,default 3
   --use_shm=USE_SHM     whether to set path of package,value<0|1>,default 0
   --license_file=LICENSE_FILE    在执行节点替换时,需要提前生产lic文件,通过此参数传入
                                import license file
   --vcname=VC_NAME      vc name,only support one vc
   -p, --addr_protocol   domain map address,default False(IPv4)
   --passwordInputMode=PASSWORDINPUTMODE   指定密码的获取方式
                                get password method[file,pwdsame],
                                file:    get from command line parameters,default   文件中获取
                               pwdsame: nodes have same user passwd   终端输入
                                pwddiff: 表示从终端由用户输入密码,并且节点间的密码不一致情况下使用该 参数,对于不同用户密码每个节点分别输入一次,适用于不同节点使用不同的密码;    

复合节点替换:

1.将节点设置为unavailable

csharp 复制代码
 [gbase@gbaseman gcinstall]$  gcadmin setnodestate 192.168.18.11 unavailable;
 after set node state into unavailable,can not set the state into normal,
 must run gcadmin replacenodes to replace this node ,after that command node state return into normal.
 you realy want to set node state into unavailable(yes or no)?
 yes
 node 192.168.18.11 state already is unavailable, not need repeat set

2.清理feventlog日志

vbnet 复制代码
 [gbase@gbaseman opt]$ gcadmin rmfeventlog 192.168.18.11
 after rmfeventlog 192.168.18.11, fevent log will be removed, must run gcadmin replacenodes to replace this node.
 you realy want to remove node 192.168.18.11 fevent log(yes or no)?
 yes
 delete ddl event log on node 192.168.18.11 start
 delete ddl event log on node 192.168.18.11 end
 delete dml event log on node 192.168.18.11 start
 delete dml event log on node 192.168.18.11 end
 delete dml storage event log on node 192.168.18.11 start
 delete dml storage event log on node 192.168.18.11 end

3.进行coor节点替换命令

css 复制代码
 [gbase@gbasedata1 gcinstall]$ ./replace.py --host 192.168.18.11 --type=coor --
dbaUser=gbase --dbaUserPwd=gbase@123 --generalDBUser=gbase --generalDBPwd=gbase@123

4.检查节点状态

ruby 复制代码
 [gbase@gbaseman opt]$ gcadmin showcluster

5.清理feventlog日志

vbnet 复制代码
 [gbase@gbaseman opt]$ gcadmin rmfeventlog 192.168.18.11
 after rmfeventlog 192.168.18.11, fevent log will be removed, must run gcadmin replacenodes to replace this node.
 you realy want to remove node 192.168.18.11 fevent log(yes or no)?
 yes
 delete ddl event log on node 192.168.18.11 start
 delete ddl event log on node 192.168.18.11 end
 delete dml event log on node 192.168.18.11 start
 delete dml event log on node 192.168.18.11 end
 delete dml storage event log on node 192.168.18.11 start
 delete dml storage event log on node 192.168.18.11 end

6.创建中间的distributeion

建立新的 distribution,该分布信息用于剔除被替换节点,其他节点分片分布保持不变。

markdown 复制代码
 查看分片信息
 [gbase@gbaseman opt]$ gcadmin showdistribution node
                                                    Distribution ID: 1 | State: new | Total segment num: 6

 ========================================================================================
============================================
|  nodes   |              192.168.18.13              |              192.168.18.11
           192.168.18.14             |
----------------------------------------------------------------------------------------
------------------------------------------
| primary  |                     1                    |                     2 |                  3                    |
| segments |                  4                       |                     5 |                  6                    |
 ----------------------------------------------------------------------------------------
------------------------------------------
 |duplicate |                  3                       |                    1 |                  2                    |
 |segments 1 |                  6                       |                    4 |                  5                    |
 ========================================================================================
============================================

使用 gcadmin getdistribution 命令将待替换节点所在的 vc 的 distribution 信息保存在指定的文件中

css 复制代码
 [gbase@gbaseman gcinstall]$ gcadmin getdistribution 1 distribution_info_1.xml
 gcadmin getdistribution 1 distribution_info_1.xml ...
 get segments information
 write segments information to file [distribution_info_1.xml]
 gcadmin getdistribution information successful

修改新的 distribution 的分布规则信息。

修改原则为让被替换节点没有任何分片,其他节点分片的分布规则不变,

若被替换节点存储的分片是作为主分片,则将该分片的备份分片节点修改为主分片节点,即节点 IP 在 primarynode 标签中,则将该 segment 内的 duplicatenodes标签内的 IP 替换被替换节点 IP,并删除 duplicatenodes 标签。

若被替换节点存储的分片是作为备份分片,即被替换的节点 IP 在 duplicatenodes标签中,则将 该 duplicatenodes 标签删除。

xml 复制代码
[gbase@gbaseman gcinstall]$ cat distribution_info_1.xml
<?xml version='1.0' encoding="utf-8"?>
<distributions>
<distribution>
<segments>
<segment>
<primarynode ip="192.168.18.13"/>
                     <duplicatenodes>
                           <duplicatenode ip="192.168.18.11"/>     //删除
                      </duplicatenodes>
                 </segment> 13
                 <segment>
                     <primarynode ip="192.168.18.11"/>               //将备份节点分片修改为主分 片,即把192.168.18.11改为14
                     <duplicatenodes>
                           <duplicatenode ip="192.168.18.14"/>         //删除
                      </duplicatenodes>
                </segment> 21
                <segment>
                     <primarynode ip="192.168.18.14"/> 24
                     <duplicatenodes>
                           <duplicatenode ip="192.168.18.13"/>
                     </duplicatenodes>
                </segment> 29
                <segment>
                     <primarynode ip="192.168.18.13"/> 32
                     <duplicatenodes>
                           <duplicatenode ip="192.168.18.11"/>            //删除
                     </duplicatenodes>
                </segment> 37
                <segment>
                     <primarynode ip="192.168.18.11"/>                 //将备份节点分片修改为主 分片,即把192.168.18.11改为14
                     <duplicatenodes>
                           <duplicatenode ip="192.168.18.14"/>          //删除
                     </duplicatenodes>
                </segment>
                    <segment>
                      <primarynode ip="192.168.18.14"/> 48
                      <duplicatenodes>
                            <duplicatenode ip="192.168.18.13"/>
                      </duplicatenodes>
                 </segment>
            </segments>
       </distribution>
  </distributions> 
                                                                                                                 

修改创建 distribution 所需的 gcChangeInfo_vc2.xml 文件

xml 复制代码
 [gbase@gbaseman gcinstall]$ cat gcChangeInfo.xml
 <?xml version="1.0" encoding="utf-8"?>
 <servers>
           <cfgFile file="distribution_info_1.xml"/>
 </servers>

执行创建新的 distribution

ruby 复制代码
 [gbase@gbaseman gcinstall]$ gcadmin distribution gcChangeInfo.xml
 gcadmin generate distribution ...
 gcadmin generate distribution successful

查看分片信息

ruby 复制代码
 [gbase@gbaseman gcinstall]$ gcadmin showdistribution   node

执行 initnodedatamap 命令初始化 hashmap,然后将数据通过 rebalance instance 命令重分布到 最新的 distribution( Distribution ID: 1)上。

说明:按 distribution 分布规则,此次 rebalance 操作不会实际进行数据搬移,所以会很快完成;

本次 rebalance 操作后不要删掉旧版 nodedatamap 和 distribution。

sql 复制代码
 初始化hashmap
 gbase> initnodedatamap;
 Query OK, 0 rows affected, 6 warnings (Elapsed: 00:00:00.35)
 数据重分布
 gbase> rebalance instance;
 Query OK, 19 rows affected (Elapsed: 00:00:00.73)
 
 查看rebalance状态
 gbase> select index_name,status,percentage,priority,host,distribution_id from gclusterdb.rebalancing_status;

 +---------------+-----------+------------+----------+---------------+-----------------+
  | index_name    | status     | percentage | priority | host           | distribution_id |
  +---------------+-----------+------------+----------+---------------+-----------------+
  | test.t4        | COMPLETED |         100 |         5 | 192.168.18.11 |                2 |
  | test.liguixin | COMPLETED |         100 |        5 | 192.168.18.11 |                2 |
  | test.t10       | COMPLETED |         100 |        5 | 192.168.18.11 |               2 |
  | test.t5        | COMPLETED |         100 |         5 | 192.168.18.11 |                2 |
  | test.t12       | COMPLETED |         100 |        5 | 192.168.18.11 |               2 |
  | test.t16       | COMPLETED |         100 |        5 | 192.168.18.11 |               2 |
  | test.t6        | COMPLETED |         100 |         5 | 192.168.18.11 |                2 |
  | test.t7        | COMPLETED |         100 |         5 | 192.168.18.11 |                2 |
  | test.t15       | COMPLETED |         100 |        5 | 192.168.18.11 |                2 |
  | test.t_user1  | COMPLETED |         100 |        5 | 192.168.18.11 |                2 |
  | test.t11       | COMPLETED |         100 |        5 | 192.168.18.11 |                2 |
  | test.t_user   | COMPLETED |         100 |        5 | 192.168.18.11 |                2 |
  | test.t20       | COMPLETED |         100 |        5 | 192.168.18.11 |                2 |
  | test.t17       | COMPLETED |         100 |        5 | 192.168.18.11 |                2 |
  | test.t1        | COMPLETED |         100 |         5 | 192.168.18.11 |                2 |
  | test.t2        | COMPLETED |         100 |         5 | 192.168.18.11 |                2 |
  | test.t3        | COMPLETED |         100 |         5 | 192.168.18.11 |                2 |
  | test.t14       | COMPLETED |         100 |        5 | 192.168.18.11 |                2 |
  | test.t9        | COMPLETED |         100 |         5 | 192.168.18.11 |                2 |
  +---------------+-----------+------------+----------+---------------+-----------------+

执行data节点替换命令

css 复制代码
 [gbase@gbasedata1 gcinstall]$ ./replace.py --host 192.168.18.11 --type=data --
dbaUser=gbase --dbaUserPwd=gbase@123 --generalDBUser=gbase --generalDBPwd=gbase@123

查看节点状态

数据重分布

本次数据重分布将进行实际数据的重分布;重分布的所需时间需要根据数据量,系统 CPU,磁盘,网络 等综合情况进行评估

删除旧的分片id

csharp 复制代码
 [gbase@gbasedata1 gcinstall]$ gcadmin rmdistribution 2
 cluster distribution ID [2]
 it will be removed now
 please ensure this is ok, input [Y,y] or [N,n]: y
 select count(*) from gbase.nodedatamap where data_distribution_id=2 result is not 0
 refreshnodedatamap drop 2 success
 gcadmin remove distribution [2] success

节点替换过程需要注意以下问题:

1.如果替换coordiantor集群节点,要求总数不可以超过coordiantor集群总数的一半,也就是保证集 群不能是lock状态,因为超过一半集群就进入锁定状态

2.如果是data节点,不可以同时替换主备分片的节点,保证分片必须有可用的备份源数据,如果同时 替换,数据无法拷贝,会导致数据丢失。

3.损坏的节点上有 nocopies 表,数据无法恢复,必须用户手工进行恢复。 nocopies 表数据没有副 本,无法拷贝。

4.损坏的节点上存在不通过集群命令创建的数据,这些数据无法恢复,必须用户手工进行恢复。比 如:集群数据节点当单机使用,在不是集群状态,对数据进行写入。

5.在节点替换过程中,如果出现 replace.py 命令被强杀或者执行replace.py 命令的机器掉电等现象, 可能会导致集群状态处于READONLY状态无法自行恢复正常。此时可以使用gcadmin switchmode normal 恢复集群状态然后继续使用集群。或者再一次执行

6.节点状态转换为 UNAVAILABLE 后,只有在节点替换成功的时候,节点状态才能转换为 ONLINE。

用户不能对 corosync 中的节点状态持久化文件进行手工操作,如果手工修改持久化文件中的节点状态 (UNAVAILABLE - > ONLINE),会导致数据丢失。

7.设置节点为 UNAVAILABLE 时,若集群中有大量 ddl event, dml event或 dmlstorage event

时,程序需要检查所有的 event,判断被设置状态的节点的备份节点是否正常,有大量 event 时,该 过程可能需要较长时间。

8.开始节点替换时,若被替换节点有大量 ddl event, dml event 或dmlstorage event 时,节点替换 程序要将被替换节点的所有 event 删除,该过程可能会需要较长时间。

常见问题:

host key verification failed

解决方法:

1.编辑文件/home/gbase/.ssh/known_hosts文件(最简单直接删除,重新建立互信)

2.删除替换节点对应的ssh-rsa秘钥

3.通过ssh连接新节点,重新建立连接互信。

原文链接:www.gbase.cn/community/p...

更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

相关推荐
数据智能老司机6 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机6 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿6 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
无名之逆7 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601017 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机7 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
hzulwy7 小时前
Redis常用的数据结构及其使用场景
数据库·redis
程序猿熊跃晖7 小时前
解决 MyBatis-Plus 中 `update.setProcInsId(null)` 不生效的问题
数据库·tomcat·mybatis
Three~stone9 小时前
MySQL学习集--DDL
数据库·sql·学习
Qi妙代码9 小时前
MYSQL基础
数据库·mysql·oracle