一.redis安装配置及主从复制
1. 什么是redis
Redis是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置,正因为这样,Redis才能实现持久化。
2.redis的安装
https://redis.io/download下载
在server1上:
[root@server1 ~]# tar zxf redis-6.2.4.tar.gz
[root@server1 ~]# cd redis-6.2.4
在源码编译的时候,会有依赖性,根据提示安装
yum install -y gcc
make && make install
运行自带的安装程序,安装失败,修改脚本文件,将文件中的判定脚本注释掉,重新安装。
cd utils/
ls
./install_server.sh ##运行自带的安装程序,失败
vim install_server.sh ##将下文部分注释
///
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
///
./install_server.sh ##一路enter,安装成功
此时切换到配置目录下,可以看到自动生成了配置文件,查看端口,端口开启。修改该配置文件,重启服务。
cd /etc/redis
ls ##6379.conf
netstat -antlp ##6379
vim 6379.conf
///
94 protected-mode no ##设定关闭保护模式
75 #bind 127.0.0.1 -::1 ##链接redis 时只能通过本地localhost (127.0.0.1)来链接,而不能用网络ip(192.168..)链接,因为处于保护模式,只能本地链接,所以将该设定注释
///
/etc/init.d/redis_6379 stop
/etc/init.d/redis_6379 start
netstat -antlp | grep :6379
3.redis主从复制
将server1安装包复制给server2主机。
cd
scp redis-6.2.4.tar.gz server2:
配置server2:
tar zxf redis-6.2.4.tar.gz
cd redis-6.2.4/
make USE_SYSTEMD=yes ##使用systemd支持进行构建,失败,需要c编译器
yum install -y gcc
make USE_SYSTEMD=yes ##还是需要下载依赖jemalloc
cd
rm -fr redis-6.2.4
重新解压安装:
tar zxf redis-6.2.4.tar.gz
cd redis-6.2.4/
yum install -y systemd-devel ##安装systemd
make USE_SYSTEMD=yes ##重新make
make install
此时,切换到utils目录下,运行自带的安装程序,将服务文件复制到目录自动存放启动文件的配置位置,重载配置文件,重启服务。
cd utils/
./install_server.sh
cp systemd-redis_server.service /usr/lib/systemd/system /redis.service ##目录自动存放启动文件的配置位置
systemctl daemon-reload ##重载配置文件
systemctl start redis.service
cd /usr/lib/systemd/system/
vim redis.service ##注意仔细修改该文件
///
[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
#Before=your_application.service another_example_application.service
#AssertPathExists=/var/lib/redis
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
#ExecStart=/usr/local/bin/redis-server --supervised systemd --daemonize no
## Alternatively, have redis-server load a configuration file:
#LimitNOFILE=10032
#NoNewPrivileges=yes
#OOMScoreAdjust=-900
#PrivateTmp=yes
Type=forking
#TimeoutStartSec=infinity
#TimeoutStopSec=infinity
#UMask=0077
#User=redis
#Group=redis
#WorkingDirectory=/var/lib/redis
///
cd redis-6.2.4/
cp redis.conf /etc/redis/
vim /etc/redis/redis.conf
///
302 logfile "/var/log/redis.log" ##日志存放目录
94 protected-mode no ##关闭保护模式
75 #bind 127.0.0.1 -::1 ##注释,允许网络ip链接redis
454 dir /var/lib/redis ##数据文件放置的目录
257 daemonize yes ##以守护进程的方式运行
2052 slaveof 172.25.101.1 6379 ##主从复制
///
systemctl daemon-reload
systemctl restart redis
主从复制:
主从复制原理:
1.Slave启动后,无论是第一次连接还是重连到Master,它都会主动发出一个SYNC命令
2.当Master收到SYNC命令之后,将会执行BGSAVE(后台存盘进程),即在后台保存数据到磁盘(rdb快照文件),同时收集所有新收到的写入和修改数据集的命令存入缓冲区(非查询类)
3.Master在后台把数据保存到快照文件完成后,会传送整个数据库文件到Slave
4.Slave接收到数据库文件后,会把内存清空,然后加载该文件到内存中以完成一次完全同步
5.然后Master会把之前收集到缓冲区中的命令和新的修改命令依次传送给Slave
6.Slave接受到之后在本地执行这些数据修改命令,从而达到最终的数据同步
7.之后Master与Slave之间将会不断的通过异步方式进行命令的同步,从而保证数据的时时同步
8.如果Master和Slave之间的链接出现断连,Slave可以自动重连Master。
主机和从机都配置好了,开始主从复制:
server1t添加数据,然后在server2上查看,复制成功:
[root@server1 utils]# redis-cli
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name westos
OK
127.0.0.1:6379> get name
"westos"
[root@server2 system]# redis-cli
127.0.0.1:6379> get name
"westos"
4.redis常用命令指南
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 //判断是否存在 1为存在,0为不存在
实验:
master端:
[root@server1 redis]# redis-cli
127.0.0.1:6379> select 1 ##选择数据库
OK
127.0.0.1:6379[1]> set user zjl
OK
127.0.0.1:6379[1]> get user
"zjl"
127.0.0.1:6379[1]> FLUSHDB ##清空当前数据库
OK
127.0.0.1:6379[1]> get user ##为空
(nil)
127.0.0.1:6379[1]> FLUSHALL ##清空所有数据库
OK
127.0.0.1:6379[1]> SELECT 0
OK
127.0.0.1:6379> get name ##为空
(nil)
127.0.0.1:6379> set name westos
OK
127.0.0.1:6379> EXPIRE name 5 ##设置过期时间
(integer) 1
127.0.0.1:6379> get name
"westos"
...wait
127.0.0.1:6379> get name ##5s后过期
(nil)
127.0.0.1:6379> set user1 hello
OK
127.0.0.1:6379> set user2 linux
OK
127.0.0.1:6379> set user3 redhat
OK
127.0.0.1:6379> keys user* ##查询
1) "user3"
2) "user2"
3) "user1"
127.0.0.1:6379> EXISTS user1 ##判断是否存在
(integer) 1 ##1为存在
127.0.0.1:6379> EXISTS user4
(integer) 0 ##0为不存在
slave端:
[root@server2 system]# redis-cli
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> select 1 ##选择数据库
OK
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> set user zxc
(error) READONLY You can't write against a read only replica. ##slave端只读
二.redis主从自动切换
Redis-sentinel是Redis实例的监控管理、通知和实例失效备援服务,是Redis集群的管理工具。在一般的分布式中心节点数据库中,Redis-sentinel的作用是中心节点的工作,监控各个其他节点的工作情况并且进行故障恢复,来提高集群的高可用性。
Redis-sentinel的三大功能:监测、通知、自动故障恢复。首先Redis-sentinel要建立一个监控的master列表,然后针对master列表的每个master获取监控其的sentinels和slaves供以后故障恢复使用。
原理:一主两从的情况下,当master与两个slave或因网络关系断掉的情况下,客户端并不知道master失联,会持续写入数据,但此时slave端已经不能复制数据。
slave会选举一个变成新的master,形成新的主从关系。
如果此时master恢复,重新加入主从关系,会转为一个新的slave,但因为超时连接,会清除自己的所有数据,那么客户端写入的数据就会丢失。
如果需要解决此问题,则需要两个slave同时认定不能连接master,或者,超过设定时间不能连接,则此时master端会拒绝客户端继续写入,那么重新接入变成slave时就不会造成数据丢失。
在server1主机将redis复制至server3。
scp redis-6.2.4.tar.gz server3:
与server2一样,在server3主机进行配置。解压,安装gcc,make,删除c环境下生成的缓存,重新解压,make install,修改安装文件,运行自带的安装程序。修改配置文件,启动服务。
server3:
redis-cli
> info
在server1主机中,配置sentinel,并复制到server2和server3中。
cd redis-6.2.4/
cp sentinel.conf /etc/redis/
cd /etc/redis/
vim sentinel.conf
///
sentinel monitor mymaster 172.25.24.1 6379 2 ##master为server1,2表示需要两票通过,这台主机就被认定宕掉
sentinel down-after-milliseconds mymaster 10000 ##连接超时为10s
///
scp sentinel.conf server2:/etc/redis/
scp sentinel.conf server3:/etc/redis/
redis-sentinel /etc/redis/sentinel.conf
server2 & server3
redis-sentinel /etc/redis/sentinel.conf
重新连接一个server1,info查看当前为master,有两个slave端,然后关闭当前主机。
server1(重新ssh一个)
redis-cli
> info ##role:master connected_slaves:2
> shutdown
在server1中,可以看到本机的down,并且新的slave为1和2,即新的master为3
在新的server1中,连接到server3,info查看到当前为master,有一个slave端,因为server1当前为挂掉状态。
重新开启server1,info查看,当前为slave状态,并且master端为server3主机。即就是,当master宕机时,sentinel自动切换master主机成功。
/etc/init.d/redis_6379 start
redis-cli
> info
三.redis集群:
redis集群:
自动分割数据到不同的节点上。
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
redis-cli --cluster help
1.构建集群
vim /etc/redis/6379.conf
///
appendonly yes #开启AOF模式
///
/etc/init.d/redis_6379 restart
cd /usr/local/
mkdir redis
cd redis/
mkdir 700{1..6}
cd 7001
vim redis.conf
///
port 7001
cluster-enabled yes #开启集群
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes #用守护线程的方式启动
///
redis-server redis.conf #启动服务
复制文件分别到7002,7003,7004,7005,7006,以同样的方式编写配置文件,端口号改为对应的目录号,并开启所有的端口
cp redis.conf ../7002/
cp redis.conf ../7003
cp redis.conf ../7004
cp redis.conf ../7005
cp redis.conf ../7006
cd 7002
vim redis.conf
redis-server redis.conf
cd ..
cd 7003
vim redis.conf
redis-server redis.conf
cd ..
cd 7004
vim redis.conf
redis-server redis.conf
cd ..
vim redis.conf
cd 7005
vim redis.conf
redis-server redis.conf
cd ..
cd 7006
vim redis.conf
redis-server redis.conf
ls
ps ax
添加节点:使用redis-cli来进行集群的交互,使用客户端连接任意一个节点,使用-c表示以集群的方式登录,-p指定端口。info查看,当前为master,没有slave端。创建集群主从节点,–cluster-replicas 参数为数字,1表示每个主节点需要1个从节点。然后检查集群,查看集群信息。
redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1
redis-cli --cluster check 127.0.0.1:7001
2.自动切换
由上图可知,7006为7001的slave,当关闭7001节点,7006会自动切换为主节点,没有从节点,当打开7001,此时为从节点。
redis-cli -c -p 7001
> SHUTDOWN
ps ax ##7002消失
redis-cli --cluster check 127.0.0.1:7001 ##7006 0 slaves
cd ..
cd 7001
redis-server redis.conf
ps ax ##redis-server *:7001 [cluster]
redis-cli --cluster check 127.0.0.1:7001
此时已经没有7001的进程:
当打开7001之后,自动变为7006的slave
添加新节点:
cd ..
mkdir 7007 7008
cd 7007
cp ../7001/redis.conf .
vim redis.conf
redis-server redis.conf
cd ..
cd 7008
cp ../7001/redis.conf .
vim redis.conf
redis-server redis.conf
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 ##将节点加入了集群中,但是并没有分配slot,所以这个节点并没有真正的开始分担集群工作
redis-cli --cluster check 127.0.0.1:7001
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 --cluster-slave --cluster-master-id d50e1748877d67a58a1fd2d01d61602ec970cfb8 #将7008节点添加为7007的slave
redis-cli --cluster check 127.0.0.1:7001
#给master节点添加槽:
redis-cli --cluster reshard 127.0.0.1:7007
---- 5000 #数量自定义
---- d50e1748877d67a58a1fd2d01d61602ec970cfb8 #此处为7007的id
---- all
---- yes #等待添加成功后查看
redis-cli --cluster check 127.0.0.1:7001
由上图知,7002为7004的master,则在7002中添加数据,会在7004上同步:
redis-cli -c -p 7002
> set name zjl
> get name
"zjl"
redis-cli -c -p 7004
> get name
"zjl"
四.redis结合mysql
1.部署nginx服务器
server1:
yum install psmisc.x86_64 -y
killall redis-server #杀死所有redis-server的进程
cd /usr/local/nginx/html/
lftp 172.25.254.250
> cd pub/docs/redis
> get test.php
> exit
vim test.php
cd
lftp 172.25.254.250
> cd pub/docs/redis
> get phpredis-master.zip phpredis-5.3.4.tgz
> exit
unzip phpredis-master.zip
cd phpredis-master/
phpize
注意:phpize扩展是为了生成./configure文件,如果phpize命令找不到,则需要下载php-devel软件包,如果找不到软件包,使下面两条命令更新软件仓库:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install php-devel -y #下载成功,重新phpize
再进行编译:
./configure --enable-redis
cd
tar zxf phpredis-5.3.4.tgz
cd redis-5.3.4/
phpize
./configure --enable-redis
make
make install
cd /usr/local/php/etc
vim php.ini #更改时区,添加redis模块;
systemctl reload php-fpm.service
php -m | grep redis
php -m | grep mysql
systemctl stop php-fpm.service
vim .bash_profile
source .bash_profile
lftp 172.25.254.250
> cd pub/dosc/redis
> mirror rhel7
cd rhel7/
yum install *.rpm -y
vim /usr/lib/systemd/system/php-fpm.service
systemctl restart php-fpm.service
ps ax
打开浏览器,访问:http://172.25.101.1/test.php
在server3中安装mariadb,导入test.sql数据库作为实验素材:
chkconfig redis_6379 off #关掉开机自启
vim .bash_profile #设置环境变量
source .bash_profile
yum install mariadb -y
systemctl start mariadb
如果启动不了,则需要删除数据目录里面的内容重新启动:
cd /data/mysql/
rm -fr
systemctl start mariadb
vim /etc/my.cnf
systemctl start mariadb
mysql
> show databases;
> grant all on test.* to redis@'%' identified by 'westos';
mysql < test.sql
mysql
> show databases;
> use test;
> select * from test;
server2 测试:
vim /etc/redis/redis.conf # 删除slaveof 172.25.101.1:6379,由slave变成master;
[root@server2 ~]# redis-cli
127.0.0.1:6379> get 1
"test1"
127.0.0.1:6379> get 5
"test5"
127.0.0.1:6379> set 1 redhat
OK
127.0.0.1:6379> get 1
"redhat"
在浏览器访问:
yum install mariadb-devel -y
lftp 172.25.254.250
>cd pub/docs/redis/
>get lib_mysqludf_json-master.zip
>exit
unzip lib_mysqludf_json-master.zip
cd lib_mysqludf_json-master/
yum install gcc -y
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
cd lib_mysqludf_json-master/
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
mysql
>show global variables like 'plugin_dir';
>CREATE FUNCTION json_object RETURNS STRING SONAME
>select * from mysql.func;
To be continued . . . . . .