设为首页 收藏本站
查看: 1428|回复: 0

[经验分享] 在Linux x86_64环境下编译memcached

[复制链接]

尚未签到

发表于 2018-12-26 06:55:06 | 显示全部楼层 |阅读模式
  Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
  说简单一点memcached就是维护着一个位于内存中的大map。它利用RAM的随机访问优势(内存的读写速度要比磁盘的读写速度快得多,前者是后者的10的6次方倍),将某个对象通过特定的索引值存储,当需要这个对象的时候通过这个索引值可以立即找出来。索引值在整个内存缓冲系统中是唯一的,也同时对应唯一的一个对象。这样在涉及查询数据的操作时加入这样一种机制即可起到加快访问速度的效果。
  闲话少叙,下面介绍memcached在Linux x86_64环境中的编译过程。
  工作机器各项参数如下:
  CPU:Intel Xeon 5110
  内存:DDR2 1G*4
  主机型号:ProLiant DL140 G3

  操作系统:Red Hat Enterprise Linux Server>  内核版本:2.6.18
  gcc版本:4.1.2
  g++版本:4.1.2
  1.下载memcached源码包
  访问memcached官方网站http://memcached.org可以下载到最新最稳定版本的memcached源码包

  下载完成后将其解压
  [plain] view plaincopy

  •   [root@lxp2 ~]# cd Download
  •   [root@lxp2 Download]# ll
  •   total 312
  •   -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
  •   [root@lxp2 Download]# tar -xf memcached-1.4.10.tar.gz
  •   [root@lxp2 Download]# ll
  •   total 316
  •   drwxr-xr-x 6 1000 1000   4096 Nov 10 08:32 memcached-1.4.10
  •   -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
  2.尝试配置memcached编译
  进入memcached解压后的目录后,执行./configure命令来检测当前系统环境并生成makefile
  [plain] view plaincopy

  •   [root@lxp2 Download]# cd memcached-1.4.10
  •   [root@lxp2 memcached-1.4.10]# ./configure
  如果在执行之后发现最后一行有如下提示表明缺少libevent库:
  [plain] view plaincopy

  •   checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/

  •   If it's already installed, specify its path using --with-libevent=/dir/

  •   [root@lxp2 memcached-1.4.10]#
  这是在编译memcached过程中经常遇到的问题(memcached基于libevent的事件处理机制。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使服务器的连接数增加,也能发挥时间复杂度O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。)。这时就要安装libevent库了。在libevent官方网站http://libevent.org中可以下载到最新最稳定版源代码:

  同样需要解压并进入解压后的源码包目录:
  [plain] view plaincopy

  •   [root@lxp2 Download]# ll
  •   total 1140
  •   -rw-r--r-- 1 root root 837650 Nov 20 17:16 libevent-2.0.16-stable.tar.gz
  •   drwxr-xr-x 6 1000 1000   4096 Nov 20 17:03 memcached-1.4.10
  •   -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
  •   [root@lxp2 Download]# tar -xf libevent-2.0.16-stable.tar.gz
  •   [root@lxp2 Download]# cd libevent-2.0.16-stable
  接下来要配置libevent库的编译了。这里的配置需要注意添加--prefix参数,这个参数要指定编译完成后,如果安装此库,库安装到哪里。默认值是/usr/local。如果保持默认值,会将库安装到/usr/local/lib目录中。多数Linux发行版默认的加载库路径都不包含此路径。为了避免麻烦,这里指定--prefix=/usr。这样编译后安装就会安装到/usr/lib目录中了。这个目录是多数Linux发行版默认的加载库路径。
  执行配置脚本:
  [plain] view plaincopy

  •   [root@lxp2 libevent-2.0.16-stable]# ./configure --prefix=/usr
  如果你在配置时忘了加这个参数,不要紧,后面还有解决办法,接着往下看。
  配置好之后就可以编译了:
  [plain] view plaincopy

  •   [root@lxp2 libevent-2.0.16-stable]# make
  编译好之后就是用root权限安装:
  [plain] view plaincopy

  •   [root@lxp2 libevent-2.0.16-stable]# sudo make install
  3.正式编译memcached
  刚刚介绍的是遇到了一个小麻烦时的解决办法,现在已经不存在libevent库缺失的问题了,如果你遇到了libevent库缺失的问题,此时需要回到memcached源码包目录,再次执行一次编译配置脚本:
  [plain] view plaincopy

  •   [root@lxp2 memcached-1.4.10]# ./configure
  不添加参数直接执行编译配置脚本,在安装时将自动安装到/usr/local/bin目录中。如果要更改安装位置,可以添加参数--prefix。例如--prefix=/usr/local/memcached,则安装时将安装到/usr/local/memcached/bin中。
  检查没问题,可以开始编译了:
  [plain] view plaincopy

  •   [root@lxp2 memcached-1.4.10]# make
  编译完成后进行安装
  [plain] view plaincopy

  •   [root@lxp2 memcached-1.4.10]# sudo make install
  然后去看一看是否已经安装(memcached默认安装目录为/usr/local/bin)。转到memcached目录,然后启动memcached加参数-h显示帮助。帮助第一行即当前memcached版本:
  [plain] view plaincopy

  •   [root@lxp2 memcached-1.4.10]# cd /usr/local/bin/
  •   [root@lxp2 bin]# sudo ./memcached -h
  •   ./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
  •   [root@lxp2 bin]#
  如果之前的libevent编译时加了--prefix=/usr参数,此时执行应该是正常的,会显示帮助信息。我刚才编译libevent库的时候故意没有加此参数,因此memcached到这一步的时候就会出现上面的问题——无法加载共享库libevent-2.0.so.5。如果你也遇到了这样的问题,接着往下看:
  在多数linux发行版中,程序启动后静态加载的库默认查找路径为/lib(64位系统还有/lib64)和/usr/lib(64位系统中还有/usr/lib64),而目前我们编译的libevent库安装路径不在这些默认库加载路径中,因此需要配置库加载路径:
  先通过ldd命令看一看memcached都需要加载哪些库:
  [plain] view plaincopy

  •   [root@lxp2 bin]# ldd memcached
  •   libevent-2.0.so.5 => not found
  •   librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
  •   libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
  •   libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
  •   /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
  •   [root@lxp2 bin]#
  此时看到结果第一行:libevent-2.0.so.5 => not found,正是缺少的库,该库无法找到。
  那这个库在哪里呢?我们来问一下系统:
  [plain] view plaincopy

  •   [root@lxp2 bin]# whereis libevent-2.0.so.5
  •   libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
  •   [root@lxp2 bin]#
  它告诉我们,libevent-2.0.so.5库存放在/usr/local/lib目录中。因此我们把这个目录加入到系统默认的库加载路径中。这里要修改系统环境变量$LD_LIBRARY_PATH。
  先看一下当前$LD_LIBRARY_PATH的值:
  [plain] view plaincopy

  •   [root@lxp2 bin]# echo $LD_LIBRARY_PATH

  •   [root@lxp2 bin]#
  当前值为空,说明目前库加载路径还是上文提到的/lib(64位系统还有/lib64)和/usr/lib(64位系统中还有/usr/lib64)。接下来使用root权限修改/etc/profile文件,在文件末尾追加一行:
  [plain] view plaincopy

  •   export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  然后保存,更新一下系统配置:
  [plain] view plaincopy

  •   [root@lxp2 bin]# source /etc/profile
  再查看一下默认加载库路径:
  [plain] view plaincopy

  •   [root@lxp2 ~]# cd /etc/
  •   [root@lxp2 etc]# source profile
  •   [root@lxp2 etc]# echo $LD_LIBRARY_PATH
  •   /usr/local/lib:
  •   [root@lxp2 etc]#
  libevent库所在的目录已经添到了系统默认库加载路径中了,再次使用ldd命令查看memcached是否能够完全加载所需的库:
  [plain] view plaincopy

  •   [root@lxp2 etc]# cd /usr/local/bin/
  •   [root@lxp2 bin]# ls
  •   dialyzer  erl   escript          memcached  run_test  typer
  •   epmd      erlc  event_rpcgen.py  run_erl    to_erl
  •   [root@lxp2 bin]# ldd memcached
  •   libevent-2.0.so.5 => /usr/local/lib/libevent-2.0.so.5 (0x00002b52aedd1000)
  •   librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
  •   libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
  •   libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
  •   /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
  •   [root@lxp2 bin]#
  已经都能找到了,看一下版本信息:
  [plain] view plaincopy

  •   [root@lxp2 bin]# ./memcached -h
  •   memcached 1.4.10
  •   -p       TCP port number to listen on (default: 11211)
  •   -U       UDP port number to listen on (default: 11211, 0 is off)
  已经没有问题了。
  至此memcached的编译安装完成。
  近期我还要写一些关于memcached的配置文章,敬请关注!
  参考资料:
  在CentOS 5.6上编译安装Memcached ,http://whxhz.iteye.com/blog/1117118
  error while loading shared libraries: libevent-2.0.so.5解决办法,http://blog.sina.com.cn/s/blog_6d09b5750100vqow.html
  5、编写memcached服务启停脚本
  # cd /etc/init.d
  vi memcached,脚本内容如下:
#!/bin/sh  #
  # Startup script for the server of memcached
  #
  # processname: memcached
  # pidfile: /etc/memcached/memcached.pid
  # logfile: /etc/memcached/memcached_log.txt
  # memcached_home: /etc/memcached
  # chkconfig: 35 21 79
  # description: Start and stop memcached Service
  # Source function library
  . /etc/rc.d/init.d/functions
  RETVAL=0
  prog="memcached"
  basedir=/etc/memcached
  cmd=${basedir}/bin/memcached
  pidfile="$basedir/${prog}.pid"
  #logfile="$basedir/memcached_log.txt"
  ipaddr="192.168.1.200"  # 绑定侦听的IP地址
  port="11211"  # 服务端口
  username="root" # 运行程序的用户身份
  max_memory=64  # default: 64M | 最大使用内存
  max_simul_conn=1024 # default: 1024 | 最大同时连接数
  #maxcon=51200
  #growth_factor=1.3 # default: 1.25 | 块大小增长因子
  #thread_num=6  # default: 4
  #verbose="-vv"  # 查看详细启动信息
  #bind_protocol=binary  # ascii, binary, or auto (default)
  start() {
  echo -n $"Starting service: $prog"
  $cmd -d -m $max_memory -u $username -l $ipaddr -p $port -c $max_simul_conn -P $pidfile
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
  }
  stop() {
  echo -n $"Stopping service: $prog "
  run_user=`whoami`
  pidlist=`ps -ef | grep $run_user | grep memcached | grep -v grep | awk '{print($2)}'`
  for pid in $pidlist
  do
  #  echo "pid=$pid"
  kill -9 $pid
  if [ $? -ne 0 ]; then
  return 1
  fi
  done
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
  }
  # See how we were called.
  case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  #reload)
  #reload
  #;;
  restart)
  stop
  start
  ;;
  #condrestart)
  #if [ -f /var/lock/subsys/$prog ]; then
  #stop
  #start
  #fi
  #;;
  status)
  status memcached
  ;;
  *)
  echo "Usage: $0 {start|stop|restart|status}"
  exit 1
  esac
  exit $RETVAL
  6、赋予执行权限
  #chmod +x memcached
  7、设置memcached随系统启动
  # chkconfig --add memcached
  # chkconfig --level 35 memcached on
  启动memcached
  # service memcached start
  //启动的时候实际上是调用了下面的这个命令,以守护进程的方式来启动memcached
  /etc/memcached/bin/memcached -d -m 64 -u root -l 192.168.1.201 \
  -p 11211 -c 1024 -P /etc/memcached/memcached.pid
  查看memcached是否启动
  # ps -ef | grep memcached



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-655838-1-1.html 上篇帖子: 使用 Nginx 和 Memcached 对 WordPress 的整页做缓存 下篇帖子: 金庸武功之“蛤蟆功”--memcached主从复制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表