一、redis安裝配置
實驗環境為三臺主機,其中server1為master端,server2,3為slave,均安裝redis,首先準備redis安裝包
tar zxf redis-6.2.1.tar.gz
cd redis-6.2.1
make
make install
./install_server.sh
發現安裝失敗,提示使用systemd

注釋掉安裝檔案的systemd
vim /root/redis-6.2.1/utils/install_server.sh

重新安裝,成功

啟動redis
/etc/init.d/redis_6379 start
二、redis主從復制
server1,添加master網段
vim /etc/redis/6379.conf

重新啟動
/etc/init.d/redis_6379 restart
redis-cli

server2,server3組態檔
vim /etc/redis/6379.conf

server1查看slave數量
info

三、sentinel分布式監控
當集群某節點出現故障,可以進行故障轉移操作
server1修改sentinel檔案,指向主機master端
cp /root/redis-6.2.1/sentinel.conf /etc/red
cd /etc/redis/
vim sentinel.conf


將該組態檔傳給兩臺slave,三臺機器均開始監控
redis-sentinel /etc/redis/sentinel.conf


模擬master端故障,可以看到master切換
redis-cli
SHUTDOWN

server2端查看info

重啟server1后變為slave

四、redis集群cluster
雖然做了主從復制,但單個master的容量受機器記憶體限制,往往要做集群來提升容量,
redis集群特點:
- 去中心化,不存在中心節點或者代理節點
- 沒有統一的入口,集群內部的節點是相互通信的(PING-PONG機制),每個節點都是一個redis實體
- redis-cluster 投票容錯機制判斷節點是否能夠正常使用,少數過半判斷節點down掉則判定節點down
- 哈希槽:集群內置了16384個slot(哈希槽),將所有的物理節點映射到了這16384[0-16383]個slot上,或者說把這些slot均等的分配給了各個節點,注意:當任意一個節點掛掉后,集群將無法使用
- redis集群最多有16384個節點
1、手動創建集群
創建集群目錄
cd /usr/local/
mkdir cluster
cd cluster
mkdir 7000 7001 7002 7003 7004 7005
編輯各個節點組態檔
cd 7000
vim redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
啟動集群
redis-server redis.conf
ps ax

以此類推,各節點編輯同樣的組態檔,啟動

安裝tcl, 創建集群并配對
yum install tcl
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

測驗
redis-cli -c -p 7000

重新啟動集群需要進入指定集群目錄!!!
關掉其中的一個master,集群會自動分配
redis-cli --cluster check 127.0.0.1:7000

重新啟動后變為slave

2、腳本創建
生成集群
cd /root/redis-6.2.1/utils/create-cluster
./create-cluster start

集群配對
./create-cluster create

五、redis結合mysql
1.mysql與redis不實時同步
需要三臺主機,由于前面的實驗server2成為了master,其余節點變為slave
server1,3中查看系統檔案
vim .bash_profile
source .bash_profile

server3作為資料庫,若有已存在的資料庫,關閉,安裝MariaDB資料庫
/etc/init.d/mysqld stop
yum install -y mariadb-server
修改組態檔,啟動
vim /etc/my.cnf
systemctl start mariadb

撰寫一個測驗檔案,匯入mysql中
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 ;
mysql < test.sql
使用該資料庫

在server1中,安裝php-fpm (需從網上下載)httpd psmisc
yum install -y php-fpm httpd psmic
cd /etc/php-fpm.d/
關閉上次實驗開啟的集群
killall redis-server

撰寫test.php,連接master與資料庫
<?php
$redis = new Redis();
$redis->connect('172.25.34.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.34.3','redis','westos');
mysql_select_db(test);
$result = mysql_query($query);
//如果沒有找到$key,就將該查詢sql的結果快取到redis
while ($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>";
}
?>
server3授權
grant all on test.* to redis@'%' identified by 'westos';

將test.php放在apache發布目錄下,開啟httpd服務,測驗訪問172.25.34.1/test.php

server2的redis中,同步資料

重繪網頁

2.配置gearman實作mysql與redis實時同步
gearman是支持分布式任務分發的框架,運行在后臺
在server3上gearman安裝步驟:
準備lib_mysqludf_json-master.zip檔案,解壓并進入解壓后的目錄
unzip lib_mysqludf_json-master.zip
cd lib_mysqludf_json-master/
安裝mariadb開發包
yum install -y mariadb-devel
重新編譯
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

將編譯好的檔案復制到/usr/lib64/mysql/plugin/
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
模塊目錄可在資料庫查看
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

注冊udf函式
CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

server1中,安裝gearman,開啟并查看埠
systemctl start gearmand
netstat -antlp|grep :4730

server3中,制定路徑解壓安裝gearman
tar zxf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6/
./configure --libdir=/usr/lib64/plugin
發現需要依賴性

安裝相關依賴性libevent-devel libgearman.x86_64 libgearman-devel,重新編譯gearman
./configure --libdir=/usr/lib64/plugin --with-mysql=/usr/bin/mysql_config
make && make install
進入mysql
CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';

查看

撰寫觸發器,輸入資料庫
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 ;
mysql < test.sql
進入資料庫查看觸發器
SHOW TRIGGERS FROM test;

也可以這樣看
SHOW TRIGGERS FROM test\G;

server1撰寫worker.php,指向master
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
$redis = new Redis();
$redis->connect('172.25.34.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);
}
?>
打入后臺運行
nohup php worker.php &

進入server3資料庫,更新名稱為redhat
use test;
update test set name='redhat' where id=1;
進入網頁查看更新

在server2查看更新

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/301717.html
標籤:其他
下一篇:centOS7 安裝nginx
