企业 redis配置

redis

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
它的读速度可以达到10000次/s,写速度5000次/s,可见通过内存来进行的读写速度是要比数据库每次从硬盘读写来的快,这样就可以将热点数据缓存在内存上通过redis使用户更快的获取到信息

redis配置

下载

redis是有中文官网的,可以在上面直接去下载
http://www.redis.cn/
在这里插入图片描述
在这里插入图片描述
经测试5.0.5版本执行make命令时会出现报错问题,所以可以去使用wget下载5.0.3版本的使用
下载后解压 redis-5.0.3.tar.gz ,切换到 redis-5.0.3 目录下,执行make
在这里插入图片描述
make‘执行没有问题,然后执行 make install 安装
在这里插入图片描述
这样就完成安装了,启用脚本在这个目录下的 utils/install_server.sh
执行这个标本去开启服务
在这里插入图片描述
执行后对里面的问题都可以直接回车确认,都选择默认的就可以

[root@server5 redis-5.0.3]# ./utils/install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 	#选择redis的端口,直接回车使用默认的6379
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] #选择配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] #选择日志文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] #选择数据目录
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] #选择命令执行路径
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

开启后它的默认监听是只对本机生效,所以还需要更改配置文件
在这里插入图片描述
将配置文件/etc/redis/6379.conf里的 bind 127.0.0.1 改为 0.0.0.0 开放对所有端口的监听
在这里插入图片描述
保存退出重启服务:/etc/init.d/redis_6379 restart
再查看就可以看到改为了0.0.0.0
在这里插入图片描述

服务部署配置

这里需要的测试主机有3台
我分别使用的是
server5 172.25.254.5
server6 172.25.254.6
server7 172.25.254.7
在server5和server6上都安装并配置好redis服务

主从复制

使用server5作为主节点,配置server6为从节点
编辑server6的redis配置文件,在最后写入一条配置

slaveof 172.25.254.5 6379	#指定它为172.25.254.5的slave节点

在这里插入图片描述
保存退出,重启redis服务

测试主从复制
在server5上

[root@server5 redis-5.0.3]# redis-cli	#开启redis
127.0.0.1:6379> set name redhat			#设置一个名称
OK
127.0.0.1:6379> get name				#查看
"redhat"

然后再server6上也去查看

[root@server6 redis-5.0.3]# redis-cli
127.0.0.1:6379> get name	#也是可以同步看到的
"redhat"
127.0.0.1:6379> set name test	#但是作为slave节点它只有查看的权限,没有写权限
(error) READONLY You can't write against a read only replica.

redis高可用配置

可以在官网的文档看直接去看说明等等,因为它有中文官网所以还是比较好理解的
在这里插入图片描述
可以看到它的 Sentinel 就类似 MySQL的MHA,也是当主节点发生故障时帮你自动更换从节点为主节点
实现配置,这里需要第三台主机服务,配置server7的redis服务和前面两台一样
这样我们就实现了一主二从的集群,主节点位server5,server6和server7是从节点
在主节点server5上的 redis-5.0.3 里有 sentinel.conf 这个配置文件,复制到/etc/redis/
在这里插入图片描述
编辑 /etc/redis/sentinel.conf
关闭保护模式
在这里插入图片描述
将监控的主机改为主节点的ip,最后的数字表示的是投票机制,意义为当至少有两个slave节点认为master节点不能正常工作时进行节点切换
在这里插入图片描述
设置执行切换的时间,默认时间是30s,为了操作快速设置为10s
在这里插入图片描述
在master节点启动Sentinel,启动方法官方文档也有说明
在这里插入图片描述

[root@server5 redis-5.0.3]# redis-server /etc/redis/sentinel.conf --sentinel	#开启命令
                                    
28864:X 19 May 2020 07:28:56.866 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
28864:X 19 May 2020 07:28:56.867 # Sentinel ID is f21365444ab91f35b77d330c5c7ce41ac206d32d	#成功开启会有一个ID号
28864:X 19 May 2020 07:28:56.867 # +monitor master mymaster 172.25.254.5 6379 quorum 2	#监视的主机和投票机制
28864:X 19 May 2020 07:28:56.868 * +slave slave 172.25.254.6:6379 172.25.254.6 6379 @ mymaster 172.25.254.5 6379	#slave节点
28864:X 19 May 2020 07:28:56.869 * +slave slave 172.25.254.7:6379 172.25.254.7 6379 @ mymaster 172.25.254.5 6379	#slave节点

在两台slave节点上做同样的配置文件的复制和修改,开启Sentinel,在master上就可以实时看到开启的信息
在这里插入图片描述
通过master节点进入redis查看信息

[root@server5 redis-5.0.3]# redis-cli
127.0.0.1:6379> info

# Replication
role:master		#当前的自己的角色是master
connected_slaves:2	#从节点有两台
slave0:ip=172.25.254.6,port=6379,state=online,offset=73305,lag=1
slave1:ip=172.25.254.7,port=6379,state=online,offset=73305,lag=1

通过master节点进入Sentinel查看信息,Sentinel 的端口是26379在配置文件里都有写

[root@server5 redis-5.0.3]# redis-cli -p 26379
127.0.0.1:26379> info

# Sentinel
master0:name=mymaster,status=ok,address=172.25.254.5:6379,slaves=2,sentinels=3	
#slave有两台,sentinel有3台

测试sentinel ,简单操作直接关闭server5的redis

[root@server5 redis-5.0.3]# redis-cli
127.0.0.1:6379> shutdown

看sentinel 的操作日志

21902:X 19 May 2020 07:46:35.254 # +sdown master mymaster 172.25.254.5 6379	#mater节点down了
21902:X 19 May 2020 07:46:36.070 # +switch-master mymaster 172.25.254.5 6379 172.25.254.7 6379 更换server7为新的master
21902:X 19 May 2020 07:46:36.070 * +slave slave 172.25.254.6:6379 172.25.254.6 6379 @ mymaster 172.25.254.7 6379	#添加slave节点
21902:X 19 May 2020 07:46:36.070 * +slave slave 172.25.254.5:6379 172.25.254.5 6379 @ mymaster 172.25.254.7 6379

当server5再开启redis服务时,就会成为slave节点

redis集群

redis的集群官方的建议是在一台主机上开实例的集群模式。
官方的介绍是,Redis 集群有16384个哈希槽,把这些哈希槽平均给所有的master节点,如果是3个那每个就分得5500个。
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。
首先, 让我们进入一个新目录, 并创建六个以端口号为名字的子目录, 稍后我们在将每个目录中运行一个 Redis 实例:
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
在这里插入图片描述
为每个目录下都写入配置文件:例7000目录 vim 7000/redis.conf

port 7000	#端口号
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/cluster-test/7000/redis.pid"	#pid文件
logfile "/usr/local/cluster-test/7000/redis.log"	#日志文件
daemonize yes	#后台运行
dir "/usr/local/cluster-test/7000"	#工作目录

其他几个目录的配置文件也是这样写,将端口号等更改即可
写完配置后,开始开启端口,依然使用官方文档里的方法
在这里插入图片描述
开启7000端口

[root@server5 7000]# redis-server redis.conf 	#开启端口
[root@server5 7000]# ps -ax
 29910 ?        Ssl    0:00 redis-server *:7000 [cluster]

其他的端口同样方法开启
在这里插入图片描述
配置集群
它的配置方式是
在这里插入图片描述
但是现在的redis-trib.rb 已经被 redis-cli 替代,所以现在的命令是用redis-cli

[root@server5 cluster-test]# 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

执行后,前面是M的是master节点,S是slave节点,输入yes继续
在这里插入图片描述
完成配置,登录7000端口,执行set name ,可以看到它写入的位置在7001的哈希槽上
在这里插入图片描述
并且其他所有节点都可以看到这个写入的数据,从7001的哈希槽上
在这里插入图片描述
并且可以查看到这3个master节点都各自有一个slave节点,我们刚写入的key值存在7001上,如果7001和它的slave节点都没了,那这个key值也就失去了
在这里插入图片描述

集群添加新服务端口
新建两个端口7006和7007,添加配置文件开启这两个端口
在这里插入图片描述
在这里插入图片描述
添加这两个服务端口到集群中

[root@server5 cluster-test]# redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 #指定要添加的端口,并且指定一个存在的端口

使用7006端口进入redis命令行查看集群里的端口状态
7006是成为了一个master节点,但是它没有自己的从节点,也没有分配到哈希槽,因为哈希槽数量是一定的,已经在之前创建集群是分配完了

[root@server5 cluster-test]# redis-cli -c -p 7006
127.0.0.1:7006> cluster nodes
97e9d661c5dfd213a7dd03da8710a267b0226dcd 127.0.0.1:7003@17003 slave 3543e8128e468dde54e9e1e9ae3434cb7cba92fc 0 1589908884000 1 connected
48d9bf303de43ab710f3585aa9e134a2cdb6b4a4 127.0.0.1:7004@17004 slave 220e83f7d30ba8414e912c2d4de4c9d0c62d3c97 0 1589908883000 2 connected
3543e8128e468dde54e9e1e9ae3434cb7cba92fc 127.0.0.1:7000@17000 master - 0 1589908883336 1 connected 0-5460
220e83f7d30ba8414e912c2d4de4c9d0c62d3c97 127.0.0.1:7001@17001 master - 0 1589908883000 2 connected 5461-10922
5e02809a4cd23a426b0724446e9b7d2e476e4a3b 127.0.0.1:7005@17005 slave 58dff282c3a7f8a5f43de16b1abcabe350395ee4 0 1589908883536 3 connected
58dff282c3a7f8a5f43de16b1abcabe350395ee4 127.0.0.1:7002@17002 master - 0 1589908884542 3 connected 10923-16383
11fb27b448c0e0d464b63807d6a973971cb7231b 127.0.0.1:7006@17006 myself,master - 0 1589908882000 0 connected 	

所以我们需要给它分配哈希槽,并且添加一个slave节点。将7007作为它slave节点添加进去

[root@server5 cluster-test]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7006 --cluster-slave --cluster-master-id 11fb27b448c0e0d464b63807d6a973971cb7231b
# --cluster-slave 指定为slave节点
# --cluster-master-id 为这个slave节点指定master的id,id号在上面我们查看信息里就有

在这里插入图片描述
分配哈希槽

[root@server5 cluster-test]# redis-cli --cluster reshard 127.0.0.1:7006
>>> Performing Cluster Check (using node 127.0.0.1:7006)
。。。。
How many slots do you want to move (from 1 to 16384)? 1000	#指定需要分配在的哈希槽个数
What is the receiving node ID? 11fb27b448c0e0d464b63807d6a973971cb7231b	#指定需要分配哈希槽的节点的id
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all	#选择从所有有哈希槽的节点上取出一部分

可以看到7006的哈希槽是从其他的master节点取出来的,分布比较分散
在这里插入图片描述
划分哈希槽后可以看到其他的主节点上都是5018个哈希槽,这样我们可以使用重新均衡来重新划分哈希槽,是所有的主节点哈希槽都是一样的均分

[root@server5 cluster-test]# redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7006

[root@server5 cluster-test]# redis-cli --cluster check 127.0.0.1:7006
M: 11fb27b448c0e0d464b63807d6a973971cb7231b 127.0.0.1:7006
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
M: 3543e8128e468dde54e9e1e9ae3434cb7cba92fc 127.0.0.1:7000
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: 220e83f7d30ba8414e912c2d4de4c9d0c62d3c97 127.0.0.1:7001
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
M: 58dff282c3a7f8a5f43de16b1abcabe350395ee4 127.0.0.1:7002
   slots:[12288-16383] (4096 slots) master

这样划完后,所有的节点上哈希槽都是4096个。

redis 数据缓存

redis在首次接受请求查看数据时,如果没有回去从mysql中缓存数据过来,之后再接受到相同的请求就会直接从redis里返回数据,加快用户访问,减少MySQL服务器的压力
配置方式:使用3台服务主机
server5 配置 nginx 对外开放访问;
server6 配置redis;
server7 配置MySQL。

server5 配置 nginx

编译安装nginx
更改配置文件,添加可以访问php的页面
在这里插入图片描述
在这里插入图片描述
打开php的模块配置
在这里插入图片描述
配置完成开启nginx,测试访问
在这里插入图片描述
下来安装php,这里除了安装php还需要安装一系列的插件

gearmand-1.1.12-18.el7.x86_64.rpm
libevent-devel-2.0.21-4.el7.x86_64.rpm
libgearman-1.1.12-18.el7.x86_64.rpm
libgearman-devel-1.1.12-18.el7.x86_64.rpm
libzip-0.10.1-8.el7.x86_64.rpm
openssl-1.0.2k-16.el7.x86_64.rpm
openssl-libs-1.0.2k-16.el7.x86_64.rpm
php-cli-5.4.16-46.el7.x86_64.rpm
php-common-5.4.16-46.el7.x86_64.rpm
php-fpm-5.4.16-46.el7.x86_64.rpm
php-mysql-5.4.16-46.el7.x86_64.rpm
php-pdo-5.4.16-46.el7.x86_64.rpm
php-pecl-gearman-1.1.2-1.el7.x86_64.rpm
php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm
php-pecl-redis-2.2.8-1.el7.x86_64.rpm
php-process-5.4.16-46.el7.x86_64.rpm
php-xml-5.4.16-46.el7.x86_64.rpm

安装完成后启动php
在这里插入图片描述
写入一个index.php的测试页面,放入/usr/local/nginx/html/
测试访问数据test表时,先通过redis服务器,如果没有数据就去MySQL服务器加载数据

<?php
        $redis = new Redis();
        $redis->connect('172.25.254.6',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.254.7','redis','He1234..');
                        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>";
        }
?>
server6 配置 redis

安装redis,在配置文件里/etc/redis/6379.conf ,将监听端口的开放为所有地址
在这里插入图片描述
重启服务

server7 配置 MySQL

安装MySQL服务,安全初始化
登录数据库建立test库,建立redis用户并授权对test库的操作,刷新授权表

mysql> create database test;
mysql> grant all on test.* to redis@'%' identified by 'He1234..';
mysql> flush privileges;

导入需要测试使用的sql数据信息

[root@server7 ~]# cat 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');

[root@server7 ~]# mysql -pHe1234.. < test.sql 
测试服务

测试服务时需要注意配置3台主机的火墙信息,或关闭火墙,并且在nginx服务主机上将selinux设为警告模式
使用浏览器访问地址
第一次看到信息使用mysql上查看到的,之后的都是从redis上看到的信息
在这里插入图片描述
这样我们就配置完成了redis数据缓存服务,可以快速的为用户访问完成数据信息的反馈

gearmand

但是这样的配置存在缺陷,就是当我们的mysql服务器数据更新时,redis缓存并不会自动同步,还需要手动去清除数据重新缓存
在这里插入图片描述
在这里插入图片描述
gearmand我们在上面配置php的时候一起安装上了
gearmand-1.1.12-18.el7.x86_64.rpm
php-pecl-gearman-1.1.2-1.el7.x86_64.rpm
所以直接再server5上打开gearmand
在这里插入图片描述
并且它开启了4730端口
在这里插入图片描述
可以在它的官网上看详细信息 http://gearman.org/
再去网上下载 udf函数 为数据库服务器安装
lib_mysqludf_json-master.zip,因为这些都是c语言写的可以在网上找到大神写的这些文件来使用
解压进入这个文件目录
在这里插入图片描述
这里为了方便测试我是用的是mariadb数据库,并且安装mariadb-devel开发工具
安装mariadb-server,并开启进行安全初始化,同样执行上面对server7数据库的配置
然后编译lib_mysqludf_json-master里的文件

[root@server7 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) --shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

[root@server7 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/	#编译完后将文件放入MySQL的插件目录里

登录数据库就可以查看到这个插件目录
在这里插入图片描述
注册udf函数

MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

然后安装gearmand在server7上
安装gearmand库文件
在这里插入图片描述
解压 gearman-mysql-udf-0.6.tar.gz 程序文件,进入目录编译

[root@server7 ~]# tar xfz gearman-mysql-udf-0.6.tar.gz

[root@server7 ~]# cd gearman-mysql-udf-0.6/
[root@server7 gearman-mysql-udf-0.6]# ./configure --libdir=/usr/lib64/mysql/plugin --with-mysql	#编译

[root@server7 gearman-mysql-udf-0.6]# make && make install	#安装

完成后再登录数据库,注册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;	#查看注册的插件
+--------------------+-----+-------------------------+----------+
| name               | ret | dl                      | type     |
+--------------------+-----+-------------------------+----------+
| json_object        |   0 | lib_mysqludf_json.so    | function |
| gman_do_background |   0 | libgearman_mysql_udf.so | function |
| gman_servers_set   |   0 | libgearman_mysql_udf.so | function |
+--------------------+-----+-------------------------+----------+
3 rows in set (0.00 sec)

MariaDB [(none)]> select gman_servers_set('172.25.254.5:4730');	#配置工作端的IP和端口
+---------------------------------------+
| gman_servers_set('172.25.254.5:4730') |
+---------------------------------------+
| 172.25.254.5:4730                     |
+---------------------------------------+
1 row in set (0.00 sec)	

导入触发器,编写一个sql语句文件,导入:mysql -pHe1234… < 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 ;

这样就完成了数据库的gearmand的服务配置

再到server5里配置触发的php文件,在/usr/local/里写一个work.php文件

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('172.25.254.6', 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);
}
?>

编写文件后,后台运行

[root@server5 local]# nohup php worker.php &> /dev/null &

测试,首先在server7数据库中我们更新一个数据信息

MariaDB [test]> update test set name='redhat' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [test]> select * from test
    -> ;
+----+--------+
| id | name   |
+----+--------+
|  1 | redhat |
|  2 | test2  |
|  3 | test3  |
|  4 | test4  |
|  5 | test5  |
|  6 | test6  |
|  7 | test7  |
|  8 | test8  |
|  9 | test9  |
+----+--------+
9 rows in set (0.00 sec)

再使用浏览器访问nginx服务器,就可以看到内容也自动更新了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Howei__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值