• OB手动部署Oceanbase集群


    实施过程

    环境架构规划

    角色 机器 备注
    OBSERVER 192.168.10.201 OceanBase 数据库
    192.168.10.202
    192.168.10.203
    OBPROXY 192.168.10.201 OceanBase 访问反向代理
    192.168.10.202
    OBCLIENT 192.168.10.201 OceanBase 命令行客户端
    obagent 192.168.10.201 性能指标
    192.168.10.202
    192.168.10.203

    操作系统层环境配置

    以下操作如无特别说明,均以root管理员账号进行配置。

    关闭 selinux

    #临时关闭
    setenforce 0
    # 检查
    getenforce
    
    #开机不启动selinux,需重启OS生效。已临时关闭,本次不需要重启生效。
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    
    #查看配置已生效
    grep '^SELINUX=' /etc/selinux/config
    

    关闭防火墙服务(firewalld)

    #关闭防火墙
    systemctl stop firewalld
    
    #开机禁用自启动防火墙并立刻关闭服务
    systemctl disable --now firewalld
    
    # 检查服务状态
    systemctl status firewalld 
    

    修改主机名(可选)

    #修改主机名为oceanbase,当前已生效,退出会话,再登录后显示新主机名
    hostnamectl set-hostname oceanbase
    # 检查确认
    hostnamectl 
    

    配置hosts

    #主机名解析添加主机信息
    cat >> /etc/hosts << EOF
    192.168.10.182 oceanbase
    EOF
    
    #查看主机名信息
    cat /etc/hosts
    

    添加普通用户

    oceanbase安装和维护均由普通用户(ober)操作。[OBD工具部署的OB集群默认运行在admin用户]

    #添加用户
    groupadd -g 1000 ober
    useradd -u 1000 -g ober -m -d /ups/app/oceanbase -c "OceanBase Owner" ober
    
    
    #更改密码
    echo "ober" | passwd --stdin ober
    #运行oceanbase可运行任何命令,不需要密码
    
    # 配置 sudo 权限
    visudo      #添加oceanbase一行内容
    ## Same thing without a password
    # %wheel        ALL=(ALL)       NOPASSWD: ALL
    ober       ALL=(ALL)       NOPASSWD: ALL
    

    配置 SSH 互信(ober)

    su - ober
    export SSH='ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no'
    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
    cat ~/.ssh/*.pub >> ~/.ssh/authorized_keys
    scp ~/.ssh/authorized_keys ober@<nodeN>:~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    
    # 检查确认
    export SSH='ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no'
    for hosts in $(grep -Ev "^#|\-vip|scan" /etc/hosts|awk '{print $NF}'); do 
        ${SSH} ${hosts} date
    done
    

    创建软件目录

    以root用户安装时,默认安装在/root/observer目录下,这里以oceanbase用户安装在/ob/observer目录下。

    集群文件类型
    • 运行日志:在启动目录下的 log 目录里。主要记录进程 observer 的运行日志、选举服务的运行日志和 rootservice 的运行日志。主要读写特点是顺序写。
    • 数据文件:主要是指数据文件 block_file ,一次性初始化大小,后面可以在线扩容,但是不能缩容。主要读写特点是随机读、顺序写。偶尔密集的随机写。
    • 事务日志文件:主要是指事务和 sstable 相关的日志 ,包括 clogilogslog 等。主要读写特点是顺序写。

    这三类文件尽可能的分散在不同的磁盘上存储。如果物理上只有一块盘,则可以使用 fdisklvm 划分为多个逻辑盘。

    文件系统mount参数
    # lvm 分盘
    pvcreate /dev/sdb
    vgcreate datavg /dev/sdb
    lvcreate -L 20G datavg -n lvredo
    lvcreate -l 100%FREE datavg -n lvdata
    
    # 格式化文件系统
    mkfs.ext4 /dev/obvg/lvdata
    mkfs.ext4 /dev/obvg/lvredo
    
    # 修改 mount 参数文件
    vim /etc/fstab 
    /dev/obvg/lvredo          /redo              ext4            defaults,noatime,nodiratime,nodelalloc,barrier=0        0 0
    /dev/obvg/lvdata             /data         ext4            defaults,noatime,nodiratime,nodelalloc,barrier=0        0 0
    
    # 挂载文件系统
    mount -a
    
    查看默认安装路径
    rpm -ql oceanbase-ce-3.1.0-3.el7.x86_64
    
    for pkg in $(ls -tr ./*.rpm);do
    	echo $pkg; rpm -ql $pkg
    done
    
    自定义安装目录
    # 查看安装目录大小
    [root@progs oceanbase]# df -hT /ups
    Filesystem              Type  Size  Used Avail Use% Mounted on
    /dev/mapper/upsvg-upslv xfs    64G   44G   21G  69% /ups
    [root@progs oceanbase]#
    
    # 检查属主、属组
    [root@progs oceanbase]# ls -ld /ups/app/oceanbase
    drwxr-xr-x 2 ober ober 6 Aug 28 20:39 /ups/app/oceanbase
    [root@progs oceanbase]#
    
    cd /ups/app/oceanbase                       # obs部署启动目录   RPM包自动创建
    mkdir -p /ups/app/oceanbase/store/obce      # obs数据总目录, obce为集群名称
    mkdir -p /data/obce                         # obs数据文件实际目录
    mkdir -p /redo/obce                         # 事务日志实际目录
    
    chown -R ober:ober /ups/app/oceanbase
    chown -R ober:ober /data/obce
    chown -R ober:ober /redo/obce
    
    ln -s /ups/app/oceanbase/store/obce/sstable /data/obce/sstable
    ln -s /ups/app/oceanbase/store/obce/clog /redo/obce/clog
    ln -s /ups/app/oceanbase/store/obce/slog /redo/obce/slog
    ln -s /ups/app/oceanbase/store/obce/ilog /redo/obce/ilog
    

    系统内核参数配置

    cat > /etc/sysctl.d/98-obce.conf <<-'EOF'
    
    # for oceanbase
    ## 修改内核异步 I/O 限制
    fs.aio-max-nr=1048576
    
    ## 网络优化
    net.core.somaxconn = 2048
    net.core.netdev_max_backlog = 10000 
    net.core.rmem_default = 16777216 
    net.core.wmem_default = 16777216 
    net.core.rmem_max = 16777216 
    net.core.wmem_max = 16777216
    
    net.ipv4.ip_local_port_range = 3500 65535 
    net.ipv4.ip_forward = 0 
    net.ipv4.conf.default.rp_filter = 1 
    net.ipv4.conf.default.accept_source_route = 0 
    net.ipv4.tcp_syncookies = 0 
    net.ipv4.tcp_rmem = 4096 87380 16777216 
    net.ipv4.tcp_wmem = 4096 65536 16777216 
    net.ipv4.tcp_max_syn_backlog = 16384 
    net.ipv4.tcp_fin_timeout = 15 
    net.ipv4.tcp_max_syn_backlog = 16384 
    net.ipv4.tcp_tw_reuse = 1 
    net.ipv4.tcp_tw_recycle = 1 
    net.ipv4.tcp_slow_start_after_idle=0
    
    vm.swappiness = 0
    vm.min_free_kbytes = 2097152
    vm.max_map_count=655360
    
    # 此处为 OceanBase 数据库的 data 目录
    kernel.core_pattern = /data/core-%e-%p-%t
    EOF
    
    # 加载配置
    sysctl --system
    

    其中,kernel.core_pattern 中的 /data 为 OceanBase 数据库的 data 目录。

    调整资源限制

    OceanBase 数据库的进程涉及的限制包括线程最大栈空间大小(Stack)、最大文件句柄数(Open Files)和 core 文件大小 (Core File Size)资源

    #添加内容
    cat >> /etc/security/limits.d/98-ober.conf << EOF
    * soft nofile 655350
    * hard nofile 655350
    * soft stack 20480
    * hard stack 20480
    * soft nproc 655360
    * hard nproc 655360
    * soft core unlimited
    * hard core unlimited
    EOF
    
    #退出当前会话,重新登录,使配置生效。
    
    #检查open files当前值,应为655350,否则后续启动集群会报错
    ulimit -n
    

    时间同步

    生产环境所有节点间的时间误差建议控制在 10ms 以内。

    安装 chrony服务
    yum -y install chrony
    
    配置chrony
    vi /etc/chrony.conf
    # server 后面跟时间同步服务器
    # 使用pool.ntp.org 项目中的公共服务器。按 server 配置,理论上您想添加多少时间服务器都可以。
    # 或者使用 阿里云的 ntp 服务器
    # Please consider joining the pool (http://www.pool.ntp.org/join.html).
    server ntp.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
    server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
    server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
    server ntp1.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
    server ntp10.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
    
    # 如果是测试环境,没有时间同步服务器,那就选取一台配置为时间同步服务器。
    # 如果选中的是本机,则取消下面 server 注释
    #server 127.127.1.0
    
    # 根据实际时间计算出服务器增减时间的比率,然后记录到一个文件中,在系统重启后为系统做出最佳时间补偿调整。
    driftfile /var/lib/chrony/drift
    
    # chronyd 根据需求减慢或加速时间调整,
    # 在某些情况下系统时钟可能漂移过快,导致时间调整用时过长。
    # 该指令强制 chronyd 调整时期,大于某个阀值时步进调整系统时钟。
    # 只有在因 chronyd 启动时间超过指定的限制时(可使用负值来禁用限制)没有更多时钟更新时才生效。
    makestep 1.0 3
    
    # 将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。
    rtcsync
    
    # Enable hardware timestamping on all interfaces that support it.
    # 通过使用hwtimestamp指令启用硬件时间戳
    #hwtimestamp eth0
    #hwtimestamp eth1
    #hwtimestamp *
    
    # Increase the minimum number of selectable sources required to adjust
    # the system clock.
    #minsources 2
    
    # 指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器
    #allow 192.168.0.0/16
    #deny 192.168/16
    
    # 即使没有同步到时间源,也要服务时间
    local stratum 10
    
    # 指定包含NTP验证密钥的文件。
    #keyfile /etc/chrony.keys
    
    # 指定日志文件的目录。
    logdir /var/log/chrony
    
    
    # Select which information is logged.
    #log measurements statistics tracking
    
    检查chrony状态信息
    # 查看时间同步活动
    chronyc activity
    
    # 查看时间服务器
    chronyc sources
    
    # 查看同步状态
    chronyc sources -v
    
    # 校准时间服务器:
    chronyc tracking
    
    # 使用 clockdiff [-o] <host> 命令可以检查本机跟目标机器的时间同步误差
    clockdiff 192.168.10.181
    

    如果使用 clockdiff 运行出错时,可以换下面命令判断时间同步误差

    ping -T tsandaddr 192.168.10.181 -c 2

    节点时间同步误差不应超过 50ms,否则初始化集群会失败

    时区设置(可选)

    # 查看所有可用时区
    timedatectl list-timezones
    
    # 设置当前系统时区
    timedatectl set-timezone Asia/Shanghai
    
    # 强制同步下系统时钟
    chronyc -a makestep
    

    部署OB集群

    安装obclient客户端

    rpm -ivh libobclient-2.0.0-2.el7.x86_64.rpm obclient-2.0.0-2.el7.x86_64.rpm
    

    部署observer服务

    安装软件包
    # RPM包括是使用cpio格式打包的,因此可以先转成cpio然后解压
    cd /ups/app/oceanbase/cluster
    rpm2cpio oceanbase-ce-3.1.1-4.el7.x86_64.rpm |cpio -ivd
    rpm2cpio oceanbase-ce-libs-3.1.1-4.el7.x86_64.rpm |cpio -ivd
    
    
    配置环境变量
    su - ober
    echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/ups/app/oceanbase/lib' >> ~/.bash_profile
    echo 'export PATH=/ups/app/oceanbase/bin:$PATH' >> ~/.bash_profile
    . ~/.bash_profile
    
    启动observer
    192.168.10.201 节点
    su - ober
    cd /ups/app/oceanbase/cluster && bin/observer -i ens32 -l WARN -p 2881 -P 2882 -z zone1 -r '192.168.10.201:2882:2881;192.168.10.202:2882:2881;192.168.10.203:2882:2881' -c obce -n obce -o "__min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_size=2G,enable_syslog_wf=False,enable_syslog_recycle=True,max_syslog_file_count=6" -d /ups/app/oceanbase/store/obce
    
    192.168.10.202 节点
    su - ober
    cd /ups/app/oceanbase/cluster && bin/observer -i ens32 -l WARN -p 2881 -P 2882 -z zone2 -r '192.168.10.201:2882:2881;192.168.10.202:2882:2881;192.168.10.203:2882:2881' -c obce -n obce -o "__min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_size=2G,enable_syslog_wf=False,enable_syslog_recycle=True,max_syslog_file_count=6" -d /ups/app/oceanbase/store/obce
    
    192.168.10.203 节点
    su - ober
    cd /ups/app/oceanbase/cluster && bin/observer -i ens32 -l WARN -p 2881 -P 2882 -z zone3 -r '192.168.10.201:2882:2881;192.168.10.202:2882:2881;192.168.10.203:2882:2881' -c obce -n obce -o "__min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_size=2G,enable_syslog_wf=False,enable_syslog_recycle=True,max_syslog_file_count=6" -d /ups/app/oceanbase/store/obce
    
    检查进程状态
    netstat -ntlp|grep -E "2881|2882"
    
    集群初始化

    当所有节点的observer进程都启动成功,监听正常时,通过mysql或obclient客户端工具连接任一节点2881端口进行初始化操作

    mysql -h 192.168.10.201 -u root -P 2881 -c -A -e "set session ob_query_timeout=1000000000; alter system bootstrap ZONE 'zone1' SERVER '192.168.10.201:2882', ZONE 'zone2' SERVER '192.168.10.202:2882', ZONE 'zone3' SERVER '192.168.10.203:2882' ;"
    

    密码为空

    验证

    连接到sys的mysql租户并检查

    mysql -h 192.168.10.201 -u root@sys#obce -P 2881 -c -A -e "show databases;"
    
    设置密码
    • 集群管理员(root@sys)密码默认集群管理员(root@sys)的密码是空
    alter user root identified by 'p#ssw0rd' ;
    
    • OBPROXY 用户(proxyro)密码默认OBPROXY 连接 OceanBase 集群使用用户 proxyro
    grant select on oceanbase.* to proxyro identified by 'p#ssw0rd' ;
    

    部署obproxy

    安装软件包
    cd /ups/app/oceanbase/obproxy
    rpm2cpio obproxy-3.2.0-1.el7.x86_64.rpm |cpio -ivd
    
    启动obproxy
    # obce 集群名称
    cd /ups/app/oceanbase/obproxy && bin/obproxy -r "192.168.10.201:2881;192.168.10.202:2881;192.168.10.203:2881" -p 2883 -o "enable_strict_kernel_release=false,enable_cluster_checkout=false,skip_proxy_sys_private_check=True,enable_metadb_used=false" -l 2884 -n obce
    

    obproxy [OPTIONS]
    -h,--help print this help
    -p,--listen_port LPORT obproxy listen port
    -l,--promethues_listen_port PLPORT obproxy prometheus listen port
    -o,--optstr OPTSTR extra options string
    -n,--appname APPNAME application name
    -r,--rs_list RS_LIST root server list(format ip:sql_port)
    -c,--cluster_name CLUSTER_NAME root server cluster name
    -d,--dump_config_sql DSQL dump config sql to file
    -e,--execute_config_sql ESQL exectue config sql(create tables, insert initial data)
    -N,--nodaemon don't run in daemon
    -V,--version VERSION current obproxy version
    -R,--releaseid RELEASEID current obproxy kernel release id
    -t,--regression_test TEST_NAME regression test
    example:
    run without config server:
    ./bin/obproxy -p6789 -r'ip:port;ip:port' -n test -o enable_cluster_checkout=false,syslog_level=INFO
    OR ./bin/obproxy -p6789 -r'ip:port;ip:port' -c 'ob_test' -n test -o syslog_level=INFO

    run with config server:
    ./bin/obproxy -p6789 -e -n test -o obproxy_config_server_url='your config url',syslog_level=INFO

    Non-first start with local config file:
    ./bin/obproxy

    dump config update sql:
    ./bin/obproxy -d

    run regression tests:
    ./bin/obproxy -p6789 -rip:port -ntest -o obproxy_config_server_url='' -t ''

    检查服务状态
    ps -ef|grep obproxy
    netstat -ntlp |grep -E "2883|2884"
    
    登录 OBPROXY 修改密码
    -- 登录用户名:root@proxysys, 端口:2883 ,初始密码:空
    -- mysql -h 192.168.10.201 -u root@proxysys -P 2883
    show proxyconfig like '%sys_password%';
    
    -- 修改 OBPROXY 用户密码
    alter proxyconfig set obproxy_sys_password = 'p#ssw0rd';
    
    -- 修改 OBPROXY 连接 OceanBase 集群用户 proxyro 的密码, 密码就是前面 OceanBase 集群初始化后创建的用户 proxyro 的密码
    alter proxyconfig set observer_sys_password = 'p#ssw0rd' ;
    
    
    检查确认

    通过 OBPROXY 连接 OceanBase 集群

    -- mysql -h192.168.10.201 -uroot@sys#obce -P2883 -p -c -A oceanbase
    
    show full processlist;
    

    部署obagent

    安装软件包
    su - ober
    cd /ups/app/oceanbase/obagent
    rpm2cpio obagent-1.0.0-1.el7.x86_64.rpm |cpio -ivd
    
    配置环境变量
    su - ober
    echo 'export PATH=/ups/app/oceanbase/obagent/bin:$PATH' >> ~/.bash_profile
    
    . ~/.bash_profile
    
    编辑配置文件
    monagent.yaml
    vi conf/monagent.yaml
    log:
      level: WARN
      filename: log/monagent.log
      maxsize: 30
      maxage: 3
      maxbackups: 10
      localtime: true
      compress: true
    server:
      address: 192.168.10.201:8088
      adminAddress: 192.168.10.201:8089
      runDir: run
    cryptoMethod: plain
    cryptoPath: conf/.config_secret.key
    modulePath: conf/module_config
    propertiesPath: conf/config_properties
    
    启动obagent服务
    su - ober
    /ups/app/oceanbase/obagent/bin/monagent -c conf/monagent.yaml
    

    Usage:
    monagent [flags]

    Flags:
    -c, --config string config file (default "conf/monagent.yaml")
    -h, --help help for monagent
    -d, --pipelines_config_dir string monitor pipelines config file dir (default "conf/monagent/pipelines")

    检查确认
    ps -ef|grep monagent
    netstat -tnlp |grep -E "8088|8089"
    

    附录

    常见问题

    集群初始化失败常见原因

    • 集群节点之间时间同步延时超过 50ms 。

    • 集群节点之间网络延时超过 100ms 。

    • 集群节点上 OBSERVER 相关目录结构不对或者目录权限不对。

    • 集群节点上进程 observer 启动参数写的不对。注意隐含参数的名字(如__min_full_resource_pool_memory )、参数 -d 的目录是否正确、参数 -z

      跟 IP 的对应关系、 参数中多了空格或分隔符错误(有的是 , ,有的是;)。

    • 集群节点可用内存低于进程 observer 启动参数 memory_limit 值。

    • 数据目录空间不足,可以通过设置 datafile_size 根据实际环境配置。

  • 相关阅读:
    如何进行shell脚本正确性测试
    linux 重命名文件和文件夹
    linux 下 `dirname $0`
    五句话搞定JavaScript作用域
    Javascrpt
    css
    HTML
    python之sqlalchemy
    Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    Python之路【第八篇】:堡垒机实例以及数据库操作
  • 原文地址:https://www.cnblogs.com/binliubiao/p/15710990.html
Copyright © 2020-2023  润新知