一、簡介
存儲系統背景
存儲系統有三類:
RDBMS
oracle,dh2,postgresql,mysql,sql server
NoSQL:
KV NoSQL:redis,memcached
列式Column Family NoSQL: HBase,每一行每一字段可以保留n份,也是按照字段存儲
文檔Documentation NoSQL: MongoDB
圖式Graph NoSQL: Neo4j
NewSQL
aerospike,foundationDB,rethinkDB...
1、什么是redis
redis是一個開源的使用ANSI C 語言編寫、支持網絡、可基於內存即可持久化的日志型,key-value數據庫(是一個key-value存儲系統),支持多種語言的API
它是一個高級key-value數據庫,跟memcached類似,但是redis的數據可以持久化,並且支持數據類型更豐富,同時還支持服務端的計算集合的並、交、和補集等,支持多種排序功能。
2、特點:
常用來和memcache做比較,但redis是nosql,基於key-value(鍵值)的數據結構的存儲,可以存儲鍵值,字典,圖表
完全工作在內存中,數據保存在內存,性能不錯,數據周期性備份到硬盤,(持久化)的單線程服務器
可以通過lua腳本擴展
支持sentinel主從架構高可用
分布式
3、性能
雖然是單線程,kv是一個單純簡單的存儲cpu通常不會形成瓶頸的,官方測試50個並發請求10w次,寫的速度是110000次/s,讀的速度是81000次/s,讀寫大小為256bytes的字符串;
4、持久化persistence
RDB: snapshot,二進制格式;按事先定制的策略,周期性地將數據保存至磁盤;數據文件默認為dump.rdb;
客戶端也可顯式使用SAVA或BGSAVE命令啟動快照保存機制;
SAVE: 同步,在主線程中保存快照;此時會阻塞所有客戶端請求;
BGSAVE:異步,
AOF:Append Only File
記錄每一次寫操作至指定的文件尾部實現持久化;當redis重啟時,可通過重新執行文件中的命令在內存重建數據庫;
BGREWRITEAOF:AOF文件重寫;
不會讀取正在使用AOF文件,而通過將內存中的數據以命令的方式保存到臨時文件中,完成之后替換原來的AOF文件;
5、是一個數據結構服務器它支持的value類型有:
String字符串, List鏈表, Hash哈希, Set集合, Sorted Set有序集合, Bitmap, HyperLoglog
Strings:
SET key value [EX #] [NX|XX]
GET
INCR
DECR
EXIST
Lists:
LPUSH
RPUSH
LPOP
RPOP
LINDEX
LSET
Sets:
SADD
SINTER
SUNION
SPOP
SISMEMBER
Sorted Sets:
ZADD
ZRANGE
ZCARD
ZRANK
Hashes:
HSET
HSETNX
HGET
HKEYS
HVALS
HDEL
Bitmaps, HyperLogLog
6、守護進程
監聽端口為6379/tcp
7、數據庫對比
常見數據庫功能對比
名稱 | 數據庫類型 | 數據存儲選項 | 操作類型 | 備注 |
redis | 內存存儲,nosql數據庫 | 支持字符串、列表、集合、散列標、有序集合 | 增、刪、修改、更新 | 支持分布式存儲,主從同步及高可用,單線程 |
memcached | 內存緩存數據庫 | 鍵值之間得映射 | 增、刪、修改、更新 | 支持多線程 |
mysql | 典型關系數據庫,RDBMS | 數據庫由多表組成,每張表包含多行 | 增、刪、修改、更新 | 支持ACID性質 |
postgresql | 典型關系數據庫,RDBMS | 數據庫由多表組成,每張表包含多行 | 增、刪、修改、更新 | 支持ACID性質 |
mongodb | 硬盤存儲,nosql數據庫 | 數據庫包含多個表 | 增、刪、修改、更新 | 主從復制,分片,副本集、空間索引 |
8、簡述和memcached之間的對比
redis不僅僅支持簡單的kv類型數據,還支持list,set,hash等數據結構
redis支持數據備份
redis支持數據持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以在加載使用
集群,memcache不支持集群,多台memcache 共處
9、redis的master/slave復制:
支持一個master多個slave
slave可以介紹其他slave的鏈接來替代他鏈接master
復制在master是非阻塞的,在slave是阻塞的
復制被利用來提供擴展性,在slave端只提供查詢功能及數據的冗余
10、應用場景
緩存(數據查詢,短連接、新聞內容、商品內容等)
分布式集群架構中session分離
聊天室在線好友列表
任務隊列(秒殺、搶購、12306)
應用排行
網站訪問統計
數據統計
為了解決高並發、高可用、高可擴展,大數據存儲等一系列問題而產生的數據庫解決方案
二、主從復制工作機制
redis持久化解決了redis服務重啟后能夠將硬盤的持久化數據恢復到內存中,但當redis服務器硬盤壞掉就會導致數據丟失,為了避免這種單點故障就有了主從復制工作機制
一主多從結構
主從復制不會阻塞master,在同步數據時,master可以繼續處理client請求
一個redis即可以是主也可以是從
三、多實例redis配置
1、下載軟件及安裝源
http://download.redis.io/releases/redis-5.0.4.tar.gz
如果源碼安裝下載源碼
如果yum安裝請配置源
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
2、安裝有兩種安裝方式
1)、yum安裝
直接yum install redis
systemctl enable redis
systemctl start redis
Dependencies Resolved #一些依賴 ==================================================================================================================== Package Arch Version Repository Size ==================================================================================================================== Installing: redis x86_64 3.2.12-2.el7 epel 544 k Installing for dependencies: jemalloc x86_64 3.6.0-1.el7 epel 105 k Transaction Summary ==================================================================================================================== Install 1 Package (+1 Dependent package)
Complete! [root@web1 ~]# systemctl start redis [root@web1 ~]# systemctl enable redis Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service. [root@web1 ~]# netstat -untlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/redis-server 1 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2050/nginx: master tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2176/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 879/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2035/master tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 2050/nginx: master tcp6 0 0 :::22 :::* LISTEN 875/sshd tcp6 0 0 ::1:631 :::* LISTEN 879/cupsd tcp6 0 0 ::1:25 :::* LISTEN 2035/master udp 0 0 0.0.0.0:5353 0.0.0.0:* 574/avahi-daemon: r udp 0 0 127.0.0.1:323 0.0.0.0:* 2334/chronyd udp 0 0 0.0.0.0:52822 0.0.0.0:* 574/avahi-daemon: r udp 0 0 192.168.122.1:53 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:177 0.0.0.0:* 890/lightdm udp6 0 0 ::1:323 :::* 2334/chronyd udp6 0 0 :::177 :::* 890/lightdm [root@web1 ~]#
2)、編譯安裝
解壓-->編譯-->copy-->啟動
這次編譯安裝一個新版本 mkdir /data cd /data #上傳下載的包到此目錄 redis-5.0.4.tar.gz tar redis-5.0.4.tar.gz cd rredis-5.0.4 make
3、編譯安裝及啟動
1)創建文件夾及拷貝關鍵文件
mkdir /data/redis2 cp redis.conf /data/redis2 cp src/redis-server /data/redis2 cd /data/redis2/
2)編輯配置文件
因為有#號開的行可以先過濾掉
sed -ri '/#|^$/d' redis.conf
開始編輯配置文件,修改下面幾項
vim redis.conf
port 6380 //監聽端口
appendonly no yes //日志開關,不是包報錯的日志,是二進制,記錄數據變化
pidfile /var/run/redis_6380.pid //pid名字 logfile "/data/redis2/redis.log" //log日志 daemonize yes //后台啟動
dbfilename dump.rbd //持久化數據文件
3)啟動
標紅的就是一個yum安裝的實例,一個編譯安裝的實例,這個就是多實例了
[root@web1 redis2]# ./redis-server ./redis.conf [root@web1 redis2]# netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/redis-server 1 tcp 0 0 192.168.216.51:6380 0.0.0.0:* LISTEN 15434/./redis-serve tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2050/nginx: master tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2176/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 879/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2035/master tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 2050/nginx: master tcp6 0 0 :::22 :::* LISTEN 875/sshd tcp6 0 0 ::1:631 :::* LISTEN 879/cupsd tcp6 0 0 ::1:25 :::* LISTEN 2035/master udp 0 0 0.0.0.0:5353 0.0.0.0:* 574/avahi-daemon: r udp 0 0 127.0.0.1:323 0.0.0.0:* 2334/chronyd udp 0 0 0.0.0.0:52822 0.0.0.0:* 574/avahi-daemon: r udp 0 0 192.168.122.1:53 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:177 0.0.0.0:* 890/lightdm udp6 0 0 ::1:323 :::* 2334/chronyd udp6 0 0 :::177 :::* 890/lightdm [root@web1 redis2]#
4)變量,賦值取值,正常關閉,非正常的關閉
[root@web1 redis2]# redis-cli -h 192.168.216.51 -p 6380 192.168.216.51:6380> 192.168.216.51:6380> 192.168.216.51:6380> 192.168.216.51:6380> set home zxg //賦值 OK192.168.216.51:6380> get home //取值 "zxg" 192.168.216.51:6380> get abc 123 (error) ERR wrong number of arguments for 'get' command 192.168.216.51:6380> set abc 123 OK 192.168.216.51:6380> get abc "123"192.168.216.51:6380> KEYS * //查看所有的key 1) "abc" 2) "home" 192.168.216.51:6380>
192.168.216.51:6380> SHUTDOWN //正常關閉,非正常關閉就是kill了
四、主從配置
1、配置從服務器
redis主從配置非常簡單,只需要把從服務器改一個配置即可
vim redis.conf
slaveof 192.168.216.51 6379
2、啟動服務
[root@web2 ~]# systemctl start redis
[root@web2 ~]# systemctl enable redis
3、查看主從狀態測試結果
[root@web1 redis2]# redis-cli -h 192.168.216.51 -p 6379 192.168.216.51:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=192.168.216.52,port=6379,state=online,offset=99,lag=0 master_repl_offset:99 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:98 192.168.216.51:6379>
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.216.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:253
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
127.0.0.1:6379>
注意1:從服務器只讀
master新建key test zxg
192.168.216.51:6379> set test zxg OK 192.168.216.51:6379> get test "zxg" 192.168.216.51:6379>
slave查看有沒有值
127.0.0.1:6379> get test "zxg" 127.0.0.1:6379>
轉載請注明出處:https://www.cnblogs.com/zhangxingeng/p/10743476.html