MongoDB负载均衡集群(第8章节选)

news2024/11/19 13:37:14

MongoDB自身可组成分片加复制的集群,在这个集群的前端加上负载均衡器(比如HAProxmy + Keepalived),就可组建成一个无单点故障、十分完美的高可用负载均衡集群(如图8-1所示)。

 

图8- 1

整个MongDB高可用体系结构中,存在四个应用集群:入口路由集群Mongos、配置集群“Config Server”、分片集群1、分片集群2。

入口路由集群“Mongos”由负载均衡器来实现高可用及负载均衡功能。

配置集群“Config Server”的高可用及负载均衡有MongDB自身功能实现。

分片集群至少有两组及两组以上的集群所组成,每一个分片集群是一个备份集,即每个单独的分片集群的节点所保存的数据是一致的。多个分片集群,由配置服务“Config Server”提供负载分发,分片集群本身的高可用性由MongDB自身功能实现。

一个可用于生产环境的MongDB高可用集群,除了负载均衡外,至少要12个单元运行这些服务。看起来单元数量很多,但对系统的配置要求不高,比如路由集群Mongos和配置集群“Config Server”。虽然可以在一个操作系统上运行多个MongoDB实例(不同的端口区分不同的功能),但还是建议一个系统一个实例,这样便于维护与扩容。将所有运行MongoDB实例的系统,部署在Proxmox VE超融合集群平台,那就更有优势,比容器部署、管理都方便。因为仅需在虚拟机系统安装MongoDB,并做好基础的配置,然后以此做克隆,快速生成所需的运行单元。

8.1 安装MongoDB

MongoDB支持多种Linux 发行版包管理器进行安装,比如Debian之“apt”、Suse之“zypper”、Rocky/Centos之“dnf/yum”等。作者所采用的操作系统版本为Rocky 9.2,包管理器自然就是“dnf/yum”了。

Rocky 9默认情况下,执行指令“dnf install mongodb-org”是得不到期望的结果。用文本编辑器在目录“/etc/yum.repo.d”创建文件“mongodb-org-6.0.repo”,其完整内容如下:

[mongodb-org-6.0]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/9Server/mongodb-org/6.0/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc

为保证软件仓库源的正确性,我们需要对文件“mongodb-org.repo”中的“baseurl”与“gpgkey”的设定做检查,比如用浏览器访问“baseurl”设定的地址,应该是真实存在的,如图8-2所示。

图8- 2

 

同样,用浏览器访问https://www.mongodb.org/static/pgp/server-6.0.asc,也可获得正确的结果。

接下来,系统命令行执行“dnf install mongdb-org”,就应该可以进行MongoDB的安装,如图8-3所示。

图8- 3

 

安装过程基本不会有错误出现,并且速度很快。安装完成以后,会在系统目录“/etc”生成MongoDB所必须的配置文件“mongod.conf”。我们可直接对其修改进行相应配置,也可单独自建配置文件,在启动“mongod”服务时加选项“-f”进行显式指定。

登录Proxmox VE超融合集群Web管理后台,以安装好MongoDB的虚拟机为基础,克隆出其它所需的运行单元,如图8-4所示。

图8- 4

 

如果没有作者这样的超融合集群平台,就挨个安装系统和MongoDB。

8.2 分片服务Shard集群

分片集群是实际存储数据的设施,对集群的单个节点而言,存储空间与系统独立,在文件系统层面就是使用独立的分区(如图8-5所示)。分片Shard最少是两组集群,每组三个节点或者更多节点。两组集群本身之间不会产生直接的联系,客户端的读写请求,调度到哪一组集群是由“Config Server”决定的。

图8- 5

 

我们约定,MongoDB分片的第一个集群的副本集名称为“shard1”,第二个副本集的名称为“shard2”;数据的实际存储路径为“/data/mongodb/data”,日志文件路径为“/data/momgodb/logs”. 为调试和配置集群方便起见,MongoDB暂时不设置管理员密码,集群节点之间的暂不启用认证机制。

分片Shard集群1的配置文件“/etc/mongod.conf”完整内容如下:

# mongod.conf

# for documentation of all options, see:

#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.

systemLog:

  destination: file

  logAppend: true

  path: /data/mongodb/logs/mongod.log

# Where and how to store data.

storage:

  dbPath: /data/mongodb/data

  journal:

    enabled: true

engine:

wiredTiger:

# how the process runs

processManagement:

  timeZoneInfo: /usr/share/zoneinfo

# network interfaces

net:

  port: 27017

  bindIp: 0.0.0.0 

#security:

replication:

replSetName: shard1

sharding:

clusterRole: shardsvr

将此配置同步到分片集群“shard1”中的其它节点,然后执行命令“systemctl start mongod”启动所有节点的MongoDB服务。启动过程没有任何错误信息输出,不一定代表正确启动,需要进一步验证。比如作者启动的MongoDB,就存在问题,没有被正确的启动运行,如图8-6所示。

图8- 6

 

导致MongoDB启动失败的原因是配置文件书写格式的问题,键与值之间需要一个空格站位,比如键“clusterRole:”,冒号后需要输入一个空格,再输入值“shardsvr”。

还有一种情况也能导致“mongod”服务启动失败,那就是数据存储目录“/data/mogodb”的属主与属组需要修改成“mongod:mongod”,因为以包管理器安装的MongoDB启动服务是以普通账号(安装过程会自动生成系统普通账号)“mongod”来执行的。不要养成一看到权限问题,就用“chmod -R 777 dir”胡乱赋权的坏习惯。

确认分片集群“shard1”所有节点的MongoDB服务都正常启动以后,切换到这些节点的任意节点系统命令行,登录到MongoDB交互界面,进行初始化操作,将所有节点组成一个集群,具体的命令如下:

[root@MongoDB-200-149 ~]# mongosh

Current Mongosh Log ID: 6491279f3770cc22c927a6b6

Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.10.0

Using MongoDB:          6.0.6

Using Mongosh:          1.10.0

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).

You can opt-out by running the disableTelemetry() command.

------

   The server generated these startup warnings when booting

   2023-06-19T17:00:44.278+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted

   2023-06-19T17:00:44.278+08:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'

   2023-06-19T17:00:44.278+08:00: vm.max_map_count is too low

------

test> use admin

switched to db admin

shard1 [direct: primary] admin> rs.initiate({

...         _id:"shard1",

...         members:[

...         {_id:0,host:"10.122.200.148:27017",priority:1},

...         {_id:1,host:"10.122.200.149:27017",priority:1},

...         {_id:2,host:"10.122.200.150:27017",priority:1}

...     ]

... });

{ ok: 1 }

分片集群“shard1”创建完毕后,继续在此交互界面执行指令“rs.status()”,查看刚创建好的分片集群“shard1”的运行状态,如图8-7所示。

图8- 7

 

依照此法,将第二个分片集群“shard2”也创建好。

8.3 MongoDB配置服务器“Config Server”集群

MongoDB配置服务器集群“Config Server”节点配置文件,除了副本集名称(replSetName)与集群角色(clusterRole)不同而外,其他的设定与分片集群“shard1”完全相同。在这里,我们约定,集群副本集名字为“configcls”,而集群的角色指定为“configsvr”。注意:副本集的名称可以随意命名,而集群角色是有限定的。一个完整的配置服务器“Config Server”配置文件“/etc/mongodb.conf”的内容如下:

# mongod.conf

systemLog:

  destination: file

  logAppend: true

  path: /data/mongodb/logs/mongod.log

storage:

  dbPath: /data/mongodb/data

  journal:

    enabled: true

engine:

wiredTiger:

# how the process runs

processManagement:

  timeZoneInfo: /usr/share/zoneinfo

# network interfaces

net:

  port: 27017

  bindIp: 0.0.0.0 

#security:

replication:

replSetName: configcls

sharding:

clusterRole: configsvr

启动配置集群“Config Server”所有节点的MongoDB服务“systemctl start mongod”,确认MongoDB服务的监听地址没有绑定到接口“127.0.0.1”上。用MongoDB客户端工具“mongosh”登录,创建集群“configcls”,具体的指令如下:

[root@MongoDB-200-147 ~]# mongosh  10.122.200.147

Current Mongosh Log ID: 64917e4587284270d42be6ec

Connecting to:          mongodb://10.122.200.147:27017/?directConnection=true&appName=mongosh+1.10.0

Using MongoDB:          6.0.6

Using Mongosh:          1.10.0

------省略若干--------------------------------

test> use admin

switched to db admin

admin> rs.initiate({

...         _id:"configcls",

...         members:[

...         {_id:0,host:"10.122.200.154:27017",priority:1},

...         {_id:1,host:"10.122.200.147:27017",priority:1},

...         {_id:2,host:"10.122.200.143:27017",priority:1}

...     ]

... });

{ ok: 1, lastCommittedOpTime: Timestamp({ t: 1687256871, i: 1 }) }

集群建立起后,继续在交互界面执行“rs.status()”验证其正确性。

8.4 Mongos路由集群

Mongos路由本身不需要像分片“Shard”和配置“Config Sever”以副本集方式集群,多个Mongos节点由前端的负载均衡器(例如HAProxy或者Nginx)一起组成高可用集群。Mongos路由集群分三个大的步骤:单节点配置与配置集群的关联、单节点与分片集群的关联以及节点间的集群。

8.4.1 Mongos路由与配置集群(Config server)关联

编辑Mongos所在节点的配置文件“/etc/mongod.conf”,将配置服务集群“Config Server”添加到文件中,一个已经编辑好的“/etc/mongod.conf”文件的完整内容如下:

# mongod.conf

systemLog:

  destination: file

  logAppend: true

  path: /data/mongodb/logs/mongod.log

engine:

wiredTiger:

# how the process runs

processManagement:

  timeZoneInfo: /usr/share/zoneinfo

  fork: true

# network interfaces

net:

  port: 27017

  bindIp: 0.0.0.0 

sharding:

  configDB: configcls/10.122.200.154:27017,10.122.200.147:27017,10.122.200.143:27017

保存文件后,执行命令“mongos -f /etc/mongod.conf &”启动路由服务。注意:执行“systemctl start mongos”将不能成功,除非手动创建一个“systemd”服务。

用命令行指令“mongosh”验证路由服务“mongos”的正确性。客户端“mongosh”连接成功,会输出连接地址、MongDB版本信息等,然后进入交互界面,等待用户输入。

8.4.2 Mongos路由与分片集群相关联

在运行正常的Mongos路由节点,以“mongosh”登录本地“mongos”,执行指令“sh.status()”查看一下路由初始状态,其输出如图8-8所示。

图8- 8

 

在Mongos客户端交互界面继续输入如下指令,将前边建立起来的两个分片“Shard”集群添加进来:

[direct: mongos] admin> sh.addShard("shard1/10.122.200.148:27017,10.122.200.149:27017,10.122.200.150:27017")

{

  shardAdded: 'shard1',

  ok: 1,

  '$clusterTime': {

    clusterTime: Timestamp({ t: 1687260112, i: 9 }),

    signature: {

      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),

      keyId: Long("0")

    }

  },

  operationTime: Timestamp({ t: 1687260112, i: 9 })

}

[direct: mongos] admin> sh.addShard("shard2/10.122.200.151:27017,10.122.200.152:27017,10.122.200.153:27017")

{

  shardAdded: 'shard2',

  ok: 1,

  '$clusterTime': {

    clusterTime: Timestamp({ t: 1687260132, i: 8 }),

    signature: {

      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),

      keyId: Long("0")

    }

  },

  operationTime: Timestamp({ t: 1687260132, i: 8 })

上述指令执行完毕,就达到将路由与分片相关联的目的。这时,我们输入指令“sh.status()”,查看其状态,应该有分片信息存在,如图8-9所示。

图8- 9

 

依照此法,将剩余节点的Mongos路由启动并与Shard分片关联。需要注意的是,Mongos路由节点之间,并不存在关联,不像分片Shard集群与配置集群“Config Server”,节点之间是相互感知的(比如主节点故障,剩余节点立即选举新的主节点)。由于存在多个Mongos路由节点,某个路由Mongos-A节点写入的数据,能否被其它路由Mongos-B节点所识别呢?如果不能,或者产生讹误,就不能将这些路由Mongos节点组成集群。

8.4.3 多路由Mongos状态同步验证

以MongoDB客户端工具,连接到路由Mongos节点“10.122.200.143”,创建数据库“sery”,并插入几条数据,具体的指令及输出如下:

[root@MongoDB-200-144 ~]# mongosh 10.122.200.144

Current Mongosh Log ID: 6492a92a52c3eae27b3b24c8

Connecting to:          mongodb://10.122.200.144:27017/?directConnection=true&appName=mongosh+1.10.0

Using MongoDB:          6.0.6

Using Mongosh:          1.10.0

…………………………………………….

[direct: mongos] admin> show dbs

admin   112.00 KiB

config    2.77 MiB

[direct: mongos] admin> use sery

switched to db sery

[direct: mongos] sery> db.sery.insertOne({"one":"001"})

{

  acknowledged: true,

  insertedId: ObjectId("6492cc189467940c5c0dfbb9")

}

[direct: mongos] sery> db.sery.insertOne({"two":"002"})

{

  acknowledged: true,

  insertedId: ObjectId("6492cc3c9467940c5c0dfbbb")

}

上边的插入操作,将在MongoDB中创建数据库“sery”。继续在Mongosh交互界面,输入指令“sh.status()”,可进一步了解数据库“sery”被写入到哪个分片Shard集群,如图8-10所示。

图8- 10

 

登录到另一个Mongos路由节点“10.122.200.145”,查看在Mongos路由节点“10.122.200.144”创建的数据库“sery”,是否可以被检索到,操作指令及输出结果如图8-11所示。

图8- 11

 

相应的,在Mongos路由节点“10.122.200.145”创建数据库,然后登录Mongos路由节点“10.122.200.144”,也应该能够看到所有创建好的数据库。

8.4.4 Mongos路由负载均衡集群

在负载均衡器所在的宿主系统,文本编辑器创建文件“/etc/haproxy/mongos.cfg”,并添加如下文本行:

frontend mongos

    mode tcp

    bind *:27017

    option tcplog

    log global

    default_backend mycat_lb

backend mongos_lb

    mode tcp

    balance source

    server mongos144 10.122.200.144:27017 check

server mongos145 10.122.200.145:27017 check

server mongos146 10.122.200.146:27017 check

HAProxy对配置文件执行语法检查无误后,启动或重启“Keepalived”服务,远程客户端仅需用VIP加端口27017来连接MongoDB高可用集群。

8.5 MongoDB数据分片

在本章“8.4”节,我们创建了一个名为“sery”的数据库,并在其中插入了两条数据,并且我们已经定位到“sery”数据的数据被存储到分片集群“shard2”中。而我们可能希望数据库“sery”的一部分数据被存储到分片集群“shard1”,而另一部分被存储于分片集群“shard2”。数据分片以横向方式扩展数据容量,以支持更大规模的数据存储及读写效率。

以Mongosh登录Mongos路由集群(以负载均衡器VIP加TCP27017端口),创建新的数据库“formyz”,开启分片功能并以循环方式向数据库“formyz”的表“mytable”插入50000条记录,然后查验数据库“formyz”的记录是否被分散存储到所有的分片集群。具体的操作及输出如下:

#开启数据库“formyz”分片功能,同时创建空的数据库“formyz”

[direct: mongos] admin> sh.enableSharding("formyz")

{

  ok: 1,

  '$clusterTime': {

    clusterTime: Timestamp({ t: 1687403738, i: 2 }),

    signature: {

      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),

      keyId: Long("0")

    }

  },

  operationTime: Timestamp({ t: 1687403738, i: 1 })

}

#在数据库“formyz”创建表“mytable”,基于键“_id”进行“hash”分片

[direct: mongos] admin> sh.shardCollection("formyz.mytable",{"_id":"hashed"});

{

  collectionsharded: 'formyz.mytable',

  ok: 1,

  '$clusterTime': {

    clusterTime: Timestamp({ t: 1687404504, i: 28 }),

    signature: {

      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),

      keyId: Long("0")

    }

  },

  operationTime: Timestamp({ t: 1687404504, i: 24 })

}

#数据库“formyz”的表“mytable”插入5万条记录

[direct: mongos] admin> use formyz

switched to db formyz

[direct: mongos] formyz> for(i=1;i<=50000;i++){db.usertable.insertOne({"id":i,"name":"nnn"+i})}

{

  acknowledged: true,

  insertedId: ObjectId("6493c13abcd4d10dfc6f054c")

}

数据插入完毕,继续在Mongos路由交互界面输入指令“sh.status()”,查验数据库“formyz”表“mytable”数据的分布情况,如图8-12所示。

图8- 12

 

从状态输出可知,数据库“formyz”的数据确实分布到分片集群“shard1”和“shard2”,到达预期目标。

8.6 MongoDB集群设置权限和认证

MongoDB高可用集群已经创建完毕,分片功能已经验证通过,基于数据安全层面的考虑,需要给MongoDB数据访问设置账号、各成员节点之间启用安全认证。

8.6.1 设置MongoDB数据库管理账号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于java+swing+mysql飞机票预订系统

基于javaswingmysql飞机票预订系统 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库表4.注册窗口5.登录窗口6、用户-主窗口7、用户-查询航班8.用户--订票8.用户--取票9.管理员-所有航班信息10.管理员-添加航班11.用户信息12.订票状态 四、其它1.其他系统实现五.获取源码…

路径规划-DWA算法(C++实现)

1、简单介绍 DWA算法&#xff08;dynamic window approach&#xff09;&#xff0c;其原理主要是在速度空间&#xff08;v,w&#xff09;中采样多组速度&#xff0c;并模拟出这些速度在一定时间内的运动轨迹&#xff0c;并通过评价函数对这些轨迹进行评价(其中包括距离障碍物距…

【学习笔记】 科目一之概念篇

【学习笔记】 科目一之概念篇 概念题方法 1&#xff09;抓重点&#xff1a;科目一设计知识范围太广&#xff0c;不要妄想所有知识点都复习到&#xff0c;这是不可能的&#xff0c;我们的目标是45分几个而不是考高分&#xff0c;复习时间有限&#xff0c;所以要学会抓重点&…

图片是如何生成的--图像生成模型(GAN、VAE、扩散模型)简介

目录 1.GAN 2.AutoEncoder及其变种&#xff1a;AE/DAE/VAE/VQVAE 2.1 AE&#xff1a; 2.2 DAE&#xff1a;Denoising AutoEncoder 2.3 VAE&#xff1a;Variational AutoEncoder 2.4 VQVAE&#xff1a;Vector-quantised Variational AutoEncoder 3. 扩散模型 3.1 扩散…

【openGauss简单数据管理】--快速入门

【openGauss简单数据管理】--快速入门 &#x1f53b; 一、openGauss数据库管理&#x1f530; 1.1 连接openGauss数据库&#x1f530; 1.2 创建数据库&#x1f530; 1.3 查看数据库和切换数据库&#x1f530; 1.4 修改数据库&#x1f530; 1.5 删除数据库&#x1f530; 1.6 启停…

【QQ界面展示-实现自动回复 Objective-C语言】

一、刚才咱们监听键盘弹出事件,是怎么监听的, 1.监听键盘弹出事件的步骤 1)首先,在控制器的viewDidLoad方法中,创建一个NotificationCenter对象啊 2)通过center,让当前控制器的这个方法,监听这个通知, 3)然后,我们在这个通知里面,获取到键盘的Y值, 4)对我们的…

Rust 原始类型之数组array内置方法

目录 数组 array 声明 访问 引用 Reference 切片 Slice 方法 题目实例 数组 array 在 Rust 中&#xff0c;数组是一种固定大小的数据结构&#xff0c;用于存储具有相同数据类型的元素的有序集合。 “固定大小”是指数组中的元素的类型和数量确定&#xff0c;也就确定了…

【从零开始学习JAVA | 第十八篇】接口介绍

目录 前言&#xff1a; 接口&#xff1a; 如何定义一个接口&#xff1a; 如何使用一个接口&#xff1a; 接口中成员的特点&#xff1a; 接口与类的区别&#xff1a; 接口的应用&#xff1a; 总结&#xff1a; 前言&#xff1a; 接口其实是为了弥补继承的缺点&#xf…

C语言文件打开关闭详解、文件顺序读写详解。

文件的打开和关闭 fopen函数原型&#xff1a; FILE *fopen( const char *filename, const char *mode );const char *filename 文件的路径以及名字const char *mode 文件的打开方式 文件打开方式含义如果文件不存在“r”读文件不存在会报错“w”写(清空写)建立一个新的文件“…

【新手上路】如何在Web3时代成为XR创建者

目录 0 XR在Web3里的作用 1 XR的概念、特征、技术、设备、平台、应用和工具 1.1 VR的概念、特征和技术 1.2 AR的概念、特征和技术 1.2 XR的设备、平台、应用和工具 2 选择XR的方法 2.1 何时使用VR 2.2 何时使用AR 3 开发XR作品的4个步骤 4 成为XR构建者的路径 4.1 三…

小程序布局中相对定位的用法

小程序中一般为了有一定的设计效果&#xff0c;会将下边组件的内容提升一点到上边去&#xff0c;比如我们的电商展示模板里&#xff0c;会将商品列表覆盖一点到背景图&#xff0c;效果如下&#xff1a; 这种要如何搭建呢&#xff1f;就是利用到了CSS相对定位的原理 搭建组件 …

27.移除元素

LeetCode-27.移除元素 1、题目描述2、解题思路3、代码实现3.1Java代码实现3.2双指针代码优化 4、解题记录 1、题目描述 题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要…

windows搭建vue开发环境

参考博客&#xff1a;最详细的vue安装教程_一只野生程序媛的博客-CSDN博客 Vue安装环境最全教程&#xff0c;傻瓜式安装_浪漫主义码农的博客-CSDN博客 1、安装nodejs&#xff0c;从下面官网下载版本&#xff0c;对应安装就行了&#xff1a; Node.js 中文网 2、安装好后&…

合宙Air724UG Cat.1模块硬件设计指南--天线接口

天线接口 简介 天线是发射和接收电磁波的一个重要的无线电设备&#xff0c;没有天线也就没有无线电通信。天线品种繁多&#xff0c;以供不同频率、不同用途、不同场合、不同要求等不同情况下使用。 特性 LTE天线接口。50 欧姆特性阻抗&#xff0c;不推荐使用PCB板载天线&#…

脚本模式的特点和用法

一、什么是脚本? 脚本(script)是使用一种特定的描述性语言&#xff0c;依据一定的格式编写的可执行文件&#xff0c;又称作宏或批处理文件。脚本通常可以由应用程序临时调用并执行。 简单解释:脚本类似于演戏时用到的剧本&#xff0c;脚本其实就是一系列指令——演员看了指令就…

算法--itemCF

概述&#xff1a; 电子商务网站是个性化 推荐系统重要地应用的领域之一。亚马逊就是个性化推荐系统的积极应用者和推广者&#xff0c;亚马逊的推荐系统深入到网站的各类商品&#xff0c;为亚马逊带来了至少30%的销售额。 不光是电商类&#xff0c;推荐系统无处不在。 QQ&…

【差旅-游记】记一次海南出差

哈喽&#xff0c;大家好&#xff01;我是雷工&#xff01; 这篇不是技术分享&#xff0c;是篇差旅记录。 最近出差去了一次海南&#xff0c;应该算得上我目前出差去过最远的地方了&#xff0c;也是我第一次去海南&#xff0c;还是蛮有新鲜感的&#xff0c;因此记录下此次差旅。…

【软件设计师暴击考点】数据库系统高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

tensorflow2 模型建立与训练

模型的构建&#xff1a; tf.keras.Model 和 tf.keras.layers 模型的损失函数&#xff1a; tf.keras.losses 模型的优化器&#xff1a; tf.keras.optimizer 模型的评估&#xff1a; tf.keras.metrics 模型&#xff08;Model&#xff09;与层&#xff08;Layer&#xff09; …

Mysql 索引基础介绍

索引基础介绍 索引是什么 MySQL官方&#xff1a;索引&#xff08;INDEX&#xff09;是帮助MySQL高效获取数据的数据结构。 面试官问&#xff0c;回&#xff1a;索引是排好序的快速查找数据结构 索引的目的在于提高查询效率&#xff0c;可以类比字典的目录。如果要查mysql这个这…