Centos下用twemproxy搭建ssdb伪集群示例

作者:袖梨 2022-06-30

  • 前言
    依稀记得大二下的那个暑假参加的第二场面试,面的是唯品会一个和学校合作的到贵司进行为期两周学习的一个项目,面我的是PHP班的leader(X.C)(当时分3个方向,PHP,IOS,Android),面试过程中我表现一般,其中就记得问到我对Memcache,Redis缓存的掌握程度,在此之前只是听说过大概了解它们的意思,但没有去学习实践过,面完后我回去就把没答上来的问题一一记下来,后面还是通过我大胆的争取得到了进入这个项目的机会,在此表示对leader、对dogstar师兄、对Laura姐、对贵司的感谢!(当然也感谢遇到的各位小伙伴啦~)是你们给予了我机会,希望贵司也越来越好!好吧好像扯的有点远了,想说的就是缓存在公司或者稍微大一点的应用里面特别是Web应用其实应用很广泛,所以对它的掌握与使用也显得比较重要,加上我现在实习的项目组里我负责了两个集群主要的维护,其中一个就是SSDB分布式集群,所以今天就简单学习一个SSDB集群的搭建与在PHP中的使用。
  • 搭建SSDB
    到SSDB官网下载SSDB,然后解压、编译、安装
    # wget https://github.com/ideawu/ssdb/archive/master.zip
    # unzip master.zip
    # cd ssdb-master
    # make
    # sudo make install [PREFIX=/home/users/denglitong/local/ssdb],这里不知道PREFIX参数的话默认安装在/usr/local目录下,这里我安装在/home/users/denglitong/local/ssdb目录下
    这里我安装没有遇到什么错误,所以直接去启动ssdb服务,去到ssdb目录cd /home/users/denglitong/local/ssdb:
    ssdb-dir.png
    打开ssdb.conf进行需要的修改,比如监听的端口、日志模式等:
    ssdb-conf.png
    启动ssdb:在ssdb安装目录下执行# ./ssdb-server -d -c ssdb.conf,
    查看ssdb进程:ps -ef|grep ssdb-server,
    ssdb-server.png
    我本机搭了两个ssdb所以会有两个进程,搭第二个ssdb的时候直接把第一个复制一份修改ssdb.conf,启动即可。
    ssdb安装目录下的ssdb-cli是用来连接ssdb服务的,执行./ssdb-cli [-h 127.0.0.1] -p 8600即可连接上ssdb节点进行set,get测试啦,如果是本机的话-h 127.0.0.1指定服务器地址可缺省。
    ssdb-set.png
    好啦,至此多个节点的SSDB就搭建好了,下一步就是搭建Twenproxy代理服务器啦
    1. 搭建Twemproxy
      Twemproxy原本是和Redis搭配使用的,但是SSDB的性能比Redis要好,SSDB后面是会用来替代Redis的,而SSDB的较新版本已经支持Redis协议,所以Twemproxy可以代理Redis/SSDB混搭的情况,这里我们就用Twemproxy代理多个SSDB节点。
      下载twemproxy: # git clone https://github.com/twitter/twemproxy(没装git的先装git)
      # cd twemproxy
      # autoreconf -fvi,这里我的centos6.5提示autoconf-2.63版本需要升级到autoconf-2.64版本:
      首先查看当前版本:# rpm -qf /usr/bin/autoconf
      卸载当前版本: # rpm -e --nodeps autoconf-2.63
      下载新版本: # wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.64.tar.gz
      解压安装: # tar zxvf autoconf-2.64.tar.gz
      cd autoconf-2.64
      ./configure --prefix=/usr
      (这里也可以安装到其他目录,但记得要把安装后的bin目录下的执行文件创建软连接到/usr/bin下)
      make && make install
      查看是否安装成功:# /usr/bin/autoconf -V
      # 编译安装:make && make install [PREFIX=/home/users/denglitong/local/twemproxy],不加PREFIX参数的话默认安装到/usr/local/share/sbin目录下,配置文件则在/etc/nutcracker下,我这里是安装到指定目录,所以还需要在安装目录下创建conf目录并把源码包中的conf/nutcracker.yml拷贝过去,
      twemproxy.png
      这里打开conf/nutcracker.yml修改,将servers列表修改为本地搭建好的SSDB节点:
      nutcracker-yml.png
      启动twemproxy: # ./sbin/nutcracker -d -c ./conf/nutcracker.yml
      这里的-d表示以后台进程的方式运行,-c表示指定配置文件,你还可以用-t参数后面跟着配置文件来测试语法是否正确
      好啦到此nutcracker就搭建完毕了,接下来我们要测试它是否能work,这里需要注意的是,ssdb-cli去连接ssdb节点的时候,用的是ssdb协议,twemproxy去和ssdb连接的时候用的是redis协议,因为SSDB已经兼容了redis协议,但twemproxy没有兼容ssdb协议,所以用上面的ssdb-cli去连接twemproxy监听的端口是连接不上的,这里我们还需要安装Redis,然后用redis-cli去连接twemproxy,方便校验搭建的结果,当然你也可以只装phpredis模块来连接twemproxy进行交互校验,不过推荐还是安装一个本地Redis。
    2. 安装Redis
      下载Redis包,解压后进入目录,执行make,执行完之后在根目录下生成redis-server服务端启动文件、在src目录下回生成redis-cli连接客户端文件,而我们要的就是这redis-cli,并不需要启动一个redis存储节点,然后我们创建一个软连接到/usr/bin方便连接:sudo ln -s /home/users/denglitong/local/redis-3.2.3/src/redis-cli /usr/bin/redis-cli,接下来就可以去连接twemproxy进行检验啦:
      php-test.png
      这里是用phpredis扩展用php连接了redis进行了set/get的测试,代替手动测试,后面会讲到phpredis扩展,
      redis-cli.png
      可以看到twemproxy代理可以将多个ssdb节点统一起来对外提供一个ip/port进行服务,这里测试数量比较小,我手动set了几十个值的时候是会较平均的落到两个ssdb节点中的。
    3. 搭建phpredis
      redis-cli是linux下的连接redis的客户端,twemproxy本身就是支持redis协议的,所以可以用来连接twemproxy,但是我们还需要在php中连接redis,所以就需要给php安装连接redis的客户端,这就是phpredis扩展。
      安装phpredis扩展:
      $ wget https://github.com/phpredis/phpredis/archive/2.2.4.tar.gz
      $ cd phpredis-2.2.4 # 进入 phpredis 目录
      $ /usr/local/php/bin/phpize # php安装后的路径
      $ ./configure --with-php-config=/home/users/denglitong/local/php-5.6.24/bin/php-config
      $ make && make install
      这里指定的with-php-config就是指定要安装的redis扩展是安装到哪个php目录的,编译安装完后会在php安装目录的extension目录下生成一个扩展的目录,里面就有redis.so扩展,然后去修改php.ini文件:
      redis-ext.png
      然后重启php-fpm进程,查看phpinfo页看redis扩展有没有编译进来:
      phpredis.png
      这样就是OK的,然后像这样在php中使用redis类就可以连接redis了(twemproxy):
      php-test.png
    4. 好啦,到这里twemproxy和ssdb多节点的一个伪集群就搭建完毕了,为什么说是伪集群呢,因为它只是能够把set值使用一致性哈希set到各个节点里,集群的一些高级特性如负载均衡、数据如何迁移何时迁移这些都没有实现,而且也没有分布式都是在本地搭建的,所以说它是个伪集群。其实这种代理+服务节点的方式中twemproxy代理容易成为性能瓶颈,不过SSDB单机也可以扛TB级的数据量,当然SSDB官方的分布式集群的一个代理也在开发中,到那个时候也许我们离真正的SSDB集群就不远了。
    5. 后续
      这篇文章本来是想昨晚写完的,写了一半但是11点多的时候公司那边有点事需要处理,处理完了就00:30了,所以昨晚就没写完,今天起的还算不晚所以就写了这些码到这啦!然后我的早饭煮好了,吃早饭去啦!
  • 相关文章

    精彩推荐