學習Redis(六)
分布式存儲之-Redis
一、簡介
redis常用於數據庫讀緩存和寫緩存,通常寫緩存需要考慮到數據一致性的問題,讀緩存應用較多
redis是一個開源的,使用c語言編寫的,支持網絡交互的,可基於內存也可持久化的key-value數據庫
二、安裝部署
1、安裝 wget http://download.redis.io/releases/redis-3.0.7.tar.gz tar xf redis-3.0.7.tar.gz cd redis-3.0.7 make PREFIX=/usr/local/redis install cp redis_init_script /etc/init.d/redis chmod +x /etc/init.d/redis2、修改配置文件 vim /etc/init.d/redis EXEC=/usr/local/redis/bin/redis-server CLIEXEC=/usr/local/redis/bin/redis-cli cp /usr/local/redis-3.0.7/redis.conf /etc/redis/6379.conf vim /etc/redis/6379.conf daemonize yes 3、啟動服務 /etc/init.d/redis start
通過salt-master批量安裝:
cp redis-3.0.7.tar.gz salt/redis/files/ cp 6379.conf salt/redis/files/ cp/etc/init.d/redis salt/redis/files/
vim redis.sls
redis-install: file.managed: #調用file模塊的managed方法 - name: /usr/local/src/redis-3.0.7.tar.gz #客戶端的文件路徑 - source: salt://init/files/redis-3.0.7.tar.gz #在服務器的路徑 - user: root - group: root - mode: 755 cmd.run: #執行遠程命令,使用cmd的run方法- name: cd /usr/local/src/ && tar xvf redis-3.0.7.tar.gz && cd redis-3.0.7 && make PREFIX=/usr/local/redis install #編譯安裝 - unless: test -d /usr/local/redis #如果目錄存在就不安裝了 - require: #依賴 - file: redis-install #編譯之前需要依賴redis-install執行成功 redis-config: file.managed: - name: /etc/redis/6379.conf #客戶端的配置文件路徑 - source: salt://init/files/6379.conf #服務器的配置文件路徑 - user: root - group: root - mode: 644 redis-service: file.managed: - name: /etc/init.d/redis - source: salt://init/files/redis - user: root - group: root - mode: 755 cmd.run: - name: chkconfig --add redis && chkconfig redis on #設置服務開機啟動 - unless: chkconfig --list | grep redis #如果已經在chkconfig --list列表就不執行上一步驟 service.running: #這是服務啟動 - name: redis - enable: True - watch: #監控的文件 - file: redis-config - require: 服務啟動依賴 redis-install和redis-service - cmd: redis-install - cmd: redis-service
三:redis數據類型格式
1、字符串數據格式
SET: 設置key,設置的值都是字符串格式string:
GET: 獲取key的值:
KEYS: 顯示所有的key
EXISTS: 判斷key是否存在:返回1表示存在,0表示不存在
DEL: 刪除指定的key:返回0表示沒有指定的key可以刪除,返回其他整數表示成功刪除的key的數量,沒有的key不報錯
TYPE: 獲取key的類型
INFO: 當前服務器的狀態
SELECT: 更換數據庫,redis默認支持16個數據庫,默認在數據庫0,可以使用sekect 進行更換數據庫
FLUSHALL: 清空整個數據庫
APPEND:追加
INCR:自增,如果key不存在就創建並設置value默認為1
DECR:自減,value自減1:
INCRBY :指定自增value的整數值:
DECRBY:指定自減value的值:
INCRBYFLOAT :設置浮點數的value
MSET 和 MGET:批量創建和獲取key
STRLEN:獲取key字符串的長度
2、散列數據類型:
HSET:命令用於為哈希表中的字段賦值,如果哈希表不存在,一個新的哈希表被創建並進行 HSET 操作,如果字段已經存在於哈希表中,舊值將被覆蓋
HGET:獲取key:
HGETALL:獲取key的所有值
HMSET、HMGET、HMGETALL:批量創建、批量獲取並獲取所有的key:
HDEL:刪除指定的key
3、列表數據類型
不同的數據類型的命令是不通用的,如list與string的命令是不能通用的。出了set命令之外
LPUSH:從左側添加
RPUSH:從右側添加
LLEN:獲取列表的長度:
LPOP:從左側彈出列表中的值
RPOP:從右側彈出列表中的值
LINDEX:獲取最後一個元素:
LRANGE :獲取指定範圍的元素
4、集合數據類型的操作
集合默認是無序的,列表是有序的,有序是只按照添加的循序保持位置
SADD:創建並給集合賦值
SMEMBERS:獲取集合中的所有值
SISMEMBER:判斷一個值是不是在集合當中,在返回1,否則返回0
SDIFF:求兩個集合的差集:
SINTER:求並集,即在多個集合當中共同包含的值,可以是多個集合
SUNION:求並集,即在每個元素都出現的值只統計一次
ZADD:創建有序隊列,保持值的位置固定
ZSCORE:獲取值的分數
ZRANGE:根據值的分數排序獲取值
四、持久化
redis支持兩種持久化,分別是rdb和aof
rdb:指定的時間內快照存放在本地
aof: 將所有執行過的命令保存在本地,這種方式更像mysql的binlog
在服務器宕機時,如果是快照的方式,數據將會丟失一部分,而aof則損失的較小,並且在後臺會進行重寫
save 900 1 #900秒以內有1個key發生變化就快照 save 300 10 #300秒以內有10個key發生變化就快照 save 60 10000 #60秒內有10000個key變化就快照 rdbcompression yes #持久化到RDB文件時,是否壓縮,“yes”為壓縮,“no”則反之 rdbchecksum yes #讀取和寫入的時候是否支持CRC64校驗,默認是開啟的 dbfilename dump.rdb #保存的文件的名稱 dir /usr/local/redis #快照文件的保存路徑
SAVE:阻塞保存
BGSAVE:在後臺保存,不阻塞
使用AOF進行持久化:
appendonly yes #默認為no,改為yes appendfilename "appendonly.aof" #保存的文件名,路徑為rdb指定的file目錄
五、Redis主從
一個主服務器可以有多個從服務器,而且從服務器也可以有主服務器,主從復制時非阻塞的,通過fork主進程主服務器收到從服務器的sync命令,就在後臺執行bgsave,執行完畢後將保持的rdb文件發給客戶端,客戶端收到後將rdb載入到內存,新版本的支持增量備份
在從服務器執行命令:
SLAVEOF 192.168.4.100 6379 #主服務器的地址和端口
查看從服務器的info信息
六、Redis集群:
1、簡介
四種大方案:
1)客戶端分片,優勢是比較靈活,不存在單點故障,缺點是添加節點需要重新配置,數據要手動同步
2)代理:代理分片,有proxy代理取數據,可以為proxy配置算法,如Twemproxy
3)Redis Cluster:在3.0版本以後支持,無中心,在某種情況下會造成數據丟失
4)Coodis:豌豆莢的開源方案
2、配置集群
使用redis cluster:
需要至少6個機器,3主3從,下面創建8個客戶端,另外2個做備用
先將配置文件復制到/opt,然後創建8個目錄並生成8個不同端口、不同pid和不同rdb文件的redis.conf配置文件:
cd /opt/ mkdir `seq 7001 7008` cp /etc/redis/6379.conf . sed ‘s/6379/7001/g‘ 6379.conf >> 7001/redis.conf sed ‘s/7001/7002/g‘ 6379.conf >> 7002/redis.conf sed ‘s/7002/7003/g‘ 6379.conf >> 7003/redis.conf sed ‘s/7003/7004/g‘ 6379.conf >> 7004/redis.conf sed ‘s/7004/7005/g‘ 6379.conf >> 7005/redis.conf sed ‘s/7005/7006/g‘ 6379.conf >> 7006/redis.conf sed ‘s/7006/7007/g‘ 6379.conf >> 7007/redis.conf sed ‘s/7007/7008/g‘ 6379.conf >> 7008/redis.conf
批量啟動redis:
for i in `seq 7001 7008`;do cd /opt/$i && /usr/local/redis/bin/redis-server /opt/$i/redis.conf;done
netstat -lntp|grep :700*
安裝ruby管理工具:
yum install ruby rubygems -y
gem install redis
復制ruby的管理腳本:
cp /root/redis-3.0.7/src/redis-trib.rb /usr/local/bin/redis-trib #是一個ruby腳本,方便redis管理
創建集群:
redis-trib help redis-trib create --replicas 1 192.168.10.205:7001 192.168.10.205:7002 192.168.10.205:7003 192.168.10.205:7004 192.168.10.205:7005 192.168.10.205:7006
M: 9db0386330f3d66d0c7cac48dbf2dda1972c96c4 192.168.10.205:7001 #ID及IP和端口 slots:0-5460 (5461 slots) master #本機對應的分片位置,0-5460
插入的數據是輪訓寫入到各個redis server
集群操作:
cluster nodes #列出當前的主從
cluster info #當前的狀態
向集群中添加節點:
redis-trib add-node 192.168.10.205:7007 192.168.10.205:7001 redis-trib add-node 要添加的節點和端口 添加到的目的節點和端口
添加主機以後需要重新分片:
redis-trib reshard 192.168.10.205:7007
七、Redis的管理工具
1)phpredisadmin工具
2)rdbtools管理工具
3)saltstack管理redis
4)通過codis完成redis管理
1、phpredisadmin工具
類似於mysqladmin管理mysql一樣
安裝部署
1、安裝環境: yum install httpd php php-redis -y 2、下載管理包: git clone https://github.com/erikdubbelboer/phpRedisAdmin.git 3、更改名稱並解決依賴: mv phpRedisAdmin admin cd admin git clone https://github.com/nrk/predis.git vendor #解決依賴包 4、啟動http服務 /etc/init.d/httpd restart 5、訪問 http://192.168.4.100/admin:
報錯解決:
cd /var/www/html/admin/includes/ vim config.inc.php ‘name‘ => ‘7001‘, #名稱 ‘host‘ => ‘192.168.10.205‘, #配置為自己的主機IP ‘port‘ => 7001, vim /var/www/html/admin/includes/common.inc.php #mb_internal_encoding(‘utf-8‘); 將此行改為註釋
可以配置多個reids Server
2、rdbtools管理工具:
安裝部署
yum install python-pip pip install rdbtools https://github.com/sripathikrishnan/redis-rdb-tools cd /opt/7001/ rdb -c memory dump_7001.rdb > memory.csv #然後將memory.csv文件下載到本地,即可用excel打開分析了
databases,key,大小,格式,長度,如下所示:
3、通過saltstack管理redis:
模塊名稱:redismod
官方文檔地址:https://docs.saltstack.com/en/latest/ref/modules/all/index.html
4、通過codis完成redis管理:
codis簡介:
豌豆莢,快速分布式緩存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.
安裝部署
1、安裝go語言並設置環境變量: yum install golang -y #codis是基於go語言編寫的,因此要安裝go語言環境 mkdir /opt/gopath #保存go環境的路徑 vim /etc/profile export GOPATH=/opt/gopath source /etc/profile
2、安裝配置zookeeper,需要有java環境: wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz mv zookeeper-3.4.6 /usr/local/zookeeper cd /usr/local/zookeeper/conf/ cp zoo_sample.cfg /opt/zoo.cfg #復制配置文件 cd /opt/ mkdir zk1 zk2 zk3 #準備zookeeper 服務ID,每個服務器的ID是不同的 echo 1 > zk1/myid echo 2 > zk2/myid cho 3 > zk3/myid vim zoo.cfg #編輯配置文件
dataDir=/opt/zk1 #保存數據的命令
clientPort=2181 #客戶端連接的端口 server.1 = 192.168.10.205:2887:3887 server.2 = 192.168.10.205:2888:3888 server.3 = 192.168.10.205:2889:3889
cp zoo.cfg zk1/zk1.cfg cp zoo.cfg zk2/zk2.cfg cp zoo.cfg zk3/zk3.cfg vim zk2/zk2.cfg #每個服務對應不同的目錄
dataDir=/opt/zk2
clientPort=2182 vim zk3/zk3.cfg
dataDir=/opt/zk3
clientPort=2183
啟動每個zookeeper 服務:
/usr/local/zookeeper/bin/zkServer.sh start /opt/zk1/zk1.cfg /usr/local/zookeeper/bin/zkServer.sh start /opt/zk2/zk2.cfg /usr/local/zookeeper/bin/zkServer.sh start /opt/zk3/zk3.cfg
查看每個節點的狀態:
/usr/local/zookeeper/bin/zkServer.sh status /opt/zk1/zk1.cfg /usr/local/zookeeper/bin/zkServer.sh status /opt/zk2/zk2.cfg /usr/local/zookeeper/bin/zkServer.sh status /opt/zk3/zk3.cfg
連接到zookeeper節點:
/usr/local/zookeeper/bin/zkCli.sh -server 192.168.10.205:2181
學習Redis(六)