MySQL 9.2.0
Source Code Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
cluster_metadata.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2016, 2024, 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 designed to work 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 either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24*/
25
26#ifndef ROUTER_CLUSTER_METADATA_INCLUDED
27#define ROUTER_CLUSTER_METADATA_INCLUDED
28
30
31#include <stdexcept>
32
33#include "config_generator.h"
36#include "socket_operations.h"
37
38namespace mysqlrouter {
39
41 std::vector<std::string> metadata_servers;
42 std::string cluster_id;
43 // GR name for GR cluster
45 // name of the cluster (or clusterset in case of the clusterset)
46 std::string name;
47 // whether this cluster is a primary cluster in case it is a member of a
48 // ClusterSet
49 bool is_primary{false};
50
51 std::string get_cluster_type_specific_id() const {
54 }
55};
56
57using OptionsMap = std::map<std::string, std::string>;
58
60 public:
65 : mysql_(mysql),
66 socket_operations_(sockops),
67 schema_version_(schema_version) {}
68
69 virtual ~ClusterMetadata() = default;
70
72
73 /** @brief Checks if Router with given id is already registered in metadata
74 * database, and belongs to our machine
75 *
76 * @param router_id Router id
77 * @param hostname_override If non-empty, this hostname will be used instead
78 * of getting queried from OS
79 *
80 * @throws LocalHostnameResolutionError(std::runtime_error) on hostname query
81 * failure
82 * @throws std::runtime_error if router_id doesn't exist, or is associated
83 * with a different host
84 * @throws MySQLSession::Error(std::runtime_error) on database error
85 */
87 const uint32_t router_id, const std::string &hostname_override = "") = 0;
88
89 /** @brief Registers Router in metadata database
90 *
91 * @param router_name Router name
92 * @param overwrite if Router name is already registered, allow this
93 * registration to be "hijacked" instead of throwing
94 * @param hostname_override If non-empty, this hostname will be used instead
95 * of getting queried from OS
96 *
97 * @returns newly-assigned router_id
98 *
99 * @throws LocalHostnameResolutionError(std::runtime_error) on hostname query
100 * failure, std::runtime_error on other failure
101 */
102 virtual uint32_t register_router(
103 const std::string &router_name, const bool overwrite,
104 const std::string &hostname_override = "") = 0;
105
106 virtual void update_router_info(
107 const uint32_t router_id, const std::string &cluster_id,
108 const std::string &target_cluster, const std::string &rw_endpoint,
109 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
110 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
111 const std::string &username, const std::string &local_cluster) = 0;
112
113 virtual std::vector<std::string> get_routing_mode_queries() = 0;
114
115 /** @brief Verify that host is a valid metadata server
116 *
117 *
118 * @throws MySQLSession::Error On error.
119 * @throws std::runtime_error On error.
120 * @throws std::out_of_range On error.
121 * @throws std::logic_error On error.
122 *
123 * checks that the server
124 *
125 * - has the metadata in the correct version
126 * - contains metadata for the group it's in (in case of GR cluster)
127 * (metadata server group must be same as managed group currently)
128 */
129 virtual void require_metadata_is_ok();
130
131 /** @brief Verify that host is a valid cluster member (either Group
132 * Replication or ReplicaSet cluster)
133 *
134 * @throws MySQLSession::Error On error.
135 * @throws std::runtime_error On error.
136 * @throws std::out_of_range On error.
137 * @throws std::logic_error On error.
138 */
139 virtual void require_cluster_is_ok() = 0;
140
141 virtual std::string get_cluster_type_specific_id() = 0;
142
144
146
147 virtual std::vector<std::string> get_grant_statements(
148 const std::string &new_accounts) const = 0;
149
150 virtual std::vector<std::tuple<std::string, unsigned long>>
152
153 /**
154 * Get name of the cluster that was used for bootstrap.
155 */
156 virtual std::string get_local_cluster();
157
159
160 virtual uint64_t get_view_id(
161 const std::string & /*cluster_type_specific_id*/) {
162 return 0;
163 }
164
165 protected:
166 // throws MySQLSession::Error, std::out_of_range, std::logic_error
167 virtual uint64_t query_cluster_count() = 0;
168
172};
173
175 public:
180 : ClusterMetadata(schema_version, mysql, sockops) {}
181
182 ~ClusterMetadataGR() override = default;
183
184 // For GR cluster Group Replication ID
185 std::string get_cluster_type_specific_id() override;
186
187 void require_cluster_is_ok() override;
188
189 std::vector<std::tuple<std::string, unsigned long>> fetch_cluster_hosts()
190 override;
191};
192
194 public:
199 : ClusterMetadataGR(schema_version, mysql, sockops) {}
200
201 ~ClusterMetadataGRV2() override = default;
202
205 }
206
208
209 std::vector<std::string> get_routing_mode_queries() override;
210
212
214 uint32_t router_id, const std::string &hostname_override = "") override;
215
217 const uint32_t router_id, const std::string &cluster_id,
218 const std::string &target_cluster, const std::string &rw_endpoint,
219 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
220 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
221 const std::string &username, const std::string &local_cluster) override;
222
223 uint32_t register_router(const std::string &router_name, const bool overwrite,
224 const std::string &hostname_override = "") override;
225
226 std::vector<std::string> get_grant_statements(
227 const std::string &new_accounts) const override;
228
229 protected:
230 uint64_t query_cluster_count() override;
231};
232
234 public:
236 const MetadataSchemaVersion &schema_version, MySQLSession *mysql,
237 const OptionsMap & /*options*/,
240
241 ~ClusterMetadataGRInClusterSet() override = default;
242
245 }
246
247 // nothing specific to check for ClusterSet
248 void require_metadata_is_ok() override {}
249
251
252 std::vector<std::tuple<std::string, unsigned long>> fetch_cluster_hosts()
253 override;
254
255 std::string get_local_cluster() override;
256
257 enum class TargetClusterType {
258 // target should be the cluster on which we bootstrap
260 // target should be the Priamry Cluster
262 // target should be the Cluster with the given name
264 };
265
266 std::string get_cluster_type_specific_id() override;
267 uint64_t get_view_id(const std::string &cluster_type_specific_id) override;
268
270 const uint32_t router_id, const std::string &cluster_id,
271 const std::string &target_cluster, const std::string &rw_endpoint,
272 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
273 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
274 const std::string &username, const std::string &local_cluster) override;
275
276 protected:
279};
280
282 public:
287 : ClusterMetadata(schema_version, mysql, sockops) {}
288
289 ~ClusterMetadataAR() override = default;
290
293 }
294
295 void require_cluster_is_ok() override {
296 // Nothing specific to check for ReplicaSet cluster
297 }
298
300
303 }
304
305 std::string get_cluster_type_specific_id() override;
306
307 uint64_t get_view_id(
308 const std::string & /*cluster_type_specific_id*/) override;
309
310 std::vector<std::string> get_routing_mode_queries() override;
311
313 uint32_t router_id, const std::string &hostname_override = "") override;
314
316 const uint32_t router_id, const std::string &cluster_id,
317 const std::string &target_cluster, const std::string &rw_endpoint,
318 const std::string &ro_endpoint, const std::string &rw_split_endpoint,
319 const std::string &rw_x_endpoint, const std::string &ro_x_endpoint,
320 const std::string &username, const std::string &local_cluster) override;
321
322 uint32_t register_router(const std::string &router_name, const bool overwrite,
323 const std::string &hostname_override = "") override;
324
325 std::vector<std::string> get_grant_statements(
326 const std::string &new_accounts) const override;
327
328 std::vector<std::tuple<std::string, unsigned long>> fetch_cluster_hosts()
329 override;
330
331 protected:
332 uint64_t query_cluster_count() override;
333};
334
335std::unique_ptr<ClusterMetadata> ROUTER_CLUSTER_EXPORT
336create_metadata(const MetadataSchemaVersion &schema_version,
337 MySQLSession *mysql, const OptionsMap &options = {},
340
341} // namespace mysqlrouter
342
343#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:45
static SocketOperations * instance()
Definition: socket_operations.cc:42
Definition: cluster_metadata.h:281
void require_cluster_is_ok() override
Verify that host is a valid cluster member (either Group Replication or ReplicaSet cluster)
Definition: cluster_metadata.h:295
InstanceType fetch_current_instance_type() override
Definition: cluster_metadata.h:301
std::vector< std::tuple< std::string, unsigned long > > fetch_cluster_hosts() override
Definition: cluster_metadata.cc:1122
std::vector< std::string > get_grant_statements(const std::string &new_accounts) const override
Definition: cluster_metadata.cc:1337
std::vector< std::string > get_routing_mode_queries() override
Definition: cluster_metadata.cc:1111
mysqlrouter::ClusterType get_type() override
Definition: cluster_metadata.h:291
uint64_t get_view_id(const std::string &) override
Definition: cluster_metadata.cc:1285
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
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:125
std::string get_cluster_type_specific_id() override
Definition: cluster_metadata.cc:1093
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, const std::string &local_cluster) override
Definition: cluster_metadata.cc:356
ClusterMetadataAR(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.h:283
ClusterInfo fetch_metadata_servers() override
Definition: cluster_metadata.cc:1089
~ClusterMetadataAR() override=default
uint64_t query_cluster_count() override
Definition: cluster_metadata.cc:1068
Definition: cluster_metadata.h:233
void require_metadata_is_ok() override
Verify that host is a valid metadata server.
Definition: cluster_metadata.h:248
std::string target_cluster_name_
Definition: cluster_metadata.h:278
std::vector< std::tuple< std::string, unsigned long > > fetch_cluster_hosts() override
Definition: cluster_metadata.cc:940
TargetClusterType target_cluster_type_
Definition: cluster_metadata.h:277
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, const std::string &local_cluster) override
Definition: cluster_metadata.cc:368
mysqlrouter::ClusterType get_type() override
Definition: cluster_metadata.h:243
ClusterInfo fetch_metadata_servers() override
Definition: cluster_metadata.cc:838
std::string get_cluster_type_specific_id() override
Definition: cluster_metadata.cc:971
uint64_t get_view_id(const std::string &cluster_type_specific_id) override
Definition: cluster_metadata.cc:994
std::string get_local_cluster() override
Get name of the cluster that was used for bootstrap.
Definition: cluster_metadata.cc:952
TargetClusterType
Definition: cluster_metadata.h:257
ClusterMetadataGRInClusterSet(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, const OptionsMap &, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.cc:816
Definition: cluster_metadata.h:193
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:119
std::vector< std::string > get_grant_statements(const std::string &new_accounts) const override
Definition: cluster_metadata.cc:1332
std::vector< std::string > get_routing_mode_queries() override
Definition: cluster_metadata.cc:1064
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, const std::string &local_cluster) override
Definition: cluster_metadata.cc:344
uint64_t query_cluster_count() override
Definition: cluster_metadata.cc:722
ClusterInfo fetch_metadata_servers() override
Definition: cluster_metadata.cc:794
~ClusterMetadataGRV2() override=default
ClusterMetadataGRV2(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.h:195
mysqlrouter::ClusterType get_type() override
Definition: cluster_metadata.h:203
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
InstanceType fetch_current_instance_type() override
Definition: cluster_metadata.cc:798
Definition: cluster_metadata.h:174
ClusterMetadataGR(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, mysql_harness::SocketOperationsBase *sockops=mysql_harness::SocketOperations::instance())
Definition: cluster_metadata.h:176
void require_cluster_is_ok() override
Verify that host is a valid cluster member (either Group Replication or ReplicaSet cluster)
Definition: cluster_metadata.cc:611
std::vector< std::tuple< std::string, unsigned long > > fetch_cluster_hosts() override
Definition: cluster_metadata.cc:645
~ClusterMetadataGR() override=default
std::string get_cluster_type_specific_id() override
Definition: cluster_metadata.cc:683
Definition: cluster_metadata.h:59
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:158
virtual mysqlrouter::ClusterType get_type()=0
virtual std::string get_local_cluster()
Get name of the cluster that was used for bootstrap.
Definition: cluster_metadata.cc:607
virtual uint64_t get_view_id(const std::string &)
Definition: cluster_metadata.h:160
mysqlrouter::MetadataSchemaVersion schema_version_
Definition: cluster_metadata.h:171
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:61
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, const std::string &local_cluster)=0
mysql_harness::SocketOperationsBase * socket_operations_
Definition: cluster_metadata.h:170
MySQLSession * mysql_
Definition: cluster_metadata.h:169
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:587
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:154
Definition: instrumented_condition_variable.h:32
Definition: base64.h:43
ClusterType
Definition: cluster_metadata.h:116
InstanceType
Definition: cluster_metadata.h:175
std::unique_ptr< ClusterMetadata > create_metadata(const MetadataSchemaVersion &schema_version, MySQLSession *mysql, const OptionsMap &options, mysql_harness::SocketOperationsBase *sockops)
Definition: cluster_metadata.cc:1255
std::map< std::string, std::string > OptionsMap
Definition: cluster_metadata.h:57
Definition: options.cc:57
#define ROUTER_CLUSTER_EXPORT
Definition: router_cluster_export.h:15
Definition: cluster_metadata.h:40
bool is_primary
Definition: cluster_metadata.h:49
std::string get_cluster_type_specific_id() const
Definition: cluster_metadata.h:51
std::string cluster_type_specific_id
Definition: cluster_metadata.h:44
std::string cluster_id
Definition: cluster_metadata.h:42
std::vector< std::string > metadata_servers
Definition: cluster_metadata.h:41
std::string name
Definition: cluster_metadata.h:46
Definition: cluster_metadata.h:43