You can use IOTA Peer Manager. Have a look at the neighbors boxes. They normally turn red after a while if there’s no sync between you and their node.
Here’s an example of a healthy neighbor, you can see it is also sending new transactions (green line) and the value of New Transactions increases in time:

At time of writing, and to the best of my knowledge, there is not one definitive answer. There are probably various factors that might keep the Solid milestone from ever reaching the latest one and thus remaining not fully synced.

I have noticed that this problem exacerbates when the database is relatively large (5GB+). This is mostly never a problem right after a snapshot, when things run much smoother. This might also be related to ongoing “bad” spam attacks directed against the network.

Some things to try:

Check your IRI logs. Some case in the past have shown a component failing (e.g. ZMQ) which caused milestone to get stuck. The logs might help identify errors. You can use iric to view logs (Manage Service->IRI->View log). If you don’t have iric you can install it Fullnode IRI Configuration Utility.

If there’s nothing seen in IRI logs (no errors), check other services.

Revalidate “drops” the stored solid milestone “table”. So all the milestones are revalidated once the node starts (checks signatures, balances etc). This is used it you take a DB from someone else, or have an issue with solid milestones acting out.

Rescan drops all the tables, except for the raw transaction trits, and re stores the transactions (refilling the metadata, address indexes etc) - this is used when a migration is needed when the DB schema changes mostly.

It is possible to add these options to the IRI configuration file (or startup command):

--revalidate or --rescan.

If you have used this installation’s tutorial / automation, you will find the configuration file in the following location:

OnUbuntu:/etc/default/iriOnCentOS:/etc/sysconfig/iri

You will see the OPTIONS variable, so you can tweak it like so:

OPTIONS="--rescan"

and restart IRI to take effect: systemctlrestartiri

Note

Once you’ve restarted the service with the --rescan or --revalidate options you can remove the option from the configuration file.
If it stays in the configuration file, subsequent restarts will use that option again, perhaps when you do not explicitly choose to enable it.

NOTE I am providing this database copy to help the community. Making this possible involves increasing costs due to the frequent downloads/bandwidth usage. Please consider donating to help keep this possible:

There was some debate on the slack channel whether after having imported a foreign database if it is required to run IRI with the --revalidate or --rescan flags. Some said they got fully synced without any of these.