监视器故障排除
When a cluster encounters monitor-related troubles there’s a tendency topanic, and some times with good reason. You should keep in mind that losinga monitor, or a bunch of them, don’t necessarily mean that your cluster isdown, as long as a majority is up, running and with a formed quorum.Regardless of how bad the situation is, the first thing you should do is tocalm down, take a breath and try answering our initial troubleshooting script.
开始排障
监视器在运行吗?
First of all, we need to make sure the monitors are running. You would beamazed by how often people forget to run the monitors, or restart them afteran upgrade. There’s no shame in that, but let’s try not losing a couple ofhours chasing an issue that is not there.
Are you able to connect to the monitor’s servers?
Doesn’t happen often, but sometimes people do have iptables rules thatblock accesses to monitor servers or monitor ports. Usually leftovers frommonitor stress-testing that were forgotten at some point. Try ssh’ing intothe server and, if that succeeds, try connecting to the monitor’s portusing you tool of choice (telnet, nc,…).
ceph -s 是否能运行并收到集群回复?
如果答案是肯定的,那么你的集群已启动并运行着。你可以想当然地认为如果已经形成法定人数,监视器们就只会响应 status 请求。
If ceph -s blocked however, without obtaining a reply from the clusteror showing a lot of fault messages, then it is likely that your monitorsare either down completely or just a portion is up – a portion that is notenough to form a quorum (keep in mind that a quorum if formed by a majorityof monitors).
ceph -s 没完成是什么情况?
If you haven’t gone through all the steps so far, please go back and do.
For those running on Emperor 0.72-rc1 and forward, you will be able tocontact each monitor individually asking them for their status, regardlessof a quorum being formed. This an be achieved using ceph ping mon.ID,ID being the monitor’s identifier. You should perform this for each monitorin the cluster. In section 理解 mon_status we will explain howto interpret the output of this command.
For the rest of you who don’t tread on the bleeding edge, you will need tossh into the server and use the monitor’s admin socket. Please jump to使用监视器的管理套接字.
For other specific issues, keep on reading.
使用监视器的管理套接字
通过管理套接字,你可以用 Unix 套接字文件直接与指定守护进程交互。这个文件位于你监视器的 run 目录下,默认配置时它位于 /var/run/ceph/ceph-mon.ID.asok ,但你要是改过就不一定在那里了。如果你在那里没找到它,请看看 ceph.conf 里是否配置了其它路径、或者用下面的命令获取:
- ceph-conf --name mon.ID --show-config-value admin_socket
请牢记,只有在监视器运行时管理套接字才可用。监视器正常关闭时,管理套接字会被删除;如果监视器不运行了、但管理套接字还存在,就说明监视器不是正常关闭的。不管怎样,监视器没在运行,你就不能使用管理套接字, ceph 命令会返回类似 Error111:ConnectionRefused 的错误消息。
访问管理套接字很简单,就是让 ceph 工具使用 asok 文件。对于 Dumpling 之前的版本,命令是这样的:
- ceph --admin-daemon /var/run/ceph/ceph-mon.<id>.asok <command>
对于 Dumpling 及后续版本,你可以用另一个(推荐的)命令:
- ceph daemon mon.<id> <command>
ceph 工具的 help 命令会显示管理套接字支持的其它命令。请仔细了解一下 configget 、 configshow 、 mon_status 和 quorum_status 命令,在排除监视器故障时它们能给你些启发。
理解 mon_status
mon_status can be obtained through the ceph tool when you havea formed quorum, or via the admin socket if you don’t. This command willoutput a multitude of information about the monitor, including the sameoutput you would get with quorum_status.
Take the following example of mon_status:
- { "name": "c",
- "rank": 2,
- "state": "peon",
- "election_epoch": 38,
- "quorum": [
- 1,
- 2],
- "outside_quorum": [],
- "extra_probe_peers": [],
- "sync_provider": [],
- "monmap": { "epoch": 3,
- "fsid": "5c4e9d53-e2e1-478a-8061-f543f8be4cf8",
- "modified": "2013-10-30 04:12:01.945629",
- "created": "2013-10-29 14:14:41.914786",
- "mons": [
- { "rank": 0,
- "name": "a",
- "addr": "127.0.0.1:6789\/0"},
- { "rank": 1,
- "name": "b",
- "addr": "127.0.0.1:6790\/0"},
- { "rank": 2,
- "name": "c",
- "addr": "127.0.0.1:6795\/0"}]}}
A couple of things are obvious: we have three monitors in the monmap (a, b_and _c), the quorum is formed by only two monitors, and c is in the quorumas a peon.
Which monitor is out of the quorum?
The answer would be a.
Why?
Take a look at the quorum set. We have two monitors in this set: 1and 2. These are not monitor names. These are monitor ranks, as establishedin the current monmap. We are missing the monitor with rank 0, and accordingto the monmap that would be mon.a.
By the way, how are ranks established?
Ranks are (re)calculated whenever you add or remove monitors and follow asimple rule: the greater the IP:PORT combination, the lower therank is. In this case, considering that 127.0.0.1:6789 is lower than allthe remaining IP:PORT combinations, mon.a has rank 0.
最常见的监视器问题
Have Quorum but at least one Monitor is down
When this happens, depending on the version of Ceph you are running,you should be seeing something similar to:
- $ ceph health detail
- [snip]
- mon.a (rank 0) addr 127.0.0.1:6789/0 is down (out of quorum)
How to troubleshoot this?
First, make sure mon.a is running.
Second, make sure you are able to connect to mon.a‘s server from theother monitors’ servers. Check the ports as well. Check iptables onall your monitor nodes and make sure you’re not dropping/rejectingconnections.
If this initial troubleshooting doesn’t solve your problems, then it’stime to go deeper.
First, check the problematic monitor’s mon_status via the adminsocket as explained in 使用监视器的管理套接字 and理解 mon_status.
Considering the monitor is out of the quorum, its state should be one ofprobing, electing or synchronizing. If it happens to be eitherleader or peon, then the monitor believes to be in quorum, whilethe remaining cluster is sure it is not; or maybe it got into the quorumwhile we were troubleshooting the monitor, so check you ceph -s againjust to make sure. Proceed if the monitor is not yet in the quorum.
What if the state is probing?
This means the monitor is still looking for the other monitors. Every timeyou start a monitor, the monitor will stay in this state for some timewhile trying to find the rest of the monitors specified in the monmap.The time a monitor will spend in this state can vary. For instance, when ona single-monitor cluster, the monitor will pass through the probing statealmost instantaneously, since there are no other monitors around. On amulti-monitor cluster, the monitors will stay in this state until theyfind enough monitors to form a quorum – this means that if you have 2 outof 3 monitors down, the one remaining monitor will stay in this stateindefinitively until you bring one of the other monitors up.
If you have a quorum, however, the monitor should be able to find theremaining monitors pretty fast, as long as they can be reached. If yourmonitor is stuck probing and you’ve gone through with all the communicationtroubleshooting, then there is a fair chance that the monitor is tryingto reach the other monitors on a wrong address. mon_status outputs themonmap known to the monitor: check if the other monitor’s locationsmatch reality. If they don’t, jump toRecovering a Monitor’s Broken monmap; if they do, then it may be relatedto severe clock skews amongst the monitor nodes and you should refer to时钟偏移 first, but if that doesn’t solve your problem then it isthe time to prepare some logs and reach out to the community (please referto 收集所需日志 on how to best prepare your logs).
What if state is electing?
This means the monitor is in the middle of an election. These should befast to complete, but at times the monitors can get stuck electing. Thisis usually a sign of a clock skew among the monitor nodes; jump to时钟偏移 for more infos on that. If all your clocks are properlysynchronized, it is best if you prepare some logs and reach out to thecommunity. This is not a state that is likely to persist and aside from(really) old bugs there isn’t an obvious reason besides clock skews onwhy this would happen.
What if state is synchronizing?
This means the monitor is synchronizing with the rest of the cluster inorder to join the quorum. The synchronization process is as faster assmaller your monitor store is, so if you have a big store it maytake a while. Don’t worry, it should be finished soon enough.
However, if you notice that the monitor jumps from synchronizing toelecting and then back to synchronizing, then you do have aproblem: the cluster state is advancing (i.e., generating new maps) waytoo fast for the synchronization process to keep up. This used to be athing in early Cuttlefish, but since then the synchronization process wasquite refactored and enhanced to avoid just this sort of behavior. If thishappens in later versions let us know. And bring some logs(see 收集所需日志).
What if state is leader or peon?
Recovering a Monitor’s Broken monmap
This is how a monmap usually looks like, depending on the number ofmonitors:
- epoch 3
- fsid 5c4e9d53-e2e1-478a-8061-f543f8be4cf8
- last_changed 2013-10-30 04:12:01.945629
- created 2013-10-29 14:14:41.914786
- 0: 127.0.0.1:6789/0 mon.a
- 1: 127.0.0.1:6790/0 mon.b
- 2: 127.0.0.1:6795/0 mon.c
This may not be what you have however. For instance, in some versions ofearly Cuttlefish there was this one bug that could cause your monmapto be nullified. Completely filled with zeros. This means that not evenmonmaptool would be able to read it because it would find it hard tomake sense of only-zeros. Some other times, you may end up with a monitorwith a severely outdated monmap, thus being unable to find the remainingmonitors (e.g., say mon.c is down; you add a new monitor mon.d,then remove mon.a, then add a new monitor mon.e and removemon.b; you will end up with a totally different monmap from the onemon.c knows).
In this sort of situations, you have two possible solutions:
Scrap the monitor and create a new one
You should only take this route if you are positive that you won’tlose the information kept by that monitor; that you have other monitorsand that they are running just fine so that your new monitor is ableto synchronize from the remaining monitors. Keep in mind that destroyinga monitor, if there are no other copies of its contents, may lead toloss of data.
Inject a monmap into the monitor
Usually the safest path. You should grab the monmap from the remainingmonitors and inject it into the monitor with the corrupted/lost monmap.
These are the basic steps:
Is there a formed quorum? If so, grab the monmap from the quorum:
- $ ceph mon getmap -o /tmp/monmap
No quorum? Grab the monmap directly from another monitor (thisassumes the monitor you’re grabbing the monmap from has id ID-FOOand has been stopped):
- $ ceph-mon -i ID-FOO —extract-monmap /tmp/monmap
Stop the monitor you’re going to inject the monmap into.
Inject the monmap:
- $ ceph-mon -i ID —inject-monmap /tmp/monmap
Start the monitor
Please keep in mind that the ability to inject monmaps is a powerfulfeature that can cause havoc with your monitors if misused as it willoverwrite the latest, existing monmap kept by the monitor.
时钟偏移
Monitors can be severely affected by significant clock skews across themonitor nodes. This usually translates into weird behavior with no obviouscause. To avoid such issues, you should run a clock synchronization toolon your monitor nodes.
What’s the maximum tolerated clock skew?
By default the monitors will allow clocks to drift up to 0.05 seconds.
Can I increase the maximum tolerated clock skew?
This value is configurable via the mon-clock-drift-allowed option, andalthough you CAN it doesn’t mean you SHOULD. The clock skew mechanismis in place because clock skewed monitor may not properly behave. We, asdevelopers and QA afficcionados, are comfortable with the current defaultvalue, as it will alert the user before the monitors get out hand. Changingthis value without testing it first may cause unforeseen effects on thestability of the monitors and overall cluster healthiness, although there isno risk of dataloss.
How do I know there’s a clock skew?
The monitors will warn you in the form of a HEALTH_WARN. ceph healthdetail should show something in the form of:
- mon.c addr 10.10.0.1:6789/0 clock skew 0.08235s > max 0.05s (latency 0.0045s)
That means that mon.c has been flagged as suffering from a clock skew.
What should I do if there’s a clock skew?
Synchronize your clocks. Running an NTP client may help. If you are alreadyusing one and you hit this sort of issues, check if you are using some NTPserver remote to your network and consider hosting your own NTP server onyour network. This last option tends to reduce the amount of issues withmonitor clock skews.
客户端不能连接或挂载
检查防火墙配置。有些系统安装工具把 REJECT 规则加入了 iptables ,它会拒绝除 ssh 以外的所有入栈连接。如果你的监视器主机有这样的 REJECT 规则,别的客户端进来的连接将遇到超时错误而不能挂载。得先找到这条拒绝客户端连入的 iptables 规则,例如,你要找到形似以下的规则:
- REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
你也许还要在 Ceph 主机上增加 iptables 规则来放通 Ceph 监视器端口(即默认的 6789 端口)、和 OSD 端口(默认从 6800 到 7300 )。例如:
- iptables -A INPUT -m multiport -p tcp -s {ip-address}/{netmask} --dports 6789,6800:7300 -j ACCEPT
所有尝试都失败了,怎么办?
到外面寻求帮助
You can find us on IRC at #ceph and #ceph-devel at OFTC (server irc.oftc.net)and on ceph-devel@vger.kernel.org and ceph-users@lists.ceph.com. Makesure you have grabbed your logs and have them ready if someone asks: the fasterthe interaction and lower the latency in response, the better chances everyone’stime is optimized.
收集所需日志
Monitor logs are, by default, kept in /var/log/ceph/ceph-mon.FOO.log*. Wemay want them. However, your logs may not have the necessary information. Ifyou don’t find your monitor logs at their default location, you can checkwhere they should be by running:
- ceph-conf --name mon.FOO --show-config-value log_file
The amount of information in the logs are subject to the debug levels beingenforced by your configuration files. If you have not enforced a specificdebug level then Ceph is using the default levels and your logs may notcontain important information to track down you issue.A first step in getting relevant information into your logs will be to raisedebug levels. In this case we will be interested in the information from themonitor.Similarly to what happens on other components, different parts of the monitorwill output their debug information on different subsystems.
You will have to raise the debug levels of those subsystems more closelyrelated to your issue. This may not be an easy task for someone unfamiliarwith troubleshooting Ceph. For most situations, setting the following optionson your monitors will be enough to pinpoint a potential source of the issue:
- debug mon = 10
- debug ms = 1
If we find that these debug levels are not enough, there’s a chance we mayask you to raise them or even define other debug subsystems to obtain infosfrom – but at least we started off with some useful information, insteadof a massively empty log without much to go on with.
我需要重启监视器来更改调试级别吗?
No. You may do it in one of two ways:
You have quorum
Either inject the debug option into the monitor you want to debug:
- ceph tell mon.FOO injectargs —debug_mon 10/10
or into all monitors at once:
- ceph tell mon.* injectargs —debug_mon 10/10
No quourm
Use the monitor’s admin socket and directly adjust the configurationoptions:
- ceph daemon mon.FOO config set debug_mon 10/10
Going back to default values is as easy as rerunning the above commandsusing the debug level 1/10 instead. You can check your currentvalues using the admin socket and the following commands:
- ceph daemon mon.FOO config show
or:
- ceph daemon mon.FOO config get 'OPTION_NAME'
在某个调试级别下重现了问题,然后呢?
Ideally you would send us only the relevant portions of your logs.We realise that figuring out the corresponding portion may not be theeasiest of tasks. Therefore, we won’t hold it to you if you provide thefull log, but common sense should be employed. If your log has hundredsof thousands of lines, it may get tricky to go through the whole thing,specially if we are not aware at which point, whatever your issue is,happened. For instance, when reproducing, keep in mind to write downcurrent time and date and to extract the relevant portions of your logsbased on that.
Finally, you should reach out to us on the mailing lists, on IRC or filea new issue on the tracker.