redis服务的部署
一、介紹
中文官網
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 復制(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。
1.redis與memcache
(1) redis可以用來做存儲(storge)、而memcache是來做緩存(cache)。這個特點主要是因為其有“持久化”功能
(2)存儲的數據有“結構”,對于memcache來說,存儲的數據,只有一種類型—>“字符串”,而redis則可以存儲字符串、鏈表、集合、有序集合、哈序結構
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 過程中可能會有依賴性問題,根據報錯解決即可gcc-c++ jemalloc-3.6.0-1.el6.x86_64.rpm jemalloc-devel-3.6.0-1.el6.x86_64.rpm找到對應的包下載即可,如果解決了依賴性仍然報錯的話,請刪除重新解壓再進行make [root@server1 redis-5.0.8]# cd utils/ [root@server1 utils]# ./install_server.sh ##自動生成配置文件等信息,全部回車即可
從上圖中可以看出redis的配置文件
修改主配置文件,默認在/etc/redis/6379.conf 修改, 修改監聽接口為0.0.0.0
三、redis常用指令:
| config get * | //查看配置 |
| select 1 | //選擇數據庫 |
| flushdb | //清空當前數據庫 |
| flushall | //清空所有數據庫 |
| move key 1 | //移動key |
| del key | //刪除 |
| rename oldkey newkey | //改名 |
| expire key 10 | //設置過期時間 |
| persist key | //設置持久化 |
| keys user* | //查詢 |
| exists key | //判斷是否存在 |
redis-cli 是Redis命令行界面,這是一個簡單的程序,它允許直接從終端向Redis發送命令并讀取服務器發送的回復。
默認情況下redis-cli,該服務器通過127.0.0.1端口6379連接到服務器。您可以猜測,可以使用命令行選項輕松更改此設置。要指定其他主機名或IP地址,請使用-h。為了設置其他端口,請使用-p。交互式
四、redis 的主從復制
Redis使用默認的異步復制,其特點是低延遲和高性能,是絕大多數 Redis 用例的自然復制模式。但是,從 Redis 服務器會異步地確認其從主 Redis 服務器周期接收到的數據量。
Redis 使用異步復制,slave 和 master 之間異步地確認處理的數據量,一個 master 可以擁有多個 slave
測試
我們可以看出在server1中輸入的鍵值在server2中可以get到,所以實現主從關系
五、redis 的高可用
1.介紹
Redis 的 Sentinel 系統用于管理多個 Redis 服務器(instance), 該系統執行以下三個任務:
監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級為新的主服務器, 并讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。
2.配置Sentinel
開啟第三臺虛擬機server3,同樣的方法進行redis配置
其中server1作為master server2和server3作為slave;
第一行配置指示 Sentinel 去監視一個名為 mymaster 的主服務器, 這個主服務器的 IP 地址為 172.25.1.1, 端口號為 6379 , 而將這個主服務器判斷為失效至少需要 2 個 Sentinel 同意 (只要同意 Sentinel 的數量不達標,自動故障遷移就不會執行)。
指定當主服務器掉線10秒就會被認定為服務失效
3.啟動 Sentinel
對于 redis-sentinel 程序, 你可以用以下命令來啟動 Sentinel 系統:
對于 redis-server 程序, 你可以用以下命令來啟動一個運行在 Sentinel 模式下的 Redis 服務器:
在三臺機子上都執行以下命令來啟動sentinel服務,查看效果
redis-sentinel /etc/redis/sentinel.conf ##保持這個頁面不能推出,可以遠程連接到serve1上查看 [root@server1 ~]# redis-cli 127.0.0.1:6379> SHUTDOWN這是我們查看info,master已經是server2了,并且當原來的master.server1開啟之后也不會再跳回去,server1自動變成slave
4.主觀下線和客觀下線
主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 實例對服務器做出的下線判斷。
客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 實例在對同一個服務器做出 SDOWN 判斷, 并且通過 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服務器下線判斷。 (一個 Sentinel 可以通過向另一個 Sentinel 發送 SENTINEL is-master-down-by-addr 命令來詢問對方是否認為給定的服務器已下線。)
如果一個服務器沒有在 master-down-after-milliseconds 選項所指定的時間內, 對向它發送 PING 命令的 Sentinel 返回一個有效回復(valid reply), 那么 Sentinel 就會將這個服務器標記為主觀下線。
服務器對 PING 命令的有效回復可以是以下三種回復的其中一種:
返回 +PONG 。
返回 -LOADING 錯誤。
返回 -MASTERDOWN 錯誤。
客觀下線條件只適用于主服務器: 對于任何其他類型的 Redis 實例, Sentinel 在將它們判斷為下線前不需要進行協商, 所以從服務器或者其他 Sentinel 永遠不會達到客觀下線條件。
只要一個 Sentinel 發現某個主服務器進入了客觀下線狀態, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 并對失效的主服務器執行自動故障遷移操作。
六、redis集群
1.Redis集群介紹
Redis 集群是一個提供在多個Redis間節點間共享數據的程序集。
Redis集群并不支持處理多個keys的命令,因為這需要在不同的節點間移動數據,從而達不到像Redis那樣的性能,在高負載的情況下可能會導致不可預料的錯誤.
Redis 集群通過分區來提供一定程度的可用性,在實際環境中當某個節點宕機或者不可達的情況下繼續處理命令. Redis 集群的優勢:
- 自動分割數據到不同的節點上。
- 整個集群的部分節點失敗或者不可達的情況下能夠繼續處理命令。
2.搭建并使用集群
(1)創建實例
搭建集群的第一件事情我們需要一些運行在 集群模式的Redis實例. 這意味這集群并不是由一些普通的Redis實例組成的,集群模式需要通過配置啟用,開啟集群模式后的Redis實例便可以使用集群特有的命令和特性了。
首先, 讓我們進入一個新目錄, 并創建六個以端口號為名字的子目錄, 稍后我們在將每個目錄中運行一個 Redis 實例: 命令如下:
cd /usr/local/ mkdir redis cd redis mkdir 7000 mkdir 700{1..6}在文件夾 7000 至 7006中, 各創建一個 redis.conf 文件, 文件的內容可以使用上面的示例配置文件, 但記得將配置中的端口號從 7000 改為與文件夾名字相同的號碼。
下面是一個最少選項的集群的配置文件:
[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 選項用于開實例的集群模式, 而 cluster-conf-file 選項則設定了保存節點配置文件的路徑, 默認值為 nodes.conf.節點配置文件無須人為修改, 它由 Redis 集群在啟動時創建, 并在有需要時自動進行更新。
要讓集群正常運作至少需要三個主節點,不過在剛開始試用集群功能時, 強烈建議使用六個節點: 其中三個為主節點, 而其余三個則是各個主節點的從節點。
打開實例
[root@server1 7000]# redis-server redis.conf用ps ax 查看進程,查看cluster是否創建成功
(2) 搭建集群
現在我們已經有了7正在運行中的 Redis 實例, 接下來我們需要使用這些實例來創建集群, 并為每個節點編寫配置文件。
通過使用 Redis 集群命令行工具 redis-trib , 編寫節點配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源碼的 src 文件夾中, 它是一個 Ruby 程序, 這個程序通過向實例發送特殊命令來完成創建新集群, 檢查集群, 或者對集群進行重新分片(reshared)等工作。
這個命令在這里用于創建一個新的集群, 選項–replicas 1 表示我們希望為集群中的每個主節點創建一個從節點。
之后跟著的其他參數則是這個集群實例的地址列表,3個master3個slave redis-trib 會打印出一份預想中的配置給你看, 如果你覺得沒問題的話, 就可以輸入 yes , redis-trib 就會將這份配置應用到集群當中,讓各個節點開始互相通訊,最后可以得到如下信息:
這表示集群中的 16384 個槽都有至少一個主節點在處理, 集群運作正常。
3.使用集群
測試 Redis 集群比較簡單的 redis-cli , 接下來我們將使用 redis-cli 為例來進行演示:
三主信息
七、結合數據庫
部署和之前一樣,可看文章開頭部署。
這里用到server1 server2 server3
以下實驗所以需要的包鏈接: 需要的軟件包及依賴 提取碼: 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的結果緩存到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';
到這里,我們已經實現了 redis 作為 mysql 的緩存服務器,但是如果更新了 mysql,redis
中仍然會有對應的 KEY,數據就不會更新,此時就會出現 mysql 和 redis 數據不一致的情
況。所以接下來就要通過 mysql 觸發器將改變的數據同步到 redis 中。
更新完數據庫如何實現同步redis
配置 gearman 實現數據同步
Gearman 是一個支持分布式的任務分發框架:
Gearman Job Server: Gearman 核心程序,需要編譯安裝并以守護進程形式運行在后臺。
Gearman Client:可以理解為任務的請求者。
Gearman Worker:任務的真正執行者,一般需要自己編寫具體邏輯并通過守護進程方式
運行,Gearman Worker 接收到 Gearman Client 傳遞的任務內容后,會按順序處理。
大致流程:
下面要編寫的 mysql 觸發器,就相當于 Gearman 的客戶端。修改表,插入表就相當于直接
下發任務。然后通過 lib_mysqludf_json UDF 庫函數將關系數據映射為 JSON 格式,然后
在通過 gearman-mysql-udf 插件將任務加入到 Gearman 的任務隊列中,最后通過
redis_worker.php,也就是 Gearman 的 worker 端來完成 redis 數據庫的更新。
安裝 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啟動服務:
[root@server1 ~]# systemctl start gearmand安裝 lib_mysqludf_json
lib_mysqludf_json UDF 庫函數將關系數據映射為 JSON 格式。通常,數據庫中的數據映
射為 JSON 格式,是通過程序來轉換的。
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/注冊UDF函數
MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';查看函數:
MariaDB [(none)]> select * from mysql.func;安裝 gearman-mysql-udf
這個插件是用來管理調用 Gearman 的分布式的隊列。
https://launchpad.net/gearman-mysql-udf
注冊UDF函數
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';查看函數:
MariaDB [(none)]> select * from mysql.func;指定 gearman 的服務信息
[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 觸發器(根據實際情況編寫)
[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查看觸發器:
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); } ?>后臺運行 worker
[root@server1 ~]# nohup php worker.php &更新 mysql 中的數據
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>總結
以上是生活随笔為你收集整理的redis服务的部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codis安装与部署
- 下一篇: zabbix的安装与部署(proxy、睿