MongoDB伪分布式部署(mac M2)
1. 序言
- 本博客是上一博客的进阶版:mac M2安装单机版 MongoDB 7.x,上一博客可以看做是单机、单节点部署MongoDB
- 本博客将介绍单机、多服务部署MongoDB,实际就是伪分布式部署
2. 副本集(Replica Set)方式部署
2.1 什么是副本集?
- 多节点部署、主从部署等其实都是为了 MongoDB 的高可用,支持数据多副本、读写分离等
- 较新版本的MongoDB Master/slave 被废弃,通过副本集提供高可用和数据冗余
"msg":"Master/slave replication is no longer supported"
- 一个副本集由多个节点组成,其中一个节点是主节点(Primary),其余是从节点(Secondary)
- 主节点处理所有的写操作,从节点复制主节点的数据并可以处理读操作(如果启用了读偏好)
- 副本集的特点:
- 高可用性: 如果主节点发生故障,从节点会自动选举一个新的主节点。
- 数据冗余:数据在多个节点上复制,提供数据冗余。
- 读扩展:可以配置从节点处理读操作,以减轻主节点的负载。
2.2 副本集部署
2.2.1 启动3个MongoDB服务
-
在本机以前台进程的方式启动3个 MongoDB 服务,且指定副本集为
rs0
mongod --replSet rs0 --dbpath /Users/bytedance/mongodb11/data --port 27031 --bind_ip_allmongod --replSet rs0 --dbpath /Users/bytedance/mongodb12/data --port 27032 --bind_ip_allmongod --replSet rs0 --dbpath /Users/bytedance/mongodb13/data --port 27033 --bind_ip_all
-
如果想通过配置文件部署,服务1的配置文件如下
# 数据存储相关配置 storage:dbPath: /Users/bytedance/mongodb2/datajournal:enabled: true# 网络相关配置 net:port: 27030bindIp: 0.0.0.0 # 允许从所有IP地址访问# 副本集相关配置 replication:replSetName: "rs0"# 日志相关配置 systemLog:destination: filelogAppend: truelogRotate: renamepath: /Users/xxx/mongodb11/log/mongo.log# 进程管理相关配置 processManagement:fork: true # 以守护进程方式运行(后台运行)# 安全相关配置 security:authorization: disabled # 关闭用户认证
2.2.2 初始化副本集
-
通过mongosh登录访问其中一个服务:
mongosh --port 27032
-
执行如下命令初始化副本集合:
rs.initiate({_id: "rs0",members: [{ _id: 0, host: "localhost:27031" },{ _id: 1, host: "localhost:27032" },{ _id: 2, host: "localhost:27033" }] })
-
执行
rs.status()
验证副本集状态rs0 [direct: primary] test> rs.status() {set: 'rs0',... # 其他信息省略members: [{_id: 0, # initiate 时指定的idname: 'localhost:27031',health: 1,state: 2,stateStr: 'SECONDARY', # 从节点... # 其他信息省略},{_id: 1,name: 'localhost:27032',health: 1,state: 1,stateStr: 'PRIMARY', # 主节点... # 其他信息省略},{_id: 2,name: 'localhost:27033',health: 1,state: 2,stateStr: 'SECONDARY', # 从节点... # 其他信息省略}],ok: 1,... # 其他信息省略 }
-
还可以通过
rs.isMaster()
查看当前访问的服务是不是primary节点rs0 [direct: primary] test> rs.isMaster() {... # 其他信息省略hosts: [ 'localhost:27031', 'localhost:27032', 'localhost:27033' ],setName: 'rs0',setVersion: 1,ismaster: true, # 当前访问的是primary节点(服务)secondary: false,primary: 'localhost:27032',me: 'localhost:27032',.. # 其他信息省略readOnly: false,... # 其他信息省略isWritablePrimary: true # 只能通过primary节点写入 }
2.3 副本集中数据的读写
-
从上面的信息就可以看出, 副本集的可以支持设置读写偏好、支持读写分离
-
例如,
isWritablePrimary: true
只能在primary节点写入,若在非primary节点插入数据将报错Uncaught: MongoBulkWriteError[NotWritablePrimary]: not primary
-
在primary节点插入数据
db.test_data.insertMany([{ name: "Bob", age: 25, sex: "male", city: "Los Angeles" },{ name: "Carol", age: 28, sex: "female", city: "Chicago" },{ name: "Dave", age: 35, sex: "male", city: "San Francisco" } ])
-
在任意节点查询数据
db.test_data.find({'name':"Bob"})
3. 部署分片(Sharding)集群
3.1 什么是分片?
- 在数据存储系统中,除了支持副本集(多副本存储全量数据),还支持分片(
Sharding
),MongoDB也不例外 - 分片是 MongoDB 提供的一种水平扩展机制,用于将数据分布在多个服务器上
- 分片具备以下特性:
- 水平扩展:通过将数据分布在多个分片上,解决单个服务器的存储和性能限制。
- 负载均衡:数据和请求可以在多个分片之间均匀分布。
- 高可用性:结合副本集使用,每个分片可以是一个副本集,从而提供高可用性。
3.2 副本集 vs 分片
- 相对副本集,分片会按照某种规则将数据拆分成多个split,每个split存储到相应的分片
- 以销售数据为例,形象化比喻:
- 副本集就是一个机房有多台机器,每台机器都将存储中国市场的销售数据
- 分片就是存在多个机房,每个机房存储只存储所在区域的销售数据。例如,华北机房只存储华北地区的销售数据,西南机房只存储西南地区的销售数据
- 同时,为了提供高可用和数据冗余,分片存储时,每个机房需要有多台机器,支持多副本储存该区域的销售数据
- 也就是说,一个分片就是一个副本集,分片内部通过副本集实现高可用和数据冗余机制
3.3 部署分片集群(副本集与分片的结合使用)
- 分片集群由配置服务器(Config Servers)、分片服务器(Shards)、和路由服务器(mongos)组成
- 配置服务器作为副本集:配置服务器存储集群的元数据,为了确保配置服务器的高可用性,配置服务器也通常设置为一个副本集
- 每个分片作为一个副本集:在分片集群中,每个分片通常是一个副本集。这意味着每个分片不仅能存储数据的一部分,还能提供高可用性和数据冗余。
- 路由服务器(mongos):mongos不存储数据,而是作为路由器将客户端请求路由到适当的分片,可以部署多个mongos实例以提供高可用性和负载均衡
3.3.1 部署配置服务器
-
使用如下命令,在本地启动三个配置服务器,注意提前创建好data目录
-
--configsvr
:表示这是一个配置服务器 -
--replSet rs0
:设置副本集,配置服务器的本质是一个副本集mongod --configsvr --replSet rs0 --dbpath /Users/xxx/mongodb1/data/configdb --port 27019 --bind_ip_allmongod --configsvr --replSet rs0 --dbpath /Users/xxx/mongodb2/data/configdb --port 27020 --bind_ip_allmongod --configsvr --replSet rs0 --dbpath /Users/xxx/mongodb3/data/configdb --port 27021 --bind_ip_all
-
-
访问某个配置服务,初始化副本集
mongosh --port 27019 # 访问配置服务rs.initiate({_id: "rs0",configsvr: true,members: [{ _id: 0, host: "localhost:27019" },{ _id: 1, host: "localhost:27020" },{ _id: 2, host: "localhost:27021" }] })
-
PS: 若以后台服务方式启动,上述启动方式对应的配置文件如下
storage:dbPath: /Users/xxx/mongodb1/data/configdbjournal:enabled: true # 网络相关配置 net:port: 27010bindIp: 0.0.0.0 # 允许从所有IP地址访问 # 复制集相关配置 replication:replSetName: "rs0" # 设置role:分片集群中的配置服务器 sharding:clusterRole: "configsvr" # 日志相关配置 systemLog:destination: filelogAppend: truelogRotate: renamepath: /Users/xxx/mongodb1/log/configd/mongo.log # 进程管理相关配置 processManagement:fork: true # 以守护进程方式运行(后台运行) # 安全相关配置 security:authorization: disabled # 关闭用户认证
3.3.2 部署分片服务器
shard1
-
使用如下命令,在本地启动三个分片服务器,注意提前创建好data目录
mongod --shardsvr --replSet shard1 --dbpath /Users/bytedance/mongodb1/data/shard --port 27022 --bind_ip_allmongod --shardsvr --replSet shard1 --dbpath /Users/bytedance/mongodb2/data/shard --port 27023 --bind_ip_allmongod --shardsvr --replSet shard1 --dbpath /Users/bytedance/mongodb3/data/shard --port 27024 --bind_ip_all
-
访问其中某个分片服务器,初始化分片信息
mongosh --port 27022rs.initiate({_id: "shard1",members: [{ _id: 0, host: "localhost:27022" },{ _id: 1, host: "localhost:27023" },{ _id: 2, host: "localhost:27024" }] })
shard2
-
使用如下命令,在本地启动三个分片服务器,注意提前创建好data目录
mongod --shardsvr --replSet shard2 --dbpath /Users/bytedance/mongodb1/data/shard2 --port 27025 --bind_ip_allmongod --shardsvr --replSet shard2 --dbpath /Users/bytedance/mongodb2/data/shard2 --port 27026 --bind_ip_allmongod --shardsvr --replSet shard2 --dbpath /Users/bytedance/mongodb3/data/shard2 --port 27027 --bind_ip_all
-
访问其中某个分片服务器,初始化分片信息
mongosh --port 27025rs.initiate({_id: "shard2",members: [{ _id: 0, host: "localhost:27025" },{ _id: 1, host: "localhost:27026" },{ _id: 2, host: "localhost:27027" }] })
3.3.4 部署mongos
-
先创建好mongos所需的相关目录
mkdir /Users/xxx/mongos cd /Users/xxx/mongos mkdir data log etc
-
在etc目录下创建mongos的配置文件,
mongos-config.yaml
net:bindIp: 0.0.0.0port: 27017sharding:configDB: rs0/localhost:27019,localhost:27020,localhost:27021
-
以前台方式启动mongos
mongos --config /Users/xxx/mongos/etc/mongos-config.yaml
-
访问mongos,添加分片(之前部署好的分片服务器)
mongosh --port 27017sh.addShard("shard1/localhost:27022,localhost:27023,localhost:27024") sh.addShard("shard2/localhost:27025,localhost:27026,localhost:27027")
-
通过
sh.status()
查看shard信息# 关键信息 shards [{_id: 'shard1',host: 'shard1/localhost:27022,localhost:27023,localhost:27024',state: 1,topologyTime: Timestamp({ t: 1727872634, i: 3 })},{_id: 'shard2',host: 'shard2/localhost:27025,localhost:27026,localhost:27027',state: 1,topologyTime: Timestamp({ t: 1727939236, i: 4 })} ]
3.5 启用分片
3.5.1 启用数据库分片和集合分片
-
启用数据库分片和集合分片
use admin # 一定要先切换到admin, sh.enableSharding("test")use test sh.shardCollection("test.test_data", {user_id: 1}) # user_id作为分片的key
-
验证是否成功开启集合分片
use test db.test_data.getShardDistribution()
-
若有如下输出,说明开启成功
3.5.2 插入数据并查看
-
插入100条数据
# 数据示例 -- user_id: id000001; name: name1 for (let i = 1; i <= 2000; i++) {let user_id = `id${String(i).padStart(6, '0')}`; let name = `name${i}`; db.test_data.insertOne({ user_id: user_id, name: name }); }
-
执行
sh.status()
查看分片信息,但数据只分布到了shard2,要么是集群部署存在问题,要么跟公司的 “chatGPT” 回答一样- 分片键选择不当:如果分片键的值分布不均匀,可能会导致数据集中在一个分片上。例如,如果您的分片键是一个递增的字段(如时间戳或自增 ID),那么所有新插入的数据都会集中在同一个分片上
- 数据量不足:在数据量较小的情况下,MongoDB 可能不会立即将数据分布到多个分片上。MongoDB 需要一定的数据量来决定何时进行分片 (笔者倾向于该原因)
... # 其他信息省略,可以看到 'test.test_data' 集合成功开启了分片collections: {'test.test_data': {shardKey: { user_id: 1 },unique: false,balancing: true,chunkMetadata: [ { shard: 'shard2', nChunks: 1 } ],chunks: [{ min: { user_id: MinKey() }, max: { user_id: MaxKey() }, 'on shard': 'shard2', 'last modified': Timestamp({ t: 1, i: 0 }) }],tags: []}}
-
PS: 公司的 “chatGPT” 还给出了其他的查看分片信息的方法,但无任何输出
use config db.chunks.find({ ns: "testDB.test_data" }).sort({ min: 1 }).pretty()
3.5.3 在shard2的各服务器查询数据
-
由于上面的集合只分布在shard2,现在连接shard2的任意服务器,执行如下查询命令
use test db.test_data.find({'name':"name1"})
-
均能从shard2的每个服务器查到数据,这也说明了,shard2分片自身就是一个副本集
4. 后记
- 网上查了很多MongoDB多副本部署,大部分的版本都比较低,还有
master/slave
之类的配置- MongoDB主从复制(master–>slave)环境搭建
- mongodb的主从同步配置:实战详细版(建议收藏)
- 笔者依靠公司的chartGPT完成部署后,发现这篇文章是最靠谱的:MongoDB数据库之主从复制配置实战
- 其他一些感悟
- AI真强大: 此次部署完全依靠公司的chartGPT,不懂就问、出问题也问,最后磕磕绊绊完成了部署
- 磨刀不误砍柴工: 部署分片集群时,一开始没有为认真了解分片集群的架构,不知道副本集是存储元数据的,导致部署失败
相关文章:
MongoDB伪分布式部署(mac M2)
1. 序言 本博客是上一博客的进阶版:mac M2安装单机版 MongoDB 7.x,上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB,实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集? …...
Golang | Leetcode Golang题解之第454题四数相加II
题目: 题解: func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }...
[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷
在数字艺术和创意领域,[ComfyUI]Flux以其独特的虚实结合技术,已经成为艺术家和设计师们手中的利器。今天,我们激动地宣布,[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品,经典中文元素通过AI技术重现,包…...
Linux 系统 nvm 管理node无法使用
文章目录 一、报错说明二、报错原因三、解决办法四、验证 一、报错说明 centos7服务器使用nvm安装的node之后,只要使用npm或者node,均会出现以下问题。 npm -v node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by node) node: /lib64…...
信号处理快速傅里叶变换(FFT)的学习
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来&am…...
vue3项目el-table表格行内编辑加输入框校验
核心点 1. el-form的model属性需要跟el-form-item的prop要对应 2. el-form的model属性绑定tableData 3. el-form-item的prop绑定字符串:scope.index.列名(注意有个点) 4. el-form-item需要单独设置rules属性 代码示例 <el-form :mod…...
【Node.js】内置模块FileSystem的保姆级入门讲解
作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:Vscode 本文代码都经由博主PleaSure乐事实操后得出,可以放心使用。 1.FileSystem介绍 Node.js 的 fs(filesystem)模块是一个核心模块,…...
问:LINUXWINDOWS线程CPU时间如何排序?
Linux 在Linux上,你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式,-e选项表示显示所有进程,--sort选项用于排序。 ps -e -o pid,tid,comm,…...
postgresql-重复执行相同语句,试试 prepare!
文章目录 每次你向 PostgreSQL 发送 SQL 语句时,数据库都必须对其进行解析(parse)。解析虽然很快,但如果同样的语句被解析一千次,这种操作累积起来可能会占用大量时间,而这些时间本可以用于处理其他事务。为避免这种情况ÿ…...
wpf加载带材料的3D模型(下载的3D预览一样有纹理)
背景:最近真的是忙啊,累出汁水了 整体效果: 放大可以看清砖头: 1、需要自己准备好3D模型,比如我这里是下载的这里的3D Warehouse,下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…...
【k8s之深入理解调度】调度框架扩展点理解
参考自 K8s 调度框架设计与 scheduler plugins 开发部署示例(2024) 调度插件扩展点 等待调度阶段PreEnqueuePod 处于 ready for scheduling 的阶段。 内部工作原理:sig-scheduling/scheduler_queues.md。在 Pod 被放入调度队列之前执行的插…...
音视频基础理论
1. 音频基础 1.1 音频基本概念 1.1 频率:声波的频率,即声音的音调,人类听觉的频率(音调)范围为20Hz--20KHz 1.2 振幅:即声波的响度,通俗的讲就是声音的高低,一般男生的声音振幅(响度)大于女生。 1.3 波形…...
《江苏科技大学学报(自然科学版)》
《江苏科技大学学报(自然科学版)》(双月刊,国内外公开发行)是由江苏省教育厅主管、江苏科技大学主办的理工类学术期刊,1986年创刊,国际刊号:ISSN1673-4807,国内刊号&…...
C++初学者指南-5.标准库(第二部分)–随机数生成
C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值(“抛硬币”)正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…...
Unity2017在安卓下获取GPS位置时闪退的解决办法
在Unity使用低功耗蓝牙通信(BLE)需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。 解决办法:调用原生安卓接口。 参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin,在插件中提供获取GPS位…...
OpenGL ES 索引缓冲区(4)
OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区,索引缓冲区和顶点缓冲区类似,也是显存上的一段内存,只不过上面的数据用处不同,索引缓冲区故名思义里面的数据是用于索引,主要作用是用于复用顶点缓冲区里的数据。…...
01:(寄存器开发)点亮一个LED灯
寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板,教程来源B站up“嵌入式那些事”。…...
.Net 6.0 Windows平台如何判断当前电脑是否联网
最近在工作中开发需要判断当前电脑是否联网的需求,在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍: 1.方法一(调用winAPI) [DllImport("wininet")] public static extern bool InternetGetConnec…...
微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用
Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序,并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…...
MacOS 终端执行安装 Brew
在配置新的 Mac 环境时,如果你发现终端中无法识别 brew 命令,可以按照以下步骤进行解决。 步骤 1:确保网络稳定 为了避免安装过程中出现中断,建议使用 Wi-Fi 或有线连接,不推荐使用移动网络。 步骤 2:打…...
【设计模式-解释模式】
定义 解释器模式是一种行为设计模式,用于定义一种语言的文法,并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类,使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…...
51单片机应用开发(进阶)---数码管+按键+蜂鸣器(电磁炉显示模拟)
实现目标 1、加强数码管、按键的学习,实现数码显示变量数据(四位数的显示); 2、4位数码2个按键无源蜂鸣器实现模拟电磁炉功率调节及显示; 一、内容描述 功能描述:1、开机显示电磁炉功率300,每…...
Emergency Stop (ES)
文章目录 1. 介绍2. Feature List3. 紧急停止信号触发方式3.1 Port触发紧急停止信号3.2 SMU事件触发紧急停止信号3.3 软件触发紧急停止信号 4. 应用场景4.1 Port4.2 MSC 1. 介绍 Emergency Stop (ES)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-…...
[C++][第三方库][gtest]详细讲解
目录 1.介绍2.安装3.使用1.头文件包含2.框架初始化接口3.调用测试样例4.TEST宏5.断言宏6.示例 1.介绍 gtest是一个跨平台的C单元测试框架,由Google公司发布gtest是为了在不同平台上为编写C单元测试而生成的,它提供了丰富的断言、致命和非致命判断、参数…...
【Java数据结构】 链表
【本节目标】 1. ArrayList 的缺陷 2. 链表 3. 链表相关 oj题目 一. ArrayList的缺陷 上节课已经熟悉了ArrayList 的使用,并且进行了简单模拟实现。通过源码知道, ArrayList 底层使用数组来存储元素: public class ArrayList<E>…...
前端——Ajax和jQuery
一、Ajax Ajax即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML), 通过 JS 异步的向服务器发送请 求并接收响应数据。 同步访问:当客户端向服务器发送请求时,服务器在处理的过程中,浏览器…...
C++-vector模拟实现
###vector底层相当于是数组,查看源码可以发现,这个类的私有成员变量是三个迭代器;在实现时迭代器就可以当作是vector里面的元素的指针类型; ###vector是一个类模板,实现时也应当按照这样的写法用一个模板去实现&#…...
Activity
69[toc] 1.启停活动页面 1.Activity启动和结束 从当前页面跳到新页面 startActivity(new Intent(this, ActFinishActivity.class));从当前页面返回上一个页面,相当于关闭当前页面 finish();2.Activity生命周期 官方描述生命周期 onCreate:创建活…...
【力扣 | SQL题 | 每日四题】力扣1581, 1811, 1821, 1831
今天的题目就1811这个比较难,其他非常的基础。 1. 力扣1581:进店却未进行过交易的顾客 1.1 题目: 表:Visits ---------------------- | Column Name | Type | ---------------------- | visit_id | int | | customer…...
洛谷【P1955 [NOI2015] 程序自动分析】
反思: 这道题一眼就是并查集 但是数据太大 mle和re都是有可能的我看了题解才知道是离散化数组加并查集离散化再两个月前我觉得好难啊 那道题跟本看不懂 现在觉得还行 离散化思路: 需要一个离散记录数组----ls[N]用来记录下出现的数 步骤: …...
专业做公司宣传网站/cnzz数据统计
在工作中可能会用协同工作的场景,而nfs这项技术服务就能很好满足这一场景。 接下来就直接安装配置 nfs服务的安装配置 1.检查是否有 NFS 和 RPC rpm -qa nfs-utils bind-utils2.安装NFS 和 RPC(两个都有就跳过) yum -y install nfs-utils…...
用户注册和登录网站怎么做的/南宁seo推广服务
一个采用Restfull API 标准的高扩展性和高可用性的实时数据分析的全文搜索工具Elasticsearch 涉及到的一些概念:1.Node(节点): 单个的装有Elasticsearch服务并且提供故障转移和扩展的服务器2.Cluster(集群):一个集群就是有一个或者多个node组织在一起,共同工作,共同分享整个数据…...
wordpress注册用户延迟/昆山网站建设公司
华农便利贴微信号 : scautietie合作/投稿/爆料/福利宝贝们晚上好呀~不知道大家最近看《令人心动的offer》了吗?本期有个实习生令人印象深刻,他的名字叫做丁辉,作为职场人,他今年已经29岁了。虽然本科是个二本,但他却裸…...
兼容ie8的网站模板/搜索引擎关键词怎么选
最近,一部韩剧用极为狗血离谱荒谬的剧情,击碎了本平民对上流社会的想象,没错,它就是《顶楼》。里面的有钱人到底有多奇葩呢?歌唱家去别人家偷东西,也要穿上拖地礼裙;因为平民比自己专业技能强&a…...
wordpress副标题的作用/股票发行ipo和seo是什么意思
数据库切片模式关注的实现水平伸缩。切分是从单个数据库到平分数据访问两个或更多数据库切片。每个切片有和原始数据库相同的Schema。大多数据分布在每个切片每一行。从切片合并起来的数据和原始数据库一样。切片也被近似等同于水平分区(Horizontal Partitioning),网…...
自己做网站的优势/仁茂网络seo
方便起见,SAX API也提供了一个已经实现了ContentHandler接口的DefaultHandler适配器类。 一但实现了ContentHandler或者扩展了DefaultHandler类,你只需直接将XML解析器解析一个特定的文档即可。 我们的第一个例子扩展DefaultHandler将每个SAX事件打印到控…...