MySQL 8.3.0
Source Code Documentation
cluster_metadata.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2016, 2023, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is also distributed with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have included with MySQL.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23*/
24
25#ifndef ROUTER_CLUSTER_METADATA_INCLUDED
26#define ROUTER_CLUSTER_METADATA_INCLUDED
27
29
30#include <stdexcept>
31
32#include "config_generator.h"
35#include "socket_operations.h"
36
37namespace mysqlrouter {
38
40 std::vector<std::string> metadata_servers;
41 std::string cluster_id;
42 // GR name for GR cluster
44 // name of the cluster (or clusterset in case of the clusterset)
45 std::string name;
46 // whether this cluster is a primary cluster in case it is a member of a
47 // ClusterSet
48 bool is_primary{false};
49
50 std::string get_cluster_type_specific_id() const {
53 }
54};
55
56using OptionsMap = std::map<std::string, std::string>;
57
59 public:
64 : mysql_(mysql),
65 socket_operations_(sockops),
66 schema_version_(schema_version) {}
67
68 virtual ~ClusterMetadata() = default;
69
71
72 /** @brief Checks if Router with given id is already registered in metadata
73 * database, and belongs to our machine
74 *
75 * @param router_id Router id
76 * @param hostname_override If non-empty, this hostname will be used instead
77 * of getting queried from OS
78 *
79 * @throws LocalHostnameResolutionError(std::runtime_error) on hostname query
80 * failure
81 * @throws std::runtime_error if router_id doesn't exist, or is associated
82 * with a different host
83 * @throws MySQLSession::Error(std::runtime_error) on database error
84 */
86 const uint32_t router_id, const std::string &hostname_override = "") = 0;
87
88 /** @brief Registers Router in metadata database
89 *
90 * @param router_name Router name
91 * @param overwrite if Router name is already registered, allow this
92 * registration to be "hijacked" instead of throwing
93 * @param hostname_override If non-empty, this hostname will be used instead
94 * of getting queried from OS
95 *
96 * @returns newly-assigned router_id
97 *
98 * @throws LocalHostnameResolutionError(std::runtime_error) on hostname query
99 * failure, std::runtime_error on other failure
100 */
101 virtual uint32_t register_router(
102 const std::string &router_name, const bool overwrite,
103 const std::string &hostname_override = "") = 0;
104
105 virtual void update_router_info(
106 const uint32_t router_id, const std::string &cluster_id,
107 const std::string &target_cluster, const std::string &rw_endpoint,
108 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
109 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
110 const std::string &username) = 0;
111
112 virtual std::vector<std::string> get_routing_mode_queries() = 0;
113
114 /** @brief Verify that host is a valid metadata server
115 *
116 *
117 * @throws MySQLSession::Error
118 * @throws std::runtime_error
119 * @throws std::out_of_range
120 * @throws std::logic_error
121 *
122 * checks that the server
123 *
124 * - has the metadata in the correct version
125 * - contains metadata for the group it's in (in case of GR cluster)
126 * (metadata server group must be same as managed group currently)
127 */
128 virtual void require_metadata_is_ok();
129
130 /** @brief Verify that host is a valid cluster member (either Group
131 * Replication or ReplicaSet cluster)
132 *
133 * @throws MySQLSession::Error
134 * @throws std::runtime_error
135 * @throws std::out_of_range
136 * @throws std::logic_error
137 */
138 virtual void require_cluster_is_ok() = 0;
139
140 virtual std::string get_cluster_type_specific_id() = 0;
141
143
145
146 virtual std::vector<std::string> get_grant_statements(
147 const std::string &new_accounts) const = 0;
148
149 virtual std::vector<std::tuple<std::string, unsigned long>>
151
153
154 virtual uint64_t get_view_id(
155 const std::string & /*cluster_type_specific_id*/) {
156 return 0;
157 }
158
159 protected:
160 // throws MySQLSession::Error, std::out_of_range, std::logic_error
161 virtual uint64_t query_cluster_count() = 0;
162
166};
167
169 public:
174 : ClusterMetadata(schema_version, mysql, sockops) {}
175
176 ~ClusterMetadataGR() override = default;
177
178 // For GR cluster Group Replication ID
179 std::string get_cluster_type_specific_id() override;
180
181 void require_cluster_is_ok() override;
182
183 std::vector<std::tuple<std::string, unsigned long>> fetch_cluster_hosts()
184 override;
185};
186
188 public:
193 : ClusterMetadataGR(schema_version, mysql, sockops) {}
194
195 ~ClusterMetadataGRV1() override = default;
196
199 }
200
202
203 std::vector<std::string> get_routing_mode_queries() override;
204
206 // V1 of the metadata only supported GR instances
208 }
209
211 const uint32_t router_id,
212 const std::string &hostname_override = "") override;
213
215 const uint32_t router_id, const std::string &cluster_id,
216 const std::string &target_cluster, const std::string &rw_endpoint,
217 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
218 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
219 const std::string &username) override;
220
221 uint32_t register_router(const std::string &router_name, const bool overwrite,
222 const std::string &hostname_override = "") override;
223
224 std::vector<std::string> get_grant_statements(
225 const std::string &new_accounts) const override;
226
227 protected:
228 uint64_t query_cluster_count() override;
229};
230
232 public:
237 : ClusterMetadataGR(schema_version, mysql, sockops) {}
238
239 ~ClusterMetadataGRV2() override = default;
240
243 }
244
246
247 std::vector<std::string> get_routing_mode_queries() override;
248
250
252 uint32_t router_id, const std::string &hostname_override = "") override;
253
255 const uint32_t router_id, const std::string &cluster_id,
256 const std::string &target_cluster, const std::string &rw_endpoint,
257 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
258 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
259 const std::string &username) override;
260
261 uint32_t register_router(const std::string &router_name, const bool overwrite,
262 const std::string &hostname_override = "") override;
263
264 std::vector<std::string> get_grant_statements(
265 const std::string &new_accounts) const override;
266
267 protected:
268 uint64_t query_cluster_count() override;
269};
270
272 public:
274 const MetadataSchemaVersion &schema_version, MySQLSession *mysql,
275 const OptionsMap & /*options*/,
278
279 ~ClusterMetadataGRInClusterSet() override = default;
280
283 }
284
285 // nothing specific to check for ClusterSet
286 void require_metadata_is_ok() override {}
287
289
290 std::vector<std::tuple<std::string, unsigned long>> fetch_cluster_hosts()
291 override;
292
293 enum class TargetClusterType {
294 // target should be the cluster on which we bootstrap
296 // target should be the Priamry Cluster
298 // target should be the Cluster with the given name
300 };
301
302 std::string get_cluster_type_specific_id() override;
303 uint64_t get_view_id(const std::string &cluster_type_specific_id) override;
304
306 const uint32_t router_id, const std::string &cluster_id,
307 const std::string &target_cluster, const std::string &rw_endpoint,
308 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
309 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
310 const std::string &username) override;
311
312 protected:
315};
316
318 public:
323 : ClusterMetadata(schema_version, mysql, sockops) {}
324
325 ~ClusterMetadataAR() override = default;
326
329 }
330
331 void require_cluster_is_ok() override {
332 // Nothing specific to check for ReplicaSet cluster
333 }
334
336
339 }
340
341 std::string get_cluster_type_specific_id() override;
342
343 uint64_t get_view_id(
344 const std::string & /*cluster_type_specific_id*/) override;
345
346 std::vector<std::string> get_routing_mode_queries() override;
347
349 uint32_t router_id, const std::string &hostname_override = "") override;
350
352 const uint32_t router_id, const std::string &cluster_id,
353 const std::string &target_cluster, const std::string &rw_endpoint,
354 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
355 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
356 const std::string &username) override;
357
358 uint32_t register_router(const std::string &router_name, const bool overwrite,
359 const std::string &hostname_override = "") override;
360
361 std::vector<std::string> get_grant_statements(
362 const std::string &new_accounts) const override;
363
364 std::vector<std::tuple<std::string, unsigned long>> fetch_cluster_hosts()
365 override;
366
367 protected:
368 uint64_t query_cluster_count() override;
369};
370
371std::unique_ptr<ClusterMetadata> ROUTER_LIB_EXPORT
372create_metadata(const MetadataSchemaVersion &schema_version,
373 MySQLSession *mysql, const OptionsMap &options = {},
376
377} // namespace mysqlrouter
378
379#endif // ROUTER_CLUSTER_METADATA_INCLUDED
Base class to allow multiple SocketOperations implementations (at least one "real" and one mock for t...
Definition: socket_operations.h:44
static SocketOperations * instance()
Definition: socket_operations.cc:41
Definition: cluster_metadata.h:317
void require_cluster_is_ok() override
Verify that host is a valid cluster member (either Group Replication or ReplicaSet cluster)
Definition: cluster_metadata.h:331
InstanceType fetch_current_instance_type() override
Definition: cluster_metadata.h:337
std::vector< std::tuple< std::string, unsigned long > > fetch_cluster_hosts() override
Definition: cluster_metadata.cc:1139
std::vector< std::string > get_grant_statements(const std::string &new_accounts) const override
Definition: cluster_metadata.cc:1375
std::vector< std::string > get_routing_mode_queries() override
Definition: cluster_metadata.cc:1127
mysqlrouter::ClusterType get_type() override
Definition: cluster_metadata.h:327
uint64_t get_view_id(const std::string &) override
Definition: cluster_metadata.cc:1309
uint32_t register_router(const std::string &router_name, const bool overwrite, const std::string &hostname_override="") override
Registers Router in metadata database.
Definition: cluster_metadata.cc:436
void verify_router_id_is_ours(uint32_t router_id, const std::string &hostname_override="") override
Checks if Router with given id is already registered in metadata database, and belongs to our machine...
Definition: cluster_metadata.cc:154
std::string get_cluster_type_specific_id() override
Definition: cluster_metadata.cc:1109
ClusterMetadataAR(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.h:319
ClusterInfo fetch_metadata_servers() override
Definition: cluster_metadata.cc:1105
~ClusterMetadataAR() override=default
void update_router_info(const uint32_t router_id, const std::string &cluster_id, const std::string &target_cluster, const std::string &rw_endpoint, const std::string &ro_endpoint, const std::string &rw_split_endpoint, const std::string &rw_x_endpoint, const std::string &ro_x_endpoint, const std::string &username) override
Definition: cluster_metadata.cc:277
uint64_t query_cluster_count() override
Definition: cluster_metadata.cc:1084
Definition: cluster_metadata.h:271
void require_metadata_is_ok() override
Verify that host is a valid metadata server.
Definition: cluster_metadata.h:286
std::string target_cluster_name_
Definition: cluster_metadata.h:314
std::vector< std::tuple< std::string, unsigned long > > fetch_cluster_hosts() override
Definition: cluster_metadata.cc:961
TargetClusterType target_cluster_type_
Definition: cluster_metadata.h:313
void update_router_info(const uint32_t router_id, const std::string &cluster_id, const std::string &target_cluster, const std::string &rw_endpoint, const std::string &ro_endpoint, const std::string &rw_split_endpoint, const std::string &rw_x_endpoint, const std::string &ro_x_endpoint, const std::string &username) override
Definition: cluster_metadata.cc:289
mysqlrouter::ClusterType get_type() override
Definition: cluster_metadata.h:281
ClusterInfo fetch_metadata_servers() override
Definition: cluster_metadata.cc:858
std::string get_cluster_type_specific_id() override
Definition: cluster_metadata.cc:973
uint64_t get_view_id(const std::string &cluster_type_specific_id) override
Definition: cluster_metadata.cc:995
TargetClusterType
Definition: cluster_metadata.h:293
ClusterMetadataGRInClusterSet(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, const OptionsMap &, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.cc:836
Definition: cluster_metadata.h:187
std::vector< std::string > get_routing_mode_queries() override
Definition: cluster_metadata.cc:1076
std::vector< std::string > get_grant_statements(const std::string &new_accounts) const override
Definition: cluster_metadata.cc:1365
void update_router_info(const uint32_t router_id, const std::string &cluster_id, const std::string &target_cluster, const std::string &rw_endpoint, const std::string &ro_endpoint, const std::string &rw_split_endpoint, const std::string &rw_x_endpoint, const std::string &ro_x_endpoint, const std::string &username) override
Definition: cluster_metadata.cc:255
ClusterInfo fetch_metadata_servers() override
Definition: cluster_metadata.cc:810
uint64_t query_cluster_count() override
Definition: cluster_metadata.cc:712
void verify_router_id_is_ours(const uint32_t router_id, const std::string &hostname_override="") override
Checks if Router with given id is already registered in metadata database, and belongs to our machine...
Definition: cluster_metadata.cc:142
~ClusterMetadataGRV1() override=default
uint32_t register_router(const std::string &router_name, const bool overwrite, const std::string &hostname_override="") override
Registers Router in metadata database.
Definition: cluster_metadata.cc:422
mysqlrouter::ClusterType get_type() override
Definition: cluster_metadata.h:197
ClusterMetadataGRV1(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.h:189
InstanceType fetch_current_instance_type() override
Definition: cluster_metadata.h:205
Definition: cluster_metadata.h:231
void verify_router_id_is_ours(uint32_t router_id, const std::string &hostname_override="") override
Checks if Router with given id is already registered in metadata database, and belongs to our machine...
Definition: cluster_metadata.cc:148
std::vector< std::string > get_grant_statements(const std::string &new_accounts) const override
Definition: cluster_metadata.cc:1370
std::vector< std::string > get_routing_mode_queries() override
Definition: cluster_metadata.cc:1080
uint64_t query_cluster_count() override
Definition: cluster_metadata.cc:716
ClusterInfo fetch_metadata_servers() override
Definition: cluster_metadata.cc:814
void update_router_info(const uint32_t router_id, const std::string &cluster_id, const std::string &target_cluster, const std::string &rw_endpoint, const std::string &ro_endpoint, const std::string &rw_split_endpoint, const std::string &rw_x_endpoint, const std::string &ro_x_endpoint, const std::string &username) override
Definition: cluster_metadata.cc:265
~ClusterMetadataGRV2() override=default
ClusterMetadataGRV2(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.h:233
mysqlrouter::ClusterType get_type() override
Definition: cluster_metadata.h:241
uint32_t register_router(const std::string &router_name, const bool overwrite, const std::string &hostname_override="") override
Registers Router in metadata database.
Definition: cluster_metadata.cc:429
InstanceType fetch_current_instance_type() override
Definition: cluster_metadata.cc:818
Definition: cluster_metadata.h:168
ClusterMetadataGR(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.h:170
void require_cluster_is_ok() override
Verify that host is a valid cluster member (either Group Replication or ReplicaSet cluster)
Definition: cluster_metadata.cc:592
std::vector< std::tuple< std::string, unsigned long > > fetch_cluster_hosts() override
Definition: cluster_metadata.cc:626
~ClusterMetadataGR() override=default
std::string get_cluster_type_specific_id() override
Definition: cluster_metadata.cc:664
Definition: cluster_metadata.h:58
virtual void require_cluster_is_ok()=0
Verify that host is a valid cluster member (either Group Replication or ReplicaSet cluster)
virtual std::string get_cluster_type_specific_id()=0
virtual std::vector< std::string > get_grant_statements(const std::string &new_accounts) const =0
MySQLSession & get_session()
Definition: cluster_metadata.h:152
virtual mysqlrouter::ClusterType get_type()=0
virtual uint64_t get_view_id(const std::string &)
Definition: cluster_metadata.h:154
mysqlrouter::MetadataSchemaVersion schema_version_
Definition: cluster_metadata.h:165
virtual uint64_t query_cluster_count()=0
virtual std::vector< std::string > get_routing_mode_queries()=0
ClusterMetadata(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.h:60
virtual ~ClusterMetadata()=default
virtual void verify_router_id_is_ours(const uint32_t router_id, const std::string &hostname_override="")=0
Checks if Router with given id is already registered in metadata database, and belongs to our machine...
virtual ClusterInfo fetch_metadata_servers()=0
virtual void update_router_info(const uint32_t router_id, const std::string &cluster_id, const std::string &target_cluster, const std::string &rw_endpoint, const std::string &ro_endpoint, const std::string &rw_split_endpoint, const std::string &rw_x_endpoint, const std::string &ro_x_endpoint, const std::string &username)=0
mysql_harness::SocketOperationsBase * socket_operations_
Definition: cluster_metadata.h:164
MySQLSession * mysql_
Definition: cluster_metadata.h:163
virtual InstanceType fetch_current_instance_type()=0
virtual std::vector< std::tuple< std::string, unsigned long > > fetch_cluster_hosts()=0
virtual void require_metadata_is_ok()
Verify that host is a valid metadata server.
Definition: cluster_metadata.cc:572
virtual uint32_t register_router(const std::string &router_name, const bool overwrite, const std::string &hostname_override="")=0
Registers Router in metadata database.
Definition: mysql_session.h:152
Definition: instrumented_condition_variable.h:31
Definition: dim.h:357
std::unique_ptr< ClusterMetadata > create_metadata(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, const OptionsMap &options, mysql_harness::SocketOperationsBase *sockops)
Definition: cluster_metadata.cc:1276
ClusterType
Definition: cluster_metadata.h:141
InstanceType
Definition: cluster_metadata.h:201
std::map< std::string, std::string > OptionsMap
Definition: cluster_metadata.h:56
Definition: options.cc:56
#define ROUTER_LIB_EXPORT
Definition: router_export.h:15
Definition: cluster_metadata.h:39
bool is_primary
Definition: cluster_metadata.h:48
std::string get_cluster_type_specific_id() const
Definition: cluster_metadata.h:50
std::string cluster_type_specific_id
Definition: cluster_metadata.h:43
std::string cluster_id
Definition: cluster_metadata.h:41
std::vector< std::string > metadata_servers
Definition: cluster_metadata.h:40
std::string name
Definition: cluster_metadata.h:45
Definition: cluster_metadata.h:40