> (you don't have to strictly follow this form)

**Use case**

Support manually snapshot for Keeper.

**Describe the solution you'd like**

Throught 4lw commands, such as `csnp`.


{
    state_machine->init();
    state_manager->loadLogStore(state_machine->last_commit_index() + 1, coordination_settings->reserved_log_items);
    auto log_store = state_manager->load_log_store();
    auto next_log_idx = log_store->next_slot();
    if (next_log_idx > 0 && next_log_idx > state_machine->last_commit_index())
    {
        auto log_entries = log_store->log_entries(state_machine->last_commit_index() + 1, next_log_idx);
        size_t preprocessed = 0;
        LOG_INFO(log, "Preprocessing {} log entries", log_entries->size());
        auto idx = state_machine->last_commit_index() + 1;
        for (const auto & entry : *log_entries)
        {
            if (entry && entry->get_val_type() == nuraft::log_val_type::app_log)
                state_machine->pre_commit(idx, entry->get_buf());
            ++idx;
            ++preprocessed;
            if (preprocessed % 50000 == 0)
                LOG_TRACE(log, "Preprocessed {}/{} entries", preprocessed, log_entries->size());
        }
        LOG_INFO(log, "Preprocessing done");
    }
    loadLatestConfig();
    last_local_config = state_manager->parseServersConfiguration(config, true).cluster_config;
    launchRaftServer(config, enable_ipv6);
    keeper_context->server_state = KeeperContext::Phase::RUNNING;
}
void KeeperServer::shutdownRaftServer()