redis原理及叢集主從配置
一、簡介
儲存系統背景
儲存系統有三類:
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;
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