**Describe the solution you'd like**

We already can run clickhouse-server without configured ZooKeeper (the tables will start in read-only mode)
and with configured ZooKeeper, if it starts to be inaccessible at runtime (the tables will be read-only until the session is re-established).

Let's also make it possible to start up when ZooKeeper is unavailable.

**Additional context**

If that will be very hard to implement, we can consider other options:
- lazy attaching of the tables after sever start-up;
- a maintenance mode when the tables are not attached at start-up and require manual ATTACH queries.
void restoreMetadataInZooKeeper();
    
    ThrottlerPtr getFetchesThrottler() const
    {
        return replicated_fetches_throttler;
    }
    
    ThrottlerPtr getSendsThrottler() const
    {
        return replicated_sends_throttler;
    }
    bool createEmptyPartInsteadOfLost(zkutil::ZooKeeperPtr zookeeper, const String & lost_part_name);
    
    String getZooKeeperName() const { return zookeeper_name; }
    String getZooKeeperPath() const { return zookeeper_path; }
    
    String getTableSharedID() const override;
    
    static std::optional<String> tryGetTableSharedIDFromCreateQuery(const IAST & create_query, const ContextPtr & global_context);
    static String getDefaultZooKeeperName() { return default_zookeeper_name; }