ps前言: 好久没实操更新文章了,前段时间出差了一个月,刚回来,之前在虚拟化平台搭建的ob2.2集群被回收了,索性又重新申请资源搭建了一套1-1-1集群(16cpu+64g内存),之前obproxy还遗留点问题,这次顺带把obproxy也折腾下,又开始慢慢薅羊毛吧。。。
一步一步学习OceanBase系列 本篇是oceanbase2.2集群实操第五篇 :
oceanbase2.2中obproxy的安装、配置和使用。
oceanbase2.2集群实操第一篇:OceanBase 2.2集群初体验——手动安装ob2.2集群
oceanbase2.2集群实操第二篇:OceanBase2.2集群——MySQL租户的使用体验
oceanbase2.2集群实操第三篇:OceanBase2.2集群——oracle租户的使用体验
oceanbase2.2集群实操第四篇:OceanBase2.2集群之docker部署
本系列总的专栏:一步一步学习OceanBase系列
oceanbase2.2集群实操第五篇:obproxy的安装、配置和使用
一、obproxy介绍
OceanBase是一个分布式数据库,并且至少三个节点,在每个节点上都会启动一个OBServer进程,是一个单进程软件。OBServer进程启动后默认会监听两个端口(2881和2882)。其中2882是用于节点间RPC通信的,2881是对外的连接专用端口。
由于OceanBase是分布式数据库,至少有三个节点,所以每个节点都会监听2881端口,而应用数据的每个表甚至每个表的不同分区都可能存放在不同的节点上并且不固定,所以应用不可能知道数据在哪个节点,对于应用而言,应用不想记录那么多IP。
所以OceanBase提供一个反向代理软件OBProxy,OBProxy进程启动时会监听端口2883。应用只需要访问这个OBProxy即可,OBProxy会根据应用的SQL决定将请求转发到后端哪个OBServer节点(连接后端的2881端口)。
当应用想要对表进行读写操作时,必须先要定位到数据所属的表或是分区的位置(也就是指定表或是分区的paxos group Leader OBServer),然后才能执行相应的SQL DML操作。
尽管 OceanBase 的每个 OBServer 都有 SQL 路由的功能,也就是说理论上应用只要能够连接上 OceanBase 集群中任意一台 OBServer,这个 OBServer 都可以根据 SQL 找到合适的 OBServer,如果发现数据不能在当前机器节点执行,则会转发 SQL 到正确的 OBServer。由于请求可能需要进行一次远程执行,这对性能的影响是比较大的。另外频繁的转发本身也消耗了 OBServer 的资源,影响集群的整体吞吐量。
另外,OceanBase 也是以服务的形式提供给应用访问,需要一个 Proxy 模式的组件来接受应用的请求。所以,最终的结构是,OBProxy负责接收客户端的 SQL 请求,路由到OBServer,经过OBServer的计算,将结果返回给OBProxy,OBProxy最终将结果返回给客户端。OBProxy是无状态的,其本身并不存储数据,只负责路由,可以水平无限扩展。
总结一句话就是:OBProxy只做SQL路由转发,不做SQL执行计划解析、合并计算等逻辑,是很轻量级的无状态的反向代理进程。
注意,OBProxy并没有类似F5或者LVS之类的负载均衡机制,不提供VIP,其对外是自身的IP,它只做路由转发,有自己的转发规则(根据SQL里访问的表和事务来决定的),绝大部分时候并不是无脑随机转发(负载均衡的常用策略在这里没有)。
ObProxy 作为 OceanBase 的高性能且易于运维的反向代理服务器,具有防连接闪断、OBServer 宕机或升级不影响客户端正常请求、兼容 MySQL 客户端、支持 OB Oracle 客户端、支持热升级和多集群等功能。
由于OBProxy是轻量级的反向代理服务器,占用CPU、内存、网络等资源很少,所以一般部署在OBServer所在服务器上。当然,也可以独立部署在其他低配服务器上,只要网络与OBServer是互通即可。
二、obproxy的安装配置和使用
1.安装OBProxy的软件
(1).admin用户下创建目录
su - admin -c "mkdir -p /home/admin/logs/obproxy/log /home/admin/logs/obproxy/minidump"
(2).root用户安装RPM包,默认obproxy安装目录在/opt/taobao/install 下。
# rpm -ivh obproxy-1.7.3.trail-1888511.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:obproxy-1.7.3.trail-1888511.el7 ################################# [100%]
(3).修改目录权限
# chown -R admin:admin /opt/taobao
# tree /opt
/opt
└── taobao
└── install
└── obproxy-1.7.3.trail
├── bin
│ ├── obproxy
│ ├── obproxyd.sh
│ ├── obp_xflush.py
│ └── unzip.py
├── etc
├── log -> /home/admin/logs/obproxy/log
├── minidump -> /home/admin/logs/obproxy/minidump
└── tools
├── dump_syms
├── minidump.sh
├── minidump_stackwalk
└── obproxy.sym
6 directories, 10 files
#
(4).admin用户登录创建软连接
# su - admin
# cd /opt/taobao/install/
# ll
total 0
drwxr-xr-x 4 admin admin 72 Sep 15 15:58 obproxy-1.7.3.trail
# ln -s obproxy-1.7.3.trail obproxy
total 0
lrwxrwxrwx 1 admin admin 19 Sep 15 15:58 obproxy -> obproxy-1.7.3.trail
drwxr-xr-x 4 admin admin 72 Sep 15 15:58 obproxy-1.7.3.trail
2.启动OBProxy进程
admin用户登录,启动obproxy,OBProxy启动跟OBServer启动类似
注意:
其中 -r指定的是rootservice list地址,格式稍微不同(format ip:sql_port),不需要RPC Port信息,只需要observer inner_port。-p指定OBProxy的监听端口。 -c指定ob集群名称
-o指定参数 例如: -o with_config_server=false,enable_cluster_checkout=false,enable_strict_kernel_release=false,enable_metadb_used=false,enable_proxy_scramble=true,log_dir_size_threshold=10G,automatic_match_work_thread=false,work_thread_num=16,proxy_mem_limited=4G,client_max_connections=16384,enable_compression_protocol=false \
$ cd /opt/taobao/install/obproxy
$ bin/obproxy -r "192.168.110.61:2881;192.168.110.62:2881;192.168.110.63:2881" -p 2883 -o "enable_strict_kernel_release=false,enable_cluster_checkout=false" -c obdemo
listen port: 2883
optstr: enable_strict_kernel_release=false,enable_cluster_checkout=false
cluster_name: obdemo
$
$ ps -ef|grep obproxy
admin 22122 1 2 11:51 ? 00:00:00 bin/obproxy -r 192.168.110.61:2881;192.168.110.62:2881;192.168.110.63:2881 -p 2883 -o enable_strict_kernel_release=false,enable_cluster_checkout=false -c obdemo
admin 22134 9410 0 11:52 pts/0 00:00:00 grep --color=auto obproxy
$
3.创建OBProxy专用用户
OBProxy有两个账号:
root@proxysys账号:OBProxy的管理员账号,每个OBProxy进程的管理员账号相互独立,初始密码为空。首次登陆,需要参考如下命令设置密码。
# 以root@proxysys账号登录OBProxy,修改root@proxysys的密码
mysql -h127.0.0.1 -P2883 -uroot@proxysys
mysql> alter proxyconfig set obproxy_sys_password = 'admin12345';
proxyro@sys账号:OBProxy访问OB集群的账号,OBProxy需要跟OceanBase集群保持通信,首先在OB集群创建proxyro@sys用户,并设置密码,然后在OBProxy中修改observer_sys_password配置项为这个密码,即打通了OBProxy和OB集群的连通。
步骤如下:
(1). 任一节点下,登陆OB集群sys租户,创建obproxy的内部proxyro用户,并设置密码
mysql -h127.1 -uroot@sys -P2881 -p -Doceanbase
mysql> create user if not exists proxyro identified by 'admin123123';
mysql> grant select on *.* to proxyro;
(2). 以obproxy管理员账号root@proxysys登录OBProxy,设置proxyro@sys的密码为上一步OB集群创建的proxyro用户的密码
mysql -h127.0.0.1 -P2883 -uroot@proxysys -p'admin12345'
mysql> alter proxyconfig set observer_sys_password = 'admin123123';
(3). 配置obproxy参数
以obproxy管理员账号root@proxysys登录OBProxy
mysql -h127.0.0.1 -P2883 -uroot@proxysys -p'admin12345'
下面是obproxy的一些参数配置,根据实际情况修改。
show proxyconfig like '%automatic_match_work_thread%';
alter proxyconfig set enable_metadb_used=False;
alter proxyconfig set enable_proxy_scramble=True;
alter proxyconfig set proxy_mem_limited=2G;
alter proxyconfig set log_dir_size_threshold=10G;
alter proxyconfig set slow_proxy_process_time_threshold='1000ms';
alter proxyconfig set xflush_log_level=ERROR;
alter proxyconfig set syslog_level=WARN;
alter proxyconfig set enable_compression_protocol=false;
alter proxyconfig set automatic_match_work_thread=false;
alter proxyconfig set work_thread_num=16;
alter proxyconfig set client_max_connections=16384;
(4). 设置密码和配置完obproxy参数后,建议重启obproxy进程,以admin用户执行:
su - admin
pkill obproxy
cd /opt/taobao/install/obproxy && ./bin/obproxy
# 检查obproxy进程是否启动成功
ps -ef | grep obproxy
4.使用OBProxy连接ob集群
相比直连OceanBase集群,连接OBProxy的连接串主要有两点不同:(1).用户名添加了#集群名;(2).端口号为OBProxy的服务端口,一般使用2883。
另外,通过OBProxy连接OceanBase集群的命令有两种格式,区别在于用户名的格式。如:[用户名]@[租户名]#[集群名] 或 [集群名]:[租户名]:[用户名]。
mysql -h192.168.110.61 -uroot@sys#obdemo -P2883 -padmin123 -c -A oceanbase
或
mysql -h192.168.110.61 -uobdemo:sys:root -P2883 -padmin123 -c -A oceanbase
示例:
$ mysql -h192.168.110.61 -uroot@sys#obdemo -P2883 -padmin123 -c -A oceanbase
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.25 OceanBase 2.2.30 (r20200515183156-366007805d18f72e1fbd8568ada91849305c53ac) (Built May 15 2020 19:45:08)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [oceanbase]> select version();
+-----------+
| version() |
+-----------+
| 2.2.30 |
+-----------+
1 row in set (0.00 sec)
MySQL [oceanbase]> show databases;
+--------------------+
| Database |
+--------------------+
| oceanbase |
| information_schema |
| mysql |
| SYS |
| LBACSYS |
| ORAAUDITOR |
| test |
+--------------------+
7 rows in set (0.07 sec)
MySQL [oceanbase]>
MySQL [oceanbase]> exit
Bye
$
$
$
$ mysql -h192.168.110.61 -uobdemo:sys:root -P2883 -padmin123 -c -A oceanbase
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.25 OceanBase 2.2.30 (r20200515183156-366007805d18f72e1fbd8568ada91849305c53ac) (Built May 15 2020 19:45:08)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [oceanbase]> select version();
+-----------+
| version() |
+-----------+
| 2.2.30 |
+-----------+
1 row in set (0.00 sec)
MySQL [oceanbase]> show databases;
+--------------------+
| Database |
+--------------------+
| oceanbase |
| information_schema |
| mysql |
| SYS |
| LBACSYS |
| ORAAUDITOR |
| test |
+--------------------+
7 rows in set (0.05 sec)
MySQL [oceanbase]> exit
Bye
$
一步一步学习OceanBase系列
下次实操继续更新~~~
复制
总结:
OBProxy的核心能力就是路由和容灾(容灾是指数据库主备副本切换后OBProxy路由自动切换,后端换连接对应用透明),基本的规则就是强一致性读(读写访问Leader副本),一个事务的SQL会以第一个有实体表的SQL的表的Leader副本所在节点为路由目标节点,由此可能带来分布式执行计划和远程执行计划。在性能压测的时候需要重点关注SQL的执行计划类型。
OceanBase的负载均衡原理是通过调整Leader副本的分布来间接改变各个节点的负载实现的,这其中OBProxy的路由在打配合。OBProxy自身并没有负载均衡能力。多个OBProxy之间的负载均衡(还有高可用)又是靠前端F5或LVS提供。
OceanBase还持弱一致性读,可以在租户级别、会话级别或者SQL上设置。弱一致性读默认会随机选择一个备副本。通过OBProxy的LDC变量和路由变量可以实现备副本选择时就近选择,或者专门选择只读Zone里的只读副本。弱一致性读可以实现读写分离,只读副本可以降低主副本负载,这些操作对业务都不需要特别改动。
参考文章:
OceanBase 解决方案架构师–庆涛(梅老师)的文章: 从ORACLE/MySQL到OceanBase:数据访问代理
评论


