Memcached (pronunciado de diversas formas mem-cash-dee o mem-cashed ) es un sistema de almacenamiento en caché de memoria distribuida de uso general . A menudo se utiliza para acelerar sitios web dinámicos basados en bases de datos almacenando en caché datos y objetos en RAM para reducir la cantidad de veces que se debe leer una fuente de datos externa (como una base de datos o API). Memcached es un software gratuito y de código abierto , con licencia BSD revisada . [2] Memcached se ejecuta en sistemas operativos similares a Unix ( Linux y macOS ) y en Microsoft Windows.. Depende de la biblioteca libevent .
Desarrollador (es) | Danga interactivo |
---|---|
Versión inicial | 22 de mayo de 2003 |
Lanzamiento estable | 1.6.9 [1] / 21 de noviembre de 2020 |
Repositorio | |
Escrito en | C |
Sistema operativo | Multiplataforma |
Tipo | sistema de almacenamiento en caché de memoria distribuida |
Licencia | Licencia BSD revisada [2] |
Sitio web | memcached |
Las API de Memcached proporcionan una tabla hash muy grande distribuida en varias máquinas. Cuando la tabla está llena, las inserciones posteriores hacen que los datos más antiguos se eliminen en el orden de uso menos reciente (LRU). [3] [4] Las aplicaciones que utilizan Memcached suelen colocar solicitudes y adiciones en la RAM antes de recurrir a un almacenamiento de respaldo más lento, como una base de datos.
Memcached no tiene un mecanismo interno para rastrear errores que puedan ocurrir. Sin embargo, algunas utilidades de terceros proporcionan esta funcionalidad.
Memcached fue desarrollado por primera vez por Brad Fitzpatrick para su sitio web LiveJournal , el 22 de mayo de 2003. [5] [6] Fue escrito originalmente en Perl , luego reescrito en C por Anatoly Vorobey , luego empleado por LiveJournal. [7] Memcached ahora se utiliza en muchos otros sistemas, incluidos YouTube , [8] Reddit , [9] Facebook , [10] [11] Pinterest , [12] [13] Twitter , [14] Wikipedia , [15] y Method Studios . [16] Google App Engine , Google Cloud Platform , Microsoft Azure , IBM Bluemix y Amazon Web Services también ofrecen un servicio Memcached a través de una API. [17] [18] [19] [20]
Arquitectura de software
El sistema utiliza una arquitectura cliente-servidor . Los servidores mantienen una matriz asociativa clave-valor ; los clientes completan esta matriz y la consultan por clave. Las claves tienen hasta 250 bytes de longitud y los valores pueden tener un tamaño máximo de 1 megabyte .
Los clientes utilizan bibliotecas del lado del cliente para contactar con los servidores que, de forma predeterminada, exponen su servicio en el puerto 11211. Se admiten tanto TCP como UDP. Cada cliente conoce todos los servidores; los servidores no se comunican entre sí. Si un cliente desea establecer o leer el valor correspondiente a una determinada clave, la biblioteca del cliente primero calcula un hash de la clave para determinar qué servidor utilizar. Esto proporciona una forma simple de fragmentación y una arquitectura escalable sin compartir entre los servidores. El servidor calcula un segundo hash de la clave para determinar dónde almacenar o leer el valor correspondiente. Los servidores mantienen los valores en RAM; si un servidor se queda sin RAM, descarta los valores más antiguos. Por lo tanto, los clientes deben tratar Memcached como una caché transitoria; no pueden asumir que los datos almacenados en Memcached todavía están allí cuando los necesitan. Otras bases de datos, como MemcacheDB , Couchbase Server , proporcionan almacenamiento persistente mientras mantienen la compatibilidad del protocolo Memcached.
Si todas las bibliotecas cliente utilizan el mismo algoritmo hash para determinar los servidores, los clientes pueden leer los datos en caché de los demás.
Una implementación típica tiene varios servidores y muchos clientes. Sin embargo, es posible utilizar Memcached en una sola computadora, actuando simultáneamente como cliente y servidor. El tamaño de su tabla hash suele ser muy grande. Está limitado a la memoria disponible en todos los servidores del clúster de servidores de un centro de datos. Cuando la publicación web de gran volumen y audiencia lo requiera, esto puede extenderse a muchos gigabytes. Memcached puede ser igualmente valioso para situaciones en las que el número de solicitudes de contenido es alto o el costo de generar un contenido en particular es alto.
Seguridad
La mayoría de las implementaciones de Memcached se encuentran dentro de redes confiables donde los clientes pueden conectarse libremente a cualquier servidor. Sin embargo, a veces Memcached se implementa en redes que no son de confianza o donde los administradores desean ejercer control sobre los clientes que se conectan. Para este propósito, Memcached se puede compilar con soporte de autenticación SASL opcional . El soporte SASL requiere el protocolo binario.
Una presentación en BlackHat USA 2010 reveló que varios sitios web públicos importantes habían dejado Memcached abierto a la inspección, análisis, recuperación y modificación de datos. [21]
Incluso dentro de una organización confiable, el modelo de confianza plana de Memcached puede tener implicaciones de seguridad. Para una simplicidad eficiente, todas las operaciones Memcached se tratan por igual. Los clientes con una necesidad válida de acceso a entradas de baja seguridad dentro de la caché obtienen acceso a todas las entradas dentro de la caché, incluso cuando son de mayor seguridad y ese cliente no tiene una necesidad justificada de ellas. Si la clave de caché se puede predecir, adivinar o encontrar mediante una búsqueda exhaustiva, se puede recuperar su entrada de caché.
Se pueden realizar algunos intentos de aislar los datos de configuración y lectura en situaciones como la publicación web de gran volumen. Una granja de servidores de contenido externos tiene acceso de lectura a memcached que contiene páginas publicadas o componentes de página, pero no acceso de escritura. Cuando se publica contenido nuevo (y aún no está en memcached), se envía una solicitud a los servidores de generación de contenido que no son de acceso público para crear la unidad de contenido y agregarla a memcached. A continuación, el servidor de contenido vuelve a intentar recuperarlo y publicarlo en el exterior.
Utilizado como vector de ataque DDoS
En febrero de 2018, CloudFlare informó que se utilizaron servidores Memcached mal configurados para lanzar ataques DDoS a gran escala. [22] El protocolo memcached sobre UDP tiene un factor de amplificación enorme , de más de 51000. [23] Las víctimas de los ataques DDoS incluyen GitHub , que se inundó con un tráfico entrante máximo de 1,35 Tbit / s. [24]
Este problema se mitigó en Memcached versión 1.5.6, que deshabilitó el protocolo UDP de forma predeterminada. [25]
Código de ejemplo
Tenga en cuenta que todas las funciones descritas en esta página son solo pseudocódigo . Las llamadas y los lenguajes de programación de Memcached pueden variar según la API utilizada.
Convertir consultas de creación de bases de datos o de objetos para usar Memcached es simple. Normalmente, cuando se utilizan consultas directas a la base de datos, el código de ejemplo sería el siguiente:
function get_foo ( int userid ) data = db_select ( "SELECT * FROM users WHERE userid =?" , userid ) devuelve datos
Después de la conversión a Memcached, la misma llamada podría tener el siguiente aspecto
function get_foo ( int userid ) / * primero intente la caché * / data = memcached_fetch ( "userrow:" + userid ) si no hay datos / * no encontrado: solicitar base de datos * / data = db_select ( "SELECT * FROM users WHERE userid =? " , userid ) / * luego almacenar en caché hasta el próximo get * / memcached_add ( " userrow: " + userid , data ) end devolver datos
El cliente primero verificaría si existe un valor Memcached con la clave única "userrow: userid", donde userid es un número. Si el resultado no existe, seleccionará de la base de datos como de costumbre y establecerá la clave única mediante la llamada a la función de adición de API Memcached.
Sin embargo, si solo se modificara esta llamada a la API, el servidor terminaría obteniendo datos incorrectos después de cualquier acción de actualización de la base de datos: la "vista" Memcached de los datos quedaría desactualizada. Por lo tanto, además de crear una llamada "agregar", también se necesitaría una llamada de actualización usando la función de conjunto de Memcached.
función update_foo ( int userid , string dbUpdateString ) / * primera actualización de la base de datos * / result = db_execute ( dbUpdateString ) si el resultado / * actualización de la base de datos se realizó correctamente: recuperar los datos que se almacenarán en la caché * / data = db_select ( "SELECT * FROM users WHERE userid =? " , userid ) / * la línea anterior también podría verse como data = createDataFromDBString (dbUpdateString) * / / * luego almacenar en caché hasta el próximo get * / memcached_set ( " userrow: " + userid , data )
Esta llamada actualizaría los datos actualmente almacenados en caché para que coincidan con los nuevos datos en la base de datos, asumiendo que la consulta de la base de datos se realiza correctamente. Un enfoque alternativo sería invalidar el caché con la función de eliminación de Memcached, de modo que las búsquedas posteriores resulten en un error de caché. Debería tomarse una acción similar cuando se eliminen los registros de la base de datos, para mantener una caché correcta o incompleta.
Una estrategia alternativa de invalidación de caché es almacenar un número aleatorio en una entrada de caché acordada e incorporar este número en todas las claves que se utilizan para almacenar un tipo particular de entrada. Para invalidar todas esas entradas a la vez, cambie el número aleatorio. Las entradas existentes (que se almacenaron con el número anterior) ya no serán referenciadas y, por lo tanto, eventualmente caducarán o se reciclarán.
función store_xyz_entry ( clave int , valor de cadena ) / * Recuperar el número aleatorio - use cero si aún no existe ninguno. * El nombre de clave utilizado aquí es arbitrario. * / seed = memcached_fetch ( ": xyz_seed:" ) si no seed seed = 0 / * Construye la clave usada para almacenar la entrada y almacenarla. * El nombre de clave utilizado aquí también es arbitrario. Observe que la "semilla" y la "clave" del usuario * se almacenan como partes separadas de la cadena hashKey construida: ": xyz_data: (semilla) :( clave)". * Esto no es obligatorio, pero se recomienda. * / string hashKey = sprintf ( ": xyz_data:% d:% d" , semilla , clave ) memcached_set ( hashKey , valor ) / * "fetch_entry", no mostrado, sigue una lógica idéntica a la anterior. * / function invalidate_xyz_cache () existing_seed = memcached_fetch ( ": xyz_seed:" ) / * Acuña una semilla aleatoria diferente * / do seed = rand () until seed ! = existing_seed / * Ahora guárdalo en el lugar acordado. Todas las solicitudes futuras utilizarán este número. * Por lo tanto, todas las entradas existentes dejan de ser referenciadas y eventualmente caducarán. * / memcached_set ( ": xyz_seed:" , semilla )
Uso
- MySQL : admite directamente la API Memcached a partir de la versión 5.6. [26]
- Oracle Coherence : admite directamente la API Memcached a partir de la versión 12.1.3. [27]
- GigaSpaces XAP : admite Memcached con alta disponibilidad y compatibilidad con transacciones [28]
Ver también
- Amazon ElastiCache
- Aerospike
- Servidor Couchbase
- Redis
- Mnesia
- MemcacheDB
- Hazelcast
- Casandra
- Tarantool
- Ehcache
Referencias
- ^ "Versión 1.6.9" . 21 de noviembre de 2020 . Consultado el 15 de diciembre de 2020 .
- ^ a b "Licencia Memcached" . GitHub . Consultado el 27 de junio de 2014 .
- ^ "Archivo de código de Google - almacenamiento a largo plazo para el alojamiento de proyectos de código de Google" . Code.google.com . Consultado el 25 de junio de 2017 .
- ^ "Archivo de código de Google - almacenamiento a largo plazo para el alojamiento de proyectos de código de Google" . Code.google.com . Consultado el 25 de junio de 2017 .
- ^ [1] . Community.livejournal.com (22 de mayo de 2003). Consultado el 18 de septiembre de 2013.
- ^ [2] . Community.livejournal.com (27 de mayo de 2003). Consultado el 18 de septiembre de 2013.
- ^ "lj_dev: memcached" . 2013-02-25. Archivado desde el original el 25 de febrero de 2013 . Consultado el 25 de junio de 2017 .
- ^ Cuong Do Cuong (director de ingeniería de YouTube / Google) (23 de junio de 2007). Conferencia de Seattle sobre escalabilidad: escalabilidad de YouTube (video en línea - minuto 26). Seattle: Google Tech Talks.
- ^ Whitaker, Keir (17 de mayo de 2010). "Steve Huffman sobre lecciones aprendidas en Reddit | Carsonified" . Archivado desde el original el 17 de mayo de 2010 . Consultado el 25 de junio de 2017 .
- ^ "Escalando memcached en Facebook" . Facebook.com . 2008-12-12 . Consultado el 25 de junio de 2017 .
- ^ "Escalando Memcache en Facebook" . USENIX . Consultado el 25 de junio de 2017 .
- ^ "Construyendo Pinterest en la nube" . Pinterest.com . 2013-06-19 . Consultado el 9 de marzo de 2018 .
- ^ "Un cliente Memcached completo, rápido y puro de Python" . Github.com . 2018-01-08 . Consultado el 9 de marzo de 2018 .
- ^ "No es ciencia espacial, pero es nuestro trabajo" . Blog.twitter.com . 2008-06-01 . Consultado el 25 de junio de 2017 .
- ^ "memcached" . MediaWiki . Consultado el 25 de junio de 2017 .
- ^ Rez BoF, SIGGRAPH 2019 , consultado el 9 de agosto de 2019
- ^ "Ejemplos de Memcache | Entorno estándar de App Engine para Python | Google Cloud Platform" . Code.google.com . 2017-03-22 . Consultado el 25 de junio de 2017 .
- ^ "Acerca de la caché en función de la caché de Azure" . Msdn.microsoft.com . 2015-08-25 . Consultado el 25 de junio de 2017 .
- ^ Verge, Jason (23 de septiembre de 2014). "Redis Labs: tenemos 3.000 clientes de pago NoSQL en memoria en la nube" . Conocimiento del centro de datos . Consultado el 10 de septiembre de 2016 .
- ^ "AWS | Amazon ElastiCache: almacenamiento de datos en memoria y caché" . Aws.amazon.com . Consultado el 25 de junio de 2017 .
- ^ "Copia archivada" . Archivado desde el original el 21 de diciembre de 2018 . Consultado el 2 de septiembre de 2016 .CS1 maint: copia archivada como título ( enlace )
- ^ "Memcrashed - Grandes ataques de amplificación desde el puerto UDP 11211" . CloudFlare. 27 de febrero de 2018 . Consultado el 3 de marzo de 2018 .
- ^ Jeffrey, Cal (1 de marzo de 2018). "GitHub es víctima del mayor ataque DDoS jamás registrado" .
- ^ "Informe de incidente DDoS del 28 de febrero" . 1 de marzo de 2018 . Consultado el 3 de marzo de 2018 .
- ^ "Notas de la versión Memcached 1.5.6" . 2018-02-27 . Consultado el 3 de marzo de 2018 .
- ^ "Speedy MySQL 5.6 apunta a NoSQL, MariaDB" . Theregister.co.uk . Consultado el 25 de junio de 2017 .
- ^ David Felcey (13 de agosto de 2014). "Introducción al adaptador Coherence Memcached | Blog de Oracle Coherence" . Blogs.oracle.com . Consultado el 25 de junio de 2017 .
- ^ "Procesamiento de transacciones en tiempo real XAP" . Gigaspaces.com . Consultado el 25 de junio de 2017 .
enlaces externos
- Página web oficial