天天看點

redis安裝&&redis叢集

NoSql資料庫之Redis

1、什麼是nosql,nosql的應用場景

2、Nonsql資料庫的類型

a) Key-value

b) 文檔型(類似于json)

c) 列式存儲

d) 圖式

3、redis的相關概念kv型的。

4、Redis的安裝及部署

5、Redis的使用方法及資料類型

a) Redis啟動及關閉

b) Redis的資料類型

i. String類型

ii. Hash類型

iii. List類型

iv. Set類型

v. SortedSet(zset)

6、redis資料庫的持久化

a) Rdb快照形式

b) Aof指令形式

7、主從複制

8、Redis叢集

2 什麼是nosql

2.1 nosql

Nosql=Not only sql,非關系型資料庫。

Web1.0:内容輸出型網站。類似于搜狐、網頁、新浪。

Web2.0:互動型的網站。例如人人網、微網誌等。

關系型資料庫遇到的問題:

1、High performance - 對資料庫高并發讀寫的需求

2、大資料量存儲。

3、High Scalability && High Availability- 對資料庫的高可擴充性和高可用性的需求

此時nosql資料出現了。

2.2 Nosql資料庫的類型

1、key-value類型。常用的就是redis。可以用作緩存使用。

2、文檔型。Mongodb。存儲的是類似于json的資料bson。

3、列式存儲。Hbase。基于hadoop的資料庫。

4、圖式存儲。典型應用:社交網絡

3 Redis的相關概念

3.1 什麼是redis

Redis是用C語言開發的一個開源的高性能鍵值對(key-value)資料庫。它通過提供多種鍵值資料類型來适應不同場景下的存儲需求,目前為止Redis支援的鍵值資料類型如

下:

字元串類型

散列類型

清單類型

集合類型

有序集合類型。

3.2 Redis的應用場景

緩存(資料查詢、短連接配接、新聞内容、商品内容等等)。(最多使用)

分布式叢集架構中的session分離。

聊天室的線上好友清單。

任務隊列。(秒殺、搶購、12306等等)

應用排行榜。

網站通路統計。

資料過期處理(可以精确到毫秒)

4 Redis的安裝及部署

4.1 Redis部署環境

需要linux系統,centos6.4

Redis同樣也有windows版本,可以練習使用。官方不典型支援。推薦使用linux版本。

需要gcc的開發環境。

4.2 Redis的下載下傳

http://redis.io/

redis安裝&&redis叢集

最新版本:3.0.3

本課程的版本:3.0.0

redis安裝&&redis叢集

是一個redis的源碼包,c語言開發的。

4.3 安裝步驟

第一步:安裝linux虛拟機。Centos6.4(32位)

第二步:把源碼包上傳到伺服器。

第三步:解壓源碼包。

tar -zxvf redis-3.0.0.tar.gz

第四步:編譯源碼,需要gcc的環境。如果沒有就安裝一個,需要聯網。

安裝gcc:yum install gcc-c++

編譯源碼:進入源碼目錄,make。

第五步:安裝

make install PREFIX=/usr/local/redis

PREFIX:指定安裝目錄

redis安裝&&redis叢集

4.4 啟動和關閉

4.4.1 前端啟動模式

在bin 目錄下執行:

./redis-server

redis安裝&&redis叢集

4.4.2 後端啟動模式

需要redis.conf配置檔案:

redis安裝&&redis叢集

把此檔案複制到redis的目錄。

修改redis.conf檔案:daemonize yes(預設是no)

啟動:

./redis-server redis.conf

需要指定一個配置檔案。

4.4.3 關閉redis

1、kill程序

2、正常關閉

./redis-cli -h 192.168.25.147 -p 6379 shutdown

-h:服務的ip位址

-p:端口号

如果是本地服務,而且端口是6379這些參數可以省略。

4.5 Redis的用戶端

4.5.1 Redis自帶用戶端:redis-cli

簡單指令:

Ping:測試伺服器是否還活着。

Set:指令,添加一個key

Set key value

例子:

127.0.0.1:6379> set key1 100

OK

Get指令,取一個key的值

Get key

例子:

127.0.0.1:6379> get key1

“100”

4.5.2 Java的用戶端Jedis

如果遠端連接配接失敗,檢視linux 的防火牆是否開放redis的服務端口。

第一種方法:關閉防火牆:

service iptables stop

第二種方法:修改配置檔案開放指定端口。

第一步:修改:

vim /etc/sysconfig/iptables

redis安裝&&redis叢集

第二步:重新開機防火牆服務

[[email protected] ~]# service iptables restart

iptables: Flushing firewall rules: [ OK ]

iptables: Setting chains to policy ACCEPT: filter [ OK ]

iptables: Unloading modules: [ OK ]

iptables: Applying firewall rules: [ OK ]

4.6 圖像用戶端

redis安裝&&redis叢集

Redis中預設有16個資料庫。0-15号。預設操作0号庫。

使用指令切換資料庫:

127.0.0.1:6379> select 1

OK

127.0.0.1:6379[1]> select 16

(error) ERR invalid DB index

127.0.0.1:6379> select 15

OK

127.0.0.1:6379[15]>

庫和庫之間互相隔離,不同的庫中可以有相同的key。

資料庫的數量在redis.conf中配置:

redis安裝&&redis叢集

5 Redis中的資料類型

5.1 String類型

基礎資料類型。在redis中所有的值都是字元串。在redis中指令不區分大小寫。

1、set指令:添加一個key

2、get指令:取一個key

3、Incr指令:加一指令。如果key的值是數值類型可以使用此指令。

127.0.0.1:6379> incr a

(integer) 101

4、decr指令:減一指令

127.0.0.1:6379> decr a

(integer) 100

5、del指令:删除key

127.0.0.1:6379> del a

(integer) 1

127.0.0.1:6379> get a

(nil)

5.2 Hash類型

Key-value(hash)-key-value

|-key-value

|-key-value

指令:

1、Hset指令:添加一個key

Hset key hashkey value

127.0.0.1:6379> hset hash1 a 1

(integer) 1

2、hmset:批量添加key

Hmset key hkey1 value hkey2 value hkey3 value …

127.0.0.1:6379> hmset hash2 a 1 b 2 c 3 d 4

OK

3、hget指令:取一個hash key

127.0.0.1:6379> hget hash1 a

“1”

4、hmget指令:取多個hash key

127.0.0.1:6379> hmget hash2 a b c

  1. “1”
  2. “2”
  3. “3”

    4、自增指令:hincrby

    127.0.0.1:6379> hmget hash2 a b c

  4. “1”
  5. “2”
  6. “3”

    127.0.0.1:6379> hincrby hash2 a 10

    (integer) 11

5.3 List類型

Redis中是連結清單形式的存儲。

可以當做隊列使用,也可以當做棧使用。

1、在左邊添加元素:lpush

Lpush key value1 value2 value3

127.0.0.1:6379> lpush list1 a b c d e f

(integer) 6

127.0.0.1:6379>

2、右邊添加元素:rpush

127.0.0.1:6379> rpush list1 1 2 3 4 5

(integer) 11

redis安裝&&redis叢集

3、取最左邊元素:lpop,取完清單中此元素删除。

127.0.0.1:6379> lpop list1

“f”

4、取最右元素:rpop

127.0.0.1:6379> rpop list1

“5”

127.0.0.1:6379>

5、檢視清單中的元素:lrange

Lrange key 起始下标 結束下标(取全部的結束下标就是-1)

127.0.0.1:6379> lrange list1 0 3

  1. “e”
  2. “d”
  3. “c”
  4. “b”

    127.0.0.1:6379> lrange list1 0 -1

  5. “e”
  6. “d”
  7. “c”
  8. “b”
  9. “a”
  10. “1”
  11. “2”
  12. “3”
  13. “4”

    127.0.0.1:6379>

5.4 Set類型

特點:集合中的元素是無序的并且沒有重複的。

5.4.1 指令

1、向集合中添加元素:sadd

Sadd key value1 value2 value3 …

127.0.0.1:6379> sadd set1 a b c d e

(integer) 5

2、删除元素:srem

Srem key value

127.0.0.1:6379> srem set1 a

(integer) 1

3、檢視集合中的元素:smembers

Smembers key

127.0.0.1:6379> smembers set1

  1. “c”
  2. “d”
  3. “b”
  4. “e”

    127.0.0.1:6379>

5.4.2 集合的運算

1、差集運算

屬于A并且不屬于B的元素構成的集合。

redis安裝&&redis叢集

SDIFF key [key …]

127.0.0.1:6379> sadd seta a b c d e

(integer) 5

127.0.0.1:6379> sadd setb c d e f g

(integer) 5

127.0.0.1:6379> sdiff seta setb

  1. “a”
  2. “b”

    2、交集運算

    屬于A且屬于B的元素構成的集合。

redis安裝&&redis叢集

SINTER key [key …]

127.0.0.1:6379> sinter seta setb

  1. “c”
  2. “d”
  3. “e”

    127.0.0.1:6379>

5.4.3 并集運算

屬于A或者屬于B的元素構成的集合

redis安裝&&redis叢集

SUNION key [key …]

127.0.0.1:6379> sunion seta setb

  1. “c”
  2. “d”
  3. “b”
  4. “a”
  5. “f”
  6. “e”
  7. “g”

5.5 SortedSet類型(zset)

特點集合但是是有序的。在此集合中每個元素都有一個分數,可以根據分數升序排列。

5.5.1 指令

1、添加元素指令:zadd

Zadd key 得分 元素 得分 元素 。。。。。

127.0.0.1:6379> zadd zset1 1 a 2 b 3 c 4 d

(integer) 4

2、删除元素:zrem

127.0.0.1:6379> zrem zset1 a

(integer) 1

3、檢視計劃中的元素:zrange

Zrange key 起始下标 結束下标(-1全部)withscores(帶分數)

127.0.0.1:6379> zrange zset1 0 -1

  1. “b”
  2. “c”
  3. “d”

    127.0.0.1:6379> zrange zset1 0 -1 withscores

  4. “b”
  5. “2”
  6. “c”
  7. “3”
  8. “d”
  9. “4”

    4、降序排列:zrevrange

    127.0.0.1:6379> zrevrange zset1 0 -1 withscores

  10. “d”
  11. “4”
  12. “c”
  13. “3”
  14. “b”
  15. “2”

适用于應用排行榜。

6 Keys指令

6.1 可以設定key的有效期。

1、設定有效期:expire

Expire key 生存期(以秒為機關)

127.0.0.1:6379> set a 100

OK

127.0.0.1:6379> expire a 30

(integer) 1

2、檢視key的生存期

Ttl key

-1:永久

-2:key不存在

3、持久化keypersist,可以把key持久化儲存

127.0.0.1:6379> persist a

(integer) 1

6.2 其他keys指令

Keys指令,可以檢視資料庫中所有的可以清單。

127.0.0.1:6379> keys *

  1. “list1”
  2. “zset1”
  3. “a”
  4. “hash2”
  5. “key1”
  6. “setb”
  7. “seta”
  8. “list”
  9. “hash1”
  10. “hello”
  11. “set1”

7 Redis的持久化

兩種方案:

1、快照形式RDB形式。(預設開啟)

2、Aof形式。指令形式存儲。(需要手動開啟)

Rdb:速度快。丢失資料的機率大。

Aof:預設每秒鐘儲存一次指令。性能低,可靠性高。最多丢失一秒的資料。

需要在redis.conf中配置。

Rdb:

redis安裝&&redis叢集

Aof方案:(append only file)

redis安裝&&redis叢集

兩種方案同時開啟,使用aof恢複資料。

8 主從複制

隻需要修改redis.conf檔案就可以。

需要配置兩個虛拟機,如果不能實作,至少需要兩個資料庫執行個體。

第一步:建立slave伺服器的執行個體。

1、把redis的bin目錄複制一份。

2、修改redis.conf檔案。修改端口号。

redis安裝&&redis叢集

第二步:配置從伺服器,主伺服器不需要做任何修改。修改從伺服器的redis.conf檔案。

redis安裝&&redis叢集

第三步:啟動從伺服器

9 redis叢集

9.1 叢集架構圖

redis安裝&&redis叢集

9.2 叢集中的槽slot

槽是用來存儲key。

redis安裝&&redis叢集

9.3 redis-cluster投票:容錯

redis安裝&&redis叢集

(1)領着投票過程是叢集中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為目前master節點挂掉.

(2):什麼時候整個叢集不可用(cluster_state:fail)?

a:如果叢集任意master挂掉,且目前master沒有slave.叢集進入fail狀态,也可以了解成叢集的slot映射[0-16383]不完成時進入fail狀态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,預設關閉,打開叢集相容部分失敗.

b:如果叢集超過半數以上master挂掉,無論是否有slave叢集進入fail狀态.

ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

9.4 安裝步驟

第一步:需要6台虛拟機。至少需要6個redis執行個體。

redis安裝&&redis叢集

第二步:修改每個執行個體的端口7001~7006。需要修改redis.conf檔案。

第三步:安裝ruby環境

安裝ruby

yum install ruby

yum install rubygems

安裝ruby和redis的接口程式

拷貝redis-3.0.0.gem至/usr/local下

執行:

gem install /usr/local/redis-3.0.0.gem

第四步:在/root/redis-3.0.0/src目錄下有一個redis-trib.rb檔案就是一個ruby的腳本檔案,是用來建立redis叢集的腳本檔案。把此檔案複制到/usr/local/redis-cluster目錄下。

第五步:修改每個執行個體的redis.conf檔案。

redis安裝&&redis叢集

第六步:啟動每個執行個體。

redis安裝&&redis叢集

第七步:使用redis-trib.rb腳本建立叢集。

./redis-trib.rb create --replicas 1 192.168.25.147:7001 192.168.25.147:7002 192.168.25.147:7003 192.168.25.147:7004 192.168.25.147:7005 192.168.25.147:7006

[[email protected] redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.147:7001 192.168.25.147:7002 192.168.25.147:7003 192.168.25.147:7004 192.168.25.147:7005 192.168.25.147:7006

Creating cluster

Connecting to node 192.168.25.147:7001: OK

Connecting to node 192.168.25.147:7002: OK

Connecting to node 192.168.25.147:7003: OK

Connecting to node 192.168.25.147:7004: OK

Connecting to node 192.168.25.147:7005: OK

Connecting to node 192.168.25.147:7006: OK

Performing hash slots allocation on 6 nodes…

Using 3 masters:

192.168.25.147:7001

192.168.25.147:7002

192.168.25.147:7003

Adding replica 192.168.25.147:7004 to 192.168.25.147:7001

Adding replica 192.168.25.147:7005 to 192.168.25.147:7002

Adding replica 192.168.25.147:7006 to 192.168.25.147:7003

M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001

slots:0-5460 (5461 slots) master

M: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002

slots:5461-10922 (5462 slots) master

M: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003

slots:10923-16383 (5461 slots) master

S: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004

replicates a96e224fe9aa5667a908a721c18aeeb78c0e628d

S: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005

replicates 22f03de15a3fd7260f5efa83539a342b94f07032

S: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006

replicates 75ccb72ea57cce1fbd951117c021d385f126b894

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 192.168.25.147:7001)

M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001

slots:0-5460 (5461 slots) master

M: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002

slots:5461-10922 (5462 slots) master

M: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003

slots:10923-16383 (5461 slots) master

M: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004

slots: (0 slots) master

replicates a96e224fe9aa5667a908a721c18aeeb78c0e628d

M: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005

slots: (0 slots) master

replicates 22f03de15a3fd7260f5efa83539a342b94f07032

M: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006

slots: (0 slots) master

replicates 75ccb72ea57cce1fbd951117c021d385f126b894

[OK] All nodes agree about slots configuration.

Check for open slots…

Check slots coverage…

[OK] All 16384 slots covered.

[[email protected] redis-cluster]#

9.5 連接配接叢集

9.5.1 使用redis-cli連接配接叢集

redis01/redis-cli -p 7005 -c

連接配接叢集必須添加-c參數。

9.5.2 檢視叢集資訊

192.168.25.147:7003> 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:3

cluster_stats_messages_sent:827

cluster_stats_messages_received:827

9.5.3 檢視叢集節點狀态

192.168.25.147:7003> cluster nodes

22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002 master - 0 1438330186924 2 connected 5461-10922

6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006 slave 75ccb72ea57cce1fbd951117c021d385f126b894 0 1438330185914 6 connected

f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005 slave 22f03de15a3fd7260f5efa83539a342b94f07032 0 1438330186420 5 connected

a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001 master - 0 1438330188440 1 connected 0-5460

75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003 myself,master - 0 0 3 connected 10923-16383

2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004 slave a96e224fe9aa5667a908a721c18aeeb78c0e628d 0 1438330187431 1 connected

9.6 添加節點

9.6.1 第一步:

建立一個新的redis執行個體,如果檔案中存在nodes.conf,需要删除。

9.6.2 第二步:

修改redis.conf檔案。修改端口,允許叢集。

9.6.3 第三步:

啟動伺服器

9.6.4 第四步:

使用redis-trib.rb向叢集添加節點。

[[email protected] redis-cluster]# ./redis-trib.rb add-node 192.168.25.147:7007 192.168.25.147:7001

Adding node 192.168.25.147:7007 to cluster 192.168.25.147:7001

Connecting to node 192.168.25.147:7001: OK

Connecting to node 192.168.25.147:7006: OK

Connecting to node 192.168.25.147:7002: OK

Connecting to node 192.168.25.147:7003: OK

Connecting to node 192.168.25.147:7005: OK

Connecting to node 192.168.25.147:7004: OK

Performing Cluster Check (using node 192.168.25.147:7001)

M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001

slots:0-5460 (5461 slots) master

1 additional replica(s)

S: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006

slots: (0 slots) slave

replicates 75ccb72ea57cce1fbd951117c021d385f126b894

M: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002

slots:5461-10922 (5462 slots) master

1 additional replica(s)

M: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003

slots:10923-16383 (5461 slots) master

1 additional replica(s)

S: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005

slots: (0 slots) slave

replicates 22f03de15a3fd7260f5efa83539a342b94f07032

S: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004

slots: (0 slots) slave

replicates a96e224fe9aa5667a908a721c18aeeb78c0e628d

[OK] All nodes agree about slots configuration.

Check for open slots…

Check slots coverage…

[OK] All 16384 slots covered.

Connecting to node 192.168.25.147:7007: OK

Send CLUSTER MEET to node 192.168.25.147:7007 to make it join the cluster.

[OK] New node added correctly.

9.6.5 第五步:配置設定槽。

添加完主節點需要對主節點進行hash槽配置設定這樣該主節才可以存儲資料。

redis叢集有16384個槽,叢集中的每個結點配置設定自已槽,通過檢視叢集結點可以看到槽占用情況。

redis安裝&&redis叢集

給剛添加的7007結點配置設定槽:

1:連接配接上叢集

./redis-trib.rb reshard 192.168.101.3:7001(連接配接叢集中任意一個可用結點都行)

2:輸入要配置設定的槽數量

redis安裝&&redis叢集

輸入 500表示要配置設定500個槽

3:輸入接收槽的結點id

redis安裝&&redis叢集

這裡準備給7007配置設定槽,通過cluster nodes檢視7007結點id為15b809eadae88955e36bcdbb8144f61bbbaf38fb

輸入:15b809eadae88955e36bcdbb8144f61bbbaf38fb

4:輸入源結點id

redis安裝&&redis叢集

這裡輸入all

5:輸入yes開始移動槽到目标結點id

redis安裝&&redis叢集

9.6.6 第六步:給7007執行個體添加一個新的從伺服器

1、建立一個新的redis執行個體

2、配置執行個體的端口号為7008

3、使用ruby腳本添加從節點。

執行如下指令:

./redis-trib.rb add-node --slave --master-id a66a2d3239122ad51f88fb6d1a0428effc18f98d 192.168.25.147:7008 192.168.25.147:7001

9.7 删除結點:

./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017

删除已經占有hash槽的結點會失敗,報錯如下:

[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.

需要将該結點占用的hash槽配置設定出去(參考hash槽重新配置設定章節)。

繼續閱讀