沃梦达 / IT编程 / 数据库 / 正文

Redis+Twemproxy分片存储实现

from unsplash为提高Redis存储能力的提升,以及对外提供服务可用性提升,有时候有必要针对Redis进行集群式搭建,比较常用的有Twemproxy分片存储以及官方提供的Cluster方式。Redis实例安装Redis的安装这里不再多讲,...

from unsplash

为提高Redis存储能力的提升,以及对外提供服务可用性提升,有时候有必要针对Redis进行集群式搭建,比较常用的有Twemproxy分片存储以及官方提供的Cluster方式。

Redis实例安装

Redis的安装这里不再多讲,相关步骤可从官网或其它渠道得到。为安装redis多实例,这里简单提前创建完相关文件夹。其中redis存放应用程序,redis1/redis2/redis3仅存储配置文件。

  1. [root@host1 redis-cluster]# ll

  2. 总用量 4

  3. drwxr-xr-x 6 root root 4096 8月 ?29 09:16 redis

  4. drwxr-xr-x 2 root root ? 24 8月 ?29 09:29 redis1

  5. drwxr-xr-x 2 root root ? 24 8月 ?29 09:25 redis2

  6. drwxr-xr-x 2 root root ? 24 8月 ?29 09:26 redis3

各实例简单配置如下:

redis1

  1. daemonize yes

  2. port 63791

  3. pidfile /var/run/redis1.pid

redis2

  1. daemonize yes

  2. port 63792

  3. pidfile /var/run/redis2.pid

redis3

  1. daemonize yes

  2. port 63793

  3. pidfile /var/run/redis3.pid

分别启动,运行成功如下:

  1. [root@host1 redis-cluster]# ps -ef |grep redis

  2. root ? ? 110719 ? ? ?1 ?0 09:24 ? ? ? ? ?00:00:00 redis/src/redis-server 127.0.0.1:63791

  3. root ? ? 110761 ? ? ?1 ?0 09:25 ? ? ? ? ?00:00:00 redis/src/redis-server 127.0.0.1:63792

  4. root ? ? 110787 ? ? ?1 ?0 09:26 ? ? ? ? ?00:00:00 redis/src/redis-server 127.0.0.1:63793

  5. root ? ? 110964 ?83212 ?0 09:30 pts/0 ? ?00:00:00 grep --color=auto redis

Twemproxy应用

以上三个实例各为独自运行,并没有启动集群存储、存储能力提升的功能。为实现redis的集群存储,本例结合早先出现的Twemproxy技术(由twitter开源)进行redis分片存储,而非在Twemproxy之后出现的官方提供的cluster功能。

下面开启Twemproxy的应用,源码安装

  1. [root@host1 src]# git clone git@github.com:twitter/twemproxy.git

  2. [root@host1 src]# cd twemproxy

  3. [root@host1 twemproxy]# autoreconf -fvi

  4. [root@host1 twemproxy]# ./configure --enable-debug=full

  5. [root@host1 twemproxy]# make

  6. [root@host1 twemproxy]# src/nutcracker -h

  7. [root@host1 twemproxy]# src/nutcracker -h

  8. This is nutcracker-0.4.1

  9.  

  10. Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file]

  11. ? ? ? ? ? ? ? ? ?[-c conf file] [-s stats port] [-a stats addr]

  12. ? ? ? ? ? ? ? ? ?[-i stats interval] [-p pid file] [-m mbuf size]

  13.  

  14. Options:

  15. ?-h, --help ? ? ? ? ? ? : this help

  16. ?-V, --version ? ? ? ? ?: show version and exit

  17. ?-t, --test-conf ? ? ? ?: test configuration for syntax errors and exit

  18. ?-d, --daemonize ? ? ? ?: run as a daemon

  19. ?-D, --describe-stats ? : print stats description and exit

  20. ?-v, --verbose=N ? ? ? ?: set logging level (default: 5, min: 0, max: 11)

  21. ?-o, --output=S ? ? ? ? : set logging file (default: stderr)

  22. ?-c, --conf-file=S ? ? ?: set configuration file (default: conf/nutcracker.yml)

  23. ?-s, --stats-port=N ? ? : set stats monitoring port (default: 22222)

  24. ?-a, --stats-addr=S ? ? : set stats monitoring ip (default: 0.0.0.0)

  25. ?-i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)

  26. ?-p, --pid-file=S ? ? ? : set pid file (default: off)

  27. ?-m, --mbuf-size=N ? ? ?: set size of mbuf chunk in bytes (default: 16384 bytes)

安装完成后,配置nutcracker.yml,采用ketama(一致性hash算法)分片方式。其余还有Modula和Random两种方式。取模算法有明细的缺陷:在分片增加的情况下,数据的命中率直线下降。随机算法更是无法保证数据的均衡读写。

  1. redis-cluster:

  2. ?listen: 0.0.0.0:22122

  3. ?hash: fnv1a_64

  4. ?distribution: ketama

  5. ?timeout: 400

  6. ?backlog: 65535

  7. ?preconnect: true

  8. ?redis: true

  9. ?server_connections: 1

  10. ?auto_eject_hosts: true

  11. ?server_retry_timeout: 60000

  12. ?server_failure_limit: 3

  13. ?servers:

  14. ? ?- 127.0.0.1:63791:1 redis01

  15. ? ?- 127.0.0.1:63792:1 redis02

  16. ? ?- 127.0.0.1:63793:1 redis03

保存后,进行简单的测试,保证配置文件的正确性,若出现如下响应,证明配置文件运行正常。

[root@host1 conf]# ../src/nutcracker -c nutcracker.yml -t

nutcracker: configuration file 'nutcracker.yml' syntax is ok

启动Twemproxy,此时的redis的分片集群搭建已完成。可以通过22122直接访问redis服务【twemproxy并不支持所有redis/memcache的命令,具体请参考https://github.com/twitter/twemproxy/blob/master/notes/redis.md】

简单测试

采用redis-cli客户端登陆22122端口,随机写入一批数据,再通过redis-cli连接具体的redis实例端口,如63791/63792/63793,查看数据是真实的存储在哪一个实例中。

至此,我们已经搭建好一个分片存储的Redis集群应用,为前端提供强劲数据缓存服务

扩展阅读:

  • 学习新技术时你应当掌握的『最少必要知识』

  • 基于SpringCloud的Microservices架构实战案例

  • 基于SpringCloud的某支付产品微服务构架拆解

  • 如何从传统软件开发顺利过渡到互联网技术开发

  • 你是『眼高手低』的程序员吗

  • 怎么定位自己在团队里的角色

  • 你的经历不一定都能变成经验

  • 那些会阻碍程序员成长的细节[7]

  • 认识区块链,认知区块链— —区块链开发

  • 用Supervisor实现进程守护,在异常退出时自动重启

长按2秒,识别二维码,关注我。

关注程序员成长

本文标题为:Redis+Twemproxy分片存储实现