ArangoDB 主从配置

1.前提条件

  1. 安装前确保集群已经完成 基础环境配置
  2. 本次安装的ArangoDB软件版本为:3.9.2

2.环境和参数准备

  1. 主从配置中共有3个节点,一个Leader,两个Follower
  2. ArangoDB的数据目录定为:/data/arango

3.安装及配置

3.1.安装ArangoDB

在3个节点上分别安装ArangoDB,执行安装命令:

# Ubuntu系统安装命令
dpkg -i arangodb3_3.9.2-1_amd64.deb
# CentOS系统安装命令
rpm -ivh arangodb3-3.9.2-1.0.x86_64.rpm

Ubuntu系统使用deb包安装过程中会出现如,设置密码、是否自动更新数据库文件、更新前是否自动备份的对话框,根据需要设置即可。 CentOS系统使用rpm包安装过程会为arangodb的root用户设置一个默认的密码,可以用 arango-secure-installation 命令重新设置一下。

sudo arango-secure-installation

注意:安装过程中设置的密码仅适用于单机启动情况下root用户的登陆密码,部署集群、主动故障转移等需要另外设置密码

ArangoDB安装完成后会自动启动,输入以下命令查看ArangoDB的状态

systemctl status arangodb3

若状态表示已经启动,则先关闭单机的ArangoDB服务

systemctl stop arangodb3

安装完成后修改/etc/arangodb3/arangod.conf中endpoint配置项为

endpoint = tcp://0.0.0.0:8529

3.2.配置故障转移

生成用于主动故障转移机器间的jwt认证的密钥文件,在一个节点上生成然后同步至另外两个节点

# 在/etc目录下创建arangodb目录 
mkdir /etc/arangodb 
# 在arangodb目录下生成秘钥文件 
arangodb create jwt-secret --secret=arangodb.secret
# 给密钥文件设置只读权限 
chmod 400 arangodb.secret          

注意:这个密钥文件要同步到所有节点,保持一致,一定不要多次生成

3.3.启动服务

1.以主动故障转移的方式在所有节点上启动ArangoDB服务

使用Starter –starter.mode=activefailover选项 ,启动 Active Failover 设置。在3个节点上分别执行启动命令,默认前台启动。

arangodb --starter.mode=activefailover --starter.data-dir=/data/arangodb --auth.jwt-secret=/etc/arangodb/arangodb.secret  --starter.join bigdata10,bigdata11,bigdata12

为避免不必要的故障转移,请注意可以增加 –agents.agency.supervision-grace-period选项,将启动选项的值增加到 30 秒以上可能是有意义的。

若想要后台启动则需要在启动时加一个 start

arangodb start --starter.mode=activefailover --starter.data-dir=/data/arangodb --auth.jwt-secret=/etc/arangodb/arangodb.secret  --starter.join bigdata10,bigdata11,bigdata12

2.查看 leader 和可用节点

以主动故障转移的方式启动 ArangoDB 后,可以通过询问任何涉及的单服务器实例来确定 leader。执行以下命令,第一次启动默认无密码,该命令将返回所有可用的端点,第一个端点被定义为当前的Leader

curl --user "root:" -X GET http://192.168.11.13:8529/_api/cluster/endpoints && echo

image-20220624133337384

4.主动故障转移模式说明

构成:

  • 一个Leader 可读取/写入。
  • 两个 Follower,异步复制来自 Leader 的数据,默认不可读取/写入,只有在请求标有标头X-Arango-Allow-Dirty-Read: true时才允许读取请求,Follower将始终拒绝来自客户端应用程序的写入请求,直到Follower成为新的master(发生故障转移)。
  • 3个 Agency(即代理) 用来确定哪个服务器在故障情况下成为 Leader 。

说明:

  • Leader 挂掉后,10s-30s会从两个 Follower 选出一个成为新的 Leader 。
  • Leader 挂掉后,若已经选出新的 Leader,原 Leader 重新启动后将会变成 Follower 。
  • 若挂掉两个 Follower,则 leader 还可继续写入/读取。
  • 若连续挂掉两个 leader 则剩余的一个 Follower 不会升级成 Leader,不可写也不可读,直到重新启动一个挂掉的节点,才会在这两个里面选出一个leader 正常使用。
  • 若挂掉的节点存储的数据丢失,Agency数据未丢失,重启后可以正常加入成为 Follower ;若挂掉的节点Agency数据丢失,单独重启此节点,则此节点会起不来或能起来但不可用。此时若依然想使用此节点,需要先删除三个节点上数据目录/data/arangodb下的setup.json文件,然后重启3个节点3个节点才都可以正常使用
  • 故障转移期间无法保证可能丢失了多少数据库操作。

5.客户端连接样例代码

1.Java客户端

主动故障转移部署的情况下,应按以下方式配置驱动程序:

  • 负载平衡策略必须设置为LoadBalancingStrategy.NONE 或根本不设置,因为这是默认设置
  • acquireHostList应该设置为trueacquireHostList配置来获取集群中所有已知主机的列表,然后它可以在需要回退时使用此列表。这样做只需要手动配置一台当前可以连接上的主机即可。
ArangoDB arangoDB = new ArangoDB.Builder()
  .host("host", 8529)
  .user("admin")
  .password("admin")
  .loadBalancingStrategy(LoadBalancingStrategy.NONE)
  .acquireHostList(true)
  .build();

2.Go客户端

conn, err := http.NewConnection(http.ConnectionConfig{
		Endpoints: []string{"http://192.168.11.13:8529","http://192.168.11.14:8529","http://192.168.11.15:8529"},
		TLSConfig: &tls.Config{ /*...*/ },
	})
	if err != nil {
		fmt.Println("err :",err.Error())
	}
	client, err := driver.NewClient(driver.ClientConfig{
		Connection: conn,
		Authentication: driver.BasicAuthentication("admin", "admin"),
	})
	if err != nil {
		fmt.Println("err :",err.Error())
	}

Reference:

  1. https://www.arangodb.com/docs/3.9/architecture-deployment-modes-active-failover.html
  2. https://www.arangodb.com/docs/stable/drivers/