当前位置: 首页 > news >正文

河北移动:核心系统数据库成功完成整体迁移 ,实现全栈国产|OceanBase案例

1717669548

本文作者:移动通信集团河北有限公司架构规划专家,房瑞


项目背景:

中国移动通信集团河北有限公司一直在积极响应国家及集团的号召,以磐舟&磐基云原生为底座,结合国产浏览器、中间件、数据库、操作系统和服务器等,构建起完全自主掌控的支撑系统。同时,积极深化生态合作与创新,不断完善IT自主掌控评价体系,以促进产业链生态的健康发展。

2023 年 11 月,河北移动核心营业系统(唐山)完成了 OceanBase 国产数据库的上线。OceanBase 集群采用同城双机房主备架构,主集群为 X86 架构,备集群为 ARM 架构。

2024 年 5 月 20 日之前主集群(x86)对外提供服务,5 月 20 日 IT 中心顺利完成核心营业系统数据库由 x86 服务器迁移至 ARM 服务器,核心营业系统首次完成从前端应用到后端服务器全栈国产目标。自上线以来,系统运行稳定,各项性能指标与原架构持平,部分指标高于原架构,达成项目设计要求。

一、以分布式数据库为抓手,全面推动国产升级

河北移动从 2000 年至 2020 年,近二十年的时间,营业、计费等核心系统一直运行在传统集中式数据库之上,在一定的数据量下、在强大的硬件资源加持下,数据库性能表现良好,系统运行稳定。

随着近十年,业务数据量的暴涨,云计算的发展,传统集中式数据库在业务系统整体架构中越发乏力。

一是算力无法横向扩展。随着数据量的增加,原有的传统集中式数据库在算力上无法实现横向扩展,不能满足未来业务系统对性能的要求,需要引入分布式数据库解决算力动态扩容需求。

二是系统架构亟待升级。系统架构基于底层数据库架构,要满足未来 5 至 10 年的领先性,依靠数据库特性,实现应用云原生架构升级。底层数据库算力可根据业务系统动态实现扩缩容,保证系统的可扩展性,高效性、安全性要求。

加之当前核心技术的相关风险,河北移动积极探索系统架构升级方案,以分布式数据库为抓手,全面推动国产升级。

二、运营商为什么都在选择 OceanBase

2021 年,河北移动率先启动技术探寻,与 OceanBase 开展技术交流和方案验证。2022 年 5 月,开始启动核心系统数据库升级工作。2023 年 3 月,确定以营业系统(唐山)为 B 域核心系统国产化数据库实施范围。

OceanBase 原生分布式数据库满足核心库国产要求的同时 ,还适配主流的国产芯片、国产操作系统、国产中间件,可实现应用系统的全栈国产。

河北移动最终选择 OceanBase 经过多方综合评估,主要原因有以下:

第一,高度兼容传统集中式数据库语法,应用改造适配成本低。OceanBase 一套数据库引擎同时高度兼容传统集中式数据库,覆盖绝大多数常见功能,支持过程语言、触发器等高级特性,河北移动核心营业系统(唐山)对传统集中式数据库兼容率为 99.9%以上,极大降低应用的迁移成本。下表为兼容性评估:

1717669853

第二,极致降低核心库存储成本,性能无损的数据压缩。在传统的 B 树存储结构下的数据库中,数据压缩可能会给数据写入带来 CPU 的计算压力,影响写入性能。但 OceanBase 的 LSM-Tree 架构使数据的压缩只发生在合并阶段,不会影响数据的写入,加上自研混合列压缩编码能更好提高压缩率,同一业务量下相比传统集中式数据库能降低 70% - 90% 存储成本。

河北移动的核心营业系统(唐山)在传统集中式数据库端的数据量 11051G,升级到 OceanBase 后仅为 2699G,存储成本降低 76%。下表为存储空间评估:

1717669864

三、两个阶段,核心营业系统全栈上线

为保障核心营业系统能够平稳运行在全栈国产之上,安全可靠,彻底解决以往高度依赖非自研技术的风险。从系统建设目标、应用、数据库多方统筹,采用两个阶段完成建设目标。

在迁移工程中,河北移动通过借助集团磐舟能力,有效解决数据库国产过程中应用代码频繁发布难题,代码从上传-编译-镜像打包,推送到磐基 PaaS 平台,均通过可视化界面进行操作,简单直观。同时搭配流水线配置,实现全过程高效的可持续化自动运行。 

○   第一阶段完成:应用全栈+数据库国产

○   第二阶段完成:数据库由 x86 服务器迁移至 ARM 服务器

第一阶段完成:应用全栈+数据库国产

部署架构:

○   前端负载去除国外负载均衡设备,采用 DNS+OceanBase JDBC Loadbalance+代理构成,其中 DNS 提供域名服务,负载均衡能力由 JDBC Loadbalance 提供,代理 proxy 多节点部署,进行路由转发;

○   OceanBase 部署服务器全部安装国产自研操作系统 BCLinux for 欧拉 21.10 版。

○   OceanBase 主集群基于 x86 服务器部署。备集群基于 ARM 服务器部署备库。主集群采用 3-3-3 模式部署,包含 3 副本,每个副本由 3 台服务节点构成,一个副本包含一份完整的数据。

依托该架构及 OceanBase 数据库机制,实现集群内高可用能力。少数派服务器宕机、单副本不可用,集群均可正常对外部提供服务,保证应用系统稳定运行。

备集群除用于日常切换演练之外,还承担部分业务流量、当主库故障后,备库可承载全部业务流量,保障应用系统稳定运行。

1717670060

第二阶段完成:核心营业系统数据库迁移至 ARM 服务器

本次迁移基于 OceanBase 数据库容灾能力,通过在 ARM 服务器搭建容灾系统实现全自动无损数据复制,确保数据实时追平。

1717670084

5 月 20 日割接当晚,通过一键切换主备集群,实现核心营业系统数据库由 x86 服务器迁移至 ARM 服务器的高效、顺畅迁移。这也是核心营业系统首次完成从前端应用到后端服务器全栈国产目标,迁移方式顺畅稳定。

为保障本次迁移顺利完成,河北移动牵头成立了“业务专家+OceanBase 数据库架构+ARM 主机架构”小组进行攻关,在业务优化、数据库优化、ARM 主机优化三个方面制定优化措施,迁移准备工作进行验证充分。

本次割接准备工作历时 2 个月,共编制割接相关手册 5 份,准备 2 套应急方案,历经 2 轮模拟验证,发现和解决技术问题 3 项,优化迁移步骤 1 项,保证迁移过程严谨高效。

深入挖潜 ARM 国产服务器性能。充分考虑营业场景下,ARM 服务器存在性能下降风险,项目组通过优化测试模型,加大测试样本,经过 310 余次多系统混合压力测试,挖潜 ARM 服务器性能,最终确定 7 项性能优化手段。上线后,保障系统性能指标优于安全水位。

截止目前,系统指标健康,未产生业务投诉。本次数据库服务器的国产升级,为后续推进自主掌控升级奠定基础。

四、全栈国产升级后,河北移动各项收益显著

(一)先进架构满足未来 5-10 年发展需求

河北移动依托 OceanBase 的原生分布式架构,可节点横向扩展、弹性扩缩容、多租户管理、数据多副本强一致等特性,满足未来 5 至 10 年的业务发展需要。

一方面,可快速推进应用云原生架构升级。应用云原生、OceanBase 相结合实现业务负载和数据库负载全部自动弹性伸缩,具备同城双活、两地三中心单元化应用多活能力。

一方面,收获系统长期的高可用、性能稳定高效。OceanBase 数据库采用基于无共享(Shared-Nothing)的多副本架构,让整个系统没有任何单点故障,保证系统的持续可用。河北移动对核心营业系统(唐山)包括前端应用、外围渠道、后台进程、周边配套四大类共计 754 个用例进行性能压测,压测指标均优于原传统集中式数据库。上线后,应用系统稳定,数据库节点 CPU 使用率 30%左右。

(二)形成标准化的项目推广复制

随着河北移动核心营业系统(唐山)的顺利上线,沉淀了《业务系统调研方案》、《数据库部署方案》、《应用适配改造方案》、《国产库运维方案》、《系统割接方案》等一系列标准方案,使整个国产项目标准化、可复制化。

依托标准化的操作,可复制到河北移动全域业务系统中,加速推进业务系统的国产升级落地。以河北移动 CRM 系统营业 C 库为例,系统在 2 个月左右的时间可完成国产数据库上线。

(三)应用改造、存储、运维等各项成本明显降低

河北移动受益于 OceanBase 高度兼容传统集中式数据库的特性,解决了项目初期关注的三个成本因素:应用改造成本、硬件投入成本、运维成本。

○   应用改造成本基本为零:核心营业系统(唐山)对传统集中式数据库的兼容率为 99.9%以上,本次应用开发商只做极少量的应用改造,大大降低了改造成本。

○   硬件投入成本降低:原系统 11051G 的数据量迁移到 OceanBase 后只需 2699G,存储成本降低 76%。

○   运维成本降低:数据库运维人员、包括研发人员可将原传统集中式数据库的使用经验完全应用到 OceanBase 之上,减少学习成本。OceanBase 单集群多租户架构,可快速将传统集中式数据库的数据迁移至 OceanBase 统一管理运维,降低运维成本。

(四)培养核心技术骨干,形成人才梯队

通过核心系统全栈国产升级,河北移动培养出一批国产技术骨干,特别是国产数据库操作、管理和运维的人员,并形成人才梯队,实现国产自主能力,并逐步推广到全省。

相关文章:

河北移动:核心系统数据库成功完成整体迁移 ,实现全栈国产|OceanBase案例

本文作者:移动通信集团河北有限公司架构规划专家,房瑞 项目背景: 中国移动通信集团河北有限公司一直在积极响应国家及集团的号召,以磐舟&磐基云原生为底座,结合国产浏览器、中间件、数据库、操作系统和服务器等&a…...

ZKRollup

目录 ZKRollup 基本概念 运作原理 特点与优势 应用场景 典型项目 ZKRollup ZKRollup,全称为Zero-Knowledge Rollup,是一种基于零知识证明的二层扩容方案(Layer 2)。它旨在通过提高交易处理效率和降低交易成本来扩展区块链网络的能力,尤其是在以太坊等区块链平台上得…...

letcode 分类练习 树的遍历

letcode 分类练习 树的遍历 树的构建递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 层序遍历层序遍历可以解决的问题107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的…...

redisssion分布式锁

分布式锁的问题 基于setnx的分布式锁实现起来并不复杂,不过却存在一些问题。 锁误删问题 第一个问题就是锁误删问题,目前释放锁的操作是基于DEL,但是在极端情况下会出现问题。 例如,有线程1获取锁成功,并且执行完任…...

嘎嘎嘎拿到去年想要的包

一年多了 继续,把项目收尾吧 好好学前端,外企!react!从0开始,紧迫!加油!...

前奏编曲:如何编写二段式前奏

选好音源 Pianoteq 6 STAGE比较明亮些,适合做前奏的音源 确定和弦进行 比如4536251,每个小节2和弦,每个小节的和弦弹一下 优化和弦进行衔接和织体 二段式不用对和弦进行就近解决的处理,因为前奏前后要形成对比。 前半部分往…...

征服云端:Kubernetes如何让微服务与云原生技术如虎添翼

引言 在这个数字化转型的时代,微服务架构已经成为构建现代应用程序的首选方式。它不仅提高了开发效率,还增强了系统的可扩展性和灵活性。而随着云计算技术的迅猛发展,云原生的概念逐渐深入人心,它代表了一种全新的软件开发方法论…...

开源AI智能名片系统与高级机器学习技术的融合应用:重塑商务交流的未来

摘要:在数字化浪潮的推动下,人工智能(AI)技术,尤其是机器学习领域的快速发展,正深刻改变着各行各业的面貌。开源AI智能名片系统作为这一变革的先锋,通过集成并优化多种高级机器学习技术&#xf…...

Java中synchronized的偏向锁是如何减少锁开销的

偏向锁(Biased Locking)是一种优化 Java synchronized 锁的机制,旨在减少在无竞争情况下的锁开销。它通过将锁偏向于单个线程来优化锁的性能。以下是偏向锁减少锁开销的具体方式和原理: 偏向锁的工作原理 锁的初始状态: 当一个对…...

react18 + ts 使用video.js 直播.m3u8格式的视频流

一、安装依赖 我使用的video.js版本是8.17.3,从 Video.js 7.x 开始,HLS 支持被内置到了 Video.js 中所以不需要安装其他依赖 npm i video.js 二、创建VideoPlayer组件 import React, { useEffect, useRef } from react import videojs from video.js …...

使用 onBeforeRouteLeave 组合式函数提升应用的用户体验

title: 使用 onBeforeRouteLeave 组合式函数提升应用的用户体验 date: 2024/8/14 updated: 2024/8/14 author: cmdragon excerpt: 摘要:本文介绍了在Nuxtjs中使用onBeforeRouteLeave组合式函数来提升应用用户体验的方法。onBeforeRouteLeave允许在组件离开当前路…...

uni-app 吸顶方案总结

效果 页面级 uni.pageScrollTo 官方文档&#xff1a;https://uniapp.dcloud.net.cn/api/ui/scroll.html#pagescrollto 原生头部导航 uni.pageScrollTo({selector: #tabs,duration: 300 });(推荐)需要兼容自定义头部导航 <template><view id"demo1" :styl…...

【C#】知识汇总

目录 1 概述1.1 GC&#xff08;Garbage Collection&#xff09;1.1.1 为什么需要GC&#xff1f;1.1.2 GC的工作原理工作原理什么是Root&#xff1f;GC算法&#xff1a;Mark-Compact 标记压缩算法GC优化&#xff1a;Generational 分代算法 1.1.3 GC的触发时间1.1.4 如何减少垃圾…...

1、Unity【基础】3D数学

3D数学 文章目录 3D数学1、数学计算公共类Mathf1、Mathf和Math2、区别3、Mathf中的常用方法&#xff08;一般计算一次&#xff09;4、Mathf中的常用方法&#xff08;一般不停计算&#xff09;练习 A物体跟随B物体移动 2、三角函数1、角度和弧度2、三角函数3、反三角函数练习 物…...

虚拟机ubuntu22的扩容记录

这里lsblk命令能看到&#xff0c; ubuntu逻辑分区只有29G&#xff0c; 但总分区60G&#xff0c;还有接近30G未使用。 rootx:/home/x# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 63.9M 1 loop /snap/core2…...

Docker 常用配置

Docker 常用配置 1. 配置方法 修改下面位置&#xff1a; Linux&#xff1a;vim /etc/docker/daemon.jsonmacOS&#xff1a;菜单栏图标->Settings->Docker Engine 注意&#xff1a;修改完需要重启Docker Linux&#xff1a;systemctl restart dockermacOS&#xff1a;…...

通过示例了解 .NET Core 中的依赖注入

依赖注入 (DI) 是一种用于实现 IoC&#xff08;控制反转&#xff09;的设计模式&#xff0c;可以更好地解耦应用程序内的依赖关系并更轻松地管理它们。.NET Core 内置了对依赖注入的支持&#xff0c;提供了一种有效管理依赖关系的强大方法。 一.什么是依赖注入&#xff1f; 依…...

fetch、FormData上传多张图片

利用fetch方法和FormData对象上传多张图片 formdata()对象可以序列化多张图片 <html><head><meta http-equiv"content-type" content"text/html;charsetUTF-8"/><title>测试fetch和formdata上传多张图片</title></head&…...

C++STL详解(五)——list类的具体实现

一.本次所需实现的三个类及其成员函数接口 链表首先要有结点&#xff0c;因此我们需要实现一个结点类。 链表要有管理结点的结构&#xff0c;因此我们要有list类来管理结点。 链表中还要有迭代器&#xff0c;而迭代器的底层其实是指针。但是我们现有的结点类无法完成迭代器的…...

鸿蒙(API 12 Beta3版)【使用投播组件】案例应用

华为视频接入播控中心和投播能力概述** 华为视频在进入影片详情页播放时&#xff0c;支持在控制中心查看当前播放的视频信息&#xff0c;并进行快进、快退、拖动进度、播放暂停、下一集、调节音量等操作&#xff0c;方便用户通过控制中心来操作当前播放的视频。 当用户希望通…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...