文章目录
1 Memcached应用实战配置
环境规划
首先关闭防火墙,同步时间
systemctl stop firewalld
yum install ntp ntpdate -y
ntpdate cn.pool.ntp.org
hwclock --systohc
1.web 服务器配置
在192.168.74.151上安装软件,启动服务
检查http端口是否为80
vim /etc/httpd/conf/httpd.conf
安装数据库软件,如未安装请参考Centos安装mysql数据库
安装lnmp环境
yum install httpd php php-gb php-mysql php-memcache
启动apache服务
systemctl restart httpd
stemctl enable httpd
2.在mysql服务端创建用户(192.168.74.138)
mysql8.0中默认的身份认证插件是caching_sha2_password,替代了之前的mysql_navtive_password
create user 'memcache'@'%' identified by 'Nebula@123';
ALTER USER'memcache'@'%' IDENTIFIED WITH mysql_native_password BY 'Nebula@123';
flush privileges
检查mysql用户表中有刚才创建的用户信息
select user,host,plugin from mysql.user;
测试http功能
vim /var/www/html/index.html
测试PHP测试功能
vim /var/www/html/index.php
在这里可以发现php链接是正常的.接下来,我们来测试mysql
连接mysql使用MySQL服务端的IP地址,之前创建好的memcache用户名和对相应的密码,若连接正常,返回success,失败则返回fail!!
vim /var/www/html/mysql.php
<?php
$link=mysql_connect(‘192.168.74.138:3306','memcache',‘Nebula@123');
if($link);
else echo "Fail!!";
echo "<h1>Success!!</h1>";
mysql_close();
?>
通过测试,可见MySQL数据库是可以正常链接的。
如果数据库连接失败,可以查看
tail -f /var/log/httpd/error_log
错误日志进行改正
3.memcache 服务配置
yum安装
Linux系统安装memcached,首先要先安装依赖库。
yum install gcc gcc-c++ libevent-devel
安装memcahched
yum install memcached
启动memcached
memcached -u root -p 11211 -vv
这里显示了调试信息。这样就在前台启动了memcached,监听TCP端口11211。调试信息的内容大部分是关于存储的信息。
Memcached 连接
telnet localhost 11211
测试web和memcache的连通性
修改客户端监听所有地址
注意:先杀死之前创建的memcached进程
memcached -d -l 0.0.0.0 -p 11211 -u root -m 64 -c 1024 -P /var/run/memcached.pid
Web服务器(192.168.74.151)做
代码测试
这里的IP地址为memcached端,和他的端口号
vim /var/www/html/memcache.php
<?php $memcache = new Memcache; $memcache->connect('192.168.74.150', 11211) or die ("Could not connect"); $version = $memcache->getVersion(); echo "Server's version: ".$version."
"; $tmp_object = new stdClass; $tmp_object->str_attr = 'test'; $tmp_object->int_attr = 123; $memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server"); echo "Store data in the cache (data will expire in 10 seconds)
"; $get_result = $memcache->get('key'); echo "Data from the cache:
"; var_dump($get_result); ?>
配置session(web端192.168.74.151)
vim /etc/php.ini
// 把这段放在最下面即可,IP地址为memcache端地址
session.save_handler = memcache
session.save_path =“tcp://192.168.74.150:11211?persistent=1&weight=1&timeout=1&retry_interval=15”
测试memcached的可用性
vim /var/www/html/memcached1.php
"; echo "now_time:".time()."
"; echo "session_id:".session_id()."
"; ?>
在mysql端数据库节点(192.168.74.138)上创建测试数据库
create database testab1;
use testab1;
create table test1(id int not null auto_increment,name varchar(20) default null,primary key(id)) engine=innodb auto_increment=1 default charset=utf8;
insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');
对memcache用户赋予库testab1的查看权限
grant select on testab1.* to memcache@'%';
web端
"; echo "$key"; echo "
"; //print_r($data); foreach($data as $a) { echo "number is $a[id]"; echo "
"; echo "name is $a[name]"; echo "
"; } ?>
memcache监控
请参考文章memcached管理与监控web工具
2 Redis
Redis 是当前互联网世界最为流行的 NoSQL(Not Only SQL)数据库。NoSQL 在互联网系统中的作用很大,因为它可以在很大程度上提高互联网系统的性能。
Redis 具备一定持久层的功能,也可以作为一种缓存工具。对于 NoSQL 数据库而言,作为持久层,它存储的数据是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。对于那些结构化、多范式规则的数据库系统而言,它更具性能优势。作为缓存,它可以支持大数据存入内存中,只要命中率高,它就能快速响应,因为在内存中的数据读/写比数据库读/写磁盘的速度快几十到上百倍。
redis 和 memcached 的区别
Redis安装
安装源码编译支持库:yum install gcc gcc-c++
下载包:wget https://download.redis.io/releases/redis-6.2.3.tar.gz
解压包:tar xzf redis-6.2.3.tar.gz
进入redis目录:cd redis-6.2.3
编译安装:make
启动redis
src/redis-server
启动警告的解决
启动 redis 服务进程后,就可以使用测试客户端程序 redis-cli 和 redis 服务交互了。 比如:
前端启动的关闭命令:
强制关闭:Ctrl+c
正常关闭:./redis-cli shutdown
强制关闭只需在Redis控制台直接执行即可(redis可能会丢失部分数据)。
正常关闭需要另开一个终端窗口才可执行(redis不会丢失数据,推荐使用)。
后端启动与停止
1)后端启动的配置
修改redis.conf文件,将daemonize的值改为yes后保存。
2) 后端启动的命令
src/redis-server redis.conf
3)后端启动的关闭命令
强制关闭:kill -9 进程id
正常关闭:src/redis-cli shutdown
Redis客户端
1)启动
src/redis-cli
2)关闭
ctrl+c
127.0.0.1:6379> quit
2、图形界面客户端(RedisDesktopManager)
1、修改redis文件夹下redis.conf文件,在bind 127.0.0.1行前面加#注释掉这一行,使能远程连接(默认只能使用本地连接)。
2、执行命令 ps -ef|grep redis 杀掉redis-server进程。
3、在redis目录下执行 src/redis-server redis.conf 用redis.conf设置的参数重启redis-server服务。
4、命令行执行src/redis-cli 进入redis命令行,执行config set requirepass 123456 也可以设置为其他
5、在RedisDesktopManager客户端输入用户名、密码、服务器地址、端口连接服务器,点击测试连接。
redis服务器环境下mysql实现la/nmp架构缓存
场景实例搭建:(基于Memcached实例基础搭建)
关闭防火墙:
同步时间:
1、PHP安装(web端):
yum install php php-fpm php-cli php-common php-gd php-mbstring php-mysql php-pdo php-devel php-xmlrpc php-xml php-bcmath php-dba php-enchant
安装gcc依赖
yum install gcc gcc-c++ libevent-devel
安装php的redis扩展(web服务器)
wget http://pecl.php.net/get/redis-2.2.7.tgz
tar -zxvf redis-2.2.7.tgz
cd redis-2.2.7/
phpize
./configure
make install
编译完成后可以看到安装的目录如下,进入后可以看到编译的模块redis.so
vim修改/etc/php.ini,添加redis的扩展
extension=redis.so
重启web服务器的httpd服务
systemctl restart httpd
在httpd的发布目录下编辑如下php页面,然后访问
最后查看phpinfo,显示如下,代表安装成功:
2.安装redis(192.168.74.150)
wget -c -t 0 http://download.redis.io/releases/redis-2.8.19.tar.gz
tar xvf redis-2.8.19.tar.gz
#安装很简单、直接make就可以了
cd redis-2.8.19
make
启动redis
修改redis.con将daemonize no改为yes
启动redis
src/redis-server redis.conf
动如果没有报错,则配置正确
查看进程
ps -ef | grep redis
编写php的测试代码(web端)
vim /var/www/html/redis.php
<?php $redis = new Redis(); $redis->connect('192.168.42.30',6379) or die ("could net connect redis server"); $query = “select * from dog limit 8”; //红色代表这里是你的数据库里的表名 //为了简单一点,这里就读取了8条数据 for ($key = 1; $key < 9; $key++) { if (!$redis->get($key)) { $connect = mysql_connect('192.168.42.28','root','Nebula@123'); mysql_select_db(mytest); //红色这里是你的数据库名 $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 "
"; for ($key = 1; $key < 9; $key++) { echo "number is $key"; echo "
"; echo "name is $data[$key]"; echo "
"; } ?>
测试验证
第一次访问,redis中没有对应的KEY时
刷新,再次访问时
redis持久化和订阅
Redis持久化分为RDB持久化和AOF持久化:前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存到硬盘(类似于MySQL的binlog);由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过RDB持久化仍然有其用武之地。
RDB持久化
是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb,默认的文件名为dump.rdb。当Redis重新启动时,可以读取快照文件恢复数据。
1.触发条件
手动触发
bgsave命令可以生成RDB文件
自动触发
自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave。
例如,查看redis的默认配置文件(Linux下为redis根目录下的redis.conf),可以看到如下配置信息:
其中save 900 1的含义是:
当时间到900秒时,如果redis数据发
生了至少1次变化,则执行bgsave;
save 300 10和save 60 10000同理。
当三个save条件满足任意一个时,
都会引起bgsave的调用。
2.RDB备份恢复
此案例使用bgsave命令触发
灾难备份
使用flushall命令释放数据
数据恢复
先停止服务,可使用kill或pkill命令
将备份文件恢复回来
重新启动服务,并进行验证,发现数据又有了,至此我们使用RDB方式备份恢复成功
配置文件恢复参考此博客
AOF
全称是Append Only File,是 redis 记录执行指令的日志文件。
三种触发机制
(1)每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
(2)每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失
(3)不同no:从不同步
AOF备份恢复
因为配置文件默认备份方式是RDB,所以如果想以AOF方式备份,需要开启appendonly参数,将
no改为yes。演示使用默认的触发机制everysec。
修改后重新启动服务,会产生一个空的aof文件,这是因为之前都是采用rdb方式的,使用这种方式还没有数据
构造数据
发现文件增大
备份并清空数据
停止服务
pkill redis
恢复备份数据
Redis 发布订阅
实例中我们创建了订阅频道名为 redisChat:
现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。
Redis主从复制
准备三台服务器
192.168.74.138 为主服务器
192.168.74.150 为从服务器
192.168.74.151 为从服务器
一、安装redis
参考前文
二、配置主服务器
cd redis-6.2.3/
vim redis.conf
将bind 127.0.0.1这行注释或者指定ip
关闭守护进程
设置访问密码(由于redis性能非常高,撞库风险极大,建议线上把密码设置非常复杂,最好能在第2步中指定ip)。
三、配置从服务器
前四步与主服务器配置基本一致
配置所属主服务器ip和端口
配置所属主服务器的密码
需要注意的是,从服务器通常是只读,所以要配置只读(默认是只读,不要更改即可
四、测试
进入主服务器(192.168.42.28)
进入redis客户端,由于设置了密码,所以需要鉴权
设置一个值
进入从服务器
用get命令获取name的值
主从复制
环境准备
192.168.74.138 为主服务器(master)
192.168.74.150 为从服务器(slave)
192.168.74.151为从服务器(slave)
一、安装redis
首先给服务器分别安装redis,过程可参考前文
二、配置主服务器
1、进入192.168.42.28服务器,打开redis配置文件。
cd redis-6.2.3/
vim redis.conf
2、将bind 127.0.0.1这行注释或者指定ip
设置访问密码(由于redis性能非常高,撞库风险极大,建议线上把密码设置非常复杂,最好能在第2步中指定ip)。
3、开启守护进程
daemonize yes
至此主服务器配置完毕!
启动redis服务
./src/redis-server redis.conf
三、配置从服务器
前四步与主服务器配置基本一致
5、配置所属主服务器ip和端口
6、配置所属主服务器的密码
配置完成,启动服务
四、测试
1、进入主服务器
2、进入从服务器
使用get命令获取name的值,可以看到
如果在从服务器上写,则会报错,如下图
至此,redis主从复制配置完成
哨兵模式
环境准备
1、三个节点修改哨兵配置文件sentinel.conf
cd redis-6.2.3/
vim sentinel.conf
scp拷贝到其他两台从机上
scp sentlnel.conf 192.168.74.150:/root/redis-6.2.3/
scp sentlnel.conf 192.168.74.151:/root/redis-6.2.3/
将server1上配好的sentinel文件发送给server2和server3,一定要在server1开启sentinel之前。这是因为sentinel是一个动态的服务。
2、在server1/2/3开启服务sentinel
启动redis服务(先主机后从机)
启动sentinel(先主机后从机)
cd /root/redis-6.2.3
src/redis-server sentinel.conf --sentinel
提示socket连接数设置的太低了,需要修改后重启服务就不会有警告提示了
echo 1024 > /proc/sys/net/core/somaxconn
搭建好哨兵之后,哨兵一启动,过了几秒就会判断master sdown
原因是没有设置节点认证的密码,也就是我的redis设置了节点通信的密码,那么在哨兵里面也是需要配置的。
主节点可以查看到如下信息,slave两个节点已经加入
3、在server1上查看master信息
redis-cli
info
4、模拟server1(Master)宕机故障,进行测试:
shutdown
此时我们,在server2上,可以看到订阅的消息:
备Redis(server3)上:
我们可以看到server3变为master。
5、我们再将server1的redis恢复,重新加入主从复制
src/redis-server redis.conf
此时,在server1上,我们可以看到,server1重新上线后,是server3(192.168.42.30)的备机。
在server1上:Redis的配置文件自动添加了最后一行,表明server1是server3的slave
哨兵配置文件最后自动添加了,sentinel监控状况
在server2上:
集群模式
cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。
cluster集群特点:
多个redis节点网络互联,数据共享
所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上, 并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
支持在线增加、删除节点
客户端可以连接任何一个主节点进行读写
1、集群的作用
(1)数据分区:数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
(2)高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。
2、集群的数据分片
1、Redis集群的数据分片:
Redis集群引入了哈希槽的概念
Redis集群有16384个哈希槽( 编号0-16383)
集群的每个节点负责一部分哈希槽
每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
2、以3个节点组成的集群为例:
节点A包含0到5460号哈希槽
节点B包含5461到10922号哈希槽
节点C包含10923到16383号哈希槽
3、Redis集群的主从复制模型
集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1 都失败后,集群将不可用。
3、群集模式的搭建
修改配置文件:
cp /root/redis-6.2.3/redis.conf /root/redis-6.2.3/redis_7001.conf
cp /root/redis-6.2.3/redis.conf /root/redis-6.2.3/redis_7002.conf
mdir -p /var/log/redis/cluster
mkdir -p /root/redis-6.2.3/cluster/{redis_7001,redis_7002}
以下是要手动修改或添加的,其他配置不需要修改
vim redis_7001.conf
bind 192.168.74.151
port 7001
daemonize yes
pidfile “/var/run/redis_7001.pid”
logfile “/var/log/redis/cluster/redis_7001.log”
dir “/root/redis-6.2.3/cluster/redis_7001”
masterauth “123456”
requirepass “123456”
appendonly yes
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000
vim redis_7002.conf
bind 192.168.74.151
port 7002
daemonize yes
pidfile “/var/run/redis_7002.pid”
logfile “/var/log/redis/cluster/redis_7002.log”
dir /root/redis-6.2.3/cluster/redis_7002"
masterauth “123456”
requirepass “123456”
appendonly yes
cluster-enabled yes
cluster-config-file nodes_7002.conf
cluster-node-timeout 15000
其它两台机器配置与192.168.74.151一致,参照上面
启动redis服务
./src/redis-server redis_7001.conf
tail -f /var/log/redis/cluster/redis_7001.log
src/redis-server redis_7002.conf
tail -f /var/log/redis/cluster/redis_7002.log
其它两台机器启动与192.168.42.28一致
echo 1024 > /proc/sys/net/core/somaxconn
再次重新登陆即可
创建集群
src/redis-cli -a 123456 --cluster create 192.168.74.151:7001 192.168.74.151:7002 192.168.74.138:7003192.168.74.138:7004 192.168.74.151:7005 192.168.74.151:7006 --cluster-replicas 1
手动输入yes,接受上面的配置
cd redis-6.2.3/cluster/redis_7001/
ll
vim /root/redis/cluster/redis_7001/nodes-7001.conf
集群操作
登录集群:
./src/redis-cli -c -h 192.168.74.151 -p 7001 -a 123456 # -c,使用集群方式登录
cluster info
列出节点信息:
cluster nodes
写入数据
可以看出redis cluster集群是去中心化的,每个节点都是平等的,连接哪个节点都可以获取和设置数据。
当然,平等指的是master节点,因为slave节点根本不提供服务,只是作为对应master节点的一个备份。
增加节点
192.168.74.138上增加一节点(7007)
cp /root/redis-6.2.3/redis_7003.conf /root/redis-6.2.3/redis_7007.conf
vim /root/redis-6.2.3/redis_7007.conf
bind 192.168.74.138
port 7007
daemonize yes
pidfile "/var/run/redis_7007.pid“
logfile "/usr/local/redis/cluster/redis_7007.log“
dir "/data/redis/cluster/redis_7007“
#replicaof 192.168.74.151 6379
masterauth "123456“
requirepass "123456“
appendonly yes
cluster-enabled yes
cluster-config-file nodes_7007.conf
cluster-node-timeout 15000
mkdir /root/redis-6.2.3/cluster/redis_7007
./src/redis-server redis_7007.conf
192.168.74.150上增加一节点
cp /root/redis-6.2.3/redis_7005.conf /root/redis-6.2.3/redis_7008.conf
vim /root/redis-6.2.3/redis_7008.conf
bind 192.168.74.150
port 7008
daemonize yes
pidfile "/var/run/redis_7008.pid“
logfile "/usr/local/redis/cluster/redis_7008.log“
dir "/data/redis/cluster/redis_7008“
masterauth "123456“
requirepass "123456“
appendonly yes
cluster-enabled yes
cluster-config-file nodes_7008.conf
cluster-node-timeout 15000
mkdir /root/redis-6.2.3/cluster/redis_7008
./src/redis-server redis_7008.conf
集群中增加节点:
192.168.74.138:7003> cluster meet 192.168.74.150 7008
192.168.74.138:7003> cluster nodes
可以看到,新增的节点都是以master身份加入集群的
更换节点身份
将新增的192.168.42.30:7008节点身份改为192.168.42.29:7007的slave
./src/redis-cli -c -h 192.168.74.150 -p 7008 -a 123456 cluster replicate 22097f46f8740176f93570001f9132cbab9bbdbc
查看相应的nodes.conf文件,可以发现有更改,它记录当前集群的节点信息
cat /root/redis/cluster/redis_7001/nodes_7001.conf
删除节点:
CLUSTER FORGET
CLUSTER NODES
保存配置:
CLUSTER SAVECONFIG
模拟master节点挂掉
CLUSTER NODES
重新启动7001节点
./src/redis-server redis_7001.conf
CLUSTER NODES
可以看到,7001节点启动后为slave节点,并且是7004的slave节点。即master节点如果挂掉,它的slave节点变为新master节点继续对外提供服务,
而原来的master节点如果重启,则变为新master节点的slave节点。
另外,如果这里是拿7007节点做测试的话,会发现7008节点并不会切换,这是因为7007节点上根本没数据。集群数据被分为三份,采用哈希槽 (hash slot)的方式来分配16384个slot的话,它们三个节点分别承担的slot 区间是
节点7004覆盖0-5460
节点7003覆盖5461-10922
节点7005覆盖10923-16383