redis 安装、主从复制、主从切换

一.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 . . . . . .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis主从复制是一种基于异步的,单向的复制机制,可以将一个Redis实例的数据复制到多个其他实例上,从而实现数据的备份、负载均衡等功能。下面是Redis主从复制的深度剖析: 1. 主从复制的原理 Redis主从复制的原理是,从Redis主节点(Master)向从节点(Slave)发送RDB快照文件和增量命令流,从而实现数据的复制。主节点将自己的状态信息发送给从节点,从节点按照主节点的状态进行复制。 2. 主从复制的过程 主从复制的过程可以分为三个阶段:同步、复制和命令传播。 (1)同步阶段 主从复制的同步阶段是指从节点和主节点建立连接,进行身份验证,并将主节点的状态信息发送给从节点。在这个阶段,从节点向主节点发送SYNC命令,主节点接收到SYNC命令后,会生成RDB快照文件,并将RDB快照文件发送给从节点。当从节点接收到RDB快照文件后,会将其加载到内存中,然后向主节点发送PSYNC命令,主节点接收到PSYNC命令后,将增量命令流发送给从节点。 (2)复制阶段 主从复制的复制阶段是指从节点从主节点接收增量命令流,并将其应用到自己的数据库中。在这个阶段,从节点会将接收到的增量命令流写入自己的缓冲区中,然后按序应用到自己的数据库中。从节点记录自己已经复制的命令的偏移量和主节点的偏移量,用于在命令传播阶段进行判断。 (3)命令传播阶段 主从复制的命令传播阶段是指从节点向主节点发送命令确认信息,以及主节点向从节点发送新的增量命令流。在这个阶段,从节点会周期性地向主节点发送命令确认信息,主节点接收到命令确认信息后,会将新的增量命令流发送给从节点。从节点接收到新的增量命令流后,会将其应用到自己的数据库中。如果从节点和主节点之间的网络连接断开,从节点会向主节点重新发送SYNC命令,主节点会重新发送RDB快照文件和增量命令流。 3. 主从复制的优缺点 主从复制的优点是: (1)实现数据的备份和恢复功能,可以在主节点出现故障时,通过从节点快速恢复数据。 (2)实现负载均衡功能,可以通过将读请求分配到不同的从节点上,实现读写分离。 (3)提高服务的可用性,可以通过从节点提供服务,当主节点发生故障时,可以快速切换到从节点提供服务。 主从复制的缺点是: (1)从节点只能读取数据,不能写入数据,如果需要写入数据,必须通过主节点进行写操作。 (2)从节点的数据可能存在延迟,如果主节点的数据更新频繁,从节点的数据可能会落后于主节点。 (3)如果主节点出现故障,从节点需要重新选举出新的主节点,可能会导致服务中断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值