nginx Lua Redis/SSDB+Twemproxy#
Redis#
cd /usr/servers/
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make
nohup /usr/servers/redis-5.0.5/src/redis-server /usr/servers/redis-5.0.5/redis.conf &
ps -aux | grep redis
/usr/servers/redis-5.0.5/src/redis-cli -p 6379
Redis Settings#
#设置Redis占用100mb的大小
maxmemory 100mb
#如果内存满了就需要按照如相应算法进行删除过期的/最老的
#volatile-lru 根据LRU算法移除设置了过期的key
#allkeys-lru 根据LRU算法移除任何key(包含那些未设置过期时间的key)
#volatile-random/allkeys->random 使用随机算法而不是LRU进行删除
#volatile-ttl 根据Time-To-Live移除即将过期的key
#noeviction 永不过期,而是报错
maxmemory-policy volatile-lru
#Redis并不是真正的LRU/TTL,而是基于采样进行移除的,即如采样10个数据移除其中最老的/即将过期的
maxmemory-samples 10
SSDB#
yum install gcc-c++
yum install autoconf automake
cd /usr/servers
wget https://github.com/ideawu/ssdb/archive/1.9.4.tar.gz
tar -xvf 1.9.4.tar.gz
cd ssdb-1.9.4
make
nohup /usr/servers/ssdb-1.9.4/ssdb-server -d /usr/servers/ssdb-1.9.4/ssdb.conf &
ps -aux | grep ssdb
/usr/servers/ssdb-1.9.4/tools/ssdb-cli -p 8888
/usr/servers/redis-5.0.5/src/redis-cli -p 8888
Twemproxy#
yum install libtool
cd /usr/servers
wget https://github.com/twitter/twemproxy/archive/v0.4.1.tar.gz
tar -xvf v0.4.1.tar.gz
cd twemproxy-0.4.1/
autoreconf -fvi
./configure && make
vim /usr/servers/twemproxy-0.4.1/conf/nutcracker.yml
server1:
listen: 127.0.0.1:1111
hash: fnv1a_64
distribution: ketama
timeout: 1000
redis: true
servers:
- 127.0.0.1:6379:1
/usr/servers/twemproxy-0.4.1/src/nutcracker -d -c /usr/servers/twemproxy-0.4.1/conf/nutcracker.yml -o /usr/servers/twemproxy-0.4.1/redisproxy.log
ps aux | grep nutcracker
/usr/servers/redis-5.0.5/src/redis-cli -p 1111
Twemproxy Settings#
server1
:是给当前分片配置起的名字,一个配置文件可以有多个分片配置listen
:监听的ip和端口hash
:散列算法distribution
:分片算法,比如一致性Hash/取模timeout
:连接后端Redis或接收响应的超时时间redis
:是否是redis代理,如果是false则是memcached代理servers
:代理的服务器列表,该列表会使用distribution配置的分片算法进行分片
hash算法#
one_at_a_time
md5
crc16
crc32 (crc32 implementation compatible with libmemcached)
crc32a (correct crc32 implementation as per the spec)
fnv1_64
fnv1a_64
fnv1_32
fnv1a_32
hsieh
murmur
jenkins
分片算法#
ketama(一致性Hash算法)
modula(取模)
random(随机算法)
HashTag#
比如一个商品有:商品基本信息(p:id:
)、商品介绍(d:id:
)、颜色尺码(c:id:
)等,假设存储时不采用HashTag将会导致这些数据不会存储到一个分片,而是分散到多个分片,这样获取时将需要从多个分片获取数据进行合并,无法进行mget;那么如果有了HashTag,那么可以使用“::”中间的数据做分片逻辑,这样id一样的将会分到一个分片
一致性Hash与服务器宕机#
如果把Redis服务器作为缓存服务器并使用一致性Hash进行分片,当有服务器宕机时需要自动从一致性Hash环上摘掉,或者其上线后自动加上,此时就需要如下配置:
#是否在节点故障无法响应时自动摘除该节点,如果作为存储需要设置为为false
auto_eject_hosts: true
#重试时间(毫秒),重新连接一个临时摘掉的故障节点的间隔,如果判断节点正常会自动加到一致性Hash环上
server_retry_timeout: 30000
#节点故障无法响应多少次从一致性Hash环临时摘掉它,默认是2
server_failure_limit: 2
支持的Redis命令#
不是所有Redis命令都支持,请参考https://github.com/twitter/twemproxy/blob/master/notes/redis.md
vi nutcracker.sh
chmod u+x /usr/servers/twemproxy-0.4.1/scripts/nutcracker.sh
/usr/servers/twemproxy-0.4.1/scripts/nutcracker.sh
扩容最简单的办法是:
创建新的集群
双写两个集群
把数据从老集群迁移到新集群(不存在才设置值,防止覆盖新的值)
复制速度要根据实际情况调整,不能影响老集群的性能
切换到新集群即可,如果使用Twemproxy代理层的话,可以做到迁移对读的应用透明
Tips#
Autoconf version 2.64 or higher is required
/usr/bin/autoconf -V
rpm -e --nodeps autoconf-2.63
wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar zxvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr/
make && make install
SSDB Install#
# 启动主库, 此命令会阻塞住命令行
./ssdb-server ssdb.conf
# 或者启动为后台进程(不阻塞命令行)
./ssdb-server -d ssdb.conf
# 停止 ssdb-server
./ssdb-server ssdb.conf -s stop
# 对于旧版本
kill `cat ./var/ssdb.pid`
# 重启
./ssdb-server ssdb.conf -s restart