ssdb双主搭建

 一、前言:

我们原本使用了一个单节点的ssdb,刚开始的时候使用都没什么问题,但是几年之后随着业务的增长,业务的QPS也随之增大,代码连接ssdb的时候发现有时候会出现timeout的情况,但是排查的时候发现:

1、报错时间点,服务器资源使用正常,相对无报错的时候稍微高一点,并无太大波动,不至于影响业务。

2、报错时间点服务器网络流量稍微增大了一点,但不大于我们的服务器带宽。不至于影响业务 。

3、报错时间点没有规律。

4、 找了一遍ssdb的配置调优,但是没什么效果。

二、解决:

怀疑是ssdb这个组件本省的QPS的问题。 也就是说ssdb的QPS 就是这么大了,你业务增长之后偶尔QPS超过了ssdb承受的QPS,那多余的QPS只能等待没超过程序的超时设置的话就返回超时了。

所以搭建了一个ssdb的双主,用来承受分担多余的QPS。

建议:ssdb比较耗磁盘空间的,建议使用SSD的数据盘,内存建议大一点的。我们业务还算是比较大的,目前的配置是300G+内存32G不太够用。

三、ssdb双主搭建

机器规划:

192.168.2.201 master-node1

192.168.2.202 master-node2

系统:centos 7.4

 

1、master1安装

SSDB 主主同步模式部署记录

1)安装SSDB(在两个节点机上安装步骤一样,如下)

 


[root@master-node1 ~]# mkdir -p /usr/local/ssdb
[root@master-node1 ~]# wget https://github.com/ideawu/ssdb/archive/master.zip
[root@master-node1 ~]# unzip master.zip
[root@master-node1 ~]# cd ssdb-master/
[root@master-node1 ssdb-master]# make PREFIX=/usr/local/ssdb
[root@master-node1 ssdb-master]# make PREFIX=/usr/local/ssdb install

2)主主模式配置

master-node1节点上的配置

[root@master-node1 ~]# cd /usr/local/ssdb
[root@master-node1 ssdb]# cp ssdb.conf ssdb.conf.bak
[root@master-node1 ssdb]# vim ssdb.conf
# ssdb-server config
# MUST indent by TAB!

# absolute path, or relative to path of this file, directory must exists
work_dir = /data/ssdbdata # 数据存放的位置
pidfile = ./var/ssdb.pid  # pid文件存放的位置

server:
        # specify an ipv6 address to enable ipv6 support
        # ip: ::1
        ip: 0.0.0.0 # 允许所有ip访问
        port: 8889  # ssdb端口
        # 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: ddcsf#$%fddfdsaehthvD^&*Gdfwe1dbSsdb # 密码必须很复杂的,弱无法启动ssdb
        #readonly: yes
        # in ms, to log slowlog with WARN level
        #slowlog_timeout: 5

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: mirror
                host: 192.168.2.202
                port: 8889
                auth: ddcsf#$%fdfcaghthvD^&*Game111dbSsdb  # 如果另外一个master有密码就要加上这个

logger:
        level: debug # 建议开启这个等级的日志,但是日志量很多
        output: log.txt
        rotate:
                size: 1000000000

leveldb:
        # in MB
        cache_size: 16000
        # in MB
        write_buffer_size: 128
        # in MB/s
        compaction_speed: 1000
        # yes|no
        compression: yes
 

master-node2节点上的配置

[root@master-node2 ~]# cd /usr/local/ssdb
[root@master-node2 ssdb]# cp ssdb.conf ssdb.conf.bak
[root@master-node2 ssdb]# vim ssdb.conf
# ssdb-server config
# MUST indent by TAB!

# absolute path, or relative to path of this file, directory must exists
work_dir = /data/ssdbdata # 数据存放的位置
pidfile = ./var/ssdb.pid  # pid文件存放的位置

server:
        # specify an ipv6 address to enable ipv6 support
        # ip: ::1
        ip: 0.0.0.0 # 允许所有ip访问
        port: 8889  # ssdb端口
        # 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: ddcsf#$%fddfdsaehthvD^&*Gdfwe1dbSsdb # 密码必须很复杂的,弱无法启动ssdb
        #readonly: yes
        # in ms, to log slowlog with WARN level
        #slowlog_timeout: 5

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: mirror
                host: 192.168.2.201
                port: 8889
                auth: ddcsf#$%fdfcaghthvD^&*Game111dbSsdb  # 如果另外一个master有密码就要加上这个

logger:
        level: debug # 建议开启这个等级的日志,但是日志量很多
        output: log.txt
        rotate:
                size: 1000000000

leveldb:
        # in MB
        cache_size: 16000
        # in MB
        write_buffer_size: 128
        # in MB/s
        compaction_speed: 1000
        # yes|no
        compression: yes
 

3)启动服务(两节点启动命令一样)

[root@master-node1 ~]# /usr/local/ssdb/ssdb-server -d /usr/local/ssdb/ssdb.conf
ssdb-server 1.9.4
Copyright (c) 2012-2015 ssdb.io
 
[root@master-node1 ~]# ps -ef|grep ssdb
root     23803     1  0 21:05 ?        00:00:00 /usr/local/ssdb/ssdb-server -d /usr/local/ssdb/ssdb.conf
root     23819 23719  0 21:05 pts/0    00:00:00 grep ssdb
.........................................................................................................
关闭命令:
/usr/local/ssdb/ssdb-server /usr/local/ssdb/ssdb.conf -s stop
 
帮忙命令
/usr/local/ssdb/ssdb-server -h
.........................................................................................................
 

4)数据同步测试

在master-node1节点上写入数据

[root@master-node1 ~]# /usr/local/ssdb/ssdb-cli -h 192.168.2.201 -p 8888
ssdb (cli) - ssdb command line tool.
Copyright (c) 2012-2016 ssdb.io
 
'h' or 'help' for help, 'q' to quit.
 
ssdb-server 1.9.4
 
ssdb 192.168.2.201:8888> set name wangshibo
ok
(0.001 sec)
ssdb 192.168.2.201:8888> get name
wangshibo
(0.001 sec)
ssdb 192.168.2.201:8888>
 
在master-node2节点上查看:
[root@master-node2 ~]# /usr/local/ssdb/ssdb-cli -h 192.168.2.202 -p 8888
ssdb (cli) - ssdb command line tool.
Copyright (c) 2012-2016 ssdb.io
 
'h' or 'help' for help, 'q' to quit.
 
ssdb-server 1.9.4
 
ssdb 192.168.2.202:8888> get name
wangshibo
(0.001 sec)
 

同理,在master-node2节点上写入数据

 

[root@master-node2 ~]# /usr/local/ssdb/ssdb-cli -h 192.168.2.202 -p 8888
ssdb (cli) - ssdb command line tool.
Copyright (c) 2012-2016 ssdb.io
 
'h' or 'help' for help, 'q' to quit.
 
ssdb-server 1.9.4
 
ssdb 192.168.2.202:8888> set huanqiutest hahahah
ok
(0.001 sec)
ssdb 192.168.2.202:8888>
 
然后在另一台master-node1节点上查看
[root@master-node1 ~]# /usr/local/ssdb/ssdb-cli -h 192.168.2.201 -p 8888
ssdb (cli) - ssdb command line tool.
Copyright (c) 2012-2016 ssdb.io
 
'h' or 'help' for help, 'q' to quit.
 
ssdb-server 1.9.4
 
ssdb 192.168.2.201:8888> get huanqiutest
hahahah
(0.001 sec)

以上可以看到无论是在master1还是master2上面写入数据都能正常同步到另外一台master,说明ssdb主主同步环境已经实现!

双主或者主从有一个大坑,大家务必记住:如果要重启其中一个主,必须主要先把业务切走了,否则起来的时候因为另外一个master的频繁写入,导致同步点丢失,无法再恢复同步的状态,这种情况是没有办法解决的。只能重新做双主,就是把你的数据移走,重新恢复双主状态!

如果数据量小还好,如果像我们这种数据量大的,基本是没办法解决的。启动都要加载数据半天。很坑!有钱还是坐redis好。

 

 

 

 

如果要实现ssdb的监控,可以通过命令的方式去获取对应的监控数据:


..............................................................................
ssdb服务监控
info 命令返回的信息
 
[root@master-node1 ~]# /usr/local/ssdb/ssdb-cli -h 192.168.2.201 -p 8888
........
ssdb 192.168.2.201:8888> info
........
replication
  client 192.168.2.201:56014
      type     : mirror
      status   : SYNC
      last_seq : 3
replication
  slaveof 192.168.2.201:8888
      id         : svc_1
      type       : mirror
      status     : SYNC
      last_seq   : 2
      copy_count : 1
      sync_count : 1
 
[root@master-node2 ~]# /usr/local/ssdb/ssdb-cli -h 192.168.2.202 -p 8888
.........
ssdb 192.168.2.202:8888> info
.........
replication
  client 192.168.2.202:50210
      type     : mirror
      status   : SYNC
      last_seq : 2
replication
  slaveof 192.168.2.202:8888
      id         : svc_2
      type       : mirror
      status     : SYNC
      last_seq   : 3
      copy_count : 1
      sync_count : 0
 
............................................................................
info命令后的消息参数解释:
1)binlogs
当前实例的写操作状态.
capacity: binlog 队列的最大长度
min_seq: 当前队列中的最小 binlog 序号
max_seq: 当前队列中的最大 binlog 序号
 
2)replication
可以有多条 replication 记录. 每一条表示一个连接进来的 slave(client), 或者一个当前服务器所连接的 master(slaveof).
slaveof|client ip:port, 远端 master/slave 的 ip:port。
type: 类型, sync|mirror.
status: 当前同步状态, DISCONNECTED|INIT|OUT_OF_SYNC|COPY|SYNC。
last_seq: 上一条发送或者收到的 binlog 的序号。
slaveof.id: master 的 id(这是从 slave's 角度来看的, 你永远不需要在 master 上配置它自己的 id)。
slaveof.copy_count: 在全量同步时, 已经复制的 key 的数量。
slaveof.sync_count: 发送或者收到的 binlog 的数量。
 
3)关于 status:
DISCONNECTED: 与 master 断开了连接, 一般是网络中断。
INIT: 初始化状态。
OUT_OF_SYNC: 由于短时间内在 master 有大量写操作, 导致 binlog 队列淘汰, slave 丢失同步点, 只好重新复制全部的数据。
COPY: 正在复制基准数据的过程中, 新的写操作可能无法及时地同步。
SYNC: 同步状态是健康的.
4)判断同步状态
binlogs.max_seq 是指当前实例上的最新一次的写(写/更新/删除)操作的序号, replication.client.last_seq 是指已发送给 slave 的最新一条 binlog 的序号。所以, 如果你想判断主从同步是否已经同步到位(实时更新), 那么就判断 binlogs.max_seq 和 replication.client.last_seq 是否相等。
 
---------------------SSDB备份与恢复----------------------
1)备份
支持了在线备份功能, 可以在不停止服务的情况下备份服务器数据,这个功能让 SSDB 更加成为一个真正生产环境的存储服务器。
[root@master-node1 ~]# /home/slim/ssdb/ssdb-dump 192.168.2.202 8888 ./backup_dir
这条命令从监听在192.168.2.202:8888 的SSDB服务器上备份全量的数据, 保存到本地新创建的目录 backup_dir, 这个目录其实是一个 LevelDB 的数据库(db)。
 
2)恢复
将 backup_dir 传输到服务器, 修改新ssdb服务器的配置文件, 将 SSDB 使用的数据库名改为 backup_dir, 然后重启 SSDB 即可。
 
3)使用主从(Master-Slave)架构实时备份
 
注意:
a)一般, 建议你将 logger.level 设置为 debug 级别。详情参考:日志解读
b)利用配置文件的 deny, allow 指令限制可信的来源 IP 访问,提高服务的安全。
c)SSDB 的配置文件使用一个 TAB 来表示一级缩进, 不要使用空格来缩进, 无论你用2个, 3个, 4个, 或者无数个空格都不行!
d)一定要记得修改你的 Linux 内核参数, 关于 max open files(最大文件描述符数)的内容,详情参考:构建C1000K的服务器

 

 

 

 

 

 

 

 

 

 

 

 

 


posted @ 2022-04-07 22:00  木与风  阅读(144)  评论(0编辑  收藏  举报