oceanbase
243 строки · 6.2 Кб
1/**
2* Copyright (c) 2021 OceanBase
3* OceanBase CE is licensed under Mulan PubL v2.
4* You can use this software according to the terms and conditions of the Mulan PubL v2.
5* You may obtain a copy of Mulan PubL v2 at:
6* http://license.coscl.org.cn/MulanPubL-2.0
7* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10* See the Mulan PubL v2 for more details.
11*/
12
13#define USING_LOG_PREFIX RS_LB
14
15#include "ob_root_balancer.h"
16
17#include "lib/ob_define.h"
18#include "lib/mysqlclient/ob_mysql_proxy.h"
19#include "lib/stat/ob_diagnose_info.h"
20#include "share/config/ob_server_config.h"
21#include "share/schema/ob_multi_version_schema_service.h"
22#include "share/ob_unit_replica_counter.h"
23#include "rootserver/ob_rs_event_history_table_operator.h"
24#include "rootserver/ob_root_service.h"
25#include "observer/ob_server_struct.h"
26#include "ob_unit_manager.h"
27#include "ob_balance_info.h"
28
29namespace oceanbase
30{
31
32using namespace common;
33using namespace share;
34using namespace share::schema;
35using namespace obrpc;
36namespace rootserver
37{
38using namespace balancer;
39
40int64_t ObRootBalanceIdling::get_idle_interval_us()
41{
42const int64_t min_idle_time = 10 * 1000000;
43return min_idle_time;
44}
45
46ObRootBalancer::ObRootBalancer()
47: ObRsReentrantThread(true), inited_(false), active_(0), idling_(stop_, *this),
48server_balancer_(),
49disaster_recovery_worker_(stop_),
50rootservice_util_checker_(stop_)
51{
52}
53
54ObRootBalancer::~ObRootBalancer()
55{
56}
57
58int ObRootBalancer::init(common::ObServerConfig &cfg,
59share::schema::ObMultiVersionSchemaService &schema_service,
60ObUnitManager &unit_mgr,
61ObServerManager &server_mgr,
62ObZoneManager &zone_mgr,
63ObSrvRpcProxy &rpc_proxy,
64ObAddr &self_addr,
65ObMySQLProxy &sql_proxy,
66ObDRTaskMgr &dr_task_mgr)
67{
68int ret = OB_SUCCESS;
69static const int64_t root_balancer_thread_cnt = 1;
70if (inited_) {
71ret = OB_INIT_TWICE;
72LOG_WARN("root balancer already inited", K(ret));
73} else if (OB_UNLIKELY(nullptr == GCTX.lst_operator_)) {
74ret = OB_ERR_UNEXPECTED;
75LOG_WARN("lst_operator_ ptr is null", KR(ret));
76} else if (OB_FAIL(server_balancer_.init(schema_service, unit_mgr,
77zone_mgr, server_mgr, sql_proxy))) {
78LOG_WARN("init failed", K(ret));
79} else if (OB_FAIL(create(root_balancer_thread_cnt, "RootBalance"))) {
80LOG_WARN("create root balancer thread failed", K(ret), K(root_balancer_thread_cnt));
81} else if (OB_FAIL(disaster_recovery_worker_.init(
82self_addr, cfg, zone_mgr,
83dr_task_mgr, *GCTX.lst_operator_, schema_service, rpc_proxy, sql_proxy))) {
84LOG_WARN("fail to init disaster recovery worker", KR(ret));
85} else if (OB_FAIL(rootservice_util_checker_.init(
86unit_mgr, zone_mgr, *GCTX.rs_rpc_proxy_, self_addr, schema_service, sql_proxy, *GCTX.lst_operator_))) {
87LOG_WARN("fail to init rootservice util checker", KR(ret));
88} else {
89inited_ = true;
90}
91return ret;
92}
93
94int ObRootBalancer::idle() const
95{
96int ret = OB_SUCCESS;
97if (!inited_) {
98ret = OB_NOT_INIT;
99LOG_WARN("not init", K(ret));
100} else if (OB_FAIL(idling_.idle())) {
101LOG_WARN("idle failed", K(ret));
102} else {
103LOG_INFO("root balance idle", "idle_time", idling_.get_idle_interval_us());
104}
105return ret;
106}
107
108void ObRootBalancer::wakeup()
109{
110if (!inited_) {
111LOG_WARN_RET(OB_NOT_INIT, "not init");
112} else {
113idling_.wakeup();
114}
115}
116
117void ObRootBalancer::stop()
118{
119int ret = OB_SUCCESS;
120if (!inited_) {
121ret = OB_NOT_INIT;
122LOG_WARN("not init", K(ret));
123} else {
124ObRsReentrantThread::stop();
125idling_.wakeup();
126}
127}
128
129int ObRootBalancer::check_stop() const
130{
131int ret = OB_SUCCESS;
132if (!inited_) {
133ret = OB_NOT_INIT;
134LOG_WARN("not init", K(ret));
135} else {
136ret = stop_ ? OB_CANCELED : OB_SUCCESS;
137}
138return ret;
139}
140
141void ObRootBalancer::set_active()
142{
143const int64_t old_val = ATOMIC_SET(&active_, 1);
144UNUSED(old_val);
145wakeup();
146}
147
148void ObRootBalancer::run3()
149{
150LOG_INFO("root balance start");
151int ret = OB_SUCCESS;
152if (!inited_) {
153ret = OB_NOT_INIT;
154LOG_WARN("not init", K(ret));
155} else if (OB_FAIL(do_balance())) {
156LOG_WARN("all balance failed", K(ret));
157}
158LOG_INFO("root balance stop", K(ret), K(stop_));
159}
160
161int ObRootBalancer::do_balance()
162{
163int ret = OB_SUCCESS;
164int64_t failed_times = 0;
165if (!inited_) {
166ret = OB_NOT_INIT;
167LOG_WARN("not inited", K(ret));
168}
169
170ObArray<uint64_t> all_tenant;
171while (OB_SUCC(ret) && !stop_) {
172update_last_run_timestamp();
173
174if (!ATOMIC_LOAD(&active_)) {
175if (OB_FAIL(idle())) {
176LOG_WARN("idle failed", K(ret));
177break;
178} else {
179continue;
180}
181}
182if (OB_FAIL(all_balance())) {
183failed_times++;
184LOG_WARN("do balance round failed", K(ret), K(failed_times));
185ret = OB_SUCCESS;
186EVENT_ADD(RS_BALANCER_FAIL_COUNT, 1);
187} else {
188failed_times = 0;
189EVENT_ADD(RS_BALANCER_SUCC_COUNT, 1);
190}
191
192// idle after success or failed 2 times
193if (0 == failed_times || failed_times >= 2) {
194if (OB_FAIL(idle())) {
195LOG_WARN("idle failed", K(ret));
196}
197}
198}
199return ret;
200}
201
202int ObRootBalancer::all_balance()
203{
204int ret = OB_SUCCESS;
205int tmp_ret = OB_SUCCESS;
206if (!inited_) {
207ret = OB_NOT_INIT;
208LOG_WARN("not init", K(ret));
209} else {
210if (OB_SUCC(ret)) {
211if (OB_FAIL(disaster_recovery_worker_.try_disaster_recovery())) {
212LOG_WARN("fail to try disaster recovery", KR(ret));
213}
214}
215
216if (OB_SUCC(ret)) {
217if (OB_FAIL(rootservice_util_checker_.rootservice_util_check())) {
218LOG_WARN("fail to do rootservice util check", KR(ret));
219}
220}
221
222if (OB_SUCC(ret)) {
223if (OB_SUCCESS != (tmp_ret = server_balancer_.balance_servers())) {
224LOG_WARN("do unit balance failed", K(tmp_ret));
225}
226}
227if (OB_SUCC(ret)) {
228if (OB_FAIL(server_balancer_.tenant_group_balance())) {
229LOG_WARN("fail to do tenant group balance", KR(ret));
230}
231}
232}
233return ret;
234}
235
236int64_t ObRootBalancer::get_schedule_interval() const
237{
238return idling_.get_idle_interval_us();
239}
240
241
242} // end namespace rootserver
243} // end namespace oceanbase
244