安装和配置¶
安装¶
# 使用 HomeBrew 安装 SSDB
$ brew install ssdb
# 编译安装 SSDB
$ wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip -P /tmp
$ cd /tmp && unzip master.zip && cd ssdb-master
$ make && sudo make install
配置¶
参考文档:
https://ssdb.io/docs/zh_cn/config.html
$ mkdir -p /opt/ssdb/var
$ cp -a /usr/local/ssdb/ssdb.conf /opt/ssdb/ssdb.conf
注意¶
自带配置文件
ssdb.conf和从服务器配置文件ssdb_slave.conf。必须手动创建 var 文件夹,否则执行
ssdb-server的时候会提示'./var' is not a directory or not exists!。SSDB 的配置文件使用一个 TAB 来表示一级缩进, 不要使用空格来缩进, 无论你用1个, 2个, 3个, 4个, 5个, 6个, 7个, 8个或者无数个空格都不行!
重要¶
监听网络端口¶
server:
ip: 127.0.0.1
port: 8888
默认的配置文件监听
127.0.0.1本地回路网络, 所以无法从其它机器上连接此 SSDB 服务器. 如果你希望从其它机器上连接 SSDB 服务器, 必须把127.0.0.1改为0.0.0.0。同时, 利用配置文件的
deny, allow指令限制可信的来源 IP 访问。**警告:**如果不做网络限制便监听
0.0.0.0IP 可能导致被任意机器访问到你的数据, 这很可能是一个安全问题! 你可以结合操作系统的 iptables 来限制网络访问。
只读模式¶
server:
readonly: yes|no
SSDB 可以工作在只读模式下, 在只读模式下, 所有的写操作命令都会被服务端拒绝:
ssdb 127.0.0.1:8888> set a 2
client_error: Forbidden Command: set
(0.000 sec)
默认配置文件不设置此选项, 那表示可读可写。
同步和复制¶
参考:https://ssdb.io/docs/zh_cn/replication.html
日志配置¶
参考:https://ssdb.io/docs/zh_cn/logs.html
logger.level日志级别支持的日志级别有:
debug, info, warn, error, fatal.一般, 建议你将
logger.level设置为debug级别.logger.output日志输出可直接写相对路径或者绝对路径, 如果相对路径, 则是相对配置文件所在的目录.
如果你想输出日志到终端屏幕, 编辑 ssdb.conf, 将
logger: output: log.txt # 修改为 logger: output: stdoutlogger.rorate.size日志循环和清理设置日志拆分时的大小, 单位为字节数. 按照默认的配置, 日志会按 1000MB 大小进行切分, 切分后的文件名格式如:
log.txt.20150723-230422.切分后的日志文件不会自动被清理, 你需要自己写 crontab 脚本来清理。
日志分析¶
一般, 建议你将 logger.level 设置为 debug 级别.
请求处理
2014-06-18 11:01:40.335 [DEBUG] serv.cpp(395): w:0.393,p:5.356, req: set a 1, resp: ok 1
w:0.393请求的排队时间, 毫秒p:5.356请求的处理时间, 毫秒req:...请求内容resp:...响应内容
找出慢请求
$ tail -f log.txt | grep -w resp | grep '[wp]:[1-9][0-9]\{0,\}\.' # 或者 $ cat log.txt | grep -w resp | grep '[wp]:[1-9][0-9]\{0,\}\.'
这些命令用于找出排队时间, 或者处理时间大于等于 1 毫秒的请求.
找出大于 10 毫秒的请求:
$ cat log.txt | grep -w resp | grep '[wp]:[1-9][0-9]\{1,\}\.'
找出大于 100 毫秒的请求:
$ cat log.txt | grep -w resp | grep '[wp]:[1-9][0-9]\{2,\}\.'
SSDB 在工作中
ssdb-server 会每隔 5 分钟输出这样的一条 log
2014-06-18 11:18:03.600 [INFO ] ssdb-server.cpp(215): ssdb working, links: 0 2014-06-18 11:23:03.631 [INFO ] ssdb-server.cpp(215): ssdb working, links: 0
links: 0当前的连接数
LevelDB 配置¶
leveldb.cache_size内存缓存大小, 单位 MB
一般地, 这个数字越大, 性能越好, 你可设置为物理内存的一半. 如果你的机器内存较小, 那就把它改小, 最小值是 16。
leveldb.block_size不用关心leveldb.write_buffer_size写缓冲区大小, 单位 MB
如果你的机器内存小, 那就把它改小, 否则改大. 它应该在这个范围内: [4, 128];
leveldb.compaction_speed
一般情况下, 不用关心. 如果你的硬盘性能非常差, 同时, 你的数据几乎不变动, 也没有什么新数据写入, 可以把它改小(最好大于 50)。
leveldb.compression压缩硬盘上的数据
最好设置为 yes! 如果是 yes, 一般你能存储 10 倍硬盘空间的数据, 而且性能会更好。
内存占用¶
一个 ssdb-server 实例占用的内存瞬时(有可能, 而且即使达到, 也只是持续短时间)最高达到(MB):
cache_size + write_buffer_size * 66 + 32
这是对于压缩选项没有开启的情况. 如果 compression: yes, 计算公式是:
cache_size + 10 * write_buffer_size * 66 + 32
你可以调整配置参数, 限制 ssdb-server 的内存占用。
对于一般负载的实例来说, 物理内存的持续占用是:
cache_size + write_buffer_size * 4 + 32
根据实际经验, 使用默认配置的实例, 会占用约 1GB 的内存. 这个经验你可以参考。
设置内存占用上限?¶
很抱歉, SSDB 无法设置内存占用上限. SSDB占用的内存大小, 和下列因素相关:
cache_size参数配置, 这是最主要的因素.客户端连接的数量, 一般来说, 每一个连接要占用 2MB 的内存, 但也和连接的使用繁忙度请求响应的大小等有关.
文件缓存, 虽然是被 ssdb-server 进程占用, 但是可被操作系统回收的, 可能会占用数十 GB.
SSDB 的繁忙程度, 服务越繁忙, SSDB 会倾向于使用更多的内存, 以提高响应速度.
总体来说, cache_size 参数是你可以控制的, 后面的因素你无法控制. 例如, 在一个比较空闲的 SSDB 上, 如果物理内存是 16G, 而你设置 cache_size 是 8000(8G), 那么你通过 top 命令会看到 ssdb-server 进程占用 RES 内存可能在 12G 左右. 如果是一个比较繁忙的实例, RES 可能达到 15G.
ssdb.conf¶
注:默认的 SSDB 配置文件
注:参考 Configuration - SSDB
# 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: 127.0.0.1
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
replication:
binlog: yes
# Limit sync speed to *MB/s, -1: no limit
sync_speed: -1
slaveof:
# 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
#ip: 127.0.0.1
#port: 8889
logger:
level: debug
output: log.txt
rotate:
size: 1000000000
leveldb:
cache_size: 500
# in MB
# in KB
block_size: 32
# in MB
write_buffer_size: 64
# in MB
compaction_speed: 1000
# yes|no
compression: yes
注意:
leveldb.cache_size默认的内存缓存大小为500 MB,最小值16 MB。leveldb.write_buffer_size默认值为64 MB,取值范围[4, 128]。compression: yes时,ssdb-server实例占用的内存瞬间最高达到(MB):cache_size + 10 * write_buffer_size * 66 + 32,也就是说如果cache_size为 500 MB,write_buffer_size为 64 MB,则最高内存占用大概为500 MB + 10 * 64 MB * 66 + 32 MB = 42772 MB,大约为41.77 GB;如果机器内存小,建议把write_buffer_size改小,范围为[4, 128];当write_buffer_size为4的时候,占用的内存大概为500 MB + 10 * 4 MB * 66 + 32 MB = 3172 MB,3.10 GB。compression: no时,ssdb-server实例占用的内存瞬间最高达到(MB):cache_size + write_buffer_size * 66 + 32。偶尔通过
ssdb-cli使用命令compact可以减少内存占用(压缩内存,Compress)。建议把
logger.level改为error,否则会在var/的父目录下产生一个或多个很大的log.txt文件。值得注意的是配置文件里面的缩进符号都是 t,不能使用
空格/4个空格否则SSDB Server无法启动。建议配置
server.auth的值以提高安全性。
ssdb_slave.conf¶
注:默认的 SSDB 从服务器配置文件
# ssdb-server config
# relative to path of this file, must exist
work_dir = ./var_slave
pidfile = ./var_slave/ssdb.pid
server:
ip: 127.0.0.1
port: 8889
replication:
binlog: yes
# Limit sync speed to *MB/s, -1: no limit
sync_speed: -1
slaveof:
# 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_1
# sync|mirror, default is sync
type: sync
ip: 127.0.0.1
port: 8888
#auth: password
logger:
level: debug
output: log_slave.txt
rotate:
size: 1000000000
leveldb:
# in MB
cache_size: 500
# in KB
block_size: 32
# in MB
write_buffer_size: 64
# in MB
compaction_speed: 200
# yes|no
compression: no
注:replication.slaveof 允许配置 auth,也就是 master SSDB Server 的 server.auth 的值。