Ceph分布式存储是怎么防止脑裂的?

Ceph分布式存储是怎么防止脑裂的?,第1张

解决脑裂问题,通常采用隔离(Fencing)机制,包括三个方面:
共享存储fencing:确保只有一个Master往共享存储中写数据。
客户端fencing:确保只有一个Master可以响应客户端的请求。
Slave fencing:确保只有一个Master可以向Slave下发命令。
Hadoop公共库中对外提供了两种fenching实现,分别是sshfence和shellfence(缺省实现),其中sshfence是指通过ssh登陆目标Master节点上,使用命令fuser将进程杀死(通过tcp端口号定位进程pid,该方法比jps命令更准确),shellfence是指执行一个用户事先定义的shell命令(脚本)完成隔离。
切换对外透明:为了保证整个切换是对外透明的,Hadoop应保证所有客户端和Slave能自动重定向到新的active master上,这通常是通过若干次尝试连接旧master不成功后,再重新尝试链接新master完成的,整个过程有一定延迟。在新版本的Hadoop RPC中,用户可自行设置RPC客户端尝试机制、尝试次数和尝试超时时间等参数。
在“双机热备”高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障,2个节点上的HA软件像“裂脑人”一样,“本能”地争抢“共享资源”、争起“应用服务”,就会发生严重后果:或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。
运行于备用主机上的Heartbeat可以通过以太网连接检测主服务器的运行状态,一旦其无法检测到主服务器的“心跳”则自动接管主服务器的资源。通常情况下,主、备服务器间的心跳连接是一个独立的物理连接,这个连接可以是串行线缆、一个由“交叉线”实现的以太网连接。Heartbeat甚至可同时通过多个物理连接检测主服务器的工作状态,而其只要能通过其中一个连接收到主服务器处于活动状态的信息,就会认为主服务器处于正常状态。从实践经验的角度来说,建议为Heartbeat配置多条独立的物理连接,以避免Heartbeat通信线路本身存在单点故障。
1、串行电缆:被认为是比以太网连接安全性稍好些的连接方式,因为hacker无法通过串行连接运行诸如telnet、ssh或rsh类的程序,从而可以降低其通过已劫持的服务器再次侵入备份服务器的几率。但串行线缆受限于可用长度,因此主、备服务器的距离必须非常短。
2、以太网连接:使用此方式可以消除串行线缆的在长度方面限制,并且可以通过此连接在主备服务器间同步文件系统,从而减少了从正常通信连接带宽的占用。
基于冗余的角度考虑,应该在主、备服务器使用两个物理连接传输heartbeat的控制信息;这样可以避免在一个网络或线缆故障时导致两个节点同时认为自已是唯一处于活动状态的服务器从而出现争用资源的情况,这种争用资源的场景即是所谓的“脑裂”(split-brain)或“partitioned cluster”。在两个节点共享同一个物理设备资源的情况下,脑裂会产生相当可怕的后果。
为了避免出现脑裂,可采用下面的预防措施:
添加冗余的心跳线,例如双线条线。尽量减少“裂脑”发生机会。
启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即,正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下 参考IP,不通则表明断点就出在本端,不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

这里是结合Hadoop20使用的1,download:根据的spark的README中的描述合适的版本3,安装其实就是解压,配置/etc/profile环境变量exportSPARK_HOME=/data1/spark/sparkexportSCALA_HOME=/data1/spark/scala-293exportPATH=$PATH:$SPARK_HOME/bin:$SCALA_HOME/bin配置spark的conf下的spark-envshexportJAVA_HOME=/usr/java/defaultexportSCALA_HOME=/data1/spark/scala-293exportSPARK_MASTER_IP=19216801exportSPARK_MASTER_WEBUI_PORT=8080exportSPARK_WORKER_WEBUI_PORT=8000exportYARN_CONF_DIR=/data/hadoop/hadoop-20/etc/hadoop配置slaves(ip根据需要修改)1921680219216803分发spark目录和scala目录到几台服务器相同路径下4,启动进入主节点的spark目录的bin下stop-allsh是停掉集群,start-allsh启动集群,jps可以在主节点看到master进程,slave节点看到worker进程5,运行程序,运行例子进入spark目录下分布式运行/run-exampleorgapachesparkexamplesSparkPispark://19216801:7077/run-exampleorgapachesparkexamplesSparkLRspark://19216801:7077本地运行/run-exampleorgapachesparkexamplesSparkPilocal/run-exampleorgapachesparkexamplesSparkLRlocal

jstack用于打印出给定的java进程ID或corefile或远程调试服务的Java堆栈信息。如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:jstack[-l]pid如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的javastack和nativestack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的javastack和nativestack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。需要注意的问题:l不同的JAVA虚机的线程DUMP的创建方法和文件格式是不一样的,不同的JVM版本,dump信息也有差别。l在实际运行中,往往一次dump的信息,还不足以确认问题。建议产生三次dump信息,如果每次dump都指向同一个问题,我们才确定问题的典型性。2、命令格式$jstack[option]pid$jstack[option]executablecore$jstack[option][server-id@]remote-hostname-or-IP参数说明:pid:java应用程序的进程号,一般可以通过jps来获得;executable:产生coredump的java可执行程序;core:打印出的core文件;remote-hostname-or-ip:远程debug服务器的名称或IP;server-id:唯一id,假如一台主机上多个远程debug服务;示例:$jstack–l23561线程分析:一般情况下,通过jstack输出的线程信息主要包括:jvm自身线程、用户线程等。其中jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。ljvm线程:在线程中,有一些JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在JVM初始化的时候就存在,如下所示:1"AttachListener"daemonprio=10tid=0x0000000052fb8000nid=0xb8fwaitingoncondition[0x0000000000000000]23javalangThreadState:RUNNABLE4567Lockedownablesynchronizers:89-None1011destroyJavaVM"prio=10tid=0x00002aaac1225800nid=0x7208waitingoncondition[0x0000000000000000]1213javalangThreadState:RUNNABLE14151617Lockedownablesynchronizers:1819-Nonel用户级别的线程还有一类线程是用户级别的,它会根据用户请求的不同而发生变化。该类线程的运行情况往往是我们所关注的重点。而且这一部分也是最容易产生死锁的地方。1"qtp496432309-42"prio=10tid=0x00002aaaba2a1800nid=0x7580waitingoncondition[0x00000000425e9000]23javalangThreadState:TIMED_WAITING(parking)45atsunmiscUnsafepark(NativeMethod)67-parkingtowaitfor(ajavautilconcurrentlocksAbstractQueuedSynchronizer$ConditionObject)89atjavautilconcurrentlocksLockSupportparkNanos(LockSupportjava:198)1011atjavautilconcurrentlocksAbstractQueuedSynchronizer$ConditionObjectawaitNanos(AbstractQueuedSynchronizerjava:2025)1213atorgeclipsejettyutilBlockingArrayQueuepoll(BlockingArrayQueuejava:320)1415atorgeclipsejettyutilthreadQueuedThreadPool$2run(QueuedThreadPooljava:479)1617atjavalangThreadrun(Threadjava:662)18192021Lockedownablesynchronizers:2223-None从上述的代码示例中我们可以看到该用户线程的以下几类信息:Ø线程的状态:waitingoncondition(等待条件发生)Ø线程的调用情况;Ø线程对资源的锁定情况;

你是要单次运行还是不挂断在后台运行?单次直接java -jar xxxjar 就可以了,不挂断的话,可以编写一个shell脚本,startsh 内容如下
#!/bin/sh
nohup java -jar -XX:PermSize=64m -XX:MaxPermSize=128m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:SurvivorRatio=8 xxxjar>/dev/null 2>&1 &
具体的参数你自己把握,然后保存,给这个脚本赋于可执行权限,chmod +x startsh
然后执行这个脚本,sh startsh ,然后查看一下java进程,看这个服务起来没有,jps

GPS定位器,就是利用GPS卫星定位终端对远程目标(汽车)准确定位、实时追踪、远程监听、防盗反劫。但说到GPS定位器的安装位置,相信很多小伙伴都不知道,那到底怎么找出车上的定位器,车辆gps一般装在哪里呢,想要更快找到GPS的话,首先得知道定位器是属于哪种类型。

强磁免费安装GPS

这种类型的GPS定位器可以说是相当迷你可爱,为了避免被发现,车辆GPS,通常以一种更隐蔽的地方,如前后保险杠、备份、扶手在箱子里,乘客座位,副位置手套箱或手套箱下面,即使在底盘(需要防水袋)是可能的。因此,如果你有一个强大的,不安装的GPS定位器,它需要很多努力来找到它。

通过线性GPS

现在大多数GPS定位器都是线性的,需要一个电源连接来给它们供电。所以当我们寻找GPS的时候,我们可以追踪汽车的电源线,我们就会找到它。但是我们最好把它留给专业人士,因为汽车的线路是如此复杂,你甚至不知道如何将它连接到GPS,如果你不正确地处理它,这可能是危险的。

OBD接口型

市场上有很多OBD设备,不仅可以检测汽车故障,还可以实现汽车定位、行车记录等功能,如定位器的智能诊断终端。因此,我们只需要找到OBD的接口位置就可以找到定位器。OBD接口的位置一般在方向盘的左下角或右下角,有些型号在中控点火器附近或在中央扶手盒内。

注意事项:

当然,最直接明了的方法肯定是使用GPS型号检测仪了。定位器就跟手机一样,需要安装SIM卡来接受和发送信息,因此在工作状态下是具有一定频率的。这时候就可以拿着这个检测仪,慢慢在汽车四处搜索一下,很快就能够找到GPS定位器的位置了。

1 首先,你下的不是excel文件,在网页下载的时候,有些网页必须是点击下载,不能右键另存为的方式储存,需要你点击下载按钮,d出菜单下载。
2,如果,下载的是你需要的文件,你可以修改文件的扩展名为xls格式,有可能解决你的问题。
希望对你有所帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zz/13481150.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-15
下一篇 2023-08-15

发表评论

登录后才能评论

评论列表(0条)

保存