前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过MariaDB MaxScale 实现一份数据同时写入 MongoDB 和 MySQL,建立双写机制。

通过MariaDB MaxScale 实现一份数据同时写入 MongoDB 和 MySQL,建立双写机制。

原创
作者头像
贺春旸的技术博客
发布2024-09-09 08:41:09
1640
发布2024-09-09 08:41:09
举报
文章被收录于专栏:DBA 平台和工具

介绍

MariaDB MaxScale的NoSQL协议模块是一个强大而独特的功能,它允许使用

MongoDB协议与MariaDB数据库进行交互。

以下是该模块的主要特点:

1.协议转换:

  • 将MongoDB的查询语言和操作转换为SQL语句。
  • 使得应用程序可以使用MongoDB的驱动程序与MariaDB/MySQL通信。

2.无缝集成:

  • 允许现有的MongoDB应用程序直接连接到MariaDB/MySQL,无需修改应用程序代码。
  • 简化了从MongoDB向MariaDB/MySQL的迁移过程。
MaxScale to MongoDB架构示意图
MaxScale to MongoDB架构示意图

应用场景

需求:希望实现一份数据同时写入 MongoDB 和 MySQL(用于运营分析),建立双写机制。以往在没有 MariaDB MaxScale 的情况下,这通常需要大量的代码重构。而如今,通过 MariaDB MaxScale 的 NoSQL 协议模块,能够实现将 MongoDB 中的数据无缝迁移至 MySQL,无需修改任何现有代码。

生产环境架构图
生产环境架构图

安装与部署

1)下载与安装 MaxScale

代码语言:bash
复制
shell> wget https://dlm.mariadb.com/3843223/MaxScale/24.02.2/yum/centos/7/x86_64/maxscale-24.02.2-1.rhel.7.x86_64.rpm
shell> yum install maxscale-24.02.2-1.rhel.7.x86_64.rpm -y

2)配置 MaxScale 支持 MongoDB协议

代码语言:txt
复制
环境: 192.168.176.204 - MaxScale
      192.168.198.239 - MariaDB

1.创建MaxScale配置文件

代码语言:bash
复制
shell> vim /etc/maxscale.cnf
代码语言:plaintext
复制
[maxscale]
threads=auto
admin_secure_gui=false
admin_host=0.0.0.0

[server1]
type=server
address=192.168.198.239
port=4309
#protocol=MySQLBackend
protocol=MariaDBBackend


[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1
user=admin
password=123456
monitor_interval=2s


[Read-Write-Service]
type=service
router=readwritesplit
servers=server1
user=admin
password=123456
enable_root_user=1


[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=mariadbprotocol
port=4006


[MongoDB-Listener]
type=listener
service=Read-Write-Service
protocol=nosqlprotocol
nosqlprotocol.user=admin
nosqlprotocol.password=123456
#############################################
## 第一次要设置false,然后创建账号
## db.createUser({user:"admin",pwd:"123456",roles:[{role:"dbOwner",db:"test
"}]})
## 然后再修改为true,并重启maxscale
nosqlprotocol.authentication_required=false
nosqlprotocol.authorization_enabled=false
#############################################
port=17017

注:

首次启动 MaxScale 服务时,需要将以下两个参数设置为 false:nosqlprotocol.authentication_required=false

nosqlprotocol.authorization_enabled=false

此操作的目的是先通过非认证模式登录 17017 端口,然后再创建应用所需的访问账号。

  • 请确保后端MariaDB/MySQL服务启动正常,且已存在admin账号,权限为ALL

2.启动MaxScale

代码语言:bash
复制
shell> systemctl start maxscale

shell> systemctl status maxscale
● maxscale.service - MariaDB MaxScale Database Proxy
   Loaded: loaded (/usr/lib/systemd/system/maxscale.service; enabled; vendo
r preset: disabled)   Active: active (running) since Fri 2024-09-06 14:51:06 CST; 8h ago
  Process: 130360 ExecStart=/usr/bin/maxscale (code=exited, status=0/SUCCES
S) Main PID: 130361 (maxscale)
   CGroup: /system.slice/maxscale.service
           └─130361 /usr/bin/maxscale

3.创建Mongo连接账号,提供给应用程序访问使用

代码语言:bash
复制
shell> mongosh --port 17017

在 test 数据库中创建账号 admin,密码为 123456,并赋予 dbOwner 权限:

代码语言:javascript
复制
use test
db.createUser({user:"admin",pwd:"123456",roles:[{role:"dbOwner",db:"test"}]})

此命令将为 test 数据库创建一个具有 dbOwner 权限的管理员账号。

4.以认证模式登录 17017 端口

编译maxscale.cnf配置文件,将下面的参数值修改为true

nosqlprotocol.authentication_required=true

nosqlprotocol.authorization_enabled=true

注:需重启MaxScale服务生效。

代码语言:bash
复制
shell> systemctl restart maxscale

5.连接MongoDB协议17017端口

代码语言:bash
复制
shell> mongosh mongodb://admin:123456@127.0.0.1:17017/test --authenticationDatabase test

1.插入数据

代码语言:javascript
复制
db.t2.insert(
{"age": 45, "name": "中年大叔", "hobby": ["美食", "摩旅", "游泳", "电影", "实现50岁退休"], "address": "北京"}
)

此时,你回到后端MariaDB/MySQL数据库里,已经发现t2表已经创建,表结构如下:

代码语言:javascript
复制
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` varchar(35) GENERATED ALWAYS AS (json_compact(json_extract(`doc`,'$.
_id'))) VIRTUAL,  `doc` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHE
CK (json_valid(`doc`)),  UNIQUE KEY `id` (`id`),
  CONSTRAINT `id_not_null` CHECK (`id` is not null)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

2.查询数据

代码语言:sql
复制
mysql> select * from t2\G
*************************** 1. row ***************************
 id: {"$oid":"66dab9b9fc7f8c8fff4a7bcf"}
doc: { "_id" : { "$oid" : "66dab9b9fc7f8c8fff4a7bcf" }, "age" : 45.0, "name" : "中年大叔", "hobby" : [ "美食", "摩旅", "游泳", "电影", "实现50岁退休" ]
, "address" : "北京" }1 row in set (0.00 sec)

用MySQL的JSON函数查询数据

代码语言:sql
复制
mysql> SELECT 
    ->     JSON_UNQUOTE(JSON_EXTRACT(doc, '$.name')) AS name,
    ->     JSON_EXTRACT(doc, '$.age') AS age,
    ->     JSON_EXTRACT(doc, '$.hobby') AS hobby
    -> FROM t2;
+--------------+------+---------------------------------------------------------------+
| name         | age  | hobby                                                         |
+--------------+------+---------------------------------------------------------------+
| 中年大叔      | 45.0 | ["美食", "摩旅", "游泳", "电影", "实现50岁退休"]                 |
+--------------+------+---------------------------------------------------------------+
1 row in set (0.00 sec)

至此大功告成。

总结

MariaDB MaxScale NoSQL协议模块的核心优势在于其卓越的适应性和效率。它巧妙地架起了NoSQL和SQL世界之间的桥梁,使得组织能够在不改变现有MongoDB应用代码的情况下,实现向MySQL的无缝过渡和双写操作。这一创新极大地简化了数据库基础架构,显著降低了维护成本和复杂性。

更为重要的是,这个模块释放了开发团队的生产力。通过消除处理复杂数据层转换的需求,开发人员可以将更多精力集中在核心业务逻辑的开发上。这不仅加快了项目交付速度,还提高了代码质量和创新能力。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 1.协议转换:
      • 2.无缝集成:
      • 应用场景
      • 安装与部署
        • 1)下载与安装 MaxScale
          • 2)配置 MaxScale 支持 MongoDB协议
            • 1.创建MaxScale配置文件
            • 2.启动MaxScale
            • 3.创建Mongo连接账号,提供给应用程序访问使用
            • 4.以认证模式登录 17017 端口
            • 5.连接MongoDB协议17017端口
            • 1.插入数据
            • 2.查询数据
        • 总结
        相关产品与服务
        云数据库 MySQL
        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档