SSDB双主配置
特性
替代 Redis 数据库, Redis 的 100 倍容量
LevelDB 网络支持, 使用 C/C++ 开发
Redis API 兼容, 支持 Redis 客户端
适合存储集合数据, 如 list, hash, zset...
客户端 API 支持的语言包括: C++、PHP、Python、Cpy、Java、NodeJS、Ruby、Go。
持久化的队列服务
主从复制, 负载均衡
介绍:
levelDB是一个key->value 的数据存储库,其只能在本地保存数据,支持持久化,并且支持保存非常大的数据,单机redis在保存较大数据的时候数十G的时候会出现响应慢等问题,
而单机levelDB数据在150G以内的时候依然可以保持比较好的性能,其随机写入key->value的数据每秒可达到40W条,每秒随机读在6W,写比读还要快,因此适用于写操作大于读操作的场景
,并且不支持网络传输, 即只能本机访问数据,官网地址http://leveldb.org/,国内有360基于levelDB开发支持了网络接口的SSDB,SSDB是一个 C/C++ 语言开发的高性能 NoSQL 数据库,
支持 KV, list, map(hash), zset(sorted set) 等数据结构, 用来替代或者与 Redis 配合存储十亿级别列表的数据,SSDB支持100倍与redis的容量,
因此宣称要替换redis,SSDB支持网络、支持redis客户端、支持python/java/go/PHP/C++语言、支持持久化、支持主从复制、主主复制和负载均衡等功能。
安装环境
centos7
master1 192.168.1.209 node1
master2 192.168.1.208 node2
下载安装并编译:
cd /usr/local/src
wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
unzip master.zip
默认会编译安装到/usr/local/ssdb
cd ssdb-master/
make
make install
修改启动脚本
cp tools/ssdb.sh /etc/init.d/ssdb
vim /etc/init.d/ssdb
configs="/usr/local/ssdb/ssdb.conf"
加入启动项
chkconfig --add ssdb
chkconfig ssdb on
chkconfig --list ssdb
配置环境变量
vim /etc/profile
PATH=$PATH:/usr/local/ssdb
export PATH
source /etc/profile
SSDB 数据库是支持双主(双 Master)和多主架构的. 而且, 我们的应用也是部署双主架构, 但当作单主来用. 也就是说, 平时只往其中一个写, 当出现故障时,
整体切换到另一个主上面. 如果应用层已经解决了数据拆分, 也即不会两个节点同时操作一个 key, 那么就可以放心使用双主同时写入.
SSDB 双主的配置非常简单:
只需要将 type 设置为 mirror, 然后每个节点各指向对方即可.
如果是多主, 则每个节点要指向其它 n-1 个节点.
双主配置文件:
主库配置文件:
vim /usr/local/ssdb/ssdb.conf
# ssdb-server config
# MUST indent by TAB!
# relative to path of this file, directory must exists
work_dir = ./var
pidfile = ./var/ssdb.pid
server:
ip: 192.168.1.209
port: 8888
# bind to public ip
#ip: 0.0.0.0
# format: allow|deny: all|ip_prefix
# multiple allows or denys is supported
#deny: all
#allow: 127.0.0.1
#allow: 192.168
# auth password must be at least 32 characters
#auth: very-strong-password
#readonly: yes
replication:
binlog: yes
# Limit sync speed to *MB/s, -1: no limit
sync_speed: -1
slaveof:
id: node2
type: mirror
host: 192.168.1.208
port: 8888
# to identify a master even if it moved(ip, port changed)
# if set to empty or not defined, ip:port will be used.
#id: svc_2
# sync|mirror, default is sync
#type: sync
#host: localhost
#port: 8889
logger:
level: debug
output: log.txt
rotate:
size: 1000000000
leveldb:
# in MB
cache_size: 500
# in MB
write_buffer_size: 64
# in MB/s
compaction_speed: 1000
# yes|no
compression: yes
从库配置文件
vim /usr/local/ssdb/ssdb.conf
# ssdb-server config
# MUST indent by TAB!
# relative to path of this file, directory must exists
work_dir = ./var
pidfile = ./var/ssdb.pid
server:
ip: 192.168.1.208
port: 8888
# bind to public ip
#ip: 0.0.0.0
# format: allow|deny: all|ip_prefix
# multiple allows or denys is supported
#deny: all
#allow: 127.0.0.1
#allow: 192.168
# auth password must be at least 32 characters
#auth: very-strong-password
#readonly: yes
replication:
binlog: yes
# Limit sync speed to *MB/s, -1: no limit
sync_speed: -1
slaveof:
id: node1
type: mirror
host: 192.168.1.209
port: 8888
# to identify a master even if it moved(ip, port changed)
# if set to empty or not defined, ip:port will be used.
#id: svc_2
# sync|mirror, default is sync
#type: sync
#host: localhost
#port: 8889
logger:
level: debug
output: log.txt
rotate:
size: 1000000000
leveldb:
# in MB
cache_size: 500
# in MB
write_buffer_size: 64
# in MB/s
compaction_speed: 1000
# yes|no
compression: yes
启动服务:
/etc/init.d/ssdb start
此时在任意节点写入数据都会在另外的节点查询到
node2 登录
ssdb-cli -h 192.168.1.208 -p 8888
ssdb 192.168.1.208:8888> set mic wangxin
ok
(0.000 sec)
ssdb 192.168.1.208:8888> get mic
wangxin
(0.000 sec)
node1 登录 查询
ssdb-cli -h 192.168.1.209 -p 8888
ssdb 192.168.1.209:8888> get mic
wangxin
(0.001 sec)
项目链接:https://github.com/ideawu/ssdb
=====================================================================================================================================================================
Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。
该方案很好的解决了单个Redis实例承载能力的问题。当然,Twemproxy本身也是单点,需要用Keepalived做高可用方案。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题
这里我们使用Twemproxy代理来代理SSDB集群来实现数据的分布式存储,即shared。
Twemproxy部署环境
centos7
192.168.1.206
编译安装autoconf:
cd /usr/local/src/
wget http://down1.chinaunix.net/distfiles/autoconf-2.69.tar.xz
xz -d autoconf-2.69.tar.xz
tar xf autoconf-2.69.tar
cd autoconf-2.69
./configure
make
make install
编译安装twemproxy:
cd /usr/local/src
wget https://codeload.github.com/twitter/twemproxy/zip/master
unzip master
cd twemproxy-master/
autoreconf -fvi
./configure --prefix=/usr/local/twemproxy
make -j 8
make install
设置环境变量
echo "PATH=$PATH:/usr/local/twemproxy/sbin/" >> /etc/profile
source /etc/profile
创建相关目录(存放配置文件和pid文件)
cd /usr/local/twemproxy/
mkdir run conf
添加proxy配置文件
vim /usr/local/twemproxy/conf/nutcracker.yml
alpha:
listen: 192.168.1.206:22121 ## 监听地址和端口
hash: fnv1a_64 ## 散列算法
distribution: ketama ## 分片的算法,有ketama(一致性hash)、module(取模)、random(随机)三种算法
auto_eject_hosts: true ## 是否在节点无法响应时自动从服务器列表中剔除,重新响应时自动加入服务器列表中
redis: true ## 后端代理的是否为redis
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 192.168.1.209:8888:1 server1
- 192.168.4.208:8888:1 server2
启动Twemproxy测试服务
cd /usr/local/twemproxy/
cp -a conf sbin/
cd sbin/
./nutcracker -t
测试通过即可正式启动
nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/ssdbproxy.pid -o /usr/local/twemproxy/run/ssdbproxy.log
查看进程
ps -ef | grep nutcracker | grep -v grep
登录 测试
redis-cli -h 192.168.1.206 -p 22121
项目链接:https://github.com/twitter/twemproxy