1. 程式人生 > 其它 >ssdb雙主搭建

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的伺服器