redis安裝&&redis集羣

NoSql數據庫之Redis
一、什麼是nosql,nosql的應用場景
二、Nonsql數據庫的類型
a) Key-value
b) 文檔型(相似於json)
c) 列式存儲
d) 圖式
三、redis的相關概念kv型的。
四、Redis的安裝及部署
五、Redis的使用方法及數據類型
a) Redis啓動及關閉
b) Redis的數據類型
i. String類型
ii. Hash類型
iii. List類型
iv. Set類型
v. SortedSet(zset)
六、redis數據庫的持久化
a) Rdb快照形式
b) Aof命令形式
七、主從複製
八、Redis集羣前端

2 什麼是nosql
2.1 nosqlnode

Nosql=Not only sql,非關係型數據庫。
Web1.0:內容輸出型網站。相似於搜狐、網頁、新浪。
Web2.0:交互型的網站。例如人人網、微博等。linux

關係型數據庫遇到的問題:
一、High performance - 對數據庫高併發讀寫的需求
二、大數據量存儲。
三、High Scalability && High Availability- 對數據庫的高可擴展性和高可用性的需求c++

此時nosql數據出現了。redis

2.2 Nosql數據庫的類型sql

一、key-value類型。經常使用的就是redis。能夠用做緩存使用。
二、文檔型。Mongodb。存儲的是相似於json的數據bson。
三、列式存儲。Hbase。基於hadoop的數據庫。
四、圖式存儲。典型應用:社交網絡數據庫

3 Redis的相關概念
3.1 什麼是redisjson

Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫。它經過提供多種鍵值數據類型來適應不一樣場景下的存儲需求,目前爲止Redis支持的鍵值數據類型如
下:
字符串類型
散列類型
列表類型
集合類型
有序集合類型。vim

3.2 Redis的應用場景windows

緩存(數據查詢、短鏈接、新聞內容、商品內容等等)。(最多使用)
分佈式集羣架構中的session分離。
聊天室的在線好友列表。
任務隊列。(秒殺、搶購、12306等等)
應用排行榜。
網站訪問統計。
數據過時處理(能夠精確到毫秒)

4 Redis的安裝及部署
4.1 Redis部署環境

須要linux系統,centos6.4
Redis一樣也有windows版本,能夠練習使用。官方不典型支持。推薦使用linux版本。

須要gcc的開發環境。

4.2 Redis的下載

http://redis.io/

clipboard.png

在這裏插入圖片描述
最新版本:3.0.3
本課程的版本:3.0.0

clipboard.png

在這裏插入圖片描述
是一個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:指定安裝目錄

在這裏插入圖片描述
4.4 啓動和關閉

4.4.1 前端啓動模式

在bin 目錄下執行:
./redis-server

在這裏插入圖片描述
4.4.2 後端啓動模式

須要redis.conf配置文件:

在這裏插入圖片描述把此文件複製到redis的目錄。
修改redis.conf文件:daemonize yes(默認是no)
啓動:
./redis-server redis.conf
須要指定一個配置文件。

4.4.3 關閉redis

一、kill進程
二、正常關閉
./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

在這裏插入圖片描述第二步:重啓防火牆服務
[root@localhost ~]# 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 圖像客戶端

clipboard.png

在這裏插入圖片描述
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中配置:

clipboard.png

在這裏插入圖片描述

5 Redis中的數據類型
5.1 String類型

基礎數據類型。在redis中全部的值都是字符串。在redis中命令不區分大小寫。
一、set命令:添加一個key
二、get命令:取一個key
三、Incr命令:加一命令。若是key的值是數值類型可使用此命令。
127.0.0.1:6379> incr a
(integer) 101
四、decr命令:減一命令
127.0.0.1:6379> decr a
(integer) 100
五、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

命令:
一、Hset命令:添加一個key
Hset key hashkey value
127.0.0.1:6379> hset hash1 a 1
(integer) 1
二、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
三、hget命令:取一個hash key
127.0.0.1:6379> hget hash1 a
「1」
四、hmget命令:取多個hash key
127.0.0.1:6379> hmget hash2 a b c

「1」
「2」
「3」
四、自增命令:hincrby
127.0.0.1:6379> hmget hash2 a b c
「1」
「2」
「3」
127.0.0.1:6379> hincrby hash2 a 10
(integer) 11

clipboard.png

5.3 List類型

Redis中是鏈表形式的存儲。
能夠當作隊列使用,也能夠當作棧使用。

一、在左邊添加元素: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>
二、右邊添加元素:rpush
127.0.0.1:6379> rpush list1 1 2 3 4 5
(integer) 11

在這裏插入圖片描述三、取最左邊元素:lpop,取完列表中此元素刪除。
127.0.0.1:6379> lpop list1
「f」
四、取最右元素:rpop
127.0.0.1:6379> rpop list1
「5」
127.0.0.1:6379>
五、查看列表中的元素:lrange
Lrange key 起始下標 結束下標(取所有的結束下標就是-1)
127.0.0.1:6379> lrange list1 0 3

「e」
「d」
「c」
「b」
127.0.0.1:6379> lrange list1 0 -1
「e」
「d」
「c」
「b」
「a」
「1」
「2」
「3」
「4」
127.0.0.1:6379>

5.4 Set類型

特色:集合中的元素是無序的而且沒有重複的。
5.4.1 命令

一、向集合中添加元素:sadd
Sadd key value1 value2 value3 …
127.0.0.1:6379> sadd set1 a b c d e
(integer) 5
二、刪除元素:srem
Srem key value
127.0.0.1:6379> srem set1 a
(integer) 1
三、查看集合中的元素:smembers
Smembers key
127.0.0.1:6379> smembers set1

「c」
「d」
「b」
「e」
127.0.0.1:6379>

5.4.2 集合的運算

一、差集運算
屬於A而且不屬於B的元素構成的集合。

clipboard.png

在這裏插入圖片描述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

「a」
「b」
二、交集運算
屬於A且屬於B的元素構成的集合。

clipboard.png

在這裏插入圖片描述SINTER key [key …]
127.0.0.1:6379> sinter seta setb

「c」
「d」
「e」
127.0.0.1:6379>

5.4.3 並集運算

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

clipboard.png

在這裏插入圖片描述
SUNION key [key …]
127.0.0.1:6379> sunion seta setb

「c」
「d」
「b」
「a」
「f」
「e」
「g」

5.5 SortedSet類型(zset)

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

5.5.1 命令

一、添加元素命令:zadd
Zadd key 得分 元素 得分 元素 。。。。。
127.0.0.1:6379> zadd zset1 1 a 2 b 3 c 4 d
(integer) 4
二、刪除元素:zrem
127.0.0.1:6379> zrem zset1 a
(integer) 1
三、查看計劃中的元素:zrange
Zrange key 起始下標 結束下標(-1所有)withscores(帶分數)
127.0.0.1:6379> zrange zset1 0 -1

「b」
「c」
「d」
127.0.0.1:6379> zrange zset1 0 -1 withscores
「b」
「2」
「c」
「3」
「d」
「4」
四、降序排列:zrevrange
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
「d」
「4」
「c」
「3」
「b」
「2」

適用於應用排行榜。

6 Keys命令
6.1 能夠設置key的有效期。

一、設置有效期:expire
Expire key 生存期(以秒爲單位)
127.0.0.1:6379> set a 100
OK
127.0.0.1:6379> expire a 30
(integer) 1
二、查看key的生存期
Ttl key
-1:永久
-2:key不存在
三、持久化keypersist,能夠把key持久化保存
127.0.0.1:6379> persist a
(integer) 1

6.2 其餘keys命令

Keys命令,能夠查看數據庫中全部的能夠列表。
127.0.0.1:6379> keys *

「list1」
「zset1」
「a」
「hash2」
「key1」
「setb」
「seta」
「list」
「hash1」
「hello」
「set1」

7 Redis的持久化
兩種方案:
一、快照形式RDB形式。(默認開啓)
二、Aof形式。命令形式存儲。(須要手動開啓)

Rdb:速度快。丟失數據的機率大。
Aof:默認每秒鐘保存一次命令。性能低,可靠性高。最多丟失一秒的數據。

須要在redis.conf中配置。

Rdb:

clipboard.png

在這裏插入圖片描述
Aof方案:(append only file)

clipboard.png

在這裏插入圖片描述

兩種方案同時開啓,使用aof恢復數據。

8 主從複製
只須要修改redis.conf文件就能夠。
須要配置兩個虛擬機,若是不能實現,至少須要兩個數據庫實例。

第一步:建立slave服務器的實例。
一、把redis的bin目錄複製一份。
二、修改redis.conf文件。修改端口號。

clipboard.png

在這裏插入圖片描述第二步:配置從服務器,主服務器不須要作任何修改。修改從服務器的redis.conf文件。

clipboard.png

在這裏插入圖片描述第三步:啓動從服務器

9 redis集羣
9.1 集羣架構圖

clipboard.png

在這裏插入圖片描述
9.2 集羣中的槽slot

槽是用來存儲key。

clipboard.png

9.3 redis-cluster投票:容錯

clipboard.png

在這裏插入圖片描述
(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實例。

clipboard.png

在這裏插入圖片描述第二步:修改每一個實例的端口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文件。

clipboard.png

在這裏插入圖片描述第六步:啓動每一個實例。

clipboard.png

在這裏插入圖片描述第七步:使用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

[root@localhost 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.
        [root@localhost 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向集羣添加節點。
[root@localhost 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個槽,集羣中的每一個結點分配自已槽,經過查看集羣結點能夠看到槽佔用狀況。

clipboard.png

在這裏插入圖片描述

給剛添加的7007結點分配槽:

1:鏈接上集羣
./redis-trib.rb reshard 192.168.101.3:7001(鏈接集羣中任意一個可用結點都行)

2:輸入要分配的槽數量

clipboard.png

在這裏插入圖片描述
輸入 500表示要分配500個槽

3:輸入接收槽的結點id

clipboard.png

在這裏插入圖片描述這裏準備給7007分配槽,經過cluster nodes查看7007結點id爲15b809eadae88955e36bcdbb8144f61bbbaf38fb
輸入:15b809eadae88955e36bcdbb8144f61bbbaf38fb

4:輸入源結點id

clipboard.png

在這裏插入圖片描述這裏輸入all

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

clipboard.png

在這裏插入圖片描述
9.6.6 第六步:給7007實例添加一個新的從服務器

一、建立一個新的redis實例
二、配置實例的端口號爲7008
三、使用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槽從新分配章節)。

做者:kruppwang1
來源:CSDN
原文:https://blog.csdn.net/kruppwa... 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索