學習Redis(八)

Redis編譯安裝和saltstack簡單配置(1)

分佈式存儲之-Redis
redis經常使用於數據庫讀緩存和寫緩存,一般寫緩存須要考慮到數據一致性的問題,讀緩存應用較多
redis是一個開源的,使用c語言編寫的,支持網絡交互的,可基於內存也可持久化的key-value數據庫php

目前國內最大的redis集羣--新浪微博html

redis和memcached對比
java

 

[root@yum-down local]# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
[root@yum-down local]# tar xf redis-3.0.7.tar.gz
[root@yum-down local]# cd redis-3.0.7
[root@yum-down redis-3.0.7]# make PREFIX=/usr/local/redis install
[root@yum-down utils]# cp redis_init_script /etc/init.d/redis
[root@yum-down utils]# chmod +x /etc/init.d/redis

修改腳本中的安裝路徑node

[root@yum-down utils]# vim /etc/init.d/redis
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli

 

建立配置文件路徑,並複製配置文件以端口號命名mysql

[root@yum-down redis-3.0.7]# mkdir /etc/redis
[root@yum-down redis-3.0.7]# cp /usr/local/redis-3.0.7/redis.conf /etc/redis/6379.conf

 

第一次啓動,若是沒有修改是啓動在前臺頁面linux

[root@yum-down ~]# /etc/init.d/redis start

 

修改配置文件‘daemonize 改成yes’c++

[root@yum-down ~]# vim /etc/redis/6379.conf
daemonize yes

 

修改pid和/etc/init.d/redis中的pid一致git

pidfile /var/run/redis_6379.pid
[root@yum-down ~]# /etc/init.d/redis start
Starting Redis server...
[root@yum-down ~]# netstat -ntlp |grep redis
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      5235/redis-server 
tcp        0      0 :::6379                     :::*                        LISTEN      5235/redis-server 

 

關閉測試github

[root@yum-down ~]# service redis stop
Stopping ...
Redis stopped
[root@yum-down ~]# 

 

作一個軟鏈接啓動:golang

[root@yum-down ~]# ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cli                
[root@yum-down ~]# redis-cli 
127.0.0.1:6379> 

 

因爲redis是單線程,只能使用一個cpu,能夠啓動多個,則能夠指定ip和端口

[root@yum-down ~]# redis-cli -h 10.10.0.250 -p 6379
10.10.0.250:6379> 

 

簡單的使用:
set插入字符串,get查看

[root@yum-down ~]# redis-cli -h 10.10.0.250 -p 6379
10.10.0.250:6379> set keyname hello
OK
10.10.0.250:6379> get keyname
"hello"
10.10.0.250:6379> 

 

過濾:
顯示全部

10.10.0.250:6379> keys *
1) "keya"
2) "keyna"
3) "keyname1"
4) "keyname"

 

匹配keyname開頭

10.10.0.250:6379> keys keyname?
1) "keyname2"
2) "keyname1"
10.10.0.250:6379> 

 

判斷key是否存在,0不存在,非0則存在,表示數量

10.10.0.250:6379> EXISTS keya
(integer) 1
10.10.0.250:6379> EXISTS keya1
(integer) 0
10.10.0.250:6379> 

 

刪除:0不存在,非0則存在,表示數量

10.10.0.250:6379> DEL keya
(integer) 1
10.10.0.250:6379> DEL keya
(integer) 0
10.10.0.250:6379> 
info:

# Keyspace
db0:keys=2,expires=0,avg_ttl=0

 

db0:實例
以下:SELECT 1和2兩個實例,分別插入數據

10.10.0.250:6379[2]> SELECT 1
OK
10.10.0.250:6379[1]> SELECT 2
OK
10.10.0.250:6379[2]> SET 1 1
OK
10.10.0.250:6379[2]> SELECT 1
OK
10.10.0.250:6379[1]> SET 1 1
OK

 

在使用info查看就有了1和2的實例

# Keyspace
db0:keys=2,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
db2:keys=1,expires=0,avg_ttl=0

 

flushall可清空全部實例

10.10.0.250:6379[1]> flushall

 

keys:key數量
expires:過時數量
avg_ttl:ttl數量

簡單的配置文件說明:

[root@yum-down ~]# egrep -v  "^#|^$" /etc/redis/6379.conf
daemonize yes  先後臺啓動
pidfile /var/run/redis.pid pid位置
port 6379  端口
logfile ""   日誌
dir ./ 啓動的目錄
[root@yum-down ~]# 

 

redis-saltstack配置
1,複製安裝包到salt/redis/files/
2,複製配置文件到salt/redis/files/
3, 複製啓動腳本到salt/redis/files/目錄下,沒有則建立;top中指定便可
install.sls以下:

file.managed:
    - name: /usr/local/src/redis-3.0.7.tar.gz
    - source: salt://redis/files/redis-3.0.7.tar.gz
    - user: root
    - group: root
    - mode: 755
cmd.run:
    - name: cd /usr/local/src && tar xf redis-3.0.7.tar.gz && cd redis-3.0.7 && PREFIX=/usr/local/redis install
    - unless: test -d /usr/local/redis
redis-config:
  file.managed:
    - name: /etc/redis/6379.conf
    - spurce: salt://redis/files/6379.conf
    - user: root
    - group: root 
    - mode: 644
redis-service:
  file.managed:
    - name: /etc/init.d/redis
    - source: salt://redis/files/redis.init
    - user: root
    - group: root
    - mode: 755
  cmd.run
    - name: chkconfig --add redis && chkconfig redis on
    - unless: chkconfig --list |grep redis
  service.runnig:
    - name: redis
    - emable: True
    - watch:
      - file: redis-config
    - require:
      - cmd: redis-install
      - cmd: redis-service
 

###########################################################################################

Redis簡單的數據類型

簡單的使用:
set插入字符串,get查看

[root@yum-down ~]# redis-cli -h 10.10.0.250 -p 6379
10.10.0.250:6379> set keyname hello
OK
10.10.0.250:6379> get keyname
"hello"
10.10.0.250:6379>

過濾:
顯示全部

10.10.0.250:6379> keys *
1) "keya"
2) "keyna"
3) "keyname1"
4) "keyname"

匹配keyname開頭

10.10.0.250:6379> keys keyname?
1) "keyname2"
2) "keyname1"
10.10.0.250:6379>

判斷key是否存在,0不存在,非0則存在,表示數量

10.10.0.250:6379> EXISTS keya
(integer) 1
10.10.0.250:6379> EXISTS keya1
(integer) 0
10.10.0.250:6379>

刪除:0不存在,非0則存在,表示數量

10.10.0.250:6379> DEL keya
(integer) 1
10.10.0.250:6379> DEL keya
(integer) 0
10.10.0.250:6379>

info:

Keyspace

db0:keys=2,expires=0,avg_ttl=0
db0:實例
以下:SELECT 1和2兩個實例,分別插入數據

10.10.0.250:6379[2]> SELECT 1
OK
10.10.0.250:6379[1]> SELECT 2
OK
10.10.0.250:6379[2]> SET 1 1
OK
10.10.0.250:6379[2]> SELECT 1
OK
10.10.0.250:6379[1]> SET 1 1
OK

在使用info查看就有了1和2的實例

Keyspace

db0:keys=2,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
db2:keys=1,expires=0,avg_ttl=0
flushall可清空全部實例
10.10.0.250:63791> flushall

keys:key數量
expires:過時數量
avg_ttl:ttl數量

追加:append
一般使用set也能夠追加

127.0.0.1:6379> set 1 hello
OK
127.0.0.1:6379> get 1
"hello"
set追加
127.0.0.1:6379> set 1 hello,word
OK
127.0.0.1:6379> get 1
"hello,word"
append追加
127.0.0.1:6379> append 1 w
(integer) 11
127.0.0.1:6379> append 1 word
(integer) 15
127.0.0.1:6379> get 1
"hello,wordwword"
127.0.0.1:6379>

單個數據追加:INCR

127.0.0.1:6379> incr new
(integer) 1
127.0.0.1:6379> incr new
(integer) 2
127.0.0.1:6379> incr new
(integer) 3
127.0.0.1:6379> incr new
(integer) 4
127.0.0.1:6379> incr new
(integer) 5
127.0.0.1:6379> get new
"5"
127.0.0.1:6379>

追加多個:INCRBY

127.0.0.1:6379> get new
"5"
127.0.0.1:6379> incrby new 100
(integer) 105
127.0.0.1:6379> get new
"105"
127.0.0.1:6379>

減小:DECR

127.0.0.1:6379> get new
"105"
127.0.0.1:6379> DECR new
(integer) 104
127.0.0.1:6379> DECR new
(integer) 103
127.0.0.1:6379> DECR new
(integer) 102
127.0.0.1:6379> DECR new
(integer) 101
127.0.0.1:6379> DECR new
(integer) 100
127.0.0.1:6379> get new
"100"
127.0.0.1:6379>

浮點:INCRBYELOAT

127.0.0.1:6379> INCRBYFLOAT key 0.1
"0.2"
127.0.0.1:6379> INCRBYFLOAT key 0.1
"0.3"
127.0.0.1:6379> INCRBYFLOAT key 0.1
"0.4"
127.0.0.1:6379> INCRBYFLOAT key 0.1
"0.5"
127.0.0.1:6379> INCRBYFLOAT key 0.1
"0.6"
127.0.0.1:6379> INCRBYFLOAT key 0.1
"0.7"
127.0.0.1:6379>

MSET使用:

127.0.0.1:6379> mset key 1 key2 2 key3 3
OK
127.0.0.1:6379> get key
"1"
127.0.0.1:6379> get key2
"2"
127.0.0.1:6379> get key3
"3"
127.0.0.1:6379> mget key key2 key3
1) "1"
2) "2"
3) "3"
127.0.0.1:6379>

根據UTF-8編碼計算key值:

127.0.0.1:6379> set key "linuxEA博客"
OK
127.0.0.1:6379> get key
"linuxEA\xe5\x8d\x9a\xe5\xae\xa2"
127.0.0.1:6379> strlen key
(integer) 13
127.0.0.1:6379>

===================散列類型=====================
散列類型:

HSET
127.0.0.1:6379> HSET xuhao name 1
(integer) 1
127.0.0.1:6379> HSET xuhao co red
(integer) 1
127.0.0.1:6379> HSET xuhao price  3
(integer) 1

HGETALL查看全部

127.0.0.1:6379> HGETALL xuhao
1) "name"
2) "1"
3) "co"
4) "red"
5) "price"
6) "3"

HGET單個查看

127.0.0.1:6379> HGET xuhao name
"1"
127.0.0.1:6379> HGET xuhao co
"red"
127.0.0.1:6379> HGET xuhao price
"3"
127.0.0.1:6379> 

HMSET:
127.0.0.1:6379> HMSET pc name thinkpad co black price 3000
OK
127.0.0.1:6379> HGETALL pc
1) "name"
2) "thinkpad"
3) "co"
4) "black"
5) "price"
6) "3000"
127.0.0.1:6379> HSET pc mode1 "bu huan jia"
(integer) 1
127.0.0.1:6379> HGET pc mode1
"bu huan jia"
127.0.0.1:6379>

刪除:

127.0.0.1:6379> HGET pc mode1
"bu huan jia"
127.0.0.1:6379> HDEL pc mode1
(integer) 1
127.0.0.1:6379> HGETALL mode1
(empty list or set)

判斷是否還存在:

127.0.0.1:6379> HEXISTS mode1 "bu huan jia"
(integer) 0
127.0.0.1:6379>

判斷key是否存在:

127.0.0.1:6379> EXISTS mode1
(integer) 0
127.0.0.1:6379>

===================列表類型=====================
列表類型:

[root@yum-down ~]# redis-cli 
127.0.0.1:6379> del new
(integer) 1
127.0.0.1:6379> LPUSH new 1
(integer) 1
127.0.0.1:6379> LPUSH new 2
(integer) 2
127.0.0.1:6379> LPUSH new 3
(integer) 3

從右邊插入

127.0.0.1:6379> RPUSH new 4
(integer) 4
127.0.0.1:6379> LLEN new
(integer) 4
127.0.0.1:6379>

從左邊彈出一個:

127.0.0.1:6379> LPOP new
"1"

從右邊彈出一個:

127.0.0.1:6379> RPOP new
"4"
127.0.0.1:6379>

彈出兩個後查看只剩下2個字符

127.0.0.1:6379> LLEN new
(integer) 2
127.0.0.1:6379>

某一個範圍:LRANGE
-1表示從右邊的第一個元素

127.0.0.1:6379> LRANGE new 1 2
1) "2"
2) "3"
127.0.0.1:6379> LRANGE new 0 -1

-0則是從左邊開始查看

127.0.0.1:6379> LINDEX new 0
"1"
127.0.0.1:6379>

只保留指定的條目:
如:只保留0-4的條目:

127.0.0.1:6379> LTRIM new 1 4
OK

查看

127.0.0.1:6379> LRANGE new 0 -1
1) "4"
2) "LLEN"
3) "new"
4) "LLEN"

只保留0-3的條目

127.0.0.1:6379> LTRIM new 1 3
OK

查看

127.0.0.1:6379> LRANGE new 0 -1
1) "LLEN"
2) "new"
3) "LLEN"
127.0.0.1:6379>

例:只看logs的100條數據:

127.0.0.1:6379> LPUSH logs newlog
(integer) 1
127.0.0.1:6379> LTRIM logs 0 99
OK
127.0.0.1:6379>

===================集合類型====================
集合類型:SADD

127.0.0.1:6379> SADD jihe a b c 
(integer) 3
127.0.0.1:6379> SADD jihe2 e f g
(integer) 3
127.0.0.1:6379> SMEMBERS jihe
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> SMEMBERS jihe2
1) "e"
2) "g"
3) "f"
127.0.0.1:6379>

判斷是否存在:SISMEMBER

127.0.0.1:6379> SISMEMBER jihe2 a
(integer) 0
127.0.0.1:6379> SISMEMBER jihe2 e
(integer) 1
127.0.0.1:6379>

判斷差集:SDIFF

127.0.0.1:6379> SDIFF jihe jihe2
1) "c"
2) "a"
3) "b"
127.0.0.1:6379>

交集運算: SINTER

127.0.0.1:6379> SMEMBERS jihe2
1) "a"
2) "e"
3) "g"
4) "f"
127.0.0.1:6379> SMEMBERS jihe
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> SINTER jihe jihe2
1) "a"
127.0.0.1:6379>

集合:SUNION

127.0.0.1:6379> SUNION jihe jihe2
1) "e"
2) "a"
3) "b"
4) "f"
5) "g"
6) "c"
127.0.0.1:6379>

有序集合:

127.0.0.1:6379> ZADD jihea 80 a 
(integer) 1
127.0.0.1:6379> ZADD jihea 81 b 
(integer) 1
127.0.0.1:6379> ZADD jihea 82 c 
(integer) 1
127.0.0.1:6379> ZADD jihea 83 d 
(integer) 1
127.0.0.1:6379> ZADD jihea 84 e 
(integer) 1

查看

127.0.0.1:6379> ZSCORE jihea a
"80"
127.0.0.1:6379> ZSCORE jihea b
"81"
127.0.0.1:6379> ZSCORE jihea c
"82"
127.0.0.1:6379> ZSCORE jihea d
"83"
127.0.0.1:6379>

查看全部:

127.0.0.1:6379> ZRANGE jihea 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> 

###########################################################################################

Redis持久化rdb和aof簡單介紹

redis消息隊列:
發佈和訂閱,以及頻道
打開一個subscribe

127.0.0.1:6379> SUBSCRIBE test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
1) "message"
2) "test"
3) "hello"
1) "message"
2) "test"
3) "word

在另一個終端輸入 PUBLISH test word

127.0.0.1:6379> PUBLISH test word
(integer) 1
127.0.0.1:6379>

那麼這些數據會將在subcribe中打印出,這種方式發送後將不會再發送,若是丟失則會丟失

redis支持兩種持久化,分別是rdb和aof
rdb:指定的時間內快照存放在本地
aof: 將全部執行過的命令保存在本地,這種方式更像mysql的binlog
在服務器宕機時,若是是快照的方式,數據將會丟失一部分,而aof則損失的較小,而且在後臺會進行重寫

rdb:

[root@yum-down ~]# vim /etc/redis/6379.conf
save 900 1 
save 300 10
save 60 10000

900秒內若是有一個key發送變化則作一次快照,或者在300秒內有10個key發生變化則作一次快照,或者在60秒內,有10000個key作一次快照,禁用刪除save便可,另外這裏的快照是通過壓縮的

dbfilename dump_6379.rdb 快照的保存的名詞
dir /opt/redis 快照保存的位置
以下:

127.0.0.1:6379> set key 1
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379> set key 2
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379> 

[root@yum-down ~]# ll /opt/redis/
total 4
-rw-r--r-- 1 root root 27 Feb 26 04:49 dump_6379.rdb
[root@yum-down ~]# ll /opt/redis/
total 4
-rw-r--r-- 1 root root 27 Feb 26 04:50 dump_6379.rdb
[root@yum-down ~]# ll /opt/redis/

BGSAVE

127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> 
[root@yum-down ~]# ll /opt/redis/
total 4
-rw-r--r-- 1 root root 27 Feb 26 04:51 dump_6379.rdb

一般咱們備份時AVE不會影響到正常業務,一般咱們關機時使用save後再進行。
SAVE和BGSAVE它們調用的方式各有不一樣: SAVE 直接調用 rdbSave ,阻塞 Redis主進程,直到保存完成爲止。在主進程阻塞期間,服務器不能處理客戶端的任何請求,BGSAVE 則 fork 出一個子進程,子進程負責調用 rdbSave ,並在保存完成以後向主進程發送信號,通知保存已完成。由於 rdbSave 在子進程被調用,因此 Redis 服務器在BGSAVE 執行期間仍然能夠繼續處理客戶端的請求。

AOF:

[root@yum-down ~]# vim /etc/redis/6379.conf
appendonly yes
appendfilename "appendonly.aof"

AOF在set是經過算法進行數據重寫
AOF在配置文件中修改後,他的數據也是存放在dir目錄中,和rdb一個目錄中

[root@yum-down redis]# ll /opt/redis/

total 4

-rw-r--r-- 1 root root 0 Feb 26 05:49 appendonly.aof

-rw-r--r-- 1 root root 27 Feb 26 05:49 dump_6379.rdb 

[root@yum-down redis]# cat appendonly.aof

*2

$6

SELECT

$1

0

*3

$3

set

$1

1

$1

##########################################################################################

Redis簡單的主從配置

redis主從配置
複製配置文件

[root@yum-down ~]# cd /etc/redis/
[root@yum-down redis]# cp 6379.conf 6380.conf

修改端口,和數據文件名,或者保存位置便可‘dir‘

[root@yum-down redis]# vim 6380.conf 
:%s/6379/6380/g
appendfilename "appendonly6380.aof"
[root@yum-down redis]# diff 6379.conf 6380.conf 
46c46
< pidfile /var/run/redis_6379.pid
---
> pidfile /var/run/redis_6380.pid
48c48
< # Accept connections on the specified port, default is 6379.
---
> # Accept connections on the specified port, default is 6380.
50c50
< port 6379
---
> port 6380
182c182
< dbfilename dump_6379.rdb
---
> dbfilename dump_6380.rdb
645c645
< # cluster-config-file nodes-6379.conf
---
> # cluster-config-file nodes-6380.conf
[root@yum-down redis]#

啓動:
[

root@yum-down redis]# cd /etc/redis/
[root@yum-down ~]# /usr/local/redis/bin/redis-server /etc/redis/6380.conf 
[root@yum-down ~]# redis-cli -h 10.10.0.250 -p 6380

咱們info後,發現默認兩臺機器都是master。6379改爲從

# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

[root@yum-down redis]# netstat -ntlp |grep 6380
tcp        0      0 0.0.0.0:6380                0.0.0.0:*                   LISTEN      2315/redis-server  
tcp        0      0 :::6380                     :::*                        LISTEN      2315/redis-server  
[root@yum-down redis]# netstat -ntlp |grep 6379
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      2293/redis-server 
tcp        0      0 :::6379                     :::*                        LISTEN      2293/redis-server 
[root@yum-down redis]#

在從服務器上,也就是6379上,修改本身爲從,這條命令仍然能夠寫在配置文件中
一般,127.0.0.1:6379> CONFIG GET * config get *能夠在線重置配置

127.0.0.1:6379> slaveof 10.10.0.250 6380
ok
127.0.0.1:6379> info
# Replication
role:slave
master_host:10.10.0.250
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

在主上查看:

10.10.0.250:6380> info
# Replication
role:master
connected_slaves:1
slave0:ip=10.10.0.250,port=6379,state=online,offset=15,lag=1
master_repl_offset:15
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14

在主上插入測試:

10.10.0.250:6380> set key1 linuxea
OK
10.10.0.250:6380> get key1
"linuxea"
10.10.0.250:6380>

在從上查看:

127.0.0.1:6379> get key1
"linuxea"
127.0.0.1:6379>

從redis2.6後開始,從複製就是隻讀的,而且支持主從平滑升級
因爲自己redis單線程,支持一個cpu,在大量數據狀況下,分片多是不錯的方案

redis將rdb傳遞個從實現主從複製,複製有多從,星狀形式
當創建一個從服務器的時候,從服務器會向主服務器發送syn,主接收到syn後再後臺執行bgsave,然後將保存的rdb文件發送至從服務器,從服務器收到後載入到內存,一次同步完成。

關於其餘詳細內容可參考:redisdoc.com
#################################################################################################

Redis cluster簡單集羣配置

redis cluster使用
redis集羣方案
1,客戶端分片。如:取餘等
2, 代理(proxy)分片。由proxy絕對數據存取,如:twemproxy。
3,redis cluster。無中心模式,
4, codis(豌豆莢開發的解決方案)
redis cluster參考文檔:http://redisdoc.com/topic/cluster-tutorial.html
一般狀況下,redis集羣最少須要6臺,三主三從

[root@yum-down opt]# mkdir `seq 7001 7008`
[root@yum-down opt]# ls
7001  7002  7003  7004  7005  7006  7007  7008  redis  rh
[root@yum-down opt]# sed 's/6379/7001/' 6379.conf >> 7001/redis.conf
[root@yum-down opt]# sed 's/6379/7002/' 6379.conf >> 7002/redis.conf
[root@yum-down opt]# sed 's/6379/7003/' 6379.conf >> 7003/redis.conf
[root@yum-down opt]# sed 's/6379/7004/' 6379.conf >> 7004/redis.conf
[root@yum-down opt]# sed 's/6379/7005/' 6379.conf >> 7005/redis.conf
[root@yum-down opt]# sed 's/6379/7006/' 6379.conf >> 7006/redis.conf
[root@yum-down opt]# sed 's/6379/7007/' 6379.conf >> 7007/redis.conf
[root@yum-down opt]# sed 's/6379/7008/' 6379.conf >> 7008/redis.conf
[root@yum-down 7008]# for i in `seq 7001 7008`;do cd /opt/$i && /usr/local/redis/bin/redis-server redis.conf;done
[root@yum-down 7008]# netstat -lntp|grep :700*
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      2701/redis-server * 
tcp        0      0 0.0.0.0:7002                0.0.0.0:*                   LISTEN      2740/redis-server * 
tcp        0      0 0.0.0.0:7003                0.0.0.0:*                   LISTEN      2742/redis-server * 
tcp        0      0 0.0.0.0:7004                0.0.0.0:*                   LISTEN      2746/redis-server * 
tcp        0      0 0.0.0.0:7005                0.0.0.0:*                   LISTEN      2750/redis-server * 
tcp        0      0 0.0.0.0:7006                0.0.0.0:*                   LISTEN      2754/redis-server * 
tcp        0      0 0.0.0.0:7007                0.0.0.0:*                   LISTEN      2760/redis-server * 
tcp        0      0 0.0.0.0:7008                0.0.0.0:*                   LISTEN      2762/redis-server * 
tcp        0      0 :::7001                     :::*                        LISTEN      2701/redis-server * 
tcp        0      0 :::7002                     :::*                        LISTEN      2740/redis-server * 
tcp        0      0 :::7003                     :::*                        LISTEN      2742/redis-server * 
tcp        0      0 :::7004                     :::*                        LISTEN      2746/redis-server * 
tcp        0      0 :::7005                     :::*                        LISTEN      2750/redis-server * 
tcp        0      0 :::7006                     :::*                        LISTEN      2754/redis-server * 
tcp        0      0 :::7007                     :::*                        LISTEN      2760/redis-server * 
tcp        0      0 :::7008                     :::*                        LISTEN      2762/redis-server * 
[root@yum-down 7008]#

安裝ruby工具

[root@yum-down ~]# yum install ruby rubygems
[root@yum-down ~]# gem install redis
Successfully installed redis-3.2.2
1 gem installed
Installing ri documentation for redis-3.2.2...
Installing RDoc documentation for redis-3.2.2...
[root@yum-down ~]#

從源安裝目錄複製一個redis-trib腳本

[root@yum-down src]# cp /usr/local/redis-3.0.7/src/redis-trib.rb /usr/local/bin/redis-trib

集羣建立:主-從,前面是主後面是從

[root@yum-down src]# redis-trib create --replicas 1 10.10.0.250:7001 10.10.0.250:7002 10.10.0.250:7003 10.10.0.250:7004 10.10.0.250:7005 10.10.0.250:7006

建立主:

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.10.0.250:7001
10.10.0.250:7002
10.10.0.250:7003

是否肯定?

Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 10.10.0.250:7001)
M: efff09f4a9fe116bfda3c4d99076b535d8262dde 10.10.0.250:7001 分配0-5460
   slots:0-5460 (5461 slots) master
M: e8bb5fcbccec005aa4c3fc4d1561b54531c586e9 10.10.0.250:7002 5461-10922
   slots:5461-10922 (5462 slots) master
M: f70394b2c10d5beab0c9b91f99be9a714cdd948f 10.10.0.250:7003
   slots:10923-16383 (5461 slots) master
M: 5ca874e2e71914cf85ca85063daa56bcec4efda4 10.10.0.250:7004
   slots: (0 slots) master
   replicates efff09f4a9fe116bfda3c4d99076b535d8262dde
M: f67f8a20942831cd0454a3d54d57fb1fe75d0904 10.10.0.250:7005
   slots: (0 slots) master
   replicates e8bb5fcbccec005aa4c3fc4d1561b54531c586e9
M: 0d8c3ef48a4ae8a493699551ab629775180219c0 10.10.0.250:7006
   slots: (0 slots) master
   replicates f70394b2c10d5beab0c9b91f99be9a714cdd948f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. 總共被分配的個數


查看:
7001的從是7004

[root@yum-down ~]# redis-cli -c -h 10.10.0.250 -p 7001
10.10.0.250:7001> info
# Replication
role:master
connected_slaves:1
slave0:ip=10.10.0.250,port=7004,state=online,offset=743,lag=1
master_repl_offset:743
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:742

10.10.0.250:7001>

當set一個後便會轉到其餘redis(根據算法Redirected)

10.10.0.250:7001> set key1 test
-> Redirected to slot [9189] located at 10.10.0.250:7002
OK
10.10.0.250:7002>

查看狀態:

10.10.0.250:7002> cluster nodes
5ca874e2e71914cf85ca85063daa56bcec4efda4 10.10.0.250:7004 slave efff09f4a9fe116bfda3c4d99076b535d8262dde 0 1456659010020 4 connected
f67f8a20942831cd0454a3d54d57fb1fe75d0904 10.10.0.250:7005 slave e8bb5fcbccec005aa4c3fc4d1561b54531c586e9 0 1456659011029 5 connected
f70394b2c10d5beab0c9b91f99be9a714cdd948f 10.10.0.250:7003 master - 0 1456659011030 3 connected 10923-16383
0d8c3ef48a4ae8a493699551ab629775180219c0 10.10.0.250:7006 slave f70394b2c10d5beab0c9b91f99be9a714cdd948f 0 1456659009515 6 connected
efff09f4a9fe116bfda3c4d99076b535d8262dde 10.10.0.250:7001 master - 0 1456659010526 1 connected 0-5460
e8bb5fcbccec005aa4c3fc4d1561b54531c586e9 10.10.0.250:7002 myself,master - 0 0 2 connected 5461-10922
10.10.0.250:7002> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_sent:3238
cluster_stats_messages_received:3238
10.10.0.250:7002>

添加新節點:10.10.0.250:7007,7004爲從節點,新增節點爲主

[root@yum-down ~]# redis-trib add-node 10.10.0.250:7007 10.10.0.250:7004

查看

10.10.0.250:7002> cluster nodes
5ca874e2e71914cf85ca85063daa56bcec4efda4 10.10.0.250:7004 slave efff09f4a9fe116bfda3c4d99076b535d8262dde 0 1456659211846 4 connected
f67f8a20942831cd0454a3d54d57fb1fe75d0904 10.10.0.250:7005 slave e8bb5fcbccec005aa4c3fc4d1561b54531c586e9 0 1456659210839 5 connected
29610d96ef7c5d001e22c1bea370ba6f39f62068 10.10.0.250:7007 master - 0 1456659210131 0 connected
f70394b2c10d5beab0c9b91f99be9a714cdd948f 10.10.0.250:7003 master - 0 1456659210838 3 connected 10923-16383
0d8c3ef48a4ae8a493699551ab629775180219c0 10.10.0.250:7006 slave f70394b2c10d5beab0c9b91f99be9a714cdd948f 0 1456659211846 6 connected
efff09f4a9fe116bfda3c4d99076b535d8262dde 10.10.0.250:7001 master - 0 1456659210333 1 connected 0-5460
e8bb5fcbccec005aa4c3fc4d1561b54531c586e9 10.10.0.250:7002 myself,master - 0 0 2 connected 5461-10922

添加完成7007後,從新分片

[root@yum-down ~]# redis-trib reshard 10.10.0.250:7007
How many slots do you want to move (from 1 to 16384)? 1000  分配大小槽位
What is the receiving node ID? 29610d96ef7c5d001e22c1bea370ba6f39f62068 7007ID號
Source node #1:all all便可
Do you want to proceed with the proposed reshard plan (yes/no)? yes

在添加7008做爲7007的從節點:
首先添加7008

[root@yum-down ~]# redis-trib add-node 10.10.0.250:7008 10.10.0.250:7004

然後鏈接在7008中添加7007的cluster replicate id便可

[root@yum-down ~]# redis-cli -c -h 10.10.0.250 -p 7008
10.10.0.250:7008> cluster replicate 29610d96ef7c5d001e22c1bea370ba6f39f62068 
OK
10.10.0.250:7008>

在查看:

0.10.0.250:7008> cluster nodes
29610d96ef7c5d001e22c1bea370ba6f39f62068 10.10.0.250:7007 master - 0 1456659930448 7 connected 0-665 5461-6128 10923-11588
613063078b7b128c269996369fc2838736520a2c 10.10.0.250:7008 myself,slave 29610d96ef7c5d001e22c1bea370ba6f39f62068 0 0 0 connected
10.10.0.250:7008>

在線添加從的時候,須要master bgsava
參考文檔:http://redisdoc.com/topic/cluster-tutorial.html

##########################################################################################

Redis管理工具

phpRedisAdmin
phpredisadmin和phpmyadmin相似,主要用於web友好的界面對數據的操做,儘管本篇內容老生常談,可是仍是花點時間進行編輯
phpredisadmin的git地址:https://github.com/ErikDubbelboer/phpRedisAdmin

[root@yum-down ~]# yum install httpd php php-redis git php-mbstring
[root@yum-down ~]# cd /var/www/html/
[root@yum-down html]# git clone https://github.com/erikdubbelboer/phpRedisAdmin.git
Initialized empty Git repository in /var/www/html/phpRedisAdmin/.git/
remote: Counting objects: 567, done.
remote: Total 567 (delta 0), reused 0 (delta 0), pack-reused 567
Receiving objects: 100% (567/567), 166.60 KiB | 121 KiB/s, done.
Resolving deltas: 100% (337/337), done.
[root@yum-down html]# cd phpRedisAdmin/
[root@yum-down phpRedisAdmin]# git clone https://github.com/nrk/predis.git vendor
Initialized empty Git repository in /var/www/html/phpRedisAdmin/vendor/.git/
remote: Counting objects: 19472, done.
remote: Total 19472 (delta 0), reused 0 (delta 0), pack-reused 19472
Receiving objects: 100% (19472/19472), 4.99 MiB | 139 KiB/s, done.
Resolving deltas: 100% (11920/11920), done.
[root@yum-down phpRedisAdmin]# cd includes
[root@yum-down includes]# cp config.sample.inc.php config.inc.php

修改配置文件便可(爲部份內容)

[root@yum-down includes]# vim config.inc.php 
    array(
      'name'   => '7001', // Optional name.
      'host'   => '10.10.0.250',
      'port'   => 7001,
      'filter' => '*',

      // Optional Redis authentication.
      //'auth' => 'redispasswordhere' // Warning: The password is sent in plain-text to the Redis server.
    ),

    array(
      'name' => '7002',
      'host' => '10.10.0.250',
      'port' => 7001,
    ),


rdbtools分析內存工具

[root@yum-down ~]# pip install rdbtools
[root@yum-down ~]# https://github.com/sripathikrishnan/redis-rdb-tools
[root@yum-down ~]# cd /opt/7001/
[root@yum-down 7001]# rdb -c memory dump_7001.rdb > memory.csv

然後將csv文件打開查看,內容以下:
databases,key,大小,格式,長度,以下所示:

SALT.MODULES.SALTUTIL模塊介紹以下:https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.saltutil.html
幾種工具用處不一樣,再也不多說

##############################################################################################

RedisRedis之codis3.0.1集羣簡單實現

豌豆莢,快速分佈式緩存git地址:https://github.com/CodisLabs/codis
全部內容借鑑gitlab-豌豆莢
Codis 由四部分組成:
Codis Proxy (codis-proxy) 代理服務器作請求轉發,codis-proxy 自己實現了 Redis 協議,codis-proxy 自己是無狀態的.能夠執行多個
Codis Dashboard (codis-config) codis工具,包括添加刪除節點,而且自帶一個dashboard,點一點便可
Codis Redis (codis-server) 基於2.8.13開發的分支,只能使用codis-server
ZooKeeper/Etcd Codis 依賴 ZooKeeper 來存放數據路由表和 codis-proxy 節點的元信息, codis-config 發起的命令都會經過 ZooKeeper 同步到各個存活的 codis-proxy.

Codis 支持按照 Namespace 區分不一樣的產品, 擁有不一樣的 product name 的產品, 各項配置都不會衝突

1,codis由go語言寫的,因此須要安裝go語言包

[root@yum-down local]# wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz
[root@yum-down local]# tar -zxvf go1.6.linux-amd64.tar.gz
[root@yum-down local]# cd /usr/local/go/src/
[root@yum-down src]# go version
go version go1.6 linux/amd64
[root@yum-down src]# mkdir /gopath/src/golang.org/x
[root@yum-down src]# go get github.com/tools/godep
[root@yum-down src]# vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export PATH=$PATH:/gopath/bin
[root@yum-down local]# source /etc/profile

也能夠yum安裝:

[root@yum-down local]# yum -y install gcc gcc-c++ make git wget go 
[root@yum-down codis]# cat /etc/profile.d/go.sh 
export GOPATH=/gopath
export PATH=$GOPATH/bin:$JAVA_HOME/bin:$PATH

2,安裝java

[root@yum-down local]# wget http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm
[root@yum-down local]# rpm -ivh jdk-8u73-linux-x64.rpm 
Preparing...                ########################################### [100%]
   1:jdk1.8.0_73            ########################################### [100%]
Unpacking JAR files...
    tools.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...
    rt.jar...
    jsse.jar...
    charsets.jar...
    localedata.jar...
    jfxrt.jar...
[root@yum-down opt]# cat /etc/profile.d/java 
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin/:$PATH
export PATH=$PATH:/gopath/bin
[root@yum-down opt]# . /etc/profile.d/java 
[root@yum-down local]# java -version
java version "1.8.0_73"
Java(TM) SE Runtime Environment (build 1.8.0_73-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)
[root@yum-down local]#

3,zookeeper下載地址

[root@yum-down local]# wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
[root@yum-down local]# tar xf zookeeper-3.4.6.tar.gz 
[root@yum-down local]# ln -s  zookeeper-3.4.6 zookeeper
[root@yum-down zookeeper]# mkdir /opt/{zk1,zk2,zk3}

複製配置文件:

[root@yum-down local]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /opt/zoo.cfg

編輯配置文件,修改datadir.而且添加server(因爲是一臺機器,端口則不能相同),以下:

dataDir=/opt/zk1
clientPort=2181
server.1=10.10.0.250:2887:3887
server.2=10.10.0.250:2888:3888
server.3=10.10.0.250:2889:3889

將配置文件複製到每一個目錄下:

[root@yum-down local]# cp /opt/zoo.cfg /opt/zk1/zk1.cfg
[root@yum-down local]# cp /opt/zoo.cfg /opt/zk2/zk2.cfg
[root@yum-down local]# cp /opt/zoo.cfg /opt/zk3/zk3.cfg

修改完後以下:

[root@yum-down local]# grep '^[a-z]' /opt/zk1/zk1.cfg 
tickTime=2000     心跳時間
initLimit=10      心跳探測間隔數
syncLimit=5     
dataDir=/opt/zk1
clientPort=2181
server.1=10.10.0.250:2887:3887  集羣1
server.2=10.10.0.250:2888:3888  集羣2
server.3=10.10.0.250:2889:3889  集羣3

修改後以下:

[root@yum-down local]# grep '^[a-z]' /opt/zk2/zk2.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zk2
clientPort=2182
server.1=10.10.0.250:2887:3887
server.2=10.10.0.250:2888:3888
server.3=10.10.0.250:2889:3889
[root@yum-down local]# grep '^[a-z]' /opt/zk3/zk3.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zk3
clientPort=2183
server.1=10.10.0.250:2887:3887
server.2=10.10.0.250:2888:3888
server.3=10.10.0.250:2889:3889
[root@yum-down local]#

4,在一臺機器上跑的話,在三個目錄,而且建立id

[root@yum-down local]# cd /opt/
[root@yum-down opt]# echo "1" > zk1/myid
[root@yum-down opt]# echo "2" > zk2/myid
[root@yum-down opt]# echo "3" > zk3/myid

************zookeeper環境變量*********

[root@yum-down opt]# echo -e "export ZOOKEEPER=/usr/local/zookeeper \nexport  PATH=\$ZOOKEEPER/bin:\$PATH" >> /etc/profile && source /etc/profile

*****************************
啓動三個zookeeper

[root@yum-down local]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk1/zk1.cfg 
ZooKeeper JMX enabled by default
Using config: /opt/zk1/zk1.cfg
Starting zookeeper ... STARTED
[root@yum-down local]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk2/zk2.cfg 
ZooKeeper JMX enabled by default
Using config: /opt/zk2/zk2.cfg
Starting zookeeper ... STARTED
[root@yum-down local]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk3/zk3.cfg 
ZooKeeper JMX enabled by default
Using config: /opt/zk3/zk3.cfg
Starting zookeeper ... STARTED
[root@yum-down local]#

查看是否已經自動選舉:

[root@yum-down opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk3/zk3.cfg 
JMX enabled by default
Using config: /opt/zk3/zk3.cfg
Mode: follower  跟隨者
[root@yum-down opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk2/zk2.cfg 
JMX enabled by default
Using config: /opt/zk2/zk2.cfg
Mode: leader  領導
[root@yum-down opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk1/zk1.cfg 
JMX enabled by default
Using config: /opt/zk1/zk1.cfg
Mode: follower  跟隨者
[root@yum-down opt]#

鏈接測試:

[root@yum-down opt]# /usr/local/zookeeper/bin/zkCli.sh -server 10.10.0.250:2181
[zk: 10.10.0.250:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 10.10.0.250:2181(CONNECTED) 1] ls /zookeeper
[quota]
[zk: 10.10.0.250:2181(CONNECTED) 2]

下載codis

[root@yum-down ~]# go get -u -d github.com/CodisLabs/codis
package github.com/CodisLabs/codis: no buildable Go source files in /opt/gopath/src/github.com/CodisLabs/codis
[root@yum-down local]# cd /gopath/src/github.com/CodisLabs/codis/
[root@yum-down codis]# make
[root@yum-down codis]# make gotest
codis-config、codis-proxy、codis-server三個可執行文件已經生成
[root@yum-down bin]# ls
assets  codis-config  codis-proxy  codis-server

執行bin/codis-config dashboard,將會看到一個頁面

[root@yum-down codis]# bin/codis-config dashboard
2016/03/04 07:22:03 dashboard.go:160: [INFO] dashboard listening on addr: :18087
2016/03/04 07:22:03 dashboard.go:143: [INFO] dashboard node created: /zk/codis/db_test/dashboard, {"addr": "10.10.0.250:18087", "pid": 33434}
2016/03/04 07:22:03 dashboard.go:144: [WARN] ********** Attention **********
2016/03/04 07:22:03 dashboard.go:145: [WARN] You should use `kill {pid}` rather than `kill -9 {pid}` to stop me,
2016/03/04 07:22:03 dashboard.go:146: [WARN] or the node resisted on zk will not be cleaned when I'm quiting and you must remove it manually
2016/03/04 07:22:03 dashboard.go:147: [WARN] *******************************
2016/03/04 07:23:07 dashboard_apis.go:88: [ERROR] get server groups failed
[error]: zk: node does not exist
    1   /gopath/src/github.com/CodisLabs/codis/pkg/models/server_group.go:110
            github.com/CodisLabs/codis/pkg/models.ServerGroups
    0   /gopath/src/github.com/CodisLabs/codis/cmd/cconfig/dashboard_apis.go:86
            main.apiGetServerGroupList
        ... ...
[stack]: 
    0   /gopath/src/github.com/CodisLabs/codis/cmd/cconfig/dashboard_apis.go:88
            main.apiGetServerGroupList
        ... ...

啓動兩個redis(確保redis已經安裝)
建立兩個redis

[root@yum-down opt]# mkdir date1
[root@yum-down opt]# mkdir date2
[root@yum-down opt]# cp /etc/redis/6379.conf ./
[root@yum-down opt]# vim 6379.conf

將端口,pid修改,如:8001

[root@yum-down opt]# grep "8001" 6379.conf 
pidfile /var/run/redis_8001.pid
# Accept connections on the specified port, default is 8001.
port 8001
dir /opt/date1
# cluster-config-file nodes-8001.conf
[root@yum-down opt]# cp 6379.conf date1/8001.conf

8002

[root@yum-down opt]# grep "8002" 6379.conf 
pidfile /var/run/redis_8002.pid
# Accept connections on the specified port, default is 8002.
port 8002
dir /opt/date2
# cluster-config-file nodes-8002.conf
[root@yum-down opt]#

啓動

[root@yum-down opt]# /usr/local/redis/bin/redis-server /opt/date1/8001.conf 
[root@yum-down opt]# /usr/local/redis/bin/redis-server /opt/date2/8002.conf 
[root@yum-down opt]# ps aux|grep redis
root      36449  0.1  0.7 137448  7484 ?        Ssl  07:38   0:00 /usr/local/redis/bin/redis-server *:6379              
root      36485  0.0  0.7 137448  7436 ?        Ssl  07:48   0:00 /usr/local/redis/bin/redis-server *:8001              
root      36491  0.1  0.7 137448  7436 ?        Ssl  07:48   0:00 /usr/local/redis/bin/redis-server *:8002

啓動後手動添加便可

鏈接後查看

[root@yum-down opt]# /usr/local/redis/bin/redis-cli -h 10.10.0.250 -p 8002
role:slave
master_host:10.10.0.250
master_port:8001
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:85
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

手動提交提高主後,將會被孤立,主從將消失offline:

10.10.0.250:8002> 
# Replication
role:master
connected_slaves:0
master_repl_offset:239
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

和以前的版本不一樣的是codis3.0.1的腳本放在CodisLabs/codis/bin下:

[root@yum-down bin]# ls
assets  codis-config  codis-proxy  codis-server
[root@yum-down bin]# ll
total 37520
drwxr-xr-x 4 root root     4096 Mar  4 06:30 assets
-rwxr-xr-x 1 root root 16141960 Mar  4 06:30 codis-config
-rwxr-xr-x 1 root root 15961984 Mar  4 06:29 codis-proxy
-rwxr-xr-x 1 root root  6311107 Mar  4 06:30 codis-server
[root@yum-down bin]# pwd
/gopath/src/github.com/CodisLabs/codis/bin

配置文件仍然是config.ini

coordinator=zookeeper
zk=10.10.0.250:2181
product=test
dashboard_addr=10.10.0.250:18087

而且他還能夠添加服務的slot範圍
數據遷移:
用gitlab做者的原話是:數據遷移的最小單位是 key, 咱們在 codis redis 中添加了一些指令, 實現基於key的遷移, 如 SLOTSMGRT等 (命令列表), 每次會將特定 slot 一個隨機的 key 發送給另一個 codis redis 實例, 這個命令會確認對方已經接收, 同時刪除本地的這個 k-v 鍵值, 返回這個 slot 的剩餘 key 的數量, 整個操做是原子的.
支持動態的根據實例內存, 自動對slot進行遷移, 以均衡數據分佈.

他有不少命令不支持:https://github.com/CodisLabs/codis/blob/3.0.1/doc/unsupported_cmds.md
至於codis-proxy設計到zookeeper,若是對zookeeper不熟悉的話,有不少問題是沒法解決的

初始化 slots

[root@yum-down codis]# bin/codis-config slot init
{
  "msg": "OK",
  "ret": 0
}
[root@yum-down codis]#

設置 server group 服務的 slot 範圍
添加group2

[root@yum-down codis]# bin/codis-config server add 2 10.10.0.250:6379 master
{
  "msg": "OK",
  "ret": 0
}
[root@yum-down codis]# bin/codis-config server add 2 10.10.0.250:8001 slave
{
  "msg": "OK",
  "ret": 0
}
添加group3
[root@yum-down codis]# bin/codis-config server add 3 10.10.0.250:8001 master
{
  "msg": "OK",
  "ret": 0
}
[root@yum-down codis]# bin/codis-config server add 3 10.10.0.250:8002 slave
{
  "msg": "OK",
  "ret": 0
}

設置server group服務器的slot範圍

[root@yum-down codis]# bin/codis-config slot range-set 0 511 1 online
{
  "msg": "OK",
  "ret": 0
}
[root@yum-down codis]# bin/codis-config slot range-set 512 1023 2 online
{
  "msg": "OK",
  "ret": 0
}


啓動codis-proxy

[root@yum-down codis]# bin/codis-proxy -c config.ini -L ./log/proxy.log  --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000
  _____  ____    ____/ /  (_)  _____
 / ___/ / __ \  / __  /  / /  / ___/
/ /__  / /_/ / / /_/ /  / /  (__  )
\___/  \____/  \__,_/  /_/  /____/

[root@yum-down codis]#

數據遷移:

[root@yum-down codis]# bin/codis-config slot migrate 0 511 2 --delay=10
{
  "msg": "OK",
  "ret": 0
}
[root@yum-down codis]#

codis到此爲止,瞭解便可!

############################################################################################

Redis3.2.5配置文件解釋

Redis配置文件示例。

I. 配置文件啓動redis

#注意,爲了讀取配置文件,Redis必須是
以文件路徑做爲第一個參數開始:./redis-server /path/to/redis.conf

II. redis支持的參數

單位:當須要內存大小時,能夠指定
以一般形式的1k 5GB 4M等等:
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 10241024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024
1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.

III. include

#注意選項「include」不會被命令「CONFIG REWRITE」重寫,
#from admin或Redis Sentinel。 由於Redis老是使用最後處理的
#line做爲配置指令的值,你最好把包括
#在此文件的開頭,以免覆蓋配置更改在運行時。
#若是相反,您有興趣使用包括覆蓋配置
#include /path/to/local.conf
#include /path/to/other.conf

network
#默認狀況下,若是沒有指定「bind」配置指令,Redis會監聽
#用於來自服務器上可用的全部網絡接口的鏈接。
#能夠只使用一個或多個選定的接口
#「bind」配置指令,後跟一個或多個IP地址。
##
# 例子:
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1

#~~~警告~~~若是運行Redis的計算機直接暴露在
#internet,綁定到全部的接口是危險的,將暴露在互聯網,單機咱們一般使用127.0.0.1,集羣可能須要指定可以通信的ip地址

IV. bind 10.10.242.23

V. protected-mode yes

當等於yes,就開啓了保護模式,當開啓後,若是使用的是127.0.0.1且未配置密碼是沒法登錄到reids,默認是啓動狀態,若是你確認要和誰通信的狀態下才關閉它,在沒有配置密碼,也沒有特定接口的狀況下,使用bind明確指定,如:bind 10.10.242.23

VI. port 6379

#接受指定端口上的鏈接,默認值爲6379(IANA#815344)。
#若是指定端口0,Redis將不會偵聽TCP套接字。

VII. tcp-backlog 511

最大連接緩衝池的大小,這裏應該是指的未完成連接請求的數量。
#(測試值爲1時,仍能夠有多個連接)
# 但該值與listen函數中的backlog意義應該是相同的,源碼中該值就是被用在了listen函數中
# 該值同時受/proc/sys/net/core/somaxconn 和 tcp_max_syn_backlog(/etc/sysctl.conf中配置)的限制
# tcp_max_syn_backlog 指的是未完成連接的數量
咱們能夠以下修改:

if [ "$(id -u)" = '0' ] && [[ $(sysctl -w net.core.somaxconn=8192) ]]; then
    sysctl -w vm.overcommit_memory=1
    echo never|tee /sys/kernel/mm/transparent_hugepage/{defrag,enabled}
fi

若是是容器:

$ docker run -d --name redis --privileged --network host -e SENTINEL=enable benyoo/redis:3.2.5-sentinel

VIII. Unix socket

指定將用於偵聽的Unix套接字的路徑,傳入鏈接。 沒有默認值,因此Redis不會監聽未指定時在unix套接字上,設置unix套接字
#unixsocket /tmp/redis.sock
#unixsocketperm 700

# 超時斷鏈機制,若是一個連接在N秒內沒有任何操做,則斷開該連接,N爲0時,該機制失效

IX. timeout 0

X. tcp-keepalive 300

若是是非零值,當失去連接時,會使用SO_KEEPALIVE發送TCP ACKs到客戶端。這個參數有兩個做用:1.檢測斷點;2.從網絡中間設備來看,就是保持連接。在Linux上,設定的時間就是發送ACKs的週期。注意:達到雙倍的設定時間纔會關閉連接。在其餘內核上,週期依賴於內核設置。就像心跳檢測同樣,檢查連接是否保持正常,同時也能夠保持正常連接的通訊,此項在3.2.1版本開始,默認值爲300秒,在以前默認是爲60秒

XI. daemonize no

#默認狀況下,Redis不做爲守護程序運行。 若是須要,使用「yes」。
#注意,當daemonize時,Redis會在/var/run/redis.pid中寫一個pid文件。

supervised no
#若是從upstart或systemd運行Redis,Redis能夠與您交互
選項:
#supervised no - 沒有監督互動
#supervised upstart - 經過將Redis置於SIGSTOP模式來啓動信號
#supervised systemd - signal systemd將READY = 1寫入$ NOTIFY_SOCKET
#supervised auto - 檢測upstart或systemd方法基於
#UPSTART_JOB或NOTIFY_SOCKET環境變量
#注意:這些監督方法只發出「進程就緒」的信號。

XII. pidfile /var/run/redis_6379.pid

#若是指定了pid文件,Redis會在啓動時指定的位置寫入
#並在退出時將其刪除。
#當服務器運行非守護進程時,若是沒有pid文件,則不建立pid文件
#在配置中指定。 當服務器進行守護進程時,pid文件
#即便未指定也會使用,默認爲「/var/run/redis.pid」。
#建立pid文件是最大的努力:若是Redis沒法建立它
#沒有什麼很差發生,服務器將啓動並正常運行。

XIII. loglevel notice

#指定服務器log詳細程度級別。
#這能夠是如下之一:
#debug(不少信息,對開發/測試有用)
#verbose(不多有用的信息,但不像調試級別的混亂)
#notice(適度冗長,你想在生產中可能)
#warning(僅記錄很是重要/關鍵的消息)

XIV. logfile /var/log/redis.log

#指定日誌文件名。 也可使用空字符串強制
#Redis登陸標準輸出。 注意,若是你使用標準
#輸出用於日誌,可是守護進程,日誌將發送到/ dev / null

XV. #syslog-enabled no

#要啓用日誌記錄到系統記錄器,只需將'syslog-enabled'設置爲yes,
#並可選擇更新其餘syslog參數以知足您的須要。

#指定syslog標識。
#syslog-ident redis

#指定syslog設施。 必須是USER或LOCAL0-LOCAL7之間。
#syslog-facility local0

XVI. databases 16

設置數據庫的數目。默認的數據庫是DB 0 ,能夠在每一個鏈接上使用select 命令選擇一個不一樣的數據庫,dbid是一個介於0到databases - 1 之間的數值

XVII. SNAPSHOTTING

#將磁盤上的數據塊保存:
#save
#將保存DB若是給定的秒數和給定的
#發生對數據庫的寫操做數。
#在下面的示例中:
#900秒(15分鐘)內若是至少1個鍵更改將保存
#300秒(5分鐘)內至少10個鍵更改將保存
#after 60 seconds if至少10000 keys changed
#注意:您能夠經過註釋掉全部「保存」行來徹底禁用保存。
#也能夠刪除全部之前配置的保存
#points經過添加一個具備單個空字符串參數的save指令
#像下面的例子:
# 保存 」」
save 900 1
save 300 10
save 60 10000

XVIII. stop-writes-on-bgsave-error yes

默認狀況下,若是 redis 最後一次的後臺保存失敗,redis 將中止接受寫操做,這樣以一種強硬的方式讓用戶知道數據不能正確的持久化到磁盤, 不然就會沒人注意到災難的發生。 若是後臺保存進程從新啓動工做了,redis 也將自動的容許寫操做。然而你要是安裝了靠譜的監控,你可能不但願 redis 這樣作,那你就改爲 no 好了。

XIX. rdbcompression yes

是否在dump .rdb數據庫的時候壓縮字符串,默認設置爲yes。若是你想節約一些cpu資源的話,能夠把它設置爲no,這樣的話數據集就可能會比較大。

XX. rdbchecksum yes

是否CRC64校驗rdb文件,會有必定的性能損失(大概10%)。

XXI. dbfilename dump.rdb

轉儲DB的文件名

XXII. dir ./

數據庫存放目錄。必須是一個目錄,aof文件也會保存到該目錄下。

XXIII. REPLICATION

XXIV. slave-serve-stale-data yes

當一個slave與master失去聯繫時,或者複製正在進行的時候,slave應對請求的行爲:1) 若是爲 yes(默認值) ,slave 仍然會應答客戶端請求,但返回的數據多是過期,或者數據多是空的在第一次同步的時候;2) 若是爲 no ,在你執行除了 info 和 salveof 以外的其餘命令時,slave 都將返回一個 "SYNC with master in progress" 的錯誤。

XXV. slave-read-only yes

設置slave是否爲只讀,從2.6版本期slave默認就是隻讀

====================>


XXVI. repl-diskless-sync no

主從數據複製是否使用無硬盤複製功能。
sync策略,硬盤或套接字,一個RDB文件從主機發送到從機。要麼使用備份,要麼使用無盤:redis主機建立一個新的進程,直接寫入到rdb文件到從插座,而不觸及硬盤。使用磁盤備份複製,同時會生成多個rdb文件,有更多的從科員在當前子節點生成後當即排隊並和rdb文件一塊兒提供rdb文件。而使用無盤複製一次傳輸,到新的傳輸,會在當前中止時啓動
當使用無盤複製時,主服務器等待可配置的量時間(以秒爲單位)開始傳輸以前但願多個從機,將到達而且傳輸能夠並行化。
使用慢磁盤和快速(大帶寬)網絡,無盤複製工做更好。

XXVII. repl-diskless-sync-delay 5

#啓用無磁盤複製時,能夠配置延遲,服務器等待以便生成經過套接字傳輸RDB的子進程
到slave。
這很重要,由於一旦傳輸開始,它是不可能服務新slave到達,這將被排隊等待下一次RDB傳輸,因此服務器等待延遲,以便讓更多的slave到達。
延遲時間以秒爲單位,默認值爲5秒。 禁用徹底只是設置爲0秒,傳輸將盡快啓動。

#從設備以預約義的時間間隔向服務器發送PING。這是可能改變此間隔與repl_ping_slave_period選項。默認值爲10秒。

XXVIII. repl-ping-slave-period 10

#如下選項設置如下項的複製超時:
1)SYNC期間的批量傳輸I / O,從從機的角度。
2)主站從從站(數據,ping)的角度看超時。
3)從主機(REPLCONF ACK ping)的角度看,從機超時。
確保此值大於該值很重要.指定爲repl-ping-slave-period,不然將檢測到超時,每次在主機和從機之間有低流量。

XXIX. repl-timeout 60


主從同步支持兩種策略,即disk和socket方式(socket方式尚不完善,還處於實驗階段)。
新的slave端和重連的salve端不容許去繼續同步進程,這被稱之爲「徹底同步」。
一個RDB文件從master端傳到slave端,分爲兩種狀況:
一、支持disk:master端將RDB file寫到disk,稍後再傳送到slave端;
二、無磁盤diskless:master端直接將RDB file傳到slave socket,不須要與disk進行交互。
無磁盤diskless方式適合磁盤讀寫速度慢但網絡帶寬很是高的環境。

默認不使用diskless同步方式 .
無磁盤diskless方式在進行數據傳遞以前會有一個時間的延遲,以便slave端可以進行到待傳送的目標隊列中,這個時間默認是5秒.
slave端向server端發送pings的時間區間設置,默認爲10秒。
設置超時時間。
====================>

XXX. repl-disable-tcp-nodelay no

指定向slave同步數據時,是否禁用socket的NO_DELAY選 項。若配置爲「yes」,則禁用NO_DELAY,則TCP協議棧會合並小包統一發送,這樣能夠減小主從節點間的包數量並節省帶寬,但會增長數據同步到 slave的時間。若配置爲「no」,代表啓用NO_DELAY,則TCP協議棧不會延遲小包的發送時機,這樣數據同步的延時會減小,但須要更大的帶寬。 一般狀況下,應該配置爲no以下降同步延時,但在主從節點間網絡負載已經很高的狀況下,能夠配置爲yes。
#設置複製積壓大小。積壓是一個積累的緩衝區從數據,當從機斷開一段時間時,使得當從機時想要從新鏈接,一般不須要徹底從新同步,可是部分resync就足夠了,只是傳遞從器件錯過的數據部分disconnect。
複製待辦事項越大,從屬節點的時間就越長斷開鏈接,之後可以執行部分從新同步。僅在至少有一個從站鏈接時才分配積壓。

repl-backlog-size 1mb

XXXI. repl-backlog-ttl 3600

設置backlog的大小,backlog是一個緩衝區,在slave端失連時存放要同步到slave的數據,所以當一個slave要重連時,常常是不須要徹底同步的,執行局部同步就足夠了。backlog設置的越大,slave能夠失連的時間就越長。
若是一段時間後沒有slave鏈接到master,則backlog size的內存將會被釋放。若是值爲0則表示永遠不釋放這部分內存。

XXXII. slave-priority 100

當 master 不能正常工做的時候,Redis Sentinel 會從 slaves 中選出一個新的 master,這個值越小,就越會被優先選中,可是若是是 0 , 那是意味着這個 slave 不可能被選中。 默認優先級爲 100

#若是主數據小於,則能夠中止接受寫入N從站鏈接,具備小於或等於M秒的滯後。
N個從站須要處於「在線」狀態。以秒爲單位的滯後,必須小於指定值,由計算從從設備接收的最後一個ping,一般每秒發送一次。
此選項不保證N個副本將接受寫入,可是將限制在沒有足夠的從設備的狀況下丟失寫入的曝光窗口可用,到指定的秒數。
例如,要求至少3個滯後<= 10秒的從站使用:
min-slaves-to-write 3
min-slaves-max-lag 10

#將一個或另外一個設置爲0將禁用該功能。默認狀況下,min-slaves-to-write設置爲0(禁用功能)和min-slaves-max-lag設置爲10。Redis主機可以列出所鏈接的地址和端口slave以不一樣的方式。例如「INFO複製」部分,提供此信息,除其餘工具以外,使用Redis Sentinel爲了發現從實例。
此信息可用的另外一個地方是「ROLE」命令的一個masterser。獲取從站一般報告的列出的IP和地址,以如下方式:
IP:經過檢查對等體地址自動檢測地址從設備使用的套接字#與主設備鏈接。
Port:端口在複製期間由從設備通訊,handshake,一般是從機使用的端口列出鏈接。可是當端口轉發或網絡地址轉換(NAT)時使用,從屬實際上能夠經過不一樣的IP和端口到達。從站可使用如下兩個選項
#報告給它的主機一個特定的IP和端口集,使INFO和ROLE將報告這些值。
#沒有必要使用這兩個選項,若是你須要覆蓋只是端口或IP地址。
slave-announce-ip 5.5.5.5
slave-announce-port 1234

################################## SECURITY
#要求客戶端在處理任何其餘文件以前發出AUTH 命令。這在您不信任的環境中可能頗有用,其餘用戶能夠訪問運行redis-server的主機。。這應該保持註釋掉向後兼容性,由於大多數我的不須要身份驗證(例如他們運行本身的服務器)。
#警告:由於Redis是至關快的外部用戶能夠嘗試
#150k密碼每秒對一個好的盒子。這意味着你應該
#使用很是強的密碼不然會很容易破解。
#requirepass foobared

#命令重命名。能夠更改共享中的危險命令的名稱, 環境。例如,CONFIG命令能夠重命名爲某物,難以猜想,因此它仍然可用於內部使用工具,但不適用於通常客戶。示例:
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
也能夠經過將命令重命名爲徹底殺死命令
一個空字符串:
rename-command CONFIG「」
請注意,更改已登陸到的命令的名稱
AOF文件或傳輸到從站可能會致使問題。
################################### LIMITS
#同時設置鏈接的客戶端的最大數量。默認
#此限制設置爲10000個客戶端,但若是Redis服務器不是可以配置進程文件限制以容許指定的限制,容許的最大客戶端數被設置爲當前文件限制,minus 32(由於Redis爲內部使用保留了幾個文件描述符)。
#一旦達到限制,Redis將關閉全部新鏈接發送an error'max number of clients reached'。

XXXIII. maxclients 10000

#LRU和最小TTL算法不是精確的算法,而是近似的算法(爲了節省內存),因此你能夠調整它的速度或準確性。對於默認Redis將檢查五個鍵,並選擇一個最近使用較少,您可使用如下更改樣本大小configuration指令。
#默認值爲5產生足夠好的結果。 10很是接近true LRU可是成本多一點CPU。 3是很是快,但不是很準確。
maxmemory-samples 5
默認值5,上面LRU和最小TTL策略並不是嚴謹的策略,而是大約估算的方式,所以能夠選擇取樣值以便檢查。

maxclients 10000
maxmemory
maxmemory-policy volatile-lru
限制同時鏈接的客戶數量。當鏈接數超過這個值時,redis 將再也不接收其餘鏈接請求,客戶端嘗試鏈接時將收到error 信息。默認爲10000,要考慮系統文件描述符限制,不宜過大,浪費文件描述符,具體多少根據具體狀況而定。

redis-cache所能使用的最大內存(bytes),默認爲0,表示」無限制」,最終由OS物理內存大小決定(若是物理內存不足,有可能會使用swap)。此值儘可能不要超過機器的物理內存尺寸,從性能和實施的角度考慮,能夠爲物理內存3/4。此配置須要和」maxmemory-policy」配合使用,當redis中內存數據達到maxmemory時,觸發」清除策略」。在」內存不足」時,任何write操做(好比set,lpush等)都會觸發」清除策略」的執行。在實際環境中,建議redis的全部物理機器的硬件配置保持一致(內存一致),同時確保master/slave中」maxmemory」」policy」配置一致。
當內存滿了的時候,若是還接收到set 命令,redis 將先嚐試剔除設置過expire 信息的key,而無論該key 的過時時間尚未到達。在刪除時,
將按照過時時間進行刪除,最先將要被過時的key 將最早被刪除。若是帶有expire 信息的key 都刪光了,內存還不夠用,那麼將返回錯誤。這樣,redis 將再也不接收寫請求,只接收get 請求。maxmemory 的設置比較適合於把redis 看成於相似memcached的緩存來使用。

最大內存策略,你有 5 個選擇:

volatile-lru -> 使用 LRU 算法移除包含過時設置的 key 。
noeviction -> 不讓任何 key 過時,只是給寫入操做返回一個錯誤。
allkeys-lru -> 根據 LRU 算法移除全部的 key 。
volatile-random -> 對」過時集合」中的數據採起」隨即選取」算法,並移除選中的K-V,直到」內存足夠」爲止. 若是若是」過時集合」中所有移除所有移除仍不能知足,將OOM
allkeys-random -> 對全部的數據,採起」隨機選取」算法,並移除選中的K-V,直到」內存足夠」爲止
volatile-ttl ->對」過時集合」中的數據採起TTL算法(最小存活時間),移除即將過時的數據.
############################## APPEND ONLY MODE

XXXIV. appendonly yes

默認狀況下,redis 會在後臺異步的把數據庫鏡像備份到磁盤,可是該備份是很是耗時的,並且備份也不能很頻繁。因此redis 提供了另一種更加高效的數據庫備份及災難恢復方式。開啓append only 模式以後,redis 會把所接收到的每一次寫操做請求都追加到appendonly.aof 文件中,當redis 從新啓動時,會從該文件恢復出以前的狀態。可是這樣會形成appendonly.aof 文件過大,因此redis 還支持了BGREWRITEAOF 指令,對appendonly.aof 進行從新整理。若是不常常進行數據遷移操做,推薦生產環境下的作法爲關閉鏡像,開啓appendonly.aof,同時能夠選擇在訪問較少的時間天天對appendonly.aof 進行重寫一次。
另外,對master機器,主要負責寫,建議使用AOF,對於slave,主要負責讀,挑選出1-2臺開啓AOF,其他的建議關閉。

是否啓用aof持久化方式 。便是否在每次更新操做後進行日誌記錄,默認配置是no,即在採用異步方式把數據寫入到磁盤,若是不開啓,可能會在斷電時致使部分數據丟失。

XXXV. appendfilename "appendonly.aof"

更新日誌文件名,默認值爲appendonly.aof 。

XXXVI. appendfsync everysec

aof文件刷新的頻率。有三種:
1)no 依靠OS進行刷新,redis不主動刷新AOF,這樣最快,但安全性就差。

  1. always 每提交一個修改命令都調用fsync刷新到AOF文件,很是很是慢,但也很是安全。
  2. everysec 每秒鐘都調用fsync刷新到AOF文件,很快,但可能會丟失一秒之內的數據。

設置對appendonly.aof 文件進行同步的頻率。always 表示每次有寫操做都進行同步,everysec 表示對寫操做進行累積,每秒同步一次。no不主動fsync,由OS本身來完成。這個須要根據實際業務場景進行配置。

XXXVII. appendfsync no

當AOF fsync策略設置爲always或everysec和背景時
#保存過程(後臺保存或AOF日誌背景重寫)是在一些Linux配置中對磁盤執行大量I / O
Redis可能在fsync()調用時阻塞太長時間。請注意,沒有修復this目前,由於即便在不一樣的線程執行fsync也會阻塞咱們的同步寫(2)調用。
爲了緩解這個問題,可使用如下選項
將阻止fsync()在主進程中被調用正在進行#BGSAVE或BGREWRITEAOF。
這意味着當另外一個保存時,Redis的持久性是與「appendfsync none」相同。實際上,這意味着它可能丟失最多30秒的日誌在最糟糕的狀況下(與default Linux settings)。
若是您有延遲問題,請將此設置爲「yes」。不然保留爲「no」這是從耐用性的角度來看最安全的選擇。

XXXVIII. no-appendfsync-on-rewrite no

指定是否在後臺aof文件rewrite期間調用fsync,默認爲no,表示要調用fsync(不管後臺是否有子進程在刷盤)。Redis在後臺寫RDB文件或重寫AOF文件期間會存在大量磁盤IO,此時,在某些linux系統中,調用fsync可能會阻塞。

XXXIX. auto-aof-rewrite-percentage 100

當AOF文件增加到必定大小的時候Redis可以調用 BGREWRITEAOF 對日誌文件進行重寫 。當AOF文件大小的增加率大於該配置項時自動開啓重寫。

XL. auto-aof-rewrite-min-size 64mb

當AOF文件增加到必定大小的時候Redis可以調用 BGREWRITEAOF 對日誌文件進行重寫 。當AOF文件大小大於該配置項時自動開啓重寫。

XLI. aof-load-truncated yes

redis在啓動時能夠加載被截斷的AOF文件,而不須要先執行 redis-check-aof 工具。

#AOD文件可能會在Redis結束時被截斷啓動過程,當AOF數據被加載回內存。這可能發生在Redis運行的系統上崩潰,特別是當一個ext4文件系統沒有安裝data = ordered選項(可是這不會發生在Redis自己崩潰或停止,但操做系統仍然正常工做)。Redis能夠在出現這種狀況時退出並返回錯誤,或者加載儘量多的內容數據(默認爲如今),若是找到AOF文件,則啓動在末尾被截斷。如下選項控制此行爲。若是aof-load-truncated設置爲yes,則加載截斷的AOF文件Redis服務器開始發出日誌以通知用戶事件。不然,若是該選項設置爲no,服務器將停止並出現錯誤並拒絕啓動。當該選項設置爲no時,用戶須要從新啓動前使用「redis-check-aof」實用程序修復AOF文件
服務器。
注意,若是AOF文件被髮如今中間被損壞服務器仍將退出並顯示錯誤。此選項僅適用於
Redis將嘗試從AOF文件讀取更多數據,但沒有足夠的字節將被找到。

################################ LUA SCRIPTING

XLII. lua-time-limit 5000

一個Lua腳本最長的執行時間,單位爲毫秒,若是爲0或負數表示無限執行時間,不帶警告,默認爲5000。
################################ REDIS CLUSTER

XLIII. cluster-enabled yes

#cluster node啓用集羣支持取消註釋如下內容:

XLIV. cluster-config-file nodes-6379.conf

#每一個集羣節點都有一個集羣配置文件。 這個文件不是旨在手動編輯。 它由Redis節點建立和更新。每一個Redis羣集節點須要一個不一樣的羣集配置文件。確保在同一系統中運行的實例沒有
重疊羣集配置文件名。若是集羣建立失敗,須要刪除這個文件後重啓便可

cluster-node-timeout 5000

#集羣節點超時是節點必須沒法訪問的毫秒,以便它被認爲處於故障狀態。大多數其餘內部時間限制是節點超時的倍數。

設置集羣節點超時時間,若是超過了指定的超時時間後仍不可達,則節點被認爲是失敗狀態,單位爲毫秒。
一個屬於失效的master端的slave,若是它的數據較舊,將不會啓動failover。
如今來說並無一個簡單的方法去解決如何斷定一個slave端的數據的時效性問題,因此能夠執行如下兩個選擇:
一、若是有多個slave可用於failover,它們會交換信息以便選出一個最優的進行主從複製的offset,slave端會嘗試依據offset去獲取每一個slave的rank,這樣在啓動failover時對每一個slave的利用就與slave端的rank成正比。
二、每一個slave端和它的master端進行最後交互的時間,這多是最近的ping或指令接收時間,或自與master端失連的過期時間。若是最近的交互時間過久,slave就不會嘗試去進行failover。
第2點能夠由用戶來進行調整,明確一個slave不會進行failover。自最近一次與master端進行交互,過期時間有一個計算公式:

(node-timeout * slave-validity-factor)+repl-ping-slave-period
一個比較大的slave-validity-factor參數可以容許slave端使用比較舊的數據去failover它的master端,而一個比較小的值可能會阻止集羣去選擇slave端。
爲得到最大的可用性,能夠設置slave-validity-factor的值爲0,這表示slave端將會一直去嘗試failover它的master端而無論它與master端的最後交互時間。

XLV. cluster-slave-validity-factor 10

集羣中的slave能夠遷移到那些沒有可用slave的master端,這提高了集羣處理故障的能力。畢竟一個沒有slave的master端若是發生了故障是沒有辦法去進行failover的。
要將一個slave遷移到別的master,必須這個slave的原master端有至少給定數目的可用slave才能夠進行遷移,這個給定的數目由migration barrier參數來進行設置,默認值爲1,表示這個要進行遷移的slave的原master端應該至少還有1個可用的slave才容許其進行遷移,要禁用這個功能只須要將此參數設置爲一個很是大的值。

XLVI. cluster-migration-barrier 1

默認狀況下當redis集羣節點發現有至少一個hashslot未被covered時將會中止接收查詢。
這種狀況下若是有一部份的集羣down掉了,那整個集羣將變得不可用。
集羣將會在全部的slot從新covered以後自動恢復可用。
若想要設置集羣在部份key space沒有cover完成時繼續去接收查詢,就將參數設置爲no。

XLVII. cluster-require-full-coverage yes

slowlog-log-slower-than 10000
「慢操做日誌」記錄,單位:微秒(百萬分之一秒,1000 * 1000),若是操做時間超過此值,將會把command信息」記錄」起來.(內存,非文件)。其中」操做時間」不包括網絡IO開支,只包括請求達到server後進行」內存實施」的時間.」0」表示記錄所有操做。

XLVIII. slowlog-max-len 128

#這個長度沒有限制。 只是要注意它會消耗內存。您可使用SLOWLOG RESET來回收慢速日誌使用的內存。
「慢操做日誌」保留的最大條數,」記錄」將會被隊列化,若是超過了此長度,舊記錄將會被移除。能夠經過」SLOWLOG args」查看慢記錄的信息(SLOWLOG get 10,SLOWLOG reset)。
################################ LATENCY MONITOR

XLIX. latency-monitor-threshold 0

延遲監控,用於記錄等於或超過了指定時間的操做,默認是關閉狀態,即值爲0。
#系統只記錄在等於或的時間執行的操做大於經過指定的毫秒數latency-monitor-threshold配置指令。 當其值設置時置零,延遲監視器關閉。
默認狀況下,延遲監控被禁用,由於它大多不須要若是沒有延遲問題,而且收集數據有性能
衝擊,雖然很小,能夠在大負載下測量。 潛伏監視能夠在運行時使用命令輕鬆啓用「CONFIG SET latency-monitor-threshold 」(若是須要)。
############################# EVENT NOTIFICATION
notify-keyspace-events ""
#Redis能夠通知Pub / Sub客戶端關鍵空間中發生的事件。此功能在http://redis.io/topics/notifications中進行了說明
例如,若是啓用了鍵空間事件通知和客戶端對存儲在數據庫0中的鍵「foo」執行DEL操做,兩個郵件將經過Pub / Sub發佈:
#PUBLISH __keyspace @ 0 __:foo del
#PUBLISH __keyevent @ 0 __:del foo
能夠選擇Redis在集合中通知的事件類。每一個類由單個字符標識:
K鍵空間事件,使用__keyspace @ __前綴發佈。
E Keyevent事件,使用__keyevent @ __前綴發佈。
g通用命令(非特定類型),如DEL,EXPIRE,RENAME,...
$ String命令
l列出命令
s設置命令
h哈希命令
z排序set命令
x過時事件(每次密鑰過時時生成的事件)
e驅逐事件(當maxmemory驅逐某個鍵時生成的事件)
A g $ lshzxe的別名,所以「AKE」字符串表示全部事件。

#「notify-keyspace-events」接受一個做爲參數的字符串爲零或多個字符。空字符串表示通知已禁用。
示例:啓用列表和通用事件,從的角度來看event name,use:
notify-keyspace-events Elg
示例2:獲取訂閱頻道的過時密鑰的流
name __keyevent @ 0 __:expired use:
notify-keyspace-events例如
默認狀況下,全部通知都被禁用,由於大多數用戶不須要此功能和功能有一些開銷。注意,若是你不指定K或E中的至少一個,不會傳送任何事件。
############################### ADVANCED CONFIG
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
hash類型的數據結構在編碼上可使用ziplist和hashtable。ziplist的特色就是文件存儲(以及內存存儲)所需的空間較小,在內容較小時,性能和hashtable幾乎同樣.所以redis對hash類型默認採起ziplist。若是hash中條目的條目個數或者value長度達到閥值,將會被重構爲hashtable。
這個參數指的是ziplist中容許存儲的最大條目個數,,默認爲512,建議爲128。ziplist中容許條目value值最大字節數,默認爲64,建議爲1024。

L. list-max-ziplist-size -2

#列表也以特殊方式編碼,以節省大量空間。能夠指定每一個內部列表節點容許的條目數做爲固定的最大大小或最大數量的元素。對於固定的最大大小,請使用-5到-1,意思是:
-5:max size:64 Kb < - 不推薦用於正常工做負載
-4:max size:32 Kb < - 不推薦
-3:max size:16 Kb < - 可能不推薦
-2:最大尺寸:8Kb < - 好
-1:最大尺寸:4 Kb < - 好
正數表示存儲最多exactly該數量的元素per list node。
高性能選項一般是-2(8 Kb大小)或-1(4 Kb大小)但若是您的用例是惟一的,請根據須要調整設置。

LI. list-compress-depth 0

#也能夠壓縮列表。壓縮深度是從每一個側的快速清單ziplist節點的數量列表,* 排除從壓縮。 列表的頭和尾
始終未壓縮以進行快速推送/彈出操做。 設置包括:
0:禁用全部列表壓縮
1:depth 1表示「不要開始壓縮,直到1個節點進入列表,
從頭或尾「走」
so:[head] - > node-> node - > ...-> node - > [tail]
[head],[tail]將始終未壓縮; 內部節點將壓縮。
2:[head] - > [next] - > node-> node-> ...-> node-> [prev]
2這裏的意思是:不壓縮head或head-> next或tail-> prev或tail,
可是壓縮它們之間的全部節點。
3:[head] - > [next] - > [next] - > node-> node-> ...-> node->等。
redis在3.2中廢棄了以前的兩個list底層結構設置:list-max-ziplist-entries 512 list-max-ziplist-value 64。改成新的quicklist結構,具體詳情看:http://blog.csdn.net/a809146548/article/details/52013225

LII. set-max-intset-entries 512

與哈希和列表相似,有序集合也會使用一種特殊的編碼方式來節省空間,這種特殊的編碼方式只用於這個有序集合的長度和元素均低於如下參數設置的值時。 intset中容許保存的最大條目個數,若是達到閥值,intset將會被重構爲hashtable。

#集合在一種狀況下有一個特殊的編碼:當組合時的只是正好是範圍內的10的整數的字符串
64位有符號整數。如下配置設置設置大小的限制設置爲了使用這種特殊的內存保存編碼。

LIII. zset-max-ziplist-entries 128

zset-max-ziplist-value 64
zset爲有序集合,有2中編碼類型:ziplist,skiplist。由於」排序」將會消耗額外的性能,當zset中數據較多時,將會被重構爲skiplist。

LIV. hll-sparse-max-bytes 3000

設置HyeperLogLog的字節數限制,這個值一般在0~15000之間,默認爲3000,基本不超過16000 。
#HyperLogLog稀疏表示字節數限制。 限制包括16字節標頭。 當使用稀疏表示HyperLogLog交叉時這個限制,它被轉換成密集表示。大於16000的值是徹底無用的,由於那時候密集表示更有內存效率。建議的值是〜3000以便有好處空間高效編碼,而不會減慢太多的PFADD,是具備稀疏編碼的O(N)。 該值能夠提升到〜10000當CPU不是一個關注,但空間是,而且數據集是由許多HyperLogLogs組成,基數在0 - 15000範圍內。

LV. activerehashing yes

是否開啓頂層數據結構的rehash功能,若是內存容許,請開啓。rehash可以很大程度上提升K-V存取的效率。redis將會在每秒中抽出10毫秒來對主字典進行從新散列化處理,這有助於儘量的釋放內存。
#active rehashing每100毫秒的CPU時間使用1毫秒order以幫助從新散列主Redis散列表(一個映射頂層keys to values)。 Redis使用的哈希表實現(見dict.c)執行延遲從新散列:運行到散列表中的操做越可能是從新散列,執行更多的從新散列「步驟」,因此若是server is idle the rehashing is never complete and some more memory is used由散列表。
#默認是每秒使用這個毫秒10次主動重寫主要的字典,儘量釋放內存。
#若是不肯定:use「activerehashing no」若是你有硬的延遲要求,它是在Redis能夠不時回覆的環境中不是一件好事到2毫秒延遲的查詢。
#use「activerehashing yes」若是你沒有這麼嚴格的要求,但想盡量釋放內存空間。

client-output-buffer-limit
由於某些緣由,client不能足夠快的從server讀取數據,那client的輸出緩存限制可能會使client失連,這個限制可用於3種不一樣的client種類,分別是:normal、slave和pubsub。

LVI. client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
客戶端buffer控制。在客戶端與server進行的交互中,每一個鏈接都會與一個buffer關聯,此buffer用來隊列化等待被client接受的響應信息。若是client不能及時的消費響應信息,那麼buffer將會被不斷積壓而給server帶來內存壓力.若是buffer中積壓的數據達到閥值,將會致使鏈接被關閉,buffer被移除。
buffer控制類型包括:normal -> 普通鏈接;slave ->與slave之間的鏈接;pubsub ->pub/sub類型鏈接,此類型的鏈接,每每會產生此種問題;由於pub端會密集的發佈消息,可是sub端可能消費不足.
指令格式:client-output-buffer-limit 「,其中hard表示buffer最大值,一旦達到閥值將當即關閉鏈接;
soft表示」容忍值」,它和seconds配合,若是buffer值超過soft且持續時間達到了seconds,也將當即關閉鏈接,若是超過了soft可是在seconds以後,buffer數據小於了soft,鏈接將會被保留.
其中hard和soft都設置爲0,則表示禁用buffer控制.一般hard值大於soft.

#客戶端輸出緩衝區限制可用於強制斷開客戶端沒有從服務器讀取數據足夠快,出於某種緣由(a常見的緣由是發佈/訂閱客戶端不能消耗消息的速度publisher能夠產生它們)。
對於三種不一樣類別的客戶端,能夠設置不一樣的限制:
#normal - >正常客戶端,包括MONITOR客戶端
#slave - >從客戶端
#pubsub - >客戶端訂閱至少一個pubsub渠道或模式
#每一個client-output-buffer-limit僞指令的語法以下:
client-output-buffer-limit
客戶端在達到硬限制後當即斷開鏈接,或者達到軟限制並達到指定數量的軟限制秒(連續)。
例如,若是硬限制爲32 MB,軟限制爲16兆字節/ 10秒,客戶端會當即斷開鏈接
若是輸出緩衝區的大小達到32兆字節,但也會獲得斷開鏈接,若是客戶端達到16兆字節並持續克服限制10秒。
默認狀況下,正常客戶端不受限制,由於它們不接收數據沒有詢問(推送方式),但只是在請求後,因此只異步客戶端能夠建立更快地請求數據的場景比它能夠讀。
改成對pubsub和從屬客戶端有一個默認限制用戶和從設備以推送方式接收數據。
經過將硬限制或軟限制設置爲零能夠禁用。

LVII. hz 10

redis使用一個內部程序來處理後臺任務,例如關閉超時的client鏈接,清除過時的key等等。它並不會同時處理全部的任務,redis經過指定的hz參數去檢查和執行任務。
hz默認設爲10,提升它的值將會佔用更多的cpu,固然相應的redis將會更快的處理同時到期的許多key,以及更精確的去處理超時。
hz的取值範圍是1~500,一般不建議超過100,只有在請求延時很是低的狀況下能夠將值提高到100。

LVIII. aof-rewrite-incremental-fsync yes

當一個子進程要改寫AOF文件,若是如下選項啓用,那文件將會在每產生32MB數據時進行同步,這樣提交增量文件到磁盤時能夠避免出現比較大的延遲。

相關文章
相關標籤/搜索