线上es报错异常分析
起因:订单日志没有保存到es
解决流程:
查看book3-message的报错日志
发现如下两种异常
第一种异常:
线程池的问题,EsThreadPoolExecutor[bulk, queue capacity = 50, orgelasticsearchcommonutilconcurrentEsThreadPoolExecutor@5e6ba269[Running, pool size = 16, active threads = 16, queued tasks = 56, completed tasks = 41706906]]];];req:orgelasticsearchactionbulkBulkRequestBuilder@27779be
修改了es的线程池配置,线程池的最大数要小于等于es所在服务器的cpu数量;
参考文档: https://wwwcnblogscom/kangoroo/p/7615833html
第二种异常:
数据更新时版本不一致导致;解决方式:将更新es数据的方式从UpdateRequestBuilder改成UpdateByQueryRequestBuilder这种方式,主要是设置abortOnVersionConflict(false)这个参数;
参考文档:
https://blogcsdnnet/zhou_shaowei/article/details/80079162 为了防止版本冲突导致updateByQuery中止,设置终止冲突(false)
https://blogcsdnnet/qq_37502106/article/details/80604538
ES文件浏览器不需要添加服务器呀。你手机和电脑连上WIFI以后,ES不是给你个FTP的地址吗。你在电脑打开IE浏览器,输入FTP地址包括冒号后面的数字,电脑就能用FTP形式打开手机SD卡。然后可以在IE的查看还是工具栏里有个资源管理器方式打开FTP,就可以用资源浏览器方式打开SD卡,就可以复制删除SD卡的内容了。
2008数据库备份和恢复步骤?
答方法/步骤如下
1
打开数据库管理工具,sqlservermanagementstudio,连接上选中对应的数据库,右键---任务---还原---数据库。
2
在常规页面,选择好要还原的数据库备份文件bak,勾选需要还原的备份,在选项页面,还原选项,勾选“覆盖现在有数据库”,然后确认等待还原成功就行。
3
备份操作是一样的操作流程,
如何轻松实现服务器远程备份?
一、部署控制中心
在网管机器B中,下载并运行ATIES安装程序,弹出组件安装对话框(图1),点击“InstallAcronisTrueImage
ManagementConsole”选项,同意用户许可协议后,一路点击“NEXT”按钮,就完成了ATIES控制中心的安装。(图1)
图1
二、远程部署Agent(代理)
要想进行远程备份操作,必须为服务器A远程安装Agent代理程序。
在网管机器B中,依次点击“开始→程序→Acronis→Acronistrueimagemanagement
console→Acronistrueimagemanagementconsole”项目。在ATIES控制中心窗口中点击“Install
acroniscomponetstoaremote
computer”选项,进入到“远程安装向导”对话框,点击“NEXT”按钮后,选中“Registered
components”单选项,在接下来的“程序选择”对话框中列出两个程序组件:Acronistrueimageagent和Acronis
trueimageenterpriseserver。这里笔者要为服务器A安装代理程序,因此选择“Acronistrueimage
agent”项目如图2,然后进入到“登录信息”对话框。(图2)
图2
在“Computer”栏中输入服务器A的IP地址(图3),如“192168112”,也可以点击“Browse”按钮,在计算机浏览框中找到服
务器A,然后在“Username”和“Password”栏中分别输入服务器A的管理员账号名和密码,如“lw”账号。这里笔者建议选中“Allow
torebootremotecomputer
automatically”选项,因为代理程序远程安装后,必须重新启动系统才能生效。最后点击“Proceed”按钮,开始为服务器A远程安装代理程
序。安装完成后,服务器A将自动重新启动系统。(图3)
图3
三、让文件夹共享
这里笔者要在网管机器B中远程备份服务器A的磁盘分区,并将“镜像文件”存储在服务器A的“S_bak”共享文件夹中。这里注意服务器A使用的
是NTFS文件系统,因此共享文件夹的访问权限不但受到“共享权限”限制,还受到NTFS文件系统的访问权限限制。我们首先要在服务器A上对
“S_bak”共享文件夹访问权限进行合理设置。
1设置共享权限
在服务器A的资源管理器中,右键点击“S_bak”共享文件夹,选择“属性”,切换到“共享”标签页,点击“权限”按钮,弹出“S_bak的权
限”设置对话框,点击“添加”按钮,将“lw”账号添加到“组或用户名称”列表框内,并且还要给该账号赋予“完全控制权限”如图4,最后点击“确定”按
钮,完成共享权限设置。(图4)
图4
2NTFS访问权限设置
以上设置的只是共享访问权限,毕竟“S_bak”共享文件夹是受“共享访问权限”和“NTFS访问权限”双重制约的。如果NTFS文件系统不允许“lw”账号访问共享,也是不行的。
切换到“安全”标签页后,首先将“lw”账号添加到“组或用户名称”列表框中,接下来还要为该账号设置访问权限。选中“lw”账号后,在“lw的权限”列表框中选中“读取和运行、列出文件夹目录、读取、修改和写入”项目,最后点击“确定”按钮。(图5)
图5
经过以上操作后,就完成了“S_bak”共享文件夹访问权限的设置。这里要注意以上操作是在服务器A进行的。
四、远程备份从此简单
到此为止,远程备份的准备工作就全部完成了,下面就可以在网管机器B中对服务器A的磁盘分区进行远程备份。
1连接服务器A
在网管机器B的ATIES控制中心窗口中,点击“Connecttoaremote
computer”项目,弹出“远程连接计算机”对话框,在“Computer”栏中输入服务器A的IP地址“192168112”,点击
“Options”按钮后,在“User
name”和“Password”栏中分别输入服务器A的管理员账号名“lw”和账号密码如图6,点击“OK”按钮后,进入到“Pickatask
fortheremotecomputer”窗口,说明已经成功连接到服务器A如图7。(图6)(图7)
图6
图7
2第一次完全手工备份
下面就开始实施远程手工备份服务器A磁盘分区。点击“Backup”选项,弹出“创建镜像文件向导”对话框,点击“NEXT”按钮后,在接下来
的对话框中列出服务器A的磁盘分区。这里笔者以“C盘”分区为例,选中“C盘分区”项目,点击“NEXT”按钮后,为镜像文件指定存储位置(图8)。
图8
在“网络计算机”对话框中找到服务器A,弹出登录对话框窗口,输入服务器A的管理员账号后,进入到“S_bak”共享文件夹,接着为镜像文件起个名字,如
“servertib”。下面选择“镜像模式”,这是笔者第一次为服务器A的C盘分区进行备份,因此要选择完全备份方式,选中“Createthe
fullbackupimage
archive”选项,点击“NEXT”按钮后,要为镜像文件设置一个复杂的“保护密码”,防止有人非法窃取。接着还要为镜像文件设置分卷方式、压缩率
等,如果没有特殊要求,使用默认值即可。最后点击“Proceed”按钮,就开始远程备份服务器A的C盘分区。备份成功后,就会在服务器A的
“S_bak”共享文件夹中生成一个名为“rtjtib”的镜像文件。(图9)
图9
3计划增量备份
以上完成了第一次手工备份,但以后每次都要手工备份是非常麻烦的,ATIES提供了“计划任务”功能,利用它创建备份任务,可以轻松完成自动备份。
在网管机器B的ATIES控制中心窗口中,点击下方的“Showtasks”选项,弹出“计划任务向导”对话框,计划备份向导的操作过程和手工备份向导基本相似,只是多出“备份时间间隔”参数的设置。(图9)
还是以备份服务器A的C盘分区为例,在“计划任务向导”对话框中选中服务器A的C盘分区,指定好镜像文件的存储位置“S_bak共享文件夹中
rtjtib”。这里要注意:“镜像模式”要选中“Createdifferentialbackup
archive”项目,也就是增量备份。(图10)
图10
接着指定好分卷方式、压缩率等,然后进入到“备份时间间隔”参数设置对话框。这里笔者每天都要对服务器A的C盘分区进行远程增量备份,选中“Daily”
单选项,点击“NEXT”按钮后,在“Start
time”栏中设置每天开始计划备份的时间;然后进入到“用户信息”对话框,在这里输入要使用的服务器A的管理员账号密码,最后点击“Finish”按
钮,完成备份任务的创建。这样一来,网管机器B每天都可以自动对服务器A的C盘分区进行远程增量备份,免去了手工备份的麻烦。(图11)
图11
总结:利用ATIES实现磁盘分区的远程备份的确能方便网管对备份文件的统一管理。在设置过程中一定注意以下两点:一、要正确设置服务器A的网络防火墙和
共享文件夹的访问权限,这样在网络中进行远程备份的人员才能访问服务器A,保证备份文件被正常存储在共享文件夹中;二、远程备份人员要拥有服务器A的管理
员访问权限,否则就无法正常安装代理程序和远程连接服务器A
mysql如何实时备份?
MYSQL数据如何实时备份
依次单击:开始--程序--MicrosoftSQLServer--企业管理器--SQLServer组--管理--数据库维护计划
在右侧空白处右键单击,新建维护计划--勾选要备份的数据库--下一步
指定数据库备份计划--调度--单击更改--设置备份的时间,备份周期--下一步
每日频率即是每天什么时间开始进行备份
发生频率即是执行的周期
指定备份磁盘目录--修改使用此目录的路径作为备份数据库的存放路径勾选删除早于此时间的文件,我这里选择一周,即是数据库备份文件把一周前的进行删除
给此任务计划填写一个名字:back2单击完成,就可以在数据库维护计划中看到刚才新建的计划
注意事项
一定要开启sqlserveragent服务
怎样把服务器上的数据备份到本地机?
打开远程服务器---打开数据转换服务---选择本地包,右键---新建包---新窗口中“任务”下面点“复制sqlserver对象任务”图标(不知道图标的话,把鼠标放到图标上就会有提示)----选择好源服务器(当然是远程服务器了),目的服务器(当然是你本地机器了),以及需要传输的数据库(这些设置一看就会明白的)---保存包---立即执行包----复制数据完毕,稍微等片刻就会在本地机器上看到你要的数据库了
orecal如何进行远程备份?
你是要实时的热备呢,还是定时备份呢,
实时热备的话最好是选取一些软件比如UPM等,
定时备份的话那就简单一些了,再对方的机器上开FTP,定时作备份后再上传到远程的主机就好了。
Oracle数据导入导出imp/exp命令
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。
执行环境:可以在SQLPLUSEXE或者DOS(命令行)中执行,
DOS中可以执行时由于在oracle8i中安装目录ora81BIN被设置为全局路径,
该目录下有EXPEXE与IMPEXE文件被用来执行导入导出。
oracle用java编写,SQLPLUSEXE、EXPEXE、IMPEXE这两个文件有可能是被包装后的类文件。
SQLPLUSEXE调用EXPEXE、IMPEXE所包裹的类,完成导入导出功能。
下面介绍的是导入导出的实例。
数据导出:
1将数据库TEST完全导出,用户名system密码manager导出到D:daochudmp中
expsystem/manager@TESTfile=d:daochudmpfull=y
2将数据库中system用户与sys用户的表导出
expsystem/manager@TESTfile=d:daochudmpowner=(system,sys)
3将数据库中的表inner_notify、notify_staff_relat导出
expaichannel/aichannel@TESTDB2file=d:datanewsmgntdmptables=(inner_notify,notify_staff_relat)
4将数据库中的表table1中的字段filed1以"00"打头的数据导出
expsystem/manager@TESTfile=d:daochudmptables=(table1)query="wherefiled1like'00%'"
上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。
也可以在上面命令后面加上compress=y来实现。
数据的导入
1将D:daochudmp中的数据导入TEST数据库中。
impsystem/manager@TESTfile=d:daochudmp
impaichannel/aichannel@HUSTfull=yfile=d:datanewsmgntdmpignore=y
上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。
在后面加上ignore=y就可以了。
2将d:daochudmp中的表table1导入
impsystem/manager@TESTfile=d:daochudmptables=(table1)
基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。
注意:
操作者要有足够的权限,权限不够它会提示。
数据库时可以连上的。可以用tnspingTEST来获得数据库TEST能否连上。
附录一:
给用户增加导入数据权限的操作
第一,启动sqlpuls
第二,以system/manager登陆
第三,createuser用户名IDENTIFIEDBY密码(如果已经创建过用户,这步可以省略)
第四,GRANTCREATEUSER,DROPUSER,ALTERUSER,CREATEANYVIEW,
DROPANYVIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATESESSIONTO用户名字
第五,运行-cmd-进入dmp文件所在的目录,
impuserid=system/managerfull=yfile=dmp
或者impuserid=system/managerfull=yfile=filenamedmp
执行示例:
F:WorkOracle_Databackup>impuserid=test/testfull=yfile=inner_notifydmp
屏幕显示
Import:Release81700-Productionon星期四2月1616:50:052006
(c)Copyright2000OracleCorporationAllrightsreserved
连接到:Oracle8iEnterpriseEditionRelease81700-Production
WiththePartitioningoption
JServerRelease81700-Production
经由常规路径导出由EXPORT:V080107创建的文件
已经完成ZHS16GBK字符集和ZHS16GBKNCHAR字符集中的导入
导出服务器使用UTF8NCHAR字符集(可能的ncharset转换)
正在将AICHANNEL的对象导入到AICHANNEL
正在导入表"INNER_NOTIFY"4行被导入
准备启用约束条件
成功终止导入,但出现警告。
附录二:
Oracle不允许直接改变表的拥有者,利用Export/Import可以达到这一目的
先建立import9par,
然后,使用时命令如下:impparfile=/filepath/import9par
例import9par内容如下:
FROMUSER=TGPMS
TOUSER=TGPMS2(注:把表的拥有者由FROMUSER改为TOUSER,FROMUSER和TOUSER的用户可以不同)
ROWS=Y
INDEXES=Y
GRANTS=Y
CONSTRAINTS=Y
BUFFER=409600
file==/backup/ctgpc_20030623dmp
log==/backup/import_20030623log
问题描述:关于es6如何被导入使用,搜索很多资料,实际上关于如何导入,就是一句话的问题。在前端中写如下网:
<!DOCTYPE html>
<html lang="en">
<head>
<head>
<title>threejs webgl - ex2</title>
<meta charset="utf-8">
</head>
<body>
<script type="module">
import as THREE from '/node_modules/three/build/threemodulejs';
</script>
<P>你好,threejs</P>
</body>
</html>
实际上以上已经是导入模块的一个简单写法,通过谷歌浏览器直接打开这个网页,但是汇报以下的错误
threemodulejs:1 Failed to load module script: The server responded with a non-JavaScript MIME type of "" Strict MIME type checking is enforced for module scripts per HTML spec
解决办法:
以上问题呢,需要配置一个网页服务器,我使用的是nginx ,然后将这个网页部署到服务器中,然后启动服务器就不会产生一样的问题,网页就可以正常运行。
总结:
以上的解决方法跟遇到的问题,我相信并不是我一个人遇到的,网页如果是通过浏览器直接打开和步入到服务器中,在服务器打开实际上是不一样的,如果把网页部署到服务器中再打开就会避免很多不必要的问题,比如说本地文件的跨域访问,应该也不会出现。
还是那句话,技术很多问题都是理论与实际的联合点,多想方法,在实践中找到一种正确解决问题的方法,这才是技术所需要探寻的。
在谷歌应用商店中下载安装。
安装步骤:1打开谷歌应用商店。
2搜索elasticsearch-head。
3点击安装。
4安装成功→将localhost地址改为要指向的服务器及端口号。
5点击链接,可成功进入已部署成功的ES数据库中。
ES文件浏览器是一个能管理手机本地、局域网共享、FTP和蓝牙文件的阅读器。通过ES文件浏览器用户可以在本地、局域网共享、FTP和蓝牙设备中浏览、传输、复制、剪切、删除、重命名文件和文件夹等等,还可以备份系统的已装软件。
ES支持集群模式,是一个分布式系统,其好处主要有两个∶
es集群由多个ES 实例组成。不同集群通过集群名字来区分,可通过 clustername 进行修改,默认为elasticsearch。每个ES实例本质上是一个 JVM 进程,且有自己的名字,通过 nodename 进行修改
ES集群相关的数据称为 cluster state ,主要记录如下信息∶节点信息,比如节点名称、连接地址等;索引信息,比如索引名称、配置等
可以修改 cluster state 的节点称为master节点,一个集群只能有一个 cluster state 存储在每个节点上,master维护最新版本并同步给其他节点
master节点是通过集群中所有节点选举产生的,可以被选举的节点称为 master-eligible 节点 ,相关配置如下: nodemaster: true
处理请求的节点即为coordinating节点,该节点为所有节点的默认角色,不能取消。路由请求到正确的节点处理,比如创建索引的请求到master节点
存储数据的节点即为data节点,默认节点都是data类型,相关配置如下∶ nodedata: true
谈及副本和分片两个概念之前,我们先说一下这两个概念存在的意义: 解决系统可用性和增大系统容量
我们想象这样一个场景,我们的数据只存放在一台ES服务器上,那么一旦这台ES出现宕机或者其他不可控因素影响的话,我们除了丧失了服务的可用性外,可能还存在着数据丢失的可能。同时,单机服务的存储容量也无法应对项目对大数据量的要求。
系统可用性可以分为 服务可用性 和 数据可用性
服务可用性 含义为:当前服务挂掉后,是否有其他服务器顶替当前节点提供服务支持。
数据可用性 含义为:当前服务挂掉后,存储在当前服务器上的数据,是否还可以对外提供访问和修改的服务。
副本可以理解为是某个数据的复制体,副本和源数据内容一致。副本的存在可以有效地满足系统可用性的需求,比如说,我们可以在原有节点的基础上复制一个和源节点一模一样的节点,这样一旦原有节点挂掉了,另外一个节点也还是可以替代源节点提供服务,而且复制出来的节点拥有和源节点一样的数据,这样也保障了数据可用性。
我们在上一小节讲到可以使用副本来解决系统可用性的问题,但是这里存在一个问题,不管存在多少个副本(节点),都无法增大源节点的存储空间。在这个问题上,ES引入了Shard分片这个概念来解决问题。
看完分片的特点后可能还有人不太清楚到底什么是分片,其实分片是n/1个源节点数据。比如说原ES集群中只有一个主节点,所有的索引数据都存储在这个节点上。现在我们将某个索引数据分成3份,分别存放在3个ES节点上,那么每台ES服务器上就各自有1个分片shard。该索引的所有节点Shard分片的集合,就是索引的全部数据。
下面我们来演示一下:
为了更好的了解ES的分片机制,大家不妨在上面的案例上进一步思考两个问题:
答案是不能。原因是我们创建索引时定义的分片数量只有3个,且都已经落在了3个节点上。所以即使再增加多一个节点,也不会有对应的Shard分片可以落在新的节点上,并不能扩大 test_shard_index 的数据容量。
答案是不能。因为新增的副本也是分布在这3个节点上,还是利用了同样的资源。如果要增加吞吐量,还需要新增节点。
通过上面两个问题,相信大家已经可以认识到分片的重要性,分片数过小,会导致后续无法通过增加节点实现水平扩容;(副本)分片数过大会导致一个节点上分布过多分片,造成资源浪费,同时会影响查询性能
集群健康状况,包括以下三种: green健康状态,指所有主副分片都正常分配; yellow指所有主分片都正常分配,但是有副本分片未正常分配; red表示有主分片未分配
我们可以通过这个api查看集群的状态信息: GET _cluster/health
我们也可以通过cerebro或者head插件来直接获取当前集群的状态
需要注意的是,即使当前集群的状态为 red ,也并不代表当前的ES丧失了提供服务的能力。只是说未被分配主分片的索引无法正常存储和操作而已。
这里故障转移的意思是,当ES集群出现某个或者多个节点宕机的情况,ES实现服务可用性的应对策略。
这里我们新建一个分片为3,副本为1的索引,分片分别分布在三个节点,此时集群为 green
当master节点所在机器宕机导致服务终止,此时集群会如何处理呢
我们可以看到,从node1主节点宕机到ES恢复集群可用性的过程中,ES有着自己的故障转移机制,保障了集群的高可用性。我们也可以在自己的本地上去进行试验,建好索引后,kill掉主节点,观察集群状态就行。
同时,此时就算node2宕机了,那么node3也能够很快的恢复服务的提供能力。
我们知道,我们创建的文档最终会存储在分片上,那么在分布式集群的基础上,ES集群是怎么判断当前该文档最终应该落在哪一个分片上呢?
很显然,我们需要一个可以实现文档均匀分布到各个分片上的映射算法,那么常见的随机算法和round-robin(轮询)算法可以满足需要吗?答案是不可以,这两个算法虽然可以实现文档均匀分布分片的存储需要,但是当我们通过 DocumentId 查询文档时,ES并不能知道这个文档ID到底存储在了哪个节点的分片上,所以只能够从所有分片上检索,时间长。如果我们为这个问题建立一个文档和分片映射关系的表,虽然确实可以快速定位到文档对应的存储分片,但是当文档的数据量很大的时候,那么检索的效率也会随之变低。
对于上面这个问题,ES提供的解决方法是 建立文档到分片的映射算法
es 通过如下的公式计算文档对应的分片:
hash算法 保证可以将数据均匀地分散在分片中
routing 是一个关键参数,默认是文档id,也可以自行指定
number_of_primary_shards 是主分片数
我们可以看到,该算法与主分片数相关, 这也是分片数一旦确定后便不能更改的原因
我们已经知道了ES是如何将文档映射到分片上去了,下面我们就来详细讲解一下文档创建、读取的流程。
脑裂问题,英文为 split-brain ,是分布式系统中的经典网络问题,如下图所示:
3个节点组成的集群,突然node1的网络和其他两个节点中断
解决方案为 仅在可选举master-eligible节点数大于等于quorum时才可以进行master选举
在讲文档搜索实时性之前,先讲一下倒排索引的不可变更特性。由于倒排索引一旦生成,不可变更的特定,使得其有着以下3点好处:
下面,将针对Lucene实现文档实时性搜索的几个动作进行讲解,分析其是如何在新增文档后实现ES的搜索实时性的。
我们从上面的描述中知道,当我们新增了一个文档后会新增一个倒排索引文件 segment ,但是 segment 写入磁盘的时间依然比较耗时(难以实现实时性),所以ES借助文件系统缓存的特性, 先将 segment 在缓存中创建并开放查询来进一步提升实时性 ,该过程在es中被称为refresh。
在refresh之前文档会先存储在一个buffer中,refresh时将 buffer中的所有文档清空并生成 segment
es默认每1秒执行一次refresh,因此文档的实时性被提高到1秒 ,这也是es被称为近实时(Near Real Time)的原因
reflush虽然通过 将文档存放在缓存中 的方式实现了秒级别的实时性,但是如果在内存中的segment还没有写入磁盘前发生了宕机,那么其中的文档就无法恢复了,如何解决这个问题呢
ES 引入 translog 机制。写入文档到 buffer 时,同时将该操作写入 translog 中。
translog文件会即时写入磁盘(fsync),在ES 6x中,默认每个请求都会落盘,我们也可以修改为每5秒写一次,这样风险便是丢失5秒内的数据,相关配置为indextranslog。同时ES每次启动时会检查translog 文件,并从中恢复数据。
flush 负责将内存中的segment写入磁盘,主要做如下的工作:
Reflush和Flush执行的时机
ES的做法是 首先删除文档,然后再创建新文档
我们上面提到,新增文档是通过新建segment来解决,删除文档是通过维护del文件来进行的,假如现在我们设置的 reflush 时间间隔为1秒,那么一小时单个ES索引就会生成3600个segment,一天下来乃至一个月下来会产生的segment文件数量更是不可想象。为了解决Segment过多可能引起的性能下降问题,ES中采用了Segment Merging(即segment合并)的方法来减少segment的数量。
执行合并操作的方式有两种,一种是ES定时在后台进行 Segment Merging 操作,还有一种是我们手动执行 force_merge_api 命令来实现合并操作。
0条评论