In this paper, we address the problem of how to schedule user jobs in grids so that failures can be avoided in the presence of resources faults. We employ job replication as an effective mechanism to achieve efficient and fault-tolerant scheduling system. Most of the existing replication-based algorithms use a fixed number of replications for each job which consumes more grid resources. We first propose an algorithm to determine adaptively the number of job replicas according to the grid failure history. Then we propose an algorithm to schedule these replicas. The proposed algorithms have been evaluated through simulation and have shown better performance in terms of grid load, throughput and failure tendency.