系统与环境配置

在部署安装 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操作
使用 fdisk 命令检查服务器的磁盘信息:

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 "

results matching ""

    No results matching ""