ArangoDB 数据库集群管理

2022-04-08 00:00:00 集群 节点 启动 脚本 关闭

集群信息

  使用三个虚拟机,每个机器上运营一个 Agent,一个 DB,一个Coordinator,组成集群

  • 虚拟机:gdb21, gdb22, gdb23
  • Agent:1-3
  • DB 服务器:1-3
  • Coordinator:1-3

这些集群通过集群管理工具 ArangoDB Starter 进行配置和启动管理

设置

安装数据库文件系统

  • 使用独立的目录 /opt/gdb
  • 文件系统为 XFS

安装ArangoDB

  • 从 ArangoDB 官网 下载所需的 RPM 包
  • yum install arangodbx-x.x.x-x.x86_64.rpm

停止并禁用默认的自动启动

 我们使用 ArangoDB DB Starter 管理集群,需要关闭并禁用默认的启动配置

systemctl stop arangodb3
systemctl disable arangodb3
复制代码

安装 ArangoDB Starter

  • github 源码
  • github 下载
  • 下载源代码或安装包

操作系统设置

#修改 /etc/security/limit.conf, 添加
* soft nofile 16384
* hard nofile 16384
#修改 /etc/rc.local 添加
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
ulimit -n 8192
#修改 DB 用户 arangodb 的默认 Home 目录
usermod arangodb -d /opt/gdb
复制代码

实例安排

 目前配置了一个三个节点的集群,每个节点上运行一个数据库服务器,一个代理,一个协管服务器

服务器类型和端口
  • 协管服务器(Coordinator): 8529 - 日常服务 和 Web 管理
  • 数据库服务器(Database):8530 - 数据库
  • 代理端口(Agent):8531 - 集群管理
主机

gdb21, gdb22, gdb23

每个实例的数据库目录

 在每个主机上,ArangoDB Starter 会根据配置,在 /opt/gdb 目录下,为各类型的服务创建目录:

* /opt/gdb/agent8531
* /opt/gdb/dbserver8530
* /opt/gdb/coordinator8529  
* 每个实例目录下,会有如下文件
* arangod_command.txt - 启动该服务使用的命令行
* arangod.conf - 服务的配置文件
* arangod.log - 服务的日志(没有日志循环)
* data - 数据库服务器存放数据文件
* apps - 协管服务器存放应用
复制代码

实例的初始设置

* 默认系统用户 root,密码:没有设置
* 管理界面 http://gdb21:8529/,http://gdb22:8529/,http://gdb23:8529/
* ArangoDB Start 管理API http://gdb21:8528/,http://gdb22:8528/,http://gdb23:8528/
* 不使用 ipv6
* 使用安全 Token,通过 jwt.token 文件设置
* Agent 集群节点数:3
* 协管集群节点数:3
* 数据库服务器节点数:3
* 每个类型的服务都有独立的目录和日志
* DB Starter 有自己的日志
复制代码

初始化设置流程

 初始化设置需要使用 ArangoDB 启动脚本

1. 初始化必须以 ArangoDB 用户 arangodb 进行
2. 根据实际主机安排,配置脚本里的变量

GDB_HOME=/opt/gdb
ARANGO=$GDB_HOME/arangodb-linux-amd64
DB_USER=arangodb
LOG=$GDB_HOME/starter.log
TOKEN=$GDB_HOME/jwt.token
SERVERS="gdb21.orangeface.com,gdb22.orangeface.com,gdb23.orangeface.com"
MY_ADDR=`hostname`
3. 准备 Token 文件,Token 用于集群服务之间的加密通讯
4. 复制启动脚本和 ArangoDB Starter 到每台机器的 /opt/gdb 目录
5. 按照顺序 (gdb21, gdb22, gdb23),切换到 /opt/gdb 执行初始化命令

cd /opt/gdb
./arango initStart
6. 初始化需要运行一段时间,且 ArangoDB Starter 不会退出。
7. 在每台机器上 按 Ctrl+Z,然后 bg 让 ArangoDB Starter 进入后台运行
8. 查看每台机器上的 starter.log,确保每台机器上 Agent,DbServer,Coordinator 都运行起来

agent up and running (version 3.2.6).
dbserver up and running (version 3.2.6).
coordinator up and running (version 3.2.6).
Your cluster can now be accessed with a browser at `http://gdb21.orangeface.com:8529` or
using `arangosh --server.endpoint tcp://gdb21.orangeface.com:8529`.

9. 初始化完成后,每个节点会有一个setup.json 文件被建立。该文件必须保留,以后的启动,关闭操作依赖改文件。

{
"id": "7554e2b1",
"jwt-secret": "J78dhndalDqec2516",
"mode": "cluster",
"peers": {
"AgencySize": 3,
"LastModified": "2019-11-12T16:18:51.41618737+08:00",
"Peers": [
{
"Address": "gdb21.orangeface.com",
"DataDir": "/opt/gdb",
"HasAgent": true,
"ID": "7554e2b1",
"IsSecure": false,
"Port": 8528,
"PortOffset": 0
},
{
"Address": "gdb22.orangeface.com",
"DataDir": "/opt/gdb",
"HasAgent": true,
"HasResilientSingle": true,
"ID": "d77fb193",
"IsSecure": false,
"Port": 8528,
"PortOffset": 0
},
{
"Address": "gdb23.orangeface.com",
"DataDir": "/opt/gdb",
"HasAgent": true,
"HasResilientSingle": true,
"ID": "13779a67",
"IsSecure": false,
"Port": 8528,
"PortOffset": 0
}
]
},
"version": "0.2.2"
}
10. 通过主节点的管理界面访问,并确保服务启动成功: http://gdb21:8529/
11. 之后可以通过 ./arango stop|start 关闭启动
12. 修改 setup.json 的属性为只读,避免误删
复制代码

日常管理

启动整个集群

 整个集群的启动必须按上次关闭顺序的逆序进行。

关闭整个集群

 整个集群的关闭,可以按一定顺序,在每台主机上执行服务关闭命令

单个节点的启动和关闭

 在某个节点上执行启动或关闭命令。

 对于节点会自动执行相关的恢复。

启动脚本

脚本支持 root 和 arangodb 用户启动和关闭。root 用户会自动切换实际用户到 arangodb。该脚本可以被安装为系统启动脚本。
脚本命令选项
./arangodb start
./arangodb stop
./arangodb initStart (需要以 arangodb 用户进行)
./arangodb status
复制代码

ArangoDB Starter 的服务API

ARangoDB Starter 通过端口 8528 提供服务 API
curl gdb21:8528/endpoints
curl gdb21:8528/process
curl gdb21:8528/logs/agent
curl gdb21:8528/logs/dbserver
curl gdb21:8528/logs/coordinator
复制代码

完全失效节点的处理

 目前,ArangoDB Starter 不支持添加、去除节点。所以对于一个完全失败,必须重新建立的节点,没有很好的方法进行处理。

 一个可行的方法是定期对节点 /opt/gdb 做冷备份,这样可以恢复该目录,并重新启动。

ArangoDB 启动脚本

#!/bin/sh

GDB_HOME=/opt/gdb
ARANGO=$GDB_HOME/arangodb-linux-amd64
DB_USER=arangodb
LOG=$GDB_HOME/starter.log
TOKEN=$GDB_HOME/jwt.token
SERVERS="gdb21.orangeface.com,gdb22.orangeface.com,gdb23.orangeface.com"
MY_ADDR=`hostname`

export GLIBCXX_FORCE_NEW=1

usage() {
  echo "arango start|stop|initStart|status"
}

checkUser() {
  myName=`id -un`
  if [ ! "$myName" = "$DB_USER" ]; then
    echo "Please run as $DB_USER"
    exit 1
  fi
}

initStart() {
  checkUser
  cd $GDB_HOME
  $ARANGO --auth.jwt-secret $TOKEN \
    --log.verbose \
    --starter.address $MY_ADDR \
    --starter.data-dir $GDB_HOME \
    --starter.disable-ipv6 \
    --starter.mode cluster \
    --starter.join $SERVERS > $LOG 2>&1
}

cmd() {
  myName=`id -un`
  case $myName in
    root)
      su - "$DB_USER" -c "cd $GDB_HOME; $ARANGO $1"
    ;;
    $DB_USER)
      cd $GDB_HOME
      $ARANGO $1
    ;;
    *)
      echo "Please run as $DB_USER or root"
      exit 1
    ;;
  esac
}

status() {
  echo status
}

case $1 in
  initStart)
    initStart
  ;;
  start)
    cmd start
  ;;
  stop)
    cmd stop
  ;;
  status)
    status
  ;;
  *)
    usage
    exit 1
esac

相关文章