千家信息网

Memcached内存数据库群集配置(理论+实践篇)

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,Memcached内存数据库一套开源的高性能分布式内存对象缓存系统所有的数据都存储在内存中支持任意存储类型的数据提高网址访问的速度Memcached缓存机制当程序写入缓存数据请求时,Memcached
千家信息网最后更新 2024年11月23日Memcached内存数据库群集配置(理论+实践篇)

Memcached内存数据库

  • 一套开源的高性能分布式内存对象缓存系统
  • 所有的数据都存储在内存中
  • 支持任意存储类型的数据
  • 提高网址访问的速度

Memcached缓存机制

  • 当程序写入缓存数据请求时,Memcached的API接口将KEY输入路由算法模块路由到集群中的一台服务,之后由API接口与服务器进行通信,完成一次分布式缓存写入
  • Key索引建立在API中,值value数据存在后面的memcached中

Memcached分布式

  • 要依赖于Memcached的客户端来实现
  • 多个Memcached服务器是独立的
  • 分布式数据如何存储是路由算法所决定

Memcached路由算法

求余数hash算法

  • 先用key做hash运算的到一个整数,再去做hash算法,根据余数进行路由。不适合在动态变化的环境中

一致性hash算法

  • 按照hash算法把对应key通过一定hash算法处理后映射形成一个首尾接闭合循环,然后通过使用与对象存储一样的hash算法将机器也映射到环中,顺时针方向计算将所有对象存储到离自己最近的机器中。适合在动态变化中使用

Memcached是什么

  • 在阐述这个问题之前,我们首先要清楚它"不是什么"。很多人把它当作和SharedMemory那种形式的存储载体来使用,虽然memcached使用了同样的"Key=>Value"方式组织数据,但是它和共享内存、APC等本地缓存有非常大的区别。Memcached是分布式的,也就是说它不是本地的。它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)。
  • Memcached使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和Apache不同,它更多的时候是面向稳定的持续连接的,所以它实际的并发能力是有限制的。在保守情况下memcached的最大同时连接数为200,这和Linux线程能力有关系,这个数值是可以调整的。关于libevent可以参考相关文档。 Memcached内存使用方式也和APC不同。APC是基于共享内存和MMAP的,memcachd有自己的内存分配算法和管理方式,它和共享内存没有关系,也没有共享内存的限制,通常情况下,每个memcached进程可以管理2GB的内存空间,如果需要更多的空间,可以增加进程数。

memcached群集搭建实践

实验环境

  • 主服务器IP地址:192.168.144.238
  • 从服务器IP地址:192.168.144.239
  • 客户端IP地址:192.168.144.185
  • 漂移IP地址:192.168.144.188

主服务器安装memcached,libevent事件库,mamgent代理包

[root@localhost ~]# mkdir /abc[root@localhost ~]# mount.cifs //192.168.100.8/memcached /abc     //挂载Password for root@//192.168.100.8/memcached:  [root@localhost ~]# cd /abc/[root@localhost abc]# lsLAMP-php5.6                   magent-0.5.tar.gz   memcached-1.5.6.tar.gzlibevent-2.1.8-stable.tar.gz  memcache-2.2.7.tgz[root@localhost abc]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt   //解压事件库软件包,memcached依赖于事件库[root@localhost abc]# tar zxvf memcached-1.5.6.tar.gz -C /opt/     //解压服务端memcached软件包[root@localhost abc]# yum install gcc gcc-c++ make -y     //安装环境包[root@localhost abc]# mkdir /opt/magent[root@localhost abc]# tar zxvf magent-0.5.tar.gz -C /opt/magent/[root@localhost opt]# cd libevent-2.1.8-stable/[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr [root@localhost libevent-2.1.8-stable]# make && make install       //编译安装[root@localhost libevent-2.1.8-stable]# cd ../memcached-1.5.6/[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usrmake && make install

从服务器安装memcached,libevent事件库

[root@localhost ~]# mkdir /abc[root@localhost ~]# mount.cifs //192.168.100.8/memcached /abcPassword for root@//192.168.100.8/memcached:  [root@localhost ~]# cd /abc/[root@localhost abc]# lsLAMP-php5.6                   magent-0.5.tar.gz   memcached-1.5.6.tar.gzlibevent-2.1.8-stable.tar.gz  memcache-2.2.7.tgz[root@localhost abc]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt //解压事件库软件包[root@localhost abc]# tar zxvf memcached-1.5.6.tar.gz -C /opt/   /解压服务端memcached软件包[root@localhost abc]# yum install gcc gcc-c++ make -y[root@localhost opt]# cd libevent-2.1.8-stable/[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr[root@localhost libevent-2.1.8-stable]# make && make install[root@localhost libevent-2.1.8-stable]# cd ../memcached-1.5.6/[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usrmake && make install

主服务器配置magent

[root@localhost memcached-1.5.6]# cd /opt/[root@localhost opt]# lslibevent-2.1.8-stable  magent  memcached-1.5.6  rh[root@localhost opt]# cd magent/[root@localhost magent]# vim ketama.h#ifndef SSIZE_MAX #define SSIZE_MAX 32767 [root@localhost magent]# vim MakefileLIBS = -levent -lm              //指定makefile文件make                 //编译[root@localhost magent]# lsketama.c  ketama.h  ketama.o  magent  magent.c  magent.o  Makefile[root@localhost magent]# yum install openssh-clients -y     //安装scp远程同步软件包[root@localhost magent]# cp magent /usr/bin/      //把magent脚本放到/usr/local中,让系统能识别[root@localhost magent]# scp magent root@192.168.144.239:/usr/bin/   //把mangent文件拷贝到从服务器上

主从都关闭防火墙

[root@localhost bin]# systemctl stop firewalld.service [root@localhost bin]# setenforce 0

在主服务器、从服务器同时安装

[root@localhost bin]# yum install keepalived -y

主服务器配置主从同步

[root@localhost magent]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalivedvrrp_script magent {          //编辑函数脚本        script "/opt/shell/magent.sh"      //指定脚本位置        interval 2              //检测脚本时间间隔}global_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }      notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   router_id MAGENT_HA        //主服务器id,两台不能一样}vrrp_instance VI_1 {    state MASTER    interface ens33          //主服务器网卡    virtual_router_id 51      priority 100     advert_int 1    authentication {        auth_type PASS        auth_pass 1111 #默认验证    }       track_script {               //调函数名magent        magent}           virtual_ipaddress {        192.168.144.188        //客户端访问的漂移地址    }   }

从服务器安装openssh客户端

[root@localhost bin]# cd /etc/keepalived/[root@localhost keepalived]# mv keepalived.conf keepalived.conf.bak   //更改名称[root@localhost keepalived]# yum install openssh-clients -y

主服务器用scp把keepalived文件传到从服务器

[root@localhost magent]# cd /etc/keepalived/[root@localhost keepalived]# scp keepalived.conf root@192.168.144.239:/etc/keepalived/

从服务器配置主从同步

[root@localhost keepalived]# lskeepalived.conf  keepalived.conf.bak[root@localhost keepalived]# vim keepalived.conf! Configuration File for keepalivedvrrp_script magent {        script "/opt/shell/magent.sh"        interval 2}global_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   router_id MAGENT_HB        //routed_id不能相同}vrrp_instance VI_1 {    state BACKUP    interface ens33    virtual_router_id 52        //从服务器虚拟id不能和主服务器一样    priority 90         //优先级比主服务器低    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }       track_script {        magent}           virtual_ipaddress {        192.168.144.188    }   }

主服务器配置magent脚本

[root@localhost keepalived]# mkdir /opt/shell[root@localhost keepalived]# cd /opt/shell/[root@localhost shell]# vim magent.sh#!/bin/bashk=`ps -ef | grep keepalived | grep -v grep | wc -l`     //检查keepaliveed进程,如果开启if [ $k -gt 0 ]; then                     magent -u root -n 51200 -l 192.168.144.188 -p 12000 -s 192.168.144.238:11211 -b        // -n连接数量 -l指定漂移地址,-p指定端口映射到主从服务器的地址        192.168.144.239:11211elsepkill -9 magentfi[root@localhost shell]# chmod +x magent.sh [root@localhost shell]# systemctl start keepalived.service [root@localhost shell]# netstat -ntap | grep 12000tcp        0      0 192.168.144.188:12000   0.0.0.0:*               LISTEN      124720/magent       

从服务器同样的操作

[root@localhost keepalived]# mkdir /opt/shell[root@localhost keepalived]# cd /opt/shell/[root@localhost shell]# vim magent.sh#!/bin/bashk=`ps -ef | grep keepalived | grep -v grep | wc -l`if [ $k -gt 0 ]; then        magent -u root -n 51200 -l 192.168.144.188 -p 12000 -s 192.168.144.238:11211 -b 192.168.144.239:11211elsepkill -9 magentfi[root@localhost shell]# chmod +x magent.sh [root@localhost shell]# systemctl start keepalived.service [root@localhost shell]# netstat -ntap | grep 12000        //查看magent端口tcp        0      0 192.168.144.188:12000   0.0.0.0:*               LISTEN      11660/magent 

开启主服务器memcached

[root@localhost shell]# memcached -m 512k -u root -d -l 192.168.144.238 -p 11211    //启动主,-m指定空间大小[root@localhost shell]# netstat -ntap | grep 11211 tcp        0      0 192.168.144.238:11211   0.0.0.0:*               LISTEN      44647/memcached

开启从服务器memecached

[root@localhost shell]# memcached -m 512k -u root -d -l 192.168.144.239 -p 11211 #启动从[root@localhost shell]# netstat -ntap | grep 11211tcp        0      0 192.168.144.239:11211   0.0.0.0:*               LISTEN      42654/memcached    

客户端中验证用telnet去连接memcached 内存数据库

[root@localhost ~]# telnet 192.168.144.188 12000Trying 192.168.144.188...Connected to 192.168.144.188.Escape character is '^]'.add username 0 0 7           //编写键值对数据1234567 STORED

查看主服务器查看数据有没有

[root@localhost shell]# telnet 192.168.144.238 11211Trying 192.168.144.238...Connected to 192.168.144.238.Escape character is '^]'.geer^H^HERRORget usernameVALUE username 0 71234567END

验证从服务器数据有没有同步

[root@localhost shell]# telnet 192.168.144.239 11211Trying 192.168.144.239...Connected to 192.168.144.239.Escape character is '^]'.get usernameVALUE username 0 71234567END
0