Spymemcache - Memcache / Membase Faileover - PullRequest
2 голосов
/ 25 января 2012

Платформа: 64-битная ОС Windows, spymemcached-2.7.3.jar, J2EE

Мы хотим использовать два сервера memcache / membase для решения кеширования.Мы хотим выделить 1 ГБ памяти для каждого сервера memcache / membase, чтобы мы могли кешировать 2 ГБ данных.Мы используем spymemcached Java-клиент для установки и получения данных из memcache.Мы не используем репликацию между двумя мембранными серверами.

Мы загружаем объект memcacheClient во время запуска нашего приложения J2EE.

    URI server1 = new URI("http://192.168.100.111:8091/pools");
    URI server2 = new URI("http://127.0.0.1:8091/pools");
    ArrayList<URI> serverList = new ArrayList<URI>();
    serverList.add(server1);
    serverList.add(server2);
    client = new MemcachedClient(serverList, "default", "");

После этого мы используем memcacheClient для получения и установки значенияна сервере memcache / membase.

Object obj = client.get("spoon");
client.set("spoon", 50, "Hello World!");

Похоже, что memcacheClient устанавливает и получает значение только с server1.

Если мы остановим server1, он не сможет получить / установить значение.Не следует ли использовать server2 в случае сбоя server1?Пожалуйста, дайте мне знать, если мы делаем что-то не так ...

Ответы [ 2 ]

2 голосов
/ 22 марта 2017

aspymemcached клиент Java не обрабатывает восстановление после отказа мембраны для конкретного узла.

Ref: https://blog.serverdensity.com/handling-memcached-failover/ Нам нужно обработать его вручную (с помощью нашего кода)

Мы можем сделать этоиспользуя ConnectionObserver Вот мой код:

public static void main(String a[]) throws InterruptedException{
            try {
                URI server1 = new URI("http://192.168.100.111:8091/pools");
                URI server2 = new URI("http://127.0.0.1:8091/pools");
                final  ArrayList<URI> serverList = new ArrayList<URI>();
                serverList.add(server1);
                serverList.add(server2);
               final MemcachedClient client = new MemcachedClient(serverList, "bucketName", "");
                client.addObserver(new ConnectionObserver() {

                    @Override
                    public void connectionLost(SocketAddress arg0) {
                        //method call when connection lost
                        for(MemcachedNode node : client.getNodeLocator().getAll()){
                            if(!node.isActive()){
                                client.shutdown();
                                //re init your client here, and after re-init it will connect to your secodry node
                                break;
                            }
                        }
                    }
                    @Override
                    public void connectionEstablished(SocketAddress arg0, int arg1) {
                        //method call when connection established 
                    }
                });
                Object obj = client.get("spoon");
                client.set("spoon", 50, "Hello World!");
            }  catch (Exception e) {
            }
    }
0 голосов
/ 25 января 2012

client.get () будет использовать первый доступный узел, и поэтому ваше значение будет храниться / обновляться только на одном узле.

Вы, кажется, немного противоречите вашим требованиям - сначала вы говорите, что ' мы хотим выделить 1 ГБ памяти для каждого сервера memcache / membase, так что всего мы можем кэшировать данные 2 ГБ ', что подразумевает модель распределенного кэша (определенный ключ хранится на одном узле в ферме кэша), а затем вы ожидаете получить его, если этот узел не работает, что, очевидно, не произойдет.

Если вам нужен вашферма кэша, чтобы пережить сбой узла без потери данных, кэшированных на этом узле, вы должны использовать репликацию, которая доступна в MemBase, но, очевидно, вы заплатите цену за хранение одних и тех же значений несколько раз, так что ваше желание - 1 ГБ на сервер ... всего 2 ГБкэша "не будет возможно.

...