环境信息介绍
VoltDB开发者版本:11.1 软件包下载地址:https://www.voltdb.com/product/get-voltdb-developer/ 官网手册地址:https://docs.voltdb.com/AdminGuide/ Linux版本:CentOS 7.7 192.168.0.11 voltdb01 192.168.0.12 voltdb02 192.168.0.13 voltdb03
1. 配置域名解析
[root@voltdb01 ~]# vim /etc/hosts ...... 192.168.0.11 voltdb01 192.168.0.12 voltdb02 192.168.0.13 voltdb03 # 将hosts文件传送至其他节点 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip scp /etc/hosts root@$ip:/etc/ done
2. 配置各节点root用户免密登录[可选]
# 为简化操作将所有主机配置免密登录# 生成秘钥对 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa" done [root@voltdb01 ~]# cat ~/.ssh/id_rsa.pub # 输出公钥信息 [root@voltdb02 ~]# cat ~/.ssh/id_rsa.pub # 输出公钥信息 [root@voltdb03 ~]# cat ~/.ssh/id_rsa.pub # 输出公钥信息 # 将所有节点的"公钥信息"内容拷贝到authorized_keys文件中 [root@voltdb01 ~]# vim ~/.ssh/authorized_keys# 同步至其他所有节点 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip scp ~/.ssh/authorized_keys root@$ip:~/.ssh/ done
3. 关闭安全策略
# 关闭selinux,重启后永久生效 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "setenforce 0" ssh root@$ip "sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config" done # 关闭防火墙 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "systemctl stop firewalld" ssh root@$ip "systemctl disable firewalld" done
4. 安装依赖包
[root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "yum -y install ntp java-1.8.0-openjdk java-1.8.0-openjdk-devel python3" done
5. 关闭大透明页
[root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "echo "never" >/sys/kernel/mm/transparent_hugepage/enabled" ssh root@$ip "echo "never" >/sys/kernel/mm/transparent_hugepage/defrag" done # 所有节点操作 [root@voltdb01 ~]# cat >> /etc/rc.local <<EOF echo "never" > /sys/kernel/mm/*transparent_hugepage/enabled echo "never" > /sys/kernel/mm/*transparent_hugepage/defrag EOF # 检查没有报错即可 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "source /etc/rc.local" done # 查看如下即可 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "cat /sys/kernel/mm/transparent_hugepage/enabled" ssh root@$ip "cat /sys/kernel/mm/transparent_hugepage/defrag" done 192.168.0.11 always madvise [never] always madvise [never] 192.168.0.12 always madvise [never] always madvise [never] 192.168.0.13 always madvise [never] always madvise [never]
6. 启用虚拟内存映射和过度承诺
# 根据服务器内存大小而设定 # 64GB内存 # vm.max_map_count = 1048576 # 32GB内存 # vm.max_map_count = 524288 # 加入sysctl.conf配置文件 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "echo "vm.overcommit_memory=1" >> /etc/sysctl.conf" ssh root@$ip "echo "vm.max_map_count=524288" >> /etc/sysctl.conf" done # 执行生效 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "sysctl -p" done
7. 关闭 TCP 分割
[root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "ethtool -K eth0 tso off" ssh root@$ip "ethtool -K eth0 gro off" done
8. 配置时间服务
# 所有节点停止chrony时间同步服务 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do ssh root@$ip "systemctl stop chronyd.service" ssh root@$ip "systemctl disable chronyd.service" done [root@voltdb01 ~]# vim /etc/ntp.conf ............. # 把四个原带的server注释掉 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst server ntp1.aliyun.com iburst #主节点设置与阿里的时间服务器进行同步 # 其他节点与主节点同步时间 [root@voltdb02 ~]# vim /etc/ntp.conf ................ # 把四个原带的server注释掉 server 192.168.0.11 iburst [root@voltdb03 ~]# vim /etc/ntp.conf ................ # 把四个原带的server注释掉 server 192.168.0.11 iburst # 启动ntp服务,并设置开机自启 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do ssh root@$ip "systemctl restart ntpd" ssh root@$ip "systemctl enable ntpd" done # 检查验证时间同步状态,左边出现*表示同步成功(同步需要些时间) [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh root@$ip "ntpq -p" done # 如果需要将voltdb01节点设置为时间服务器则按照以下步骤修改ntp配置文件 # 设置本机为时间服务器 [root@voltdb01 ~]# vim /etc/ntp.conf driftfile /var/lib/ntp/drift ...... restrict -4 default nomodify notrap nopeer noquery restrict -6 default nomodify notrap nopeer noquery restrict 127.0.0.1 restrict ::1 ...... server ntp1.aliyun.com iburst # 定义使用上游ntp服务器(为阿里时间服务器) restrict ntp1.aliyun.com nomodify notrap noquery # 允许上层时间服务器主动修改本机时间 server 127.127.1.0 # 上层时间服务器不可用时,以本地时间作为时间服务器 fudge 127.127.1.0 stratum 10 ...... includefile /etc/ntp/crypto/pw keys /etc/ntp/keys disable monitor # 执行以下命令查看结果如上即可 [root@voltdb01 ~]# cat /etc/ntp.conf | grep -v ^# | grep -v ^$ driftfile /var/lib/ntp/drift restrict -4 default nomodify notrap nopeer noquery restrict -6 default nomodify notrap nopeer noquery restrict 127.0.0.1 restrict ::1 server ntp1.aliyun.com iburst restrict ntp1.aliyun.com nomodify notrap noquery server 127.127.1.0 fudge 127.127.1.0 stratum 10 includefile /etc/ntp/crypto/pw keys /etc/ntp/keys disable monitor # 重启ntpd服务 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do ssh root@$ip "systemctl restart ntpd" ssh root@$ip "systemctl enable ntpd" done
9. 增加资源限制
[root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do ssh root@$ip "ulimit -u 10000" ssh root@$ip "ulimit -n 40000" done
10. 分配网络端口
功能 | 默认端口编号 |
客户端口 | 21212 |
管理员端口 | 21211 |
网络接口端口 (httpd) | 8080 |
内部服务器端口 | 3021 |
复制端口 | 5555 |
动物园管理员端口 | 7181 |
- 或者,您可以重新分配 VoltDB 使用的端口号码。请参阅A.5 节"网络端口",了解端口的描述以及如何重新分配它们
11. 创建数据库程序运行用户
# 创建voltdb用户并设置用户密码,该用户作为数据库程序运行用户 [root@voltdb01 ~]# useradd voltdb [root@voltdb01 ~]# passwd voltdb Changing password for user voltdb. New password: # 设置用户密码 Retype new password: # 再次输入 passwd: all authentication tokens updated successfully. [root@voltdb02 ~]# useradd voltdb [root@voltdb02 ~]# passwd voltdb Changing password for user voltdb. New password: # 设置用户密码 Retype new password: # 再次输入 passwd: all authentication tokens updated successfully. [root@voltdb03 ~]# useradd voltdb [root@voltdb03 ~]# passwd voltdb Changing password for user voltdb. New password: # 设置用户密码 Retype new password: # 再次输入 passwd: all authentication tokens updated successfully. # 配置免密登录[root@voltdb01 ~]# su - voltdb [voltdb@voltdb01 ~]$ for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip ssh voltdb@ip "ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa" done [voltdb@voltdb01 ~]$ cat ~/.ssh/id_rsa.pub # 输出公钥信息 [voltdb@voltdb02 ~]$ cat ~/.ssh/id_rsa.pub # 输出公钥信息 [voltdb@voltdb03 ~]$ cat ~/.ssh/id_rsa.pub # 输出公钥信息 # 将所有节点的公钥信息内容拷贝到authorized_keys文件中 [voltdb@voltdb01 ~]$ vim ~/.ssh/authorized_keys# 同步至其他所有节点 [voltdb@voltdb01 ~]$ for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do echo $ip scp ~/.ssh/authorized_keys voltdb@$ip:~/.ssh/ done
12. 消除服务器过程延迟
# 所有节点操作 [voltdb@voltdb01 ~]$ echo "export VOLTDB_OPTS='-XX:+PerfDisableSharedMem'" >> ~/.bash_profile [voltdb@voltdb02 ~]$ echo "export VOLTDB_OPTS='-XX:+PerfDisableSharedMem'" >> ~/.bash_profile [voltdb@voltdb03 ~]$ echo "export VOLTDB_OPTS='-XX:+PerfDisableSharedMem'" >> ~/.bash_profile # 刷新生效 [voltdb@voltdb01 ~]$ for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do ssh voltdb@$ip "source ~/.bash_profile" done
13. 配置集群和数据库
- 您可以指定集群配置以及配置文件中要使用的功能,这是一个 XML 文件,您可以手动创建和编辑该文件。在最简单的情况下,配置文件指定在每个服务器上创建多少分区,以及使用何种可用性 (K-安全)级别。例如:
[voltdb@voltdb01 ~]$ vim ~/deployment.xml <?xml version="1.0"?> <deployment> <cluster sitesperhost="12" kfactor="1" /> <security enabled="true"/> <users> <user name="admin" password="superman" roles="administrator"/> <user name="mitty" password="thurber" roles="user,writer"/> </users> </deployment>
- 如下表。在配置文件中选择数据库功能
特征 | 例 |
命令记录 - 命令记录通过将交易记录到磁盘来提供耐用性,以便在恢复期间重播。您可以配置命令记录类型(同步或异步)、日志文件大小和日志频率(以毫秒或交易数量计算)。 | <commandlog enabled="true" synchronous="false"> <frequency time="300" transactions="1000"/> </commandlog> |
快照 - 自动快照通过创建数据库内容的快照提供了另一种形式的耐用性,这些快照可以在以后恢复。您可以配置快照的频率、唯一的文件前缀以及在任何给定时间保存的快照数量。 | <snapshot enabled="true" frequency="30m" prefix="mydb" retain="3" /> |
出口 - 导出 - 允许您将选定的记录从数据库中写入一个或多个外部目标,这些目标可以是文件、另一个数据库或其他服务。VoltDB 为每个协议提供不同的导出连接器。您可以配置每个流的导出类型以及其他特定于连接器类型的属性。例如,文件连接器需要特定类型的(或格式)的文件和一个称为"nonce"的独特标识符。 | <export> <configuration target="dblog" type="file"> <property name="type">csv</property> <property name="nonce">dblog</property> </configuration> </export> |
安全性 + 帐户 • 安全性允许您通过要求所有连接对已知用户名和密码进行身份验证来保护数据库免受不必要的访问。在部署文件中,您可以定义用户帐户和密码以及每个用户履行的角色或角色。角色定义帐户的权限。角色在数据库图中定义。 | <security enabled="true"/> <users> <user name="admin" password="superman" roles="administrator"/> <user name="mitty" password="thurber" roles="user,writer"/> </users> |
文件路径 - 路径定义 VoltDB 写任何文件或其他基于光盘的内容的位置。您可以为每种类型的服务配置特定路径,例如快照、命令日志、导出溢出等。 | <paths> <exportoverflow path="/tmp/overflow" /> <snapshots path="/opt/archive" /> </paths> |
14. 初始化数据库根目录
# 将软件包上传 [voltdb@voltdb01 ~]$ ls deployment.xml voltdb-developer-11.1.tar.gz# 同步至其他所有节点 [voltdb@voltdb01 ~]$ scp deployment.xml voltdb-developer-11.1.tar.gz 192.168.0.12:~/ [voltdb@voltdb01 ~]$ scp deployment.xml voltdb-developer-11.1.tar.gz 192.168.0.13:~/ [voltdb@voltdb01 ~]$ for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do ssh voltdb@$ip "tar -xf ~/voltdb-developer-11.1.tar.gz" ssh voltdb@$ip "mv ~/voltdb-developer-11.1/ ~/voltdb" ssh voltdb@$ip "ls -l ~/voltdb" done # 设置环境变量 [voltdb@voltdb01 ~]$ exit # 返回root用户 [root@voltdb01 ~]# for ip in `cat /etc/hosts | grep "voltdb" | awk '{print $1}'` do ssh root@$ip "echo "export VOLTDB_HOME=/home/voltdb/voltdb/bin" >> /etc/profile" ssh root@$ip "echo "export PATH=$PATH:$VOLTDB_HOME" >> /etc/profile" done # 以下所有节点分别各自操作 [root@voltdb01 ~]# su - voltdb [voltdb@voltdb01 ~]$ voltdb init --dir=~/voltdb --config=~/deployment.xml # 这些配置可选{--license=~/license.xml --schema=myschema.sql --classes=myprocs.jar} [root@voltdb02 ~]# su - voltdb [voltdb@voltdb02 ~]$ voltdb init --dir=~/voltdb --config=~/deployment.xml [root@voltdb03 ~]# su - voltdb [voltdb@voltdb03 ~]$ voltdb init --dir=~/voltdb --config=~/deployment.xml # 输出没有报错即可 Build: 11.1 voltdb-11.1-0-g18cc2d9-local Community Edition When using the INIT command, some deployment file settings (hostcount and voltdbroot path) are ignored Initialized VoltDB root directory /home/voltdb/voltdb/voltdbroot
在命令线上,您可以指定最多五个参数:
- 将创建根目录的位置
- 配置文件,它启用和设置特定 VoltDB 功能的属性
- 许可证文件(使用VoltDB企业版时)
- 一个或多个 SQL DDL 文件
- 包含存储程序类的一个或多个 JAR 文件
15. 启动数据库
[voltdb@voltdb01 ~]$ voltdb start --dir=~/voltdb --count=3 --host=voltdb01,voltdb02,voltdb03 & [voltdb@voltdb02 ~]$ voltdb start --dir=~/voltdb --count=3 --host=voltdb01,voltdb02,voltdb03 & [voltdb@voltdb03 ~]$ voltdb start --dir=~/voltdb --count=3 --host=voltdb01,voltdb02,voltdb03 & # 所有节点都执行voltdb start启动命令后输出如下即为正常 Server Operational State is: NORMAL Server completed initialization. # 检查端口是否已经运行 [voltdb@voltdb01 ~]$ ss -nutlp | grep 21211 [voltdb@voltdb01 ~]$ ss -nutlp | grep 21212 [voltdb@voltdb01 ~]$ ss -nutlp | grep 8080 [voltdb@voltdb01 ~]$ ss -nutlp | grep 3021 [voltdb@voltdb01 ~]$ ss -nutlp | grep 5555 # 5555这个端口是没有启动的 [voltdb@voltdb01 ~]$ ss -nutlp | grep 7181
在命令行上,您指定了四个参数:
- 根目录的位置
- 集群中的服务器数量
- 从集束中使用一个或多个节点作为"主机",以协调组集的初始启动
16. 加载数据库定义
- 存储的程序被编译成类,然后包装成 JAR 文件,如在"使用 VoltDB手册"中关于安装存储程序的部分所述。要完全加载数据库定义,您将需要存储程序类的一个或多个 JAR 文件以及包含数据定义语言 (DDL) 语句的文本文件,以声明数据库模式。
- 装载数据库图和存储程序的责任因公司而异。在某些情况下,操作员和管理员只负责启动数据库:开发人员可以自己加载和修改该模式。在其他情况下,管理员也负责启动集群并加载正确的数据库模式。
- 如果架构和存储程序是预先定义的,则可以在初始化数据库根目录时包括它们,VoltDB 将在数据库首次启动时预加载它们。否则,您可以在数据库启动后使用sqlcmd utlity 加载样图和类文件。以下部分描述了每个方法。
- 如果数据库模式是预先定义的,您可以在初始化数据库根目录时将其包括在内,使用该图和参数来调用voltdb init命令。该标志允许您指定包含 SQL DDL 语句的一个或多个文本文件,并且该标志允许您指定包含与您想要声明的任何存储程序相关的类的一个或多个 JAR 文件。--schema--classes--schema--classes
- 请注意,DDL 语句和 Java 类可能取决于订单。例如,存储的程序定义可以取决于表定义的存在来定义其分区列。VoltDB 在加载架构文件之前加载任何类。但是,您应该确保按照要加载的顺序指定单个模式文件或 JAR 文件。
- 此外,在初始化组的所有节点时,您必须按相同顺序指定相同的文件。例如:
[voltdb@voltdb01 ~]$ voltdb init --dir=/root/voltdb \ --schema=tables.sql,streams.sql,procs.sql \ --classes=globalprocs.jar,myprocs.jar
17. 数据库启动后登录数据库测试验证
- 用户名和用户密码deployment.xml文件中已指定
[voltdb@voltdb01 ~]$ sqlcmd --user=admin --password=superman 1> CREATE TABLE towns ( 2> town VARCHAR(64), county VARCHAR(64), state VARCHAR(2) 3> ); 4> insert into towns values ('Billerica','Middlesex','MA'); (Returned 1 rows in 0.05s) 5> insert into towns values ('Buffalo','Erie','NY'); (Returned 1 rows in 0.01s) 6> insert into towns values ('Bay View','Erie','OH'); (Returned 1 rows in 0.00s) 7> select count(*) as total from towns; TOTAL ------ 3 (Returned 1 rows in 0.02s) 8> exit(); #退出数据库
18. 停止数据库
- 如何选择停止 VoltDB 取决于您启用了哪些功能。如果您正在使用命令记录(在 VoltDB 企业版中默认启用),则在停止数据库时执行有序关闭是一个好主意,以确保所有活跃的客户端查询都有机会在关闭发生之前完成并返回其结果(并且没有新的查询开始)。
- 要执行有序的关闭,您可以使用voltadmin shutdown命令:
[voltdb@voltdb01 ~]$ voltadmin shutdown
- 如果启用了安全性,您还需要为具有管理员权限的用户指定用户名和密码:
[voltdb@voltdb01 ~]$ voltadmin shutdown --user=admin --password=superman
- 如果您没有使用命令记录,则要确保在关闭前执行快照。您可以使用voltadmin --save命令手动操作此操作。或者,您可以简单地将--save参数添加到voltadmin shutdown命令:
[voltdb@voltdb01 ~]$ voltadmin shutdown --save --user=admin --password=superman
- 保存到数据库快照目录(通过voltadmin save命令到默认位置、自动快照或voltadmin --save)的最新快照将通过下一个voltdb start 命令自动恢复。
su - omm
19. 重新启动数据库
- 重新启动 VoltDB 数据库与首次启动数据库的方式相同,但无需初始化根目录。只需发布与第一次启动时相同的voltdb start命令即可。例如:
[voltdb@voltdb01 ~]$ voltdb start --dir=~/voltdb --count=3 --host=voltdb01,voltdb02,voltdb03 & [voltdb@voltdb02 ~]$ voltdb start --dir=~/voltdb --count=3 --host=voltdb01,voltdb02,voltdb03 & [voltdb@voltdb03 ~]$ voltdb start --dir=~/voltdb --count=3 --host=voltdb01,voltdb02,voltdb03 &
20. 启动和停止单个服务器
- 启动集群中部分两台节点
[voltdb@voltdb01 ~]$ voltdb start --dir=~/voltdb --count=2 --host=voltdb01,voltdb02 &
- 执行以下命令只将voltdb02节点的数据库实例停止
[voltdb@voltdb01 ~]$ voltadmin stop --host=voltdb01 voltdb02 --user=admin --password=superman




