系统与环境配置
在部署安装 PolarDB-X 数据库前,需要批量初始化服务器配置,安装必要的软件与工具。我们建议使用自动化运维工具 Ansible 完成上述任务,如果您使用另外的批量执行工具,也可以参考文档提供的命令完成部署流程。
BIOS 设置
不同类型 CPU 平台及服务器厂商的 BIOS 设置界面有较大区别。在部署数据库前,建议参考服务器厂商文档,检查以下 BIOS 参数是否设置正确:
BIOS 参数 | 推荐值 | 说明 |
---|---|---|
Channel Interleaving | ENALBLE | 允许 CPU 晶片(Die)交错使用多个内存通道,提升内存带宽。 |
Die Interleaving | DISABLE | 每个 CPU 晶片(Die)只使用自身的内存通道,通过 OS 层的 NUMA 亲和性分配策略,降低内存访问延迟。 |
VT-d/ IOMMU | DISABLE | 关闭 BIOS 层的 I/O 虚拟化支持 |
安装 Ansible 工具
首先,需要在您的服务器中任选一台作为部署机(ops),Ansible 工具只需要在该节点上安装一次。打通 ops 与其他服务器之间的免密访问后,所有的部署工作都可以在 ops 上完成。
如果没有特别说明,以下的命令都在 ops 节点上执行。
安装工具
yum install ansible python-netaddr -y
配置服务器列表
Ansible 需要编辑一份服务器列表配置文件(ini),在配置文件里规划服务器的分组与用途。 如果准备为 PolarDB-X 部署独立的 Docker/Kubernetes 环境,建议在其中一台服务器(通常是部署机 ops )上部署私有 Docker 镜像仓库。 编辑服务器列表文件:
vi $HOME/all.ini
例如,用于部署的服务器是:
服务器 | 规划用途 |
---|---|
192.168.1.101 | ops,Docker 镜像仓库 |
192.168.1.102 | PolarDB-X 计算节点 |
192.168.1.103 | PolarDB-X 计算节点 |
192.168.1.104 | PolarDB-X 计算节点 |
192.168.1.105 | PolarDB-X 存储节点 |
192.168.1.106 | PolarDB-X 存储节点 |
192.168.1.107 | PolarDB-X 存储节点 |
输入的服务器列表文件内容是:
[all]
192.168.1.101 # ops
[cn]
192.168.1.102
192.168.1.103
192.168.1.104
[dn]
192.168.1.105
192.168.1.106
192.168.1.107
[all:vars]
registry=192.168.1.101
为简便使用,推荐把配置文件路径放入环境变量:
export ini_file=$HOME/all.ini
服务器免密
在 ops 安装 Ansible 后,用以下脚本一键打通 ops 与所有服务器的免密登录:
# 生成 ssh 密钥
# ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y
# 自动添加 known_hosts
echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config
# 打通 ssh 免密, ini_file 指定上述服务器列表
ansible -i ${ini_file} all -m authorized_key -a " user=root key=\"{{ lookup('file', '/root/.ssh/id_rsa.pub') }} \" " -u root --become-method=sudo --ask-become-pass --become -k
检查生效
用以下命令检查所有服务器是否已免密打通,Ansible 工具是否已正常工作:
ansible -i ${ini_file} all -m shell -a " uptime "
配置系统参数
配置时区/时钟
批量设置服务器时区,时钟。如果是生产环境部署,建议配置 NTP 服务以保证服务器时钟保持同步。
ansible -i ${ini_file} all -m shell -a " timedatectl set-timezone Asia/Shanghai "
ansible -i ${ini_file} all -m shell -a " date -s '`date '+%Y-%m-%d %H:%M:%S'`' "
完成后,用以下命令检查服务器时钟:
ansible -i ${ini_file} all -m shell -a " date '+%D %T.%6N' "
配置 /etc/hosts
如果需安装私有 Docker 镜像仓库,需要修改服务器 /etc/hosts 文件,加入 registry 域名:
ansible -i ${ini_file} all -m shell -a " sed -i '/registry/d' /etc/hosts "
ansible -i ${ini_file} all -m shell -a " echo '{{ registry }} registry' >> /etc/hosts "
配置 limits.conf
编辑 limits.conf 文件:
vi $HOME/limits.conf
输入文件内容:
# End of file
root soft nofile 655350
root hard nofile 655350
* soft nofile 655350
* hard nofile 655350
* soft nproc 655350
* hard nproc 655350
admin soft nofile 655350
admin hard nofile 655350
admin soft nproc 655350
admin hard nproc 655350
更新服务器 limits.conf 配置文件:
ansible -i ${ini_file} all -m synchronize -a " src=$HOME/limits.conf dest=/etc/security/limits.conf "
配置 sysctl.conf
编辑 sysctl.conf 文件:
vi $HOME/sysctl.conf
输入文件内容:
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
kernel.sysrq=1
net.core.somaxconn = 256
net.core.wmem_max = 262144
net.ipv4.tcp_keepalive_time = 20
net.ipv4.tcp_keepalive_probes = 60
net.ipv4.tcp_keepalive_intvl = 3
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 15
#perf
kernel.perf_event_paranoid = 1
fs.aio-max-nr = 1048576
更新服务器 sysctl.conf 配置文件:
ansible -i ${ini_file} all -m synchronize -a " src=$HOME/sysctl.conf dest=/etc/sysctl.conf "
在服务器上加载最新配置:
ansible -i ${ini_file} all -m shell -a " sysctl -p /etc/sysctl.conf "
关闭防火墙
在所有服务器上关闭防火墙:
ansible -i ${ini_file} all -m shell -a " systemctl disable firewalld "
ansible -i ${ini_file} all -m shell -a " systemctl stop firewalld "
检查防火墙是否已经关闭:
ansible -i ${ini_file} all -m shell -a " systemctl status firewalld | grep Active "
禁用 SELinux
编辑 selinux 文件:
vi $HOME/selinux
输入文件内容:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
更新服务器配置文件:
ansible -i ${ini_file} all -m synchronize -a " src=$HOME/selinux dest=/etc/selinux/config "
使配置生效:
ansible -i ${ini_file} all -m shell -a " setenforce 0 "
检查配置是否生效:
ansible -i ${ini_file} all -m shell -a " sestatus "
禁用交换分区
运行以下命令关闭 Linux 交换分区(swap):
ansible -i ${ini_file} all -m shell -a " swapoff -a "
ansible -i ${ini_file} all -m shell -a " sed -i '/=SWAP/d' /etc/fstab "
检查是否生效:
ansible -i ${ini_file} all -m shell -a " free -m | grep Swap "
磁盘挂载
数据目录需求
PolarDB-X 建议采用单机多部署的模式,会采用 docker 或 k8s pod 的 volumn 进行文件映射,每个节点的 volumn,添加对应 dockerId 的前缀形成两级目录,分别挂载到多个挂载点上
挂载目录 | 子目录 | 主机软链目录 (k8s部署) | 主机软链目录 (pxd部署) | 描述 |
/polarx | /polarx/data-log | /data-log | $HOME/.pxd/data/polarx-log/ | 日志目录 |
/polarx/filestream | /filestream | / | 中间临时文件,比如备份重搭 | |
/polarx/docker | /var/lib/docker | /var/lib/docker | docker运行文件 | |
/polarx/kubelet | /var/lib/kubelet | / | k8s的根目录 | |
/polarx/data(建议单独挂载) | /polarx/data/ | /data | $HOME/.pxd/data/polarx/ | 数据存储的主要空间,有随机IO操作 |
ansible -i ${ini_file} all -m shell -a " fdisk -l | grep Disk "
单块数据盘
如果服务器只拥有单块数据盘,例如 /dev/nvme0n1,可以用以下基础命令格式化及挂载:
风险提示:磁盘 /dev/nvme0n1 上的当前数据将全部丢失。
# 卸载数据盘
umount /dev/nvme0n1
# 创建 EXT4 文件系统,并且设置 label = polarx
mkfs.ext4 /dev/nvme0n1 -m 0 -O extent,uninit_bg -E lazy_itable_init=1 -q -L polarx -J size=4000
# 创建挂载目录
mkdir -p /polarx
# 向 /etc/fstab 加入挂载信息
echo "LABEL=polarx /polarx ext4 defaults,noatime,data=writeback,nodiratime,nodelalloc,barrier=0 0 0" >> /etc/fstab
# 挂载数据盘
mount -a
如果所有服务器的数据盘的名称相同,我们推荐使用 Ansible 命令批量操作:
风险提示:所有服务器 /dev/nvme0n1 磁盘上的当前数据将全部丢失。
# 批量挂载 /dev/nvme0n1
ansible -i ${ini_file} all -m shell -a " mkfs.ext4 /dev/nvme0n1 -m 0 -O extent,uninit_bg -E lazy_itable_init=1 -q -L polarx -J size=4000 "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx "
ansible -i ${ini_file} all -m shell -a " echo 'LABEL=polarx /polarx ext4 defaults,noatime,data=writeback,nodiratime,nodelalloc,barrier=0 0 0' >> /etc/fstab "
ansible -i ${ini_file} all -m shell -a " mount -a "
完成后,使用 df 命令检查磁盘挂载情况:
ansible -i ${ini_file} all -m shell -a " df -lh | grep polarx "
如果您选择 K8s 部署,执行如下命令,创建对应目录的软链接:
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/kubelet"
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/kubelet /var/lib/kubelet "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/docker "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/docker /var/lib/docker "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data-log "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/data-log /data-log "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/filestream "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/filestream /filestream "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/data /data "
如果您选择 PXD 部署,执行如下命令,创建对应目录的软链接:
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/docker "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/docker /var/lib/docker "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data-log "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/data-log $HOME/.pxd/data/polarx-log/ "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/data $HOME/.pxd/data/polarx/ "
多块数据盘
如果服务器拥有多块 SSD 数据盘,推荐将数据盘拆成 1 + N 使用, 第 1 块盘挂载到 /polarx 目录,存储 PolarDB-X 日志相关文件,后 N 块盘使用 LVM 方式合成一个逻辑卷挂载,挂载到 /polarx/data 目录,存储 PolarDB-X 核心数据。 如何通过 LVM 将多块数据盘合成一个逻辑卷可以参考下面的步骤。 首先需要在服务器安装 LVM 组件:
ansible -i $ini_file all -m shell -a "yum install lvm2 -y"
直接使用脚本创建 LVM 逻辑卷:
vi $HOME/create_polarx_lvm.sh
复制脚本内容:
#!/bin/sh
#****************************************************************#
# ScriptName: create_polarx_lvm.sh
# Author: polardb-x@alibaba-inc.com
# Create Date: 2020-08-04 08:42
# Modify Date: 2021-05-25 17:20
#***************************************************************#
function disk_part(){
set -e
if [ $# -le 1 ]
then
echo "disk_part argument error"
exit -1
fi
action=$1
disk_device_list=(`echo $*`)
echo $disk_device_list
unset disk_device_list[0]
echo $action
echo ${disk_device_list[*]}
len=`echo ${#disk_device_list[@]}`
echo "start remove origin partition "
for dev in ${disk_device_list[@]}
do
`parted -s ${dev} rm 1` || true
dd if=/dev/zero of=${dev} count=100000 bs=512
done
sed -i "/flash/d" /etc/fstab
if [ x${1} == x"split" ]
then
echo "split disk "
echo ${disk_device_list}
vgcreate -s 32 vgpolarx ${disk_device_list[*]}
lvcreate -A y -I 128K -l 100%FREE -i ${#disk_device_list[@]} -n polarx vgpolarx
mkfs.ext4 /dev/vgpolarx/polarx -m 0 -O extent,uninit_bg -E lazy_itable_init=1 -q -L polarx -J size=4000
sed -i "/polarx/d" /etc/fstab
mkdir -p /polarx
opt="defaults,noatime,data=writeback,nodiratime,nodelalloc,barrier=0"
echo "LABEL=polarx /polarx ext4 ${opt} 0 0" >> /etc/fstab
mount -a
else
echo "unkonw action "
fi
}
function format_nvme_mysql(){
disk_device_list=(`ls -l /dev/|grep -v ^l|awk '{print $NF}'|grep -E "^nvme[0-9]{1,2}n1$|^df[a-z]$|^os[a-z]$"`)
if [ 0 -lt ${#disk_device_list[@]} ]
then
echo "check success"
echo "start umount partition "
parttion_list=`df |grep -E "dev\/os|flash" |awk -F ' ' '{print $1}'`
for partition in ${parttion_list[@]}
do
echo $partition
umount $partition
done
else
echo "check flash fail"
#exit -1
fi
full_disk_device_list=()
for i in ${!disk_device_list[@]}
do
echo ${i}
full_disk_device_list[${i}]=/dev/${disk_device_list[${i}]}
done
echo ${full_disk_device_list[@]}
disk_part split ${full_disk_device_list[@]}
}
if [ ! -d "/polarx" ]; then
umount /dev/vgpolarx/polarx
vgremove -f vgpolarx
dmsetup --force --retry --deferred remove vgpolarx-polarx
format_nvme_mysql
else
echo "the lvm exists."
fi
复制脚本到服务器 $HOME 目录,并执行:
风险提示:所有服务器下名称匹配 /dev/nvme* 的磁盘当前数据将全部丢失。
# LVM 磁盘挂载
ansible -i ${ini_file} all -m synchronize -a " src=$HOME/create_polarx_lvm.sh dest=/tmp/create_polarx_lvm.sh "
ansible -i ${ini_file} all -m shell -a " sh /tmp/create_polarx_lvm.sh "
结束后,使用 df 命令检查磁盘挂载情况:
ansible -i ${ini_file} all -m shell -a " df -lh | grep polarx "
如果您选择,K8s 部署,执行如下命令,创建对应目录的软链接:
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/kubelet"
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/kubelet /var/lib/kubelet "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/docker "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/docker /var/lib/docker "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data-log "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/data-log /data-log "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/filestream "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/filestream /filestream "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/data /data "
如果您选择 PXD 部署,执行如下命令,创建对应目录的软链接:
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/docker "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/docker /var/lib/docker "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data-log "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/data-log $HOME/.pxd/data/polarx-log/ "
ansible -i ${ini_file} all -m shell -a " mkdir -p /polarx/data "
ansible -i ${ini_file} all -m shell -a " ln -s /polarx/data $HOME/.pxd/data/polarx/ "
常用工具
PolarDB-X 兼容 MySQL 协议,建议安装 MySQL 客户端访问数据库:
ansible -i ${ini_file} all -m shell -a " yum install mysql -y "
推荐在服务器节点安装以下工具:
ansible -i ${ini_file} all -m shell -a " yum install dstat iostat htop -y "