作者简介:白云龙,六棱镜系统运维部负责人。
文档概要:
1、准备环境 2、基础配置 3、OceanBase自动化部署 4、资源池-租户-用户-创建
5、OB优化 6、常用命令 7、维护相关-服务篇 8、维护相关-obproxy故障重建
9、维护相关-副本重建 10、维护相关-节点磁盘更换 11、维护相关-物理资源扩容
12、维护相关-物理备份 13、维护相关-OB监控dooba基本使用 14、datax部署及使用
15、ob-loader-dumper 逻辑备份工具的使用
1、准备环境:
操作系统:centos7.4
中控机1台:用于安装OBD及Obproxy 配置:8c/32G IP地址:172.20.2.119
目标机器3台:用于部署Observer 配置:10c/48G IP地址:172.20.2.116-118
磁盘规划:
系统盘:100G --LVS分区 文件系统:EXT4
数据盘: /data 5T --GPT分区 文件系统:xfs
事务日志盘: /redo 800G (一般设置为内存的4倍) --GPT分区 文件系统:xfs
数据库的二进制文件和运行日志: /home/admin/oceanbase 200G --GPT分区 文件系统:xfs
2、基础配置:
创建admin用户并设置密码(所有节点都要设置):
# useradd -U admin -d /home/admin -s /bin/bash && echo "SixlensPwd123" |passwd --stdin admin
更改目录权限:
#chown -R admin.admin /data && chown -R admin.admin /redo && chown -R admin.admin /home/admin
Note:先创建admin用户,后mount挂载/home/admin/ocaeabase 否则创建用户提示家目录存在
Note1:可以直接使用root账户(不安全)
配置sudo权限(所有节点都要设置):
# vim /etc/sudoers
admin ALL=(ALL) ALL
Note:sudoers拒绝所有用户读写,root用户也无权限,需增加权限后更改 #chmod u+w /etc/sudoers
SSH免密登录(admin用户登录):
$ ssh-keygen -t rsa --在中控机119执行
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ mkdir ~/.ssh --3 Observer个节点建立隐藏ssh目录
$ scp ~/.ssh/authorized_keys admin@172.20.2.116-118:~/.ssh/authorized_keys --复制到目标机
$ chmod 700 .ssh --目标机执行
$ chmod 600 authorized_keys --目标机执行
Note:root用户配置免密可直接登录,普通用户需更改目录和文件权限,否则无法登陆
$ for i in 116 117 118;do ssh 172.20.2.$i date;done --中控机执行免密连接测试
时间服务器配置(中控节点作为时间服务器,以root身份配置):
# yum remove ntp -y
# yum install chrony
# vim /etc/chrony.conf
server ntp1.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
allow all
stratumweight 0
local stratum 10
# systemctl start chronyd && systemctl enable chronyd && systemctl status chronyd
客户端配置(所有目标节点):
# echo "* * * * * /sbin/ntpdate -u 172.20.2.119 2>&1 1>>/tmp/ntpdate.log" >> /var/spool/cron/root
# for i in 116 117 118 ;do clockdiff 172.20.2.$i;done
# ping -T tsandaddr 172.20.2.116 --如果有机子clockdiff报错,使用tsandaddr
配置limits.conf(所有目标节点):
# cat /etc/security/limits.conf |grep ^[^#]
root soft nofile 655350
root hard nofile 655350
* soft nofile 655350
* hard nofile 655350
* soft stack 20480
* hard stack 20480
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
退出当前会话,重新登录。执行 # ulimit -a,查看配置是否生效:
配置sysctl.conf
# cat /etc/sysctl.conf |grep ^[^#]
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
kernel.core_pattern = /data/core-%e-%p-%t -- OceanBase 数据库的 data 目录
# sysctl –p --加载配置,使配置生效
目录规划:
/home/admin/oceanbase/ob -- home_path 家目录
/data/ob -- data_dir --数据目录
/redo/{clog,slog,ilog} --事务日志目录
/home/admin/oceanbase/obagent --obagent部署目录
3、OceanBase自动化部署:
1、 在线安装OBD --中控节点
]$ sudo yum install -y yum-utils
]$ sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
]$ yum install -y ob-deploy
2、在线安装 OBClient --中控节点
]$ sudo yum install -y libobclient
]$ sudo yum install -y obclient
3、配置文件
[admin@CAIP119 ~]$ vim config.yaml
oceanbase-ce:
servers:
- name: z1
ip: 172.20.2.116
- name: z2
ip: 172.20.2.117
- name: z3
ip: 172.20.2.118
global:
devname: ens192
memory_limit: 40G --系统内存的80%
system_memory: 10G --大概是memory_limt * 0.4
datafile_disk_percentage: 90 --节点使用的最大磁盘空间上限,取值范围 5-99(百分比)
syslog_level: INFO
enable_syslog_recycle: true
max_syslog_file_count: 100 --运行日志文件个数 一个是256M 100个足以,看需求
memstore_limit_percentage: 55 -- memstore占租户的内存比
freeze_trigger_percentage: 40 --启动major/minor freeze的时机 回收阀值(水位线)
minor_warm_up_duration_time: 0
cluster_id: 1 --多个集群id应不同
appname: ob_cluster
root_password: Pwd123# --sys租户的密码
z1:
mysql_port: 2881
rpc_port: 2882
home_path: /home/admin/oceanbase/ob
data_dir: /data/ob
clog_dir: /redo/clog
ilog_dir: /redo/ilog
slog_dir: /redo/slog
zone: zone1
enable_syslog_wf: true
cpu_count: 30 --实际CPU为10c、OB的cpu可以超分配置,看实际应用配置
z2:
mysql_port: 2881
rpc_port: 2882
home_path: /home/admin/oceanbase/ob
data_dir: /data/ob
clog_dir: /redo/clog
ilog_dir: /redo/ilog
slog_dir: /redo/slog
zone: zone2
enable_syslog_wf: true
cpu_count: 30
z3:
mysql_port: 2881
rpc_port: 2882
home_path: /home/admin/oceanbase/ob
data_dir: /data/ob
clog_dir: /redo/clog
ilog_dir: /redo/ilog
slog_dir: /redo/slog
zone: zone3
enable_syslog_wf: true
cpu_count: 30
obproxy:
servers:
- 172.20.2.119
depends:
- oceanbase-ce
global:
listen_port: 2883
prometheus_listen_port: 2884
home_path: /home/admin/obproxy
rs_list: 172.20.2.116:2881;172.20.2.117:2881;172.20.2.118:2881
enable_cluster_checkout: false
cluster_name: ob_cluster
enable_compression_protocol: false
automatic_match_work_thread: True
work_thread_num: 16
net_accept_threads: 2
proxy_mem_limited: 16G
obproxy_sys_password: Pwd123# --obproxy root密码
obagent:
servers:
- name: z1
ip: 172.20.2.116
- name: z2
ip: 172.20.2.117
- name: z3
ip: 172.20.2.118
depends:
- oceanbase-ce
global:
home_path: /home/admin/oceanbase/obagent
server_port: 8088
pprof_port: 8089
log_level: INFO
log_path: log/monagent.log
crypto_method: plain
log_size: 30
log_expire_day: 7
log_file_count: 10
http_basic_auth_user: admin
http_basic_auth_password: root
pprof_basic_auth_user: admin
pprof_basic_auth_password: root
ob_monitor_status: active
host_monitor_status: active
disable_http_basic_auth: false
disable_pprof_basic_auth: false
3、 部署 OceanBase 集群:
# obd cluster autodeploy sixlens_obcluster -c config.yaml --部署集群
# obd cluster display caip_obcluster --查看部署后的运行状态
4、连接验证:
$ obclient -h172.20.2.119 -uroot@sys#ob_cluster -pPwd123# -P2883 -A -c oceanbase --sys租户
1)、status 表示节点状态。inactive, 表示节点已经掉线或者进程退出了。节点掉线常见原因是节点时钟偏差过大、网络延时过大、clog空间盘满(use大于等于95%)。如果进程刚刚启动,则是进程在跟 rootserver 通信沟通。正常情况下启动几秒就能变 active,异常宕机后的再启动可能需要几十秒变 acitve,最长不超过2分钟。
2)、start_service_time 表示节点开始提供服务时间。如果是默认值 1970-1-1 ,则表示进程还在应用clog、刷新schema等。通常如果要应用的clog不多的时候,这个几秒钟就好了。如果是此前内存中大量数据还没有合并落盘就宕机了,这个恢复时间就长一些,可能会要十几分钟。
3)、stop_service_time 表示停止服务时间。如果是默认值 1970-1-1 ,表示没有停止服务。如果时间大于默认值(在当前时间附近),表示手动发起过 stop server 或 stop zone 命令。则需要手动发起 start server 或者 start zone 命令恢复服务。
4)、只有这三个列都正常了,节点才是正常的,集群才是正常的
$obclient -h172.20.2.119 -uroot@proxysys -P2883 -pPwd123# --obproxy账户
4、资源池-租户-用户-创建及测试:
查询系统资源总计资源
SELECT svr_ip,svr_port, cpu_total, mem_total/1024/1024/1024, disk_total/1024/1024/1024, zone FROM __all_virtual_server_stat;
查询租户已分配资源:
SELECT sum(c.max_cpu), sum(c.max_memory)/1024/1024/1024 FROM __all_resource_pool as a, __all_unit_config AS c WHERE a.unit_config_id=c.unit_config_id;
Note:资源池cpu共28c/20g/4T 租户已用 5c/6G 新建租户最大可用为 23c/14g(超分会报错)
创建2个资源单元(6c/8g/2T):
CREATE RESOURCE UNIT unitcaip max_cpu = 8, max_memory = '8G', min_memory = '8G', max_iops = 100000, min_iops = 100000, max_session_num = 30000, max_disk_size = '2000G';
CREATE RESOURCE UNIT unitsixlens max_cpu = 8, max_memory = '6G', min_memory = '6G', max_iops = 100000, min_iops = 100000, max_session_num = 30000, max_disk_size = '2000G';
查看新创建的资源单元:
SELECT unit_config_id,name,max_cpu,min_cpu,max_memory,min_memory,max_disk_size FROM __all_unit_config;
创建2个资源池:
CREATE RESOURCE POOL poolcaip UNIT = 'unitcaip', UNIT_NUM = 1,ZONE_LIST = ('zone1', 'zone2', 'zone3');
CREATE RESOURCE POOL poolsixlens UNIT = 'unitsixlens', UNIT_NUM = 1,ZONE_LIST = ('zone1', 'zone2', 'zone3');
创建2个租户:
create tenant tenantcaip resource_pool_list=('poolcaip'), charset=utf8mb4, replica_num=3, zone_list('zone1', 'zone2', 'zone3'), primary_zone=RANDOM, locality='F@zone1,F@zone2,F@zone3' set variables ob_compatibility_mode='mysql', ob_tcp_invited_nodes='%';
create tenant tenantsixlens resource_pool_list=('poolsixlens'), charset=utf8mb4, replica_num=3, zone_list('zone1', 'zone2', 'zone3'), primary_zone=RANDOM, locality='F@zone1,F@zone2,F@zone3' set variables ob_compatibility_mode='mysql', ob_tcp_invited_nodes='%';
查看创建成功的租户:
MySQL [oceanbase]> select tenant_id,tenant_name,primary_zone from __all_tenant;
登录新创建的2个租户(默认租户密码为空):
$ obclient -h172.20.2.119 -uroot@tenantcaip#ob_cluster -P2883 -c -A oceanbase
MySQL [oceanbase]> alter user root identified by 'Pwd123#'; --设置租户tenantcaip 的root密码
$ obclient -h172.20.2.119 -uroot@tenantsixlens#ob_cluster -P2883 -c -A oceanbase
MySQL [oceanbase]> alter user root identified by 'Pwd123#'; --设置租户tenantsixlens 的root密码
分别创建用户并授权:
$ obclient -h172.20.2.119 -uroot@tenantcaip#ob_cluster -pPwd123# -P2883 -c -A oceanbase
MySQL [oceanbase]> CREATE USER 'usercaip' IDENTIFIED BY ' Pwd123#'; --创建用户并设置密码
MySQL [oceanbase]> SELECT user FROM mysql.user; --查看创建成功的用户
MySQL [oceanbase]> grant all on *.* to 'usercaip' WITH GRANT OPTION; --授权
MySQL [oceanbase]> show grants for usercaip; --查看授权
用于登录测试:
obclient -h172.20.2.119 -uusercaip@tenantcaip#ob_cluster -pPwd123# -P2883 -c -A oceanbase
$ obclient -h172.20.2.119 -uroot@tenantsixlens#ob_cluster -pPwd123# -P2883 -c -A oceanbase
MySQL [oceanbase]> CREATE USER 'usersixlens' IDENTIFIED BY ' Pwd123#'; --创建用户并设置密码
MySQL [oceanbase]> grant all on *.* to 'usersixlens' WITH GRANT OPTION; --授权
MySQL [oceanbase]> show grants for usersixlens; --查看授权
MySQL [oceanbase]> SELECT user FROM mysql.user; --查看创建成功的用户
用于登录测试:
$ obclient -h172.20.2.119 -uusersixlens@tenantcaip#ob_cluster -pPwd123# -P2883 -c -A oceanbase
连接白名单设置(否则只能127登录)
$ obclient -h172.20.2.119 -uroot@sys#ob_cluster -p Pwd123# -P2883 -A -c oceanbase -- sys租户
ALTER TENANT tenantsixlens SET VARIABLES ob_tcp_invited_nodes='%';
随便一个租户下的用户登录OB集群测试建库建表:
$ obclient -h172.20.2.119 -uusersixlens@tenantcaip#ob_cluster -pPwd123# -P2883 -c -A oceanbase
MySQL [oceanbase]> create database sixlens;
MySQL [sixlens]> CREATE TABLE sixlens (id int,name varchar(20));
MySQL [sixlens]> insert into sixlens(id,name) values('20211212',"六棱镜");
5、优化部分:
一、sys租户优化部分
$ obclient -h172.20.2.119 -uroot@sys#ob_cluster -p123456 -P2883 -A -c oceanbase
1、OB占系统总内存的比例,提高OB可用的内存量。默认值是 80, 主机内存大于 256G 时,这个可以设置到 90,最大不要超过 90
alter system set memory_limit_percentage = 90; --百分比
2、alter system set memstore_limit_percentage = 55; -- memstore占租户的内存比
3、alter system set freeze_trigger_percentage = 40; --启动major/minor freeze的时机 转存阀值
4、minor freeze的次数,尽量不在测试期间触发major freeze。默认是0,可以设置非0的数字,100代表合并100次后进行转储
alter system set minor_freeze_times = 100;
4、 alter system set minor_warm_up_duration_time = 0; -- 加快minor freeze
5、 在memstore的内存使用率达到90%时开启写入限速。默认是100,不开启限速
alter system set writing_throttling_trigger_percentage=85; --租户级别设置(有几个租户设置几次)
6、alter system set trace_log_slow_query_watermark='100s'; --查询100秒后未出结果即为慢查询默认是1秒
7、hash join 的时候用到,跟hash join 原理有关。 如果确认业务查询hash join很多,或者数据集很大,同时又有hash join报内存不足,那就调大一些,推荐1G
alter system set _hash_area_size='1g';
8、-- 从默认的90调整到100,提高转储的IO使用上限。
alter system set sys_bkgd_io_high_percentage=100; --默认50
alter system set sys_bkgd_io_low_percentage=100; --默认0
9、alter system set enable_merge_by_turn = false; -- 关闭轮转合并
10、增大mini_merge的线程数,期望提高mini_merge的速度(默认值为3)。调大为8以后,发现会导致压测中CPU使用率有时飙升至90%,对性能有影
alter system set _mini_merge_concurrency = 8;
11、alter system set merge_thread_count = 32; -- 增大合并的线程数。默认是0
Note: show parameters like ' memstore_limit_percentage '; --查看相关参数
二、业务租户优化部分
obclient -h172.20.2.119 -uroot@tenantcaip#ob_cluster -p Pwd123# -P2883 -c -A oceanbase
obclient -h172.20.2.119 -uroot@tenantsixlens#ob_cluster -p Pwd123# -P2883 -c -A oceanbase
set global ob_query_timeout=36000000000;
set global ob_trx_timeout=36000000000;
set global max_allowed_packet=67108864;
set global secure_file_priv="";
set global ob_trx_idle_timeout = 36000000000;
set global ob_trx_lock_timeout = 10000000;
set global ob_sql_work_area_percentage = 30;
set global undo_retention = 3000;
show global variables like '%timeout%'; --查看相关变量值
6、常用命令:
1、查看资源分布信息:
select t1.name resource_pool_name, t2.`name` unit_config_name, t2.max_cpu, t2.min_cpu, t2.max_memory/1024/1024/1024 max_mem_gb, t2.min_memory/1024/1024/1024 min_mem_gb, t3.unit_id, t3.zone, concat(t3.svr_ip,':',t3.`svr_port`) observer,t4.tenant_id, t4.tenant_name from __all_resource_pool t1 join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id) join __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`) left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id) order by t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id;
2、 SELECT * FROM __all_server; --查看集群状态
Note:with_rootserver为1的节点即为当前集群的rootserver
3、查看集群资源单元unit配置情况
select unit_config_id,name,max_cpu,min_cpu,round(max_memory/1024/1024/1024) max_mem_gb, round(min_memory/1024/1024/1024) min_mem_gb, round(max_disk_size/1024/1024/1024) max_disk_size_gb from __all_unit_config order by unit_config_id;
4、更改相关资源配置:
alter resource unit sys_unit_config max_cpu=4, min_cpu=4;
alter resource unit sys_unit_config max_memory='8G', min_memory='8G' ;
5、查询磁盘相关:
select svr_ip, round(total_size/1024/1024/1024) total_size_gb, round(free_size/1024/1024/1024) free_size_gb, round((total_size-free_size)/1024/1024/1024) used_size_gb from __all_virtual_disk_stat;
6、查询所有租户总磁盘空间使用率 --未使用查询为空
select sum(data_size)/1024/1024/1024,sum(required_size)/1024/1024/1024,svr_ip,svr_port from __all_virtual_meta_table group by svr_ip,svr_port;
7、查询指定租户使用磁盘空间 --注意替换“tenant_id=1001/1002” 无数据查询结果为空
select sum(data_size)/1024/1024/1024,sum(required_size)/1024/1024/1024,svr_ip,svr_port from __all_virtual_meta_table where tenant_id=1001 group by svr_ip,svr_port;
8、查询所有租户占用的总磁盘空间
select tenant_id,sum(data_size)/1024/1024/1024,sum(required_size)/1024/1024/1024,svr_ip,svr_port from __all_virtual_meta_table group by tenant_id;
Note:租户的配额只有cpu和内存生效的,磁盘配额不生效 磁盘是用datafile size做整体限制的,不是按照租户限制的 任意一个租户都可以把整体的磁盘空间写满
9、查看总计和可分配资源:
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, round(a.disk_total/1024/1024/1024) disk_total_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, usec_to_time(b.stop_time) stop_time, b.build_version from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip;
Note: mem_total内存+system_memory等于memory_limit的大小
10、查看总计和已经被分配的资源:
select zone, svr_ip, svr_port,inner_port, cpu_total, cpu_assigned,round(mem_total/1024/1024/1024) mem_total_gb,round(mem_assigned/1024/1024/1024) mem_ass_gb,round(disk_total/1024/1024/1024) disk_total_gb,unit_num, substr(build_version,1,6) version from __all_virtual_server_stat order by zone, svr_ip, inner_port;
11、查看租户的增量内存使用情况
SELECT tenant_id, ip, round(active/1024/1024/1024) active_gb, round(total/1024/1024/1024) total_gb, round(freeze_trigger/1024/1024/1024) freeze_trg_gb, round(mem_limit/1024/1024/1024) mem_limit_gb, freeze_cnt , round((active/freeze_trigger),2) freeze_pct, round(total/mem_limit, 2) mem_usage FROM `gv$memstore` WHERE tenant_id =1001 ORDER BY tenant_id, ip;
total_gb 表示总内存,active_gb 表示当前未转储的内存,freeze_trg_gb 表示内存转储的阈值,mem_limit_gb 表示能用的最大的增量内存(超过就报内存不足),freeze_cnt 表示转储次数。freeze_pct表示未转储的内存占转储阈值的比例,mem_usage 表示增量内存总的使用比例(到100% 就报内存不足)。
Note:mem_usage:使用率达1.0就是百分之百
12、查看 OB 集群发生了什么事件
SELECT DATE_FORMAT(gmt_create, '%b%d %H:%i:%s') gmt_create_ , module, event, name1, value1, name2, value2, rs_svr_ip,name3,value3,name4,value4 FROM __all_rootservice_event_history WHERE 1 = 1 AND module IN ('daily_merge') AND module NOT IN ('leader_coordinator') and event not like '%finish_backup%' ORDER BY gmt_create DESC LIMIT 100;
——————————未完待续