redis服务的部署
一、介紹
中文官網(wǎng)
Redis 是一個(gè)開源(BSD許可)的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),它可以用作數(shù)據(jù)庫、緩存和消息中間件。 它支持多種類型的數(shù)據(jù)結(jié)構(gòu),如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內(nèi)置了 復(fù)制(replication),LUA腳本(Lua scripting), LRU驅(qū)動(dòng)事件(LRU eviction),事務(wù)(transactions) 和不同級(jí)別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel)和自動(dòng) 分區(qū)(Cluster)提供高可用性(high availability)。
1.redis與memcache
(1) redis可以用來做存儲(chǔ)(storge)、而memcache是來做緩存(cache)。這個(gè)特點(diǎn)主要是因?yàn)槠溆小俺志没惫δ?/p>
(2)存儲(chǔ)的數(shù)據(jù)有“結(jié)構(gòu)”,對(duì)于memcache來說,存儲(chǔ)的數(shù)據(jù),只有一種類型—>“字符串”,而redis則可以存儲(chǔ)字符串、鏈表、集合、有序集合、哈序結(jié)構(gòu)
2.
二、安裝
2.1 redis 各版本下載地址
https://redis.io/download
2.2 下載、解壓并安裝redis
[root@server1 ~]# tar zxf redis-5.0.8.tar.gz [root@server1 ~]# cd redis-5.0.8 [root@server1 redis-5.0.8]# make && make install make 過程中可能會(huì)有依賴性問題,根據(jù)報(bào)錯(cuò)解決即可gcc-c++ jemalloc-3.6.0-1.el6.x86_64.rpm jemalloc-devel-3.6.0-1.el6.x86_64.rpm找到對(duì)應(yīng)的包下載即可,如果解決了依賴性仍然報(bào)錯(cuò)的話,請(qǐng)刪除重新解壓再進(jìn)行make [root@server1 redis-5.0.8]# cd utils/ [root@server1 utils]# ./install_server.sh ##自動(dòng)生成配置文件等信息,全部回車即可
從上圖中可以看出redis的配置文件
修改主配置文件,默認(rèn)在/etc/redis/6379.conf 修改, 修改監(jiān)聽接口為0.0.0.0
三、redis常用指令:
| config get * | //查看配置 |
| select 1 | //選擇數(shù)據(jù)庫 |
| flushdb | //清空當(dāng)前數(shù)據(jù)庫 |
| flushall | //清空所有數(shù)據(jù)庫 |
| move key 1 | //移動(dòng)key |
| del key | //刪除 |
| rename oldkey newkey | //改名 |
| expire key 10 | //設(shè)置過期時(shí)間 |
| persist key | //設(shè)置持久化 |
| keys user* | //查詢 |
| exists key | //判斷是否存在 |
redis-cli 是Redis命令行界面,這是一個(gè)簡(jiǎn)單的程序,它允許直接從終端向Redis發(fā)送命令并讀取服務(wù)器發(fā)送的回復(fù)。
默認(rèn)情況下redis-cli,該服務(wù)器通過127.0.0.1端口6379連接到服務(wù)器。您可以猜測(cè),可以使用命令行選項(xiàng)輕松更改此設(shè)置。要指定其他主機(jī)名或IP地址,請(qǐng)使用-h。為了設(shè)置其他端口,請(qǐng)使用-p。交互式
四、redis 的主從復(fù)制
Redis使用默認(rèn)的異步復(fù)制,其特點(diǎn)是低延遲和高性能,是絕大多數(shù) Redis 用例的自然復(fù)制模式。但是,從 Redis 服務(wù)器會(huì)異步地確認(rèn)其從主 Redis 服務(wù)器周期接收到的數(shù)據(jù)量。
Redis 使用異步復(fù)制,slave 和 master 之間異步地確認(rèn)處理的數(shù)據(jù)量,一個(gè) master 可以擁有多個(gè) slave
測(cè)試
我們可以看出在server1中輸入的鍵值在server2中可以get到,所以實(shí)現(xiàn)主從關(guān)系
五、redis 的高可用
1.介紹
Redis 的 Sentinel 系統(tǒng)用于管理多個(gè) Redis 服務(wù)器(instance), 該系統(tǒng)執(zhí)行以下三個(gè)任務(wù):
監(jiān)控(Monitoring): Sentinel 會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。
提醒(Notification): 當(dāng)被監(jiān)控的某個(gè) Redis 服務(wù)器出現(xiàn)問題時(shí), Sentinel 可以通過 API 向管理員或者其他應(yīng)用程序發(fā)送通知。
自動(dòng)故障遷移(Automatic failover): 當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí), Sentinel 會(huì)開始一次自動(dòng)故障遷移操作, 它會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器, 并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器; 當(dāng)客戶端試圖連接失效的主服務(wù)器時(shí), 集群也會(huì)向客戶端返回新主服務(wù)器的地址, 使得集群可以使用新主服務(wù)器代替失效服務(wù)器。
2.配置Sentinel
開啟第三臺(tái)虛擬機(jī)server3,同樣的方法進(jìn)行redis配置
其中server1作為master server2和server3作為slave;
第一行配置指示 Sentinel 去監(jiān)視一個(gè)名為 mymaster 的主服務(wù)器, 這個(gè)主服務(wù)器的 IP 地址為 172.25.1.1, 端口號(hào)為 6379 , 而將這個(gè)主服務(wù)器判斷為失效至少需要 2 個(gè) Sentinel 同意 (只要同意 Sentinel 的數(shù)量不達(dá)標(biāo),自動(dòng)故障遷移就不會(huì)執(zhí)行)。
指定當(dāng)主服務(wù)器掉線10秒就會(huì)被認(rèn)定為服務(wù)失效
3.啟動(dòng) Sentinel
對(duì)于 redis-sentinel 程序, 你可以用以下命令來啟動(dòng) Sentinel 系統(tǒng):
對(duì)于 redis-server 程序, 你可以用以下命令來啟動(dòng)一個(gè)運(yùn)行在 Sentinel 模式下的 Redis 服務(wù)器:
在三臺(tái)機(jī)子上都執(zhí)行以下命令來啟動(dòng)sentinel服務(wù),查看效果
redis-sentinel /etc/redis/sentinel.conf ##保持這個(gè)頁面不能推出,可以遠(yuǎn)程連接到serve1上查看 [root@server1 ~]# redis-cli 127.0.0.1:6379> SHUTDOWN這是我們查看info,master已經(jīng)是server2了,并且當(dāng)原來的master.server1開啟之后也不會(huì)再跳回去,server1自動(dòng)變成slave
4.主觀下線和客觀下線
主觀下線(Subjectively Down, 簡(jiǎn)稱 SDOWN)指的是單個(gè) Sentinel 實(shí)例對(duì)服務(wù)器做出的下線判斷。
客觀下線(Objectively Down, 簡(jiǎn)稱 ODOWN)指的是多個(gè) Sentinel 實(shí)例在對(duì)同一個(gè)服務(wù)器做出 SDOWN 判斷, 并且通過 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服務(wù)器下線判斷。 (一個(gè) Sentinel 可以通過向另一個(gè) Sentinel 發(fā)送 SENTINEL is-master-down-by-addr 命令來詢問對(duì)方是否認(rèn)為給定的服務(wù)器已下線。)
如果一個(gè)服務(wù)器沒有在 master-down-after-milliseconds 選項(xiàng)所指定的時(shí)間內(nèi), 對(duì)向它發(fā)送 PING 命令的 Sentinel 返回一個(gè)有效回復(fù)(valid reply), 那么 Sentinel 就會(huì)將這個(gè)服務(wù)器標(biāo)記為主觀下線。
服務(wù)器對(duì) PING 命令的有效回復(fù)可以是以下三種回復(fù)的其中一種:
返回 +PONG 。
返回 -LOADING 錯(cuò)誤。
返回 -MASTERDOWN 錯(cuò)誤。
客觀下線條件只適用于主服務(wù)器: 對(duì)于任何其他類型的 Redis 實(shí)例, Sentinel 在將它們判斷為下線前不需要進(jìn)行協(xié)商, 所以從服務(wù)器或者其他 Sentinel 永遠(yuǎn)不會(huì)達(dá)到客觀下線條件。
只要一個(gè) Sentinel 發(fā)現(xiàn)某個(gè)主服務(wù)器進(jìn)入了客觀下線狀態(tài), 這個(gè) Sentinel 就可能會(huì)被其他 Sentinel 推選出, 并對(duì)失效的主服務(wù)器執(zhí)行自動(dòng)故障遷移操作。
六、redis集群
1.Redis集群介紹
Redis 集群是一個(gè)提供在多個(gè)Redis間節(jié)點(diǎn)間共享數(shù)據(jù)的程序集。
Redis集群并不支持處理多個(gè)keys的命令,因?yàn)檫@需要在不同的節(jié)點(diǎn)間移動(dòng)數(shù)據(jù),從而達(dá)不到像Redis那樣的性能,在高負(fù)載的情況下可能會(huì)導(dǎo)致不可預(yù)料的錯(cuò)誤.
Redis 集群通過分區(qū)來提供一定程度的可用性,在實(shí)際環(huán)境中當(dāng)某個(gè)節(jié)點(diǎn)宕機(jī)或者不可達(dá)的情況下繼續(xù)處理命令. Redis 集群的優(yōu)勢(shì):
- 自動(dòng)分割數(shù)據(jù)到不同的節(jié)點(diǎn)上。
- 整個(gè)集群的部分節(jié)點(diǎn)失敗或者不可達(dá)的情況下能夠繼續(xù)處理命令。
2.搭建并使用集群
(1)創(chuàng)建實(shí)例
搭建集群的第一件事情我們需要一些運(yùn)行在 集群模式的Redis實(shí)例. 這意味這集群并不是由一些普通的Redis實(shí)例組成的,集群模式需要通過配置啟用,開啟集群模式后的Redis實(shí)例便可以使用集群特有的命令和特性了。
首先, 讓我們進(jìn)入一個(gè)新目錄, 并創(chuàng)建六個(gè)以端口號(hào)為名字的子目錄, 稍后我們?cè)趯⒚總€(gè)目錄中運(yùn)行一個(gè) Redis 實(shí)例: 命令如下:
cd /usr/local/ mkdir redis cd redis mkdir 7000 mkdir 700{1..6}在文件夾 7000 至 7006中, 各創(chuàng)建一個(gè) redis.conf 文件, 文件的內(nèi)容可以使用上面的示例配置文件, 但記得將配置中的端口號(hào)從 7000 改為與文件夾名字相同的號(hào)碼。
下面是一個(gè)最少選項(xiàng)的集群的配置文件:
[root@server1 ~]# cd 7000/ [root@server1 7000]# vim redis.conf port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes daemonize yes文件中的 cluster-enabled 選項(xiàng)用于開實(shí)例的集群模式, 而 cluster-conf-file 選項(xiàng)則設(shè)定了保存節(jié)點(diǎn)配置文件的路徑, 默認(rèn)值為 nodes.conf.節(jié)點(diǎn)配置文件無須人為修改, 它由 Redis 集群在啟動(dòng)時(shí)創(chuàng)建, 并在有需要時(shí)自動(dòng)進(jìn)行更新。
要讓集群正常運(yùn)作至少需要三個(gè)主節(jié)點(diǎn),不過在剛開始試用集群功能時(shí), 強(qiáng)烈建議使用六個(gè)節(jié)點(diǎn): 其中三個(gè)為主節(jié)點(diǎn), 而其余三個(gè)則是各個(gè)主節(jié)點(diǎn)的從節(jié)點(diǎn)。
打開實(shí)例
[root@server1 7000]# redis-server redis.conf用ps ax 查看進(jìn)程,查看cluster是否創(chuàng)建成功
(2) 搭建集群
現(xiàn)在我們已經(jīng)有了7正在運(yùn)行中的 Redis 實(shí)例, 接下來我們需要使用這些實(shí)例來創(chuàng)建集群, 并為每個(gè)節(jié)點(diǎn)編寫配置文件。
通過使用 Redis 集群命令行工具 redis-trib , 編寫節(jié)點(diǎn)配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源碼的 src 文件夾中, 它是一個(gè) Ruby 程序, 這個(gè)程序通過向?qū)嵗l(fā)送特殊命令來完成創(chuàng)建新集群, 檢查集群, 或者對(duì)集群進(jìn)行重新分片(reshared)等工作。
這個(gè)命令在這里用于創(chuàng)建一個(gè)新的集群, 選項(xiàng)–replicas 1 表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。
之后跟著的其他參數(shù)則是這個(gè)集群實(shí)例的地址列表,3個(gè)master3個(gè)slave redis-trib 會(huì)打印出一份預(yù)想中的配置給你看, 如果你覺得沒問題的話, 就可以輸入 yes , redis-trib 就會(huì)將這份配置應(yīng)用到集群當(dāng)中,讓各個(gè)節(jié)點(diǎn)開始互相通訊,最后可以得到如下信息:
這表示集群中的 16384 個(gè)槽都有至少一個(gè)主節(jié)點(diǎn)在處理, 集群運(yùn)作正常。
3.使用集群
測(cè)試 Redis 集群比較簡(jiǎn)單的 redis-cli , 接下來我們將使用 redis-cli 為例來進(jìn)行演示:
三主信息
七、結(jié)合數(shù)據(jù)庫
部署和之前一樣,可看文章開頭部署。
這里用到server1 server2 server3
以下實(shí)驗(yàn)所以需要的包鏈接: 需要的軟件包及依賴 提取碼: hend
[root@server2 ~]# tar zxf redis-5.0.8.tar.gz [root@server2 ~]# cd redis-5.0.8/ [root@server2 redis-5.0.8]# yum install gcc-c++ -y [root@server2 redis-5.0.8]# make & make install [root@server2 utils]# ./install_server.shserver1
root@server1 ~]# yum install -y httpd php php-mysql.x86_64 php-redis [root@server1 ~]# cd /var/www/html/ get test.php [root@server1 html]# vim test.php <?php$redis = new Redis();$redis->connect('172.25.3.2',6379) or die ("could net connect redis server");# $query = "select * from test limit 9";$query = "select * from test";for ($key = 1; $key < 10; $key++){if (!$redis->get($key)){$connect = mysql_connect('172.25.3.3','redis','westos');mysql_select_db(test);$result = mysql_query($query);//如果沒有找到$key,就將該查詢sql的結(jié)果緩存到rediswhile ($row = mysql_fetch_assoc($result)){$redis->set($row['id'],$row['name']);}$myserver = 'mysql';break;}else{$myserver = "redis";$data[$key] = $redis->get($key);}}echo $myserver;echo "<br>";for ($key = 1; $key < 10; $key++){echo "number is <b><font color=#FF0000>$key</font></b>";echo "<br>";echo "name is <b><font color=#FF0000>$data[$key]</font></b>";echo "<br>";} ?> [root@server1 html]# systemctl start httpd.service get php-devel-5.4.16-46.el7.x86_64.rpm [root@server1 html]# yum install php-devel-5.4.16-46.el7.x86_64.rpm -y mirror rhel7 [root@server1 ~]# cd rhel7/ [root@server1 rhel7]# yum install php-pecl-redis-2.2.8-1.el7.x86_64.rpm php-fpm-5.4.16-46.el7.x86_64.rpm php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm -yserver3:mysql
[root@server3 ~]# yum install mariadb-server -y [root@server3 ~]# systemctl start mariadb.service get test.sql [root@server3 ~]# vim test.sql use test; CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');#DELIMITER $$ #CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN # SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`)); # END$$ #DELIMITER ; [root@server3 ~]# mysql < test.sql [root@server3 ~]# mysql grant all on test.* to redis@'%' identified by 'westos';
到這里,我們已經(jīng)實(shí)現(xiàn)了 redis 作為 mysql 的緩存服務(wù)器,但是如果更新了 mysql,redis
中仍然會(huì)有對(duì)應(yīng)的 KEY,數(shù)據(jù)就不會(huì)更新,此時(shí)就會(huì)出現(xiàn) mysql 和 redis 數(shù)據(jù)不一致的情
況。所以接下來就要通過 mysql 觸發(fā)器將改變的數(shù)據(jù)同步到 redis 中。
更新完數(shù)據(jù)庫如何實(shí)現(xiàn)同步redis
配置 gearman 實(shí)現(xiàn)數(shù)據(jù)同步
Gearman 是一個(gè)支持分布式的任務(wù)分發(fā)框架:
Gearman Job Server: Gearman 核心程序,需要編譯安裝并以守護(hù)進(jìn)程形式運(yùn)行在后臺(tái)。
Gearman Client:可以理解為任務(wù)的請(qǐng)求者。
Gearman Worker:任務(wù)的真正執(zhí)行者,一般需要自己編寫具體邏輯并通過守護(hù)進(jìn)程方式
運(yùn)行,Gearman Worker 接收到 Gearman Client 傳遞的任務(wù)內(nèi)容后,會(huì)按順序處理。
大致流程:
下面要編寫的 mysql 觸發(fā)器,就相當(dāng)于 Gearman 的客戶端。修改表,插入表就相當(dāng)于直接
下發(fā)任務(wù)。然后通過 lib_mysqludf_json UDF 庫函數(shù)將關(guān)系數(shù)據(jù)映射為 JSON 格式,然后
在通過 gearman-mysql-udf 插件將任務(wù)加入到 Gearman 的任務(wù)隊(duì)列中,最后通過
redis_worker.php,也就是 Gearman 的 worker 端來完成 redis 數(shù)據(jù)庫的更新。
安裝 gearman 軟件包:
[root@server1 rhel7]# yum install libgearman-* libevent-devel-2.0.21-4.el7.x86_64.rpm gearmand-1.1.12-18.el7.x86_64.rpm php-pecl-gearman-1.1.2-1.el7.x86_64.rpm -y啟動(dòng)服務(wù):
[root@server1 ~]# systemctl start gearmand安裝 lib_mysqludf_json
lib_mysqludf_json UDF 庫函數(shù)將關(guān)系數(shù)據(jù)映射為 JSON 格式。通常,數(shù)據(jù)庫中的數(shù)據(jù)映
射為 JSON 格式,是通過程序來轉(zhuǎn)換的。
server3
get lib_mysqludf_json-master.zip [root@server3 ~]# yum install unzip -y [root@server3 ~]# unzip lib_mysqludf_json-master.zip [root@server3 ~]# yum install mariadb-devel -y [root@server3 ~]# yum install gcc -y [root@server3 ~]# cd lib_mysqludf_json-master/ [root@server3 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c查看mysql的模塊目錄:
[root@server3 lib_mysqludf_json-master]# mysql MariaDB [(none)]> show global variables like 'plugin_dir';拷貝 lib_mysqludf_json.so 模塊:
[root@server3 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/注冊(cè)UDF函數(shù)
MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';查看函數(shù):
MariaDB [(none)]> select * from mysql.func;安裝 gearman-mysql-udf
這個(gè)插件是用來管理調(diào)用 Gearman 的分布式的隊(duì)列。
https://launchpad.net/gearman-mysql-udf
注冊(cè)UDF函數(shù)
MariaDB [(none)]> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so'; MariaDB [(none)]> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';查看函數(shù):
MariaDB [(none)]> select * from mysql.func;指定 gearman 的服務(wù)信息
[root@server3 ~]# yum install gearmand-1.1.12-18.el7.x86_64.rpm -y [root@server3 ~]# systemctl start gearmand.service root@server1 ~]# yum install gearmand-1.1.12-18.el7.x86_64.rpm -y [root@server3 ~]# mysql MariaDB [(none)]> SELECT gman_servers_set('172.25.3.1:4730');編寫 mysql 觸發(fā)器(根據(jù)實(shí)際情況編寫)
[root@server3 ~]# vim test.sql use test; DELIMITER $$ CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`)); END$$ DELIMITER ; [root@server3 ~]# mysql < test.sql查看觸發(fā)器:
MariaDB [(none)]> SHOW TRIGGERS FROM test;編寫 gearman 的 worker 端
[root@server1 ~]# cat worker.php <?php $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction('syncToRedis', 'syncToRedis');$redis = new Redis(); $redis->connect('172.25.3.2', 6379);while($worker->work()); function syncToRedis($job) {global $redis;$workString = $job->workload();$work = json_decode($workString);if(!isset($work->id)){return false;}$redis->set($work->id, $work->name); } ?>后臺(tái)運(yùn)行 worker
[root@server1 ~]# nohup php worker.php &更新 mysql 中的數(shù)據(jù)
MariaDB [(none)]> update test.test set name='hello' where id=1;查看redis
[root@server2 utils]# redis-cli 127.0.0.1:6379> get 1 "hello" 127.0.0.1:6379>總結(jié)
以上是生活随笔為你收集整理的redis服务的部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codis安装与部署
- 下一篇: zabbix的安装与部署(proxy、睿