Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Кеширование на отдельном сервере с использованием тегов (https://javascript.ru/forum/server/23351-keshirovanie-na-otdelnom-servere-s-ispolzovaniem-tegov.html)

greatilya 21.11.2011 10:01

Кеширование на отдельном сервере с использованием тегов
 
Добрый день!

Хотел бы сделать кеширование на отдельном сервере.
Memcache не подходит т.к. он использует только оперативу, что пока достаточно дороговато. Как вариант memcacheDB, он использует хранение информации в файловой системе и ускоряет операции за счет использования оперативы, также он отлично масштабируется. Вот только у memcacheDB, как и у memcache нет возможности привязки тегов к записям.

Иными словами нужна возможность задать кеш вида:
set(key,value,array(tag1,tag2,tag3...,tagN))
считать:
get(key)
очистить по тегу:
clear(tag1)

Ну и естественно, поскольку кеширование на отдельном сервере, критична скорость работы.

Есть какие-то аналоги memcacheDB с возможностью использования тегов?

UPD: Пока присматриваюсь к MongoDB, вероятно она мне подойдет.

x-yuri 24.11.2011 08:02

mongodb... это скорее альтернатива memcache + реляционная БД (кстати, не работает c openvz, если что). А для memcache можно самому теги реализовать (например, рассказано в этом видео, на 38-ой минуте) или воспользоваться готовыми реализациями (в этой статье, описана реализация Котерова и комментарии можно почитать, в zf что-то должно быть и есть еще memcache-tags)

VKS 02.12.2011 18:03

http://code.google.com/p/memcached-tag/

B~Vladi 09.12.2011 11:28

Цитата:

Сообщение от greatilya
Как вариант memcacheDB, он использует хранение информации в файловой системе и ускоряет операции за счет использования оперативы

MongoDB тоже хранит кеш в оперативе. Причем может хранить только в RAM, вот пример настройки.

greatilya 14.02.2012 14:31

x-yuri,
спасибо за видео, оно супер, много полезной информации.
Если есть возможность, скоординируйте меня. Я на "чистый" ubuntu поставил Berkeley DB, libevent, memcachedb. И теперь ищу по интернету и не могу понять один момент: как ограничить доступ к мемкешу? Получается что любой желающий теперь может обращаться к мемкешу. В мемкеше как я понял никаких ограничений сделать нельзя... видимо нужно ставить еще что-то?

B~Vladi 14.02.2012 17:56

Цитата:

Сообщение от greatilya
В мемкеше как я понял никаких ограничений сделать нельзя...

Повесь его на localhost и всё.

greatilya 14.02.2012 18:58

B~Vladi,
он у меня на отдельном сервере, и обращение к нему соответственно идет по ip. Используется только для кеша.

B~Vladi 14.02.2012 19:10

Цитата:

Сообщение от greatilya
он у меня на отдельном сервере

Ну тогда вариантов много, но я не сисадмин, могу только сделать предположение.
Можно задать правило в iptables, что бы на ip/порт memcached-а могли обращаться только с нужного ip.

greatilya 14.02.2012 19:51

Цитата:

Сообщение от B~Vladi
могли обращаться только с нужного ip

Да тоже думал на этот счет, думаю iptables можно настроить так. Но думал авось есть другие варианты, т.к. дома у локального ПК динамический ip. На серверах то конечно у меня ip статичные и их я добавлю. Либо сделать для дома некий прокси, либо свой локальный тестовый мемкеш. Но если появятся идеи, буду рад :)

UPD: дело в том что не очень удобно добавлять ip адреса по мере докупки серверов ... еще пока покопаю идеи ...

B~Vladi 14.02.2012 21:54

Цитата:

Сообщение от greatilya
либо свой локальный тестовый мемкеш

Я так и сделал. Не нравится только что под винду древняя неофициальная сборка, но ничего не мешает поднять виртуалку.

x-yuri 20.02.2012 11:12

извиняюсь за мой английский, но на русском не нашел:
Цитата:

You don't! Well, you used to not be able to. Now you can. If your client supports it, you may use SASL authentication to connect to memcached.

Keep in mind that you should do this only if you really need to. On a closed internal network this ends up just being added latency for new connections (if minor).
http://code.google.com/p/memcached/w..._authenticate?

Цитата:

15.6.5.20: Is the data inside of memcached secure?

No, there is no security required to access or update the information within a memcached instance, which means that anybody with access to the machine has the ability to read, view and potentially update the information. If you want to keep the data secure, you can encrypt and decrypt the information before storing it. If you want to restrict the users capable of connecting to the server, your only choice is to either disable network access, or use IPTables or similar to restrict access to the memcached ports to a select set of hosts.
http://dev.mysql.com/doc/refman/5.0/...em-15-6-5-1-20

другими словами, они в принципе добавили аутентификацию в memcached, но по возможности этого лучше избегать: либо использовать iptables либо не делать memcache сервер видимым извне.

Цитата:

Сообщение от greatilya
UPD: дело в том что не очень удобно добавлять ip адреса по мере докупки серверов ... еще пока покопаю идеи ...

значит надо сделать это удобным, например,
$ add-another-server 127.0.0.1
aye aye, sir...


а что, memcache у себя дома на компьютере запускается? Ну есть в принципе такая штука, как динамический dns, но...

greatilya 02.03.2012 12:56

x-yuri,
Спасибо за информацию.

Ну сейчас уже все вопросы решил. В локале стоит memcahe под виндовс. На сервере стоит memcachedb. Благо управляются они чрез одну и ту же библиотеку для РНР. Ну а сервер кеша защитил с помощью iptables с блокировкой по портам и ip, вот скрипт если кому-то пригодится:
Код:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          rc.firewall
# Required-Start:   
# Required-Stop:   
# Default-Start:   
# Default-Stop:     
# Short-Description: Run rc.firewall
### END INIT INFO

IPT="/sbin/iptables"


start_fw()
{
    echo 1 > /proc/sys/net/ipv4/ip_forward
   
    $IPT -F
    $IPT -X
       
        # Правила блокировки.
        $IPT -P FORWARD DROP

        $IPT -P OUTPUT ACCEPT

        $IPT -P INPUT DROP
        $IPT -A INPUT -i lo -j ACCEPT
        $IPT -A INPUT -i eth0 --match state --state ESTABLISHED,RELATED -j ACCEPT

        $IPT -A INPUT -i eth0 -p tcp --dport 80 --match state --state NEW -j ACCEPT
        $IPT -A INPUT -i eth0 -p tcp --dport 8080 --match state --state NEW -j ACCEPT

        $IPT -A INPUT -i eth0 -s 1.1.1.1 -p tcp --dport 21201 -j ACCEPT
        $IPT -A INPUT -i eth0 -s 2.2.2.2 -p tcp --dport 21201 -j ACCEPT

        $IPT -A INPUT -m multiport -p tcp --dports 21,22,53,65000 -j ACCEPT
        $IPT -A INPUT -m multiport -p udp --dports 21,22,53,65000 -j ACCEPT
}

case "$1" in
start)        echo -n "Starting firewall: iptables"
        start_fw
        echo "."
        ;;
stop)        echo -n "Stopping firewall: iptables"
        iptables -F
        iptables -X
        echo "."
        ;;
save)        echo -n "Saving firewall: iptables"
        iptables-save > /etc/rules-save
        echo "."
        ;;   
restart) echo -n "Restarting firewall: iptables"
        iptables -F
        iptables -X
        cat /etc/rules-save | iptables-restore
        echo "."
        ;;
reload|force-reload) echo -n "Reloading configuration files for firewall: iptables"
        echo "."
        ;;
*)        echo "Usage: /etc/init.d/rc.iptables start|stop|restart|reload|force-reload"
        exit 1
        ;;
esac
exit 0

где 1.1.1.1 и 2.2.2.2 адреса которым нужно открыть mamcache. Ну и этот скрипт ставим в автозапуск. Порт 65000 нужен для панели управления, у других хостеров может быть другим.

Мемкеш шустренько бегает даже на VPS 256Мб. Только не разобрался еще сколько выделять оперативы на кеш Berkeley DB. Пока стоит значение по умолчанию 64Мб. А в целом очень доволен результатом, спасибо за помощь!


Часовой пояс GMT +3, время: 05:40.