Fault tolerance increases system availability and reliability by making systems robust to failures and proactive enough to tackle failures. Fault tolerance can be introduced at different architectural layers of the Internet of Things (IoT), this is because a fault can occur at any of the layers. As for example, motion sensors, and motors can fail at the root layer, network connectivity could be disrupted in network layer, computation and storage nodes can perform erroneously in their layers, so it becomes crucial to introduce fault tolerance in IoT systems at every layer. The study paves the way for classifying current and possible fault tolerant approaches by presenting different techniques(replication, network control etc.), architectural patterns(centralized, hybrid etc.), layers(network, sense etc.) & styles(Microservices, Publish-Subscribe etc.) that can help in making a system fault tolerant efficiently. Paper also discusses current trends in fault tolerance, areas that have been widely worked upon and areas that can act as a future scope, in making IoT based systems fault tolerant and efficient.