redis安装 集群 教程
数据库服务软件分为2类:
关系型数据库服务软件 简称 RDBMS
存储数据的特点?
服务软件?MySQL
非关系型数据库服务软件 简称 NoSQL
存储数据的特点?
服务软件
redis 软件介绍
Remote Dictionary Server(远程字典服务器)
是一款高性能的(Key/Values)
支持数据持久化(定期把内存里数据存储到硬盘)
支持多种数据类型:字符、列表、散列、集合
支持 master-salve 模式数据备份
中文网站www.redis.cn
安装软件
[root@host51 ~]# which gcc || yum -y install gcc 安装编译工具gcc
[root@host51 ~]#tar -xf redis-4.0.8.tar.gz 解压源码
[root@host51 ~]#cd redis-4.0.8/ 进入源码目录
[root@host51 ~]#make 编译
[root@host51 ~]#make install 安装
#初始配置
[root@host51 ~]#./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] 端口号
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... 初始化配置后 会自动启动redis服务 并设置开机运行
Installation successful!
[root@host51 redis-4.0.8]#
#查看服务的端口号
[root@host51 redis-4.0.8]# netstat -utnalp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 4108/redis-server 1
查看进程
[root@host51 redis-4.0.8]# ps -C redis-server
PID TTY TIME CMD
4108 ? 00:00:00 redis-server
停止redis服务
[root@host51 redis-4.0.8]# /etc/init.d/redis_6379 stop
Stopping ...
#启动redis服务
[root@host51 redis-4.0.8]# /etc/init.d/redis_6379 start
Stopping ...
[root@host51 ~]# redis-cli 连接服务 存取数据
[root@host51 ~]# redis-cli shutdown
[root@host51 ~]# /etc/init.d/redis_6379 start
#修改密码等
[root@host51 ~]# vim /etc/redis/6379.conf
70 bind 192.168.4.51 地址
93 port 6351 端口
501 requirepass 123456 密码
:wq
[root@host51 ~]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@host51 ~]# /etc/init.d/redis_6379 start
[root@host51 ~]# netstat -utnalp | grep redis-server
tcp 0 0 192.168.4.51:6351 0.0.0.0:* LISTEN 4405/redis-server 1
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456
使用命令停止服务
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456 shutdown
[root@host51 ~]# /etc/init.d/redis_6379 start 启动服务
修改脚本使其也可以使用脚本停止服务(启动脚本是使用shell语法编写)
[root@host51 ~]# vim +43 /etc/init.d/redis_6379
$CLIEXEC -h 192.168.4.51 -p 6351 -a 123456 shutdown
:wq
#执行脚本停止服务
[root@host51 ~]# /etc/init.d/redis_6379 stop
LNP+Redis 案例
具体配置步骤如下:
1) 安装源码的nginx软件
2) 安装php软件 php php-fpm php-devel
3) 修改nginx服务的配置文件实现动静分离
4) 启动服务
启动nginx服务 和 php-fpm服务
查看服务对应的端口80 和 9000
5) 测试Nginx服务能否解释PHP代码
2.2 配置php支持redis
意思就是在网站服务器编写php 脚本 可以连接redis服务存储数据和查询数据
默认PHP不支持redis (也就是不能连接redis服务)
1) 安装软件提供连接redis服务的功能模块
2) 让PHP进程在运行时 调用redis模块
3) 查看是否支持redis服务
4) 测试配置
4.1 在网站服务器编写PHP脚本 存储数据 和查询数据
#编写存储数据的脚本
#编写查询数据的脚本
4.2 在客户端访问网站服务器php脚本
4.3 在Redis服务器本机查看内存里的数据
能够看到PHP存储的数据为成功
[root@host50~]#tar -xf redis-cluster-4.3.0.tgz
[root@host50~]#cd redis-4.3.0/
创建配置命令configure 和生产PHP配置信息文件/usr/bin/php-config
[root@host50 redis-4.3.0]# phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
#配置
[root@host50redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config
[root@host50 redis-4.3.0]# make 编译
[root@host50 redis-4.3.0]# make install 安装
#提示模块的安装目录
Installing shared extensions: /usr/lib64/php/modules/
[root@host50 redis-4.3.0]#
#查看目录下的模块列表 有redis.so 模块文件即可
[root@host50 redis-4.3.0]# ls /usr/lib64/php/modules/
curl.so json.so mysql.so pdo.so phar.so sqlite3.so
fileinfo.so mysqli.so pdo_mysql.so pdo_sqlite.so redis.so zip.so
[root@host50 redis-4.3.0]# vim /etc/php.ini
728 extension_dir = "/usr/lib64/php/modules/" 模块文件所在的目录
730 extension = "redis.so" 模块名
:wq
[root@host50 redis-4.3.0]# systemctl restart php-fpm
#查看支持的模块
[root@host50 ~]# php -m | grep -i redis
redis
Redis服务的内存清除策略
redis服务提供的内存清除策略如下:(在/etc/redis/6379.conf 有说明信息)
1) LRU 删除最近最少使用的,有2种清除方式:
volatile-lru 针对设置了TTL的key
allkeys-lru 针对所有的key
2)LFU 删除使用频率最少的 有2种清除方式:
volatile-lfu 针对设置了TTL的key
allkeys-lfu 针对所有的key
3) RANDOM 随机删除 有2种清除方式:
volatile-random 针对设置了TTL的key
allkeys-random 针对所有的key
4) volatile-ttl 删除快要过期的
5)noeviction 不删除 存储空间不够时 服务直接报错
与内存相关的配置项 vim /etc/redis/6379.conf
maxmemory //最大内存
maxmemory-policy //定义使用策略
maxmemory-samples 20 //选取key模板的个数 (针对lru 和 ttl 、volatile-ttl 策略
Redis集群
准备工作:
第1步 安装redis软件并做初始化配置
第2步 停止按照初始化配置启动的Redis服务
第3步 修改主配置文件(启用集群功能)
第4步 启动redis服务 并查看端口号
重要说明:内存里不允许有数据 不能设置连接密码
[root@host51 ~]# yum -y install gcc
[root@host51 ~]# tar -xf redis-4.0.8.tar.gz
[root@host51 ~]# cd redis-4.0.8/
[root@host51 ~]# make && make install
[root@host51 ~]# ./utils/install_server.sh 遇到提示就回车
[root@host51 ~]# /etc/init.d/redis_6379 stop
[root@host51 ~]# vim /etc/redis/6379.conf
bind 192.168.4.51
port 6379
cluster-enabled yes #启用集群功能
cluster-config-file nodes-6379.conf 保存集群信息的配置文件
cluster-node-timeout 5000 集群中主机的连接超时时间
[root@host51 ~]#
[root@host51 ~]# /etc/init.d/redis_6379 start
[root@host51 ~]# netstat -utnlp | grep redis-server
tcp 0 0 192.168.4.51:16379 0.0.0.0:* LISTEN 4249/redis-server 1
tcp 0 0 192.168.4.51:6379 0.0.0.0:* LISTEN 4249/redis-server 1
注重复上面的步骤有几台就重复好多
配置管理主机
第一步:准备ruby脚本的运行环境
第二步:创建脚本
第三步:查看脚本帮助信息
]#yum -y install rubygems ruby
]#gem install redis-3.2.1.gem
]#mkdir /root/bin //创建命令检索目录
]#tar -xf redis-4.0.8.tar.gz
]#cp redis-4.0.8/src/redis-trib.rb /root/bin/
]#chmod +x /root/bin/redis-trib.rb 设置执行权限
]#redis-trib.rb help (能看到帮助信息为成功)
创建集群
创建集群的命令格式
[root@mgm57 ~]# redis-trib.rb create --replicas 数字 ip地址:端口 ip地址:端口 ip地址:端口 ....
说明,创建集群时,会把前3台服务器 配置为主服务器,剩下的其他主机全做从服务器
--replicas 从服务器的台数(指定每个主服务器有几台从服务器)
[root@mgm57 ~]# redis-trib.rb create --replicas 1 192.168.4.51:6379 192.168.4.52:6379 192.168.4.53:6379 192.168.4.54:6379 192.168.4.55:6379 192.168.4.56:6379
>>> Creating cluster
创建集群失败:
1 如果所有的Redis服务都启用的集群功能 内存里也没有数据 也没设置连接密码 还是创建失败
可能是物理内存不足 导致创建失败 把没用的虚拟机删除
2 在集群中所有主机执行清除集群信息的命令 > cluster reset
查看集群信息
#查看集群统计信息
[root@mgm57 ~]# redis-trib.rb info 192.168.4.56:6379
#查看集群详细信息
[root@mgm57 ~]# redis-trib.rb check 192.168.4.51:6379
访问集群存取数据
命令格式
]# redis-cli -c -h redis服务器的ip -p 端口号
说明:
连接集群中的任意一台服务器都可以查询数据和存储数据)
-c 连接集群中的主机 使用集群算法存储数据
管理集群
3.1 向集群里添加新服务器
说明:什么情况下需要向集群里添加新主机(添加master角色服务器)
扩大内存空间(添加master角色服务器)。
为了保证服务的可靠性(给主服务器添加多个从服务器)
1)添加master角色的服务器
诉求把新的Redis服务器Host58 添加到集群里做master 服务器
具体配置如下:
1) Host58运行redis 服务且启用了集群功能
redis服务的端口 6379 服务使用的地址 192.168.4.58
2) 在管理主机mgm57 如下操作:
2.1 把host58主机添加到集群里
命令格式
[root@mgm57 ~]# redis-trib.rb add-node 新主机Ip:端口 集群中已有主机的ip:端口
分配hast slots (master角色的服务器没有hast slots得不到存储数据机会)
命令格式
[root@mgm57 ~]# redis-trib.rb reshard 集群中已有主机的ip:端口
2)添加slave角色的服务器
说明:从角色服务器的数据是master服务器同步过来的数据
所以slave角色的服务器不需要分配hash slots
只要把主机添加到集群了做slave服务器就可以了。
命令格式
[root@mgm57 ~]# redis-trib.rb add-node --slave 新主机Ip:端口 集群中已有主机的ip:端口
3.2 把服务器移除集群
3.2.1 移除slave角色的主机
命令格式 [root@mgm57 ~]# redis-trib.rb del-node 集群中任意主机的Ip:端口 被移除主机的id
说明:slave角色的主机的没有hash slots 直接移除即可
主机被移除集群后redis服务会自动停止
移除master角色的主机
说明:master角色的服务器会占用hash slots 要先释放hash slots 再执行移除主机的命令
具体操作步骤:
第一步:释放 hash slots (再次执行reshard命令)
第二步:移除主机 (执行删除主机的命令)
#释放 hash slots (再次执行reshard命令)
[root@mgm57 ~]# redis-trib.rb reshard 192.168.4.56:6379
第1个问题:释放hash slots 的个数
How many slots do you want to move (from 1 to 16384)? 4096 (host58主机占用hash slots 的个数)
第2个问题:接收4096的个hash slots的主数据库服务器的ID (随便给那个主服务器都可以)
What is the receiving node ID?0eb3b7aa0493a19189cba35b0c658202cc20884b (host51主机的id ,就是把释放的4096个hash slots给主数据库服务器host51)
第3个问题:从那台主服务器移除4096个hash slots
Source node #1:87cc1c128166e08a16cc294758611453bbc71437 (host58主机的id)
Source node #2:done 结束指定
第4个问题:确认配置 yes同意 no 退出
Do you want to proceed with the proposed reshard plan (yes/no)? yes 同意
查看host58主机的id 然后删除主机 Host58
[root@mgm57 ~]# redis-trib.rb check 192.168.4.56:6379 | grep 192.168.4.58
M: 87cc1c128166e08a16cc294758611453bbc71437 192.168.4.58:6379
[root@mgm57 ~]# redis-trib.rb del-node 192.168.4.56:6379 87cc1c128166e08a16cc294758611453bbc71437
>>> Removing node 87cc1c128166e08a16cc294758611453bbc71437 from cluster
扩展知识
1) 平均分配当前所有主服务器的hash slots
[root@mgm57 ~]# redis-trib.rb info 192.168.4.56:6379 槽不平均
192.168.4.53:6379 (f2c1bdb7...) -> 1 keys | 4096 slots | 1 slaves.
192.168.4.51:6379 (0eb3b7aa...) -> 3 keys | 8192 slots | 1 slaves.
192.168.4.52:6379 (a9cb8ccd...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 6 keys in 3 masters.
0.00 keys per slot on average.
平均分配hash slots
[root@mgm57 ~]# redis-trib.rb rebalance 192.168.4.56:6379
再次查看平均了
[root@mgm57 ~]# redis-trib.rb info 192.168.4.56:6379
192.168.4.53:6379 (f2c1bdb7...) -> 2 keys | 5462 slots | 1 slaves.
192.168.4.51:6379 (0eb3b7aa...) -> 2 keys | 5461 slots | 1 slaves.
192.168.4.52:6379 (a9cb8ccd...) -> 2 keys | 5461 slots | 1 slaves.
[OK] 6 keys in 3 masters.
0.00 keys per slot on average.
2) 把移除的主机再次添加到集群里的步骤
第一步: 启动Redis服务并清除前世记忆(在Redis服务器本机操作)
第二步: 清空内存里的数据(在Redis服务器本机操作)
第三步: 在管理主机执行执行添加命令(在管理主机执行)
第四步: 查看是否添加成功(在管理主机执行)
#启动服务器
/etc/init.d/redis_6379 start
Starting Redis server...
[root@host58 ~]# netstat -utnlp | grep -i redis-server
tcp 0 0 192.168.4.58:6379 0.0.0.0:* LISTEN 4480/redis-server 1
tcp 0 0 192.168.4.58:16379 0.0.0.0:* LISTEN 4480/redis-server 1
[root@host58 ~]#
[root@host58 ~]# redis-cli -h 192.168.4.58 -p 6379
192.168.4.58:6379> cluster reset清除前世记忆
OK
192.168.4.58:6379>
192.168.4.58:6379> keys *
在管理主机把5添加到集群里
[root@mgm57 ~]# redis-trib.rb add-node 192.168.4.58:6379 192.168.4.51:6351
#查看集群信息
[root@mgm57 ~]# redis-trib.rb info 192.168.4.51:6351 发现多了主服务器58
把 移除的59 再次添加到集群 做53主机的slave数据库服务器
命令格式
redis-trib.rb add-node --slave --master-id 主服务器的id 新服务器的ip:端口 集群中已有机器的Ip:端口
#启动53主机的redis服务并清除前世记录
]# /etc/init.d/redis_6379 start
]# redis-cli -h 192.168.4.59 -p 6379
> cluster reset
> exit
#在管理主机查看host53主机的id
[root@mgm57 ~]# redis-trib.rb check 192.168.4.51:6351 | grep 192.168.4.53
M: d9c9ef29c07ad740a05fa7aaa4d96ce25fa089b5 192.168.4.53:6353
#添加59主机做主服务器53的 slave服务器
[root@mgm57 ~]# redis-trib.rb add-node --slave --master-id d9c9ef29c07ad740a05fa7aaa4d96ce25fa089b5 192.168.4.59:6379 192.168.4.51:6351
3)把集群中的主机恢复为独立的数据库服务器(host51~host56)
在数据库服务器本机执行如下操作
#停止redis服务
#注释掉配置文件中的集群功能
#清空数据库目录
#启动服务
#连接服务查看不到集群信息 也没有数据
[root@host51 ~]# redis-cli -h 192.168.4.51 shutdown
[root@host51 ~]# vim /etc/redis/6379.conf
#cluster-enabled yes
#cluster-config-file nodes-6379.conf
#cluster-node-timeout 5000
[root@host51 ~]# rm -rf /var/lib/redis/6379/*
[root@host51 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host51 ~]# netstat -utnalp |grep -i redis-server
tcp 0 0 192.168.4.51:6379 0.0.0.0:* LISTEN 9082/redis-server 1
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6379
192.168.4.51:6379> keys *
(empty list or set)
192.168.4.51:6379> cluster info
ERR This instance has cluster support disabled 没有启用集群功能
192.168.4.51:6379>
#在管理主机查看集群信息看不到host51主机了
[root@mgm57 ~]# redis-trib.rb info 192.168.4.56:6379
192.168.4.54:6379 (bdba7786...) -> 2 keys | 5462 slots | 1 slaves.
192.168.4.52:6379 (a9cb8ccd...) -> 2 keys | 5461 slots | 1 slaves.
192.168.4.58:6379 (87cc1c12...) -> 2 keys | 5461 slots | 0 slaves.
[OK] 6 keys in 3 masters.
0.00 keys per slot on average.
主从复制
redis服务的主从复制(与mysql服务主同步的功能一样,都是实现数据自动同步的存储结构。
主服务器:接收客户端连接
从服务器:连接主服务器同步数据
主从复制结构模式:
一主一从 、 一主多从 、 主从从
redis主从复制工作过程(数据同步原理):
!!!说明!!!:从服务器首次做的是全量同步,且同步的数据会覆盖本机的数据
第1步:slave向master发送sync命令
第2步:master启动后台存盘进程,并收集所有修改数据命令
第3步:master完成后台存盘后,传送整个数据文件到slave
第4步:slave接收数据文件,加载到内存中完成首次完全同步,后续有新数据产生时,master继续收集数据修改命令依次传给slave,完成同步
命令行配置命令(马上生效 但不永久 适合配置线上服务器)
info replication #查看复制信息
slaveof 主服务器ip地址 主服务器端口号 #指定主服务服务器IP地址和服务端口号
slaveof no one #临时恢复为主服务器
修改配置文件(永久有效,重启了redis服务依然有效)
]# vim /etc/redis/6379.conf
slaveof 主服务器ip地址 主服务器端口号
:wq
!!!说明!!!!
redis服务运行后 默认角色就是master(主)所以一台主机做master 服务器的话 无需配置。
主从结构中的从服务器 都是只读的, 客户端连接从服务器对数据仅有查询权限
配置一主一从
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6379 #host51主机 连接服务
192.168.4.51:6379> info replication 查看复制信息
# Replication
role:master 角色是 master
connected_slaves:0 从服务器的个数 是 零个
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6379 #host52主机连接服务
192.168.4.52:6379> info replication
# Replication
role:master 角色是 master
connected_slaves:0 从服务器的个数 是 零个
192.168.4.52:6379> slaveof 192.168.4.51 6379 指定主服务器的ip 和端口
OK
#在52主机再次查看复制信息
192.168.4.52:6352> info replication
# Replication
role:slave 角色变为 slave
master_host:192.168.4.51 主服务器ip
master_port:6351 主服务器端口
master_link_status:up 能与主服务器连接 如是down 表示连接不上master 服务
.....
把52永久配置为51的从服务器 (host52主机的系统重启 或redis服务重启 都依然是host51的从服务器)
[root@host52 ~]# vim +282 /etc/redis/6379.conf
282 slaveof 192.168.4.51 6379
:wq
#在51主机再次查看复制信息
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6379
192.168.4.51:6379> info replication
# Replication
role:master
connected_slaves:1 有1台 从服务器
slave0:ip=192.168.4.52,port=6379,state=online,offset=294,lag=0 从服务器的具体信息
验证配置:
第一步 连接主服务器存储数据
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6379
192.168.4.51:6379> mset x 1 y 2 z 3
OK
192.168.4.51:6379> keys *
1) "x"
2) "z"
3) "y"
192.168.4.51:6351>
第二步 连接从服务器 能够查看到和主服务器一样的数据
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6379
192.168.4.52:6379> keys *
1) "z"
2) "y"
3) "x"
说明:主从结构的从服务器不允许执行存储数据的操作
192.168.4.52:6379> set name bob
(error) READONLY You can't write against a read only slave.
192.168.4.52:6379>
配置一主多从
在host53主机做如下配置
[root@host53 ~]# redis-cli -h 192.168.4.53 -p 6379
192.168.4.53:6379> slaveof 192.168.4.51 6379 指定主服务器的ip 和端口
OK
在master服务host51 查看复制信息
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6379
192.168.4.51:6379> info replication
# Replication
role:master
connected_slaves:2 有2台从服务器
slave0:ip=192.168.4.52,port=6379,state=online,offset=294,lag=0
slave1:ip=192.168.4.51,port=6379,state=online,offset=294,lag=0
配置主从从结构
在host53主机做如下配置
第1步 把一主多从结构中的host53主机恢复为独立的数据库服务器
第2步:把host53配置为 host52主机的slave服务器
[root@host53 ~]# redis-cli -h 192.168.4.53 -p 6379
192.168.4.53:6379> slaveof no one
OK
192.168.4.53:6379> slaveof 192.168.4.52 6379
在host52主机查看复制信息
#既有主服务器的信息又有从服务器的信息
192.168.4.52:6379> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6379
master_link_status:up
....
connected_slaves:1
slave0:ip=192.168.4.53,port=6379,state=online,offset=2310,lag=0
.....
配置带验证的主从复制
意思就是:
主从结构中的master服务器设置了连接密码,
slave服务器要指定连接密码才能正常同步master主机数据
第一步 给Redis服务器Host51 设置连接密码 123456
第二步 在redis服务器host52 设置连接 master服务器 host51的连接密码 并设置本机redis服务的连接密码为123456
第三步 在redis服务器host53 设置连接 master服务器 host52的连接密码
第一步:给主服务器51 设置连接密码
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6379
192.168.4.51:6379> config get requirepass
1) "requirepass"
2) ""
192.168.4.51:6379> config set requirepass 123456
OK
192.168.4.51:6379> config get requirepass
(error) NOAUTH Authentication required.
192.168.4.51:6379>
192.168.4.51:6379> auth 123456
OK
192.168.4.51:6379> config get requirepass
1) "requirepass"
2) "123456"
192.168.4.51:6379> config rewrite
OK
192.168.4.51:6379> exit
[root@host51 ~]# tail -1 /etc/redis/6379.conf
requirepass "123456"
[root@host51 ~]#
第二步 :配置redis服务器 host52
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6379
192.168.4.52:6379> config get requirepass
1) "requirepass"
2) ""
192.168.4.52:6379> config set requirepass 123456
OK
192.168.4.52:6379> auth 123456
OK
192.168.4.52:6379> config get masterauth
1) "masterauth"
2) ""
192.168.4.52:6379> config set masterauth 123456
OK
192.168.4.52:6379> config get masterauth
1) "masterauth"
2) "123456"
192.168.4.52:6379> config rewrite
OK
192.168.4.52:6379>
192.168.4.52:6379> info replication
192.168.4.52:6379> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6379
master_link_status:up
....
....
192.168.4.52:6379> exit
[root@host52 redis-4.0.8]# tail -2 /etc/redis/6379.conf
masterauth "123456"
requirepass "123456"
[root@host52 redis-4.0.8]#
第三步 在redis服务器host53 设置连接 master服务器 host52的连接密码
[root@host53 ~]# redis-cli -h 192.168.4.53
192.168.4.53:6379> config set masterauth 123456
OK
192.168.4.53:6379> slaveof 192.168.4.52 6379
OK
192.168.4.53:6379> config rewrite
OK
192.168.4.53:6379>
192.168.4.53:6379> info replication
# Replication
role:slave
master_host:192.168.4.52
master_port:6379
master_link_status:up
....
192.168.4.53:6379> exit
哨兵服务
什么是哨兵服务:监视主从复制结构中主服务器,发现主服务器无法连接后,会把对应的从升级为主数据库服务器,继续监视新的主数据库服务器,坏掉的主数据库服务器恢复后,会自动做当前主服务器的从主机。哨兵服务+redis主从服务 能够实现redis服务高可用和数据的自动备份,但远比Redis集群的资金成本和运维成本要低。
说明:
1)可以使用一主一从或 一主多从 或 主从从 + 哨兵服务 做服务的高可用 和 数据自动备份
2)如果主从结构中的redis服务设置连接密码的话必须全每台数据库都要设置密码且密码要一样,
3)宕机的服务器 启动服务后,要人为指定主服务器的连接密码
步骤一 给host53主机的Redis服务设置连接密码 要与另外2台Redis服务器设置一样的连接密码
[root@host53 ~]# redis-cli -h 192.168.4.53
192.168.4.53:6379> config set requirepass 123456
OK
192.168.4.53:6379> auth 123456
OK
192.168.4.53:6379> config rewrite
OK
192.168.4.53:6379>
步骤二:配置哨兵服务(192.168.4.57)
具体操作步骤:
1)安装源码软件redis (无需做初始化配置,如果做了初始化把redis服务停止即可)
2)创建并编辑主配置文件 (说明源码包里有哨兵服务配置文件的模板sentinel.conf)
1) 安装源码软件redis (无需做初始化配置,如果做了初始化把redis服务停止即可)
[root@redis57 ~ ]# yum -y install gcc
[root@redis57 ~ ]# tar -zxf redis-4.0.8.tar.gz
[root@redis57 redis]# cd redis-4.0.8/
[root@redis1 redis-4.0.8]# make
[root@redis1 redis-4.0.8]# make install
2)创建并编辑主配置文件
#说明源码包里有哨兵服务配置文件的模板sentinel.conf
[root@host57 ~]# vim /etc/sentinel.conf
bind 192.168.4.57
sentinel monitor redis_server 192.168.4.51 6379 1
sentinel auth-pass redis_server 123456 #如果主服务器没有连接密码此配置项可用省略
:wq
3)启动哨兵服务 (会占用当前终端显示启动信息)
[root@mgm57 redis-4.0.8]# nohup redis-sentinel /etc/sentinel.conf &
[1] 5701
[root@mgm57 redis-4.0.8]# nohup: 忽略输入并把输出追加到"nohup.out" 回车即可
[root@mgm57 redis-4.0.8]# jobs 查看当前终端后台进程
[1]+ 运行中 nohup redis-sentinel /etc/sentinel.conf &
3)查看哨兵服务主配置文件 监视的主服务器 自动修改为 从服务器的ip
[root@host57 ~]# cat /etc/sentinel.conf
.....
sentinel monitor redis_server 192.168.4.52 6379 1
.....
sentinel auth-pass redis_server 123456
sentinel known-slave redis_server 192.168.4.53 6379
sentinel known-slave redis_server 192.168.4.51 6379
二、持久化 (理论多)
2.1、什么是持久化: redis服务可以永久的保存数据,怎么实现的呢?
2.2、实现方式有2种:分别是 RDB文件 和 AOF文件
1) RDB文件
指定就是数据库目录下的 dump.rdb 文件
redis运行服务后,会根据配置文件的设置的存盘频率 把内存里的数据复制到数据库目录下的dump.rdb文件里(覆盖保存)
2)AOF文件
redis服务AOF文件(与mysql服务的binlog日志文件的功能相同)
是一个文件,记录连接redis服务后执行的写操作命令并且是以追加的方式记录写操作命令
默认没有开启,使用需要人为启用。
!!!说明:通过这2种文件 均可以实现对数据的手动备份和手动恢复!!!
RDB文件的使用
2.4.1、查看 redis服务存储数据到硬盘的存盘频率
vim /etc/redis/6379.conf (默认 219行 220行 221行)
save 秒 变量的个数
save 900 1
save 300 10
save 60 10000
使用RDB文件 实现数据的备份和恢复
第1步:拷贝 dump.rdb 文件就是对数据的备份
[root@host56 ~]# cp /var/lib/redis/6379/dump.rdb /opt/
[root@host56 ~]# ls /opt/*.rdb
/opt/dump.rdb
使用备份的dump.rdb文件恢复
第1步 停止内存没有数据的redis服务
第2步 把没有数据的dump.rdb文件删除
第3步 把备份dump.rdb文件拷贝到数据库目录下
第4步 启动redis服务 并连接服务查看数据
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6379 shutdown
[root@host56 ~]# rm -rf /var/lib/redis/6379/dump.rdb
[root@host56 ~]# cp /opt/dump.rdb /var/lib/redis/6379/
[root@host56 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6379
192.168.4.56:6379> keys *
1) "i"
2) "d"
3) "x"
.4.4 RDB方式的优/缺点
优点:
高性能的持久化实现 —— 创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;
过程中主进程不做任何IO操作比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合
缺点:意外宕机时,丢失最后一次持久化的所有数据
AOF文件的使用
2.5.1 启用AOF文件
1、通过修改配置文件启用(修改文件需要重启redis服务才能生效,所以时适合线下服务器)
注意:通过配置文件启用AOF文件 服务器原有的数据会被删除
vim /etc/redis/6379.conf
appendonly yes 启用 aof 文件
appendfilename "appendonly.aof" 日志文件名
:wq
[root@host53 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host53 ~]# ls /var/lib/redis/6379/ 存放在日志目录下
appendonly.aof dump.rdb
连接服务存储数据后 再查看文件行数
[root@host53 ~]# redis-cli -h 192.168.4.53 -p 6379
192.168.4.53:6379> keys * 删除了服务器原有的数据
命令行启动(马上生效且不需要重启redis服务,也不会删除原有的数据 所以适合线上服务器)
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6379
192.168.4.56:6356> config set appendonly yes 启用aof文件
OK
192.168.4.56:6356> config rewrite 永久有效
OK
192.168.4.56:6356> keys *
(empty list or set)
192.168.4.56:6356> set x 1
OK
192.168.4.56:6356> set y 2
OK
192.168.4.56:6356> set z 3
OK
192.168.4.56:6356> keys *
1) "x"
2) "z"
3) "y"
192.168.4.56:6356> exit
[root@host56 ~]# ls /var/lib/redis/6379/*.aof 数据库目录多了.aof文件
/var/lib/redis/6379/appendonly.aof
[root@host56 ~]# ls /var/lib/redis/6379/*.rdb
/var/lib/redis/6379/dump.rdb
使用AOF文件 实现数据的备份和恢复
第1步 备份aof文件
[root@host56 ~]# cp /var/lib/redis/6379/appendonly.aof /opt/
[root@host56 ~]# ls /opt/*.aof
/opt/appendonly.aof
[root@host56 ~]#
第2步 使用备份的aof文件恢复数据
#删除数据
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6379
192.168.4.56:6379> flushall
192.168.4.56:6379> exit
#恢复数据
第1步: 把没有数据的服务停止
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6356 shutdown
第2步: 删除没有数据的aof文件和rdb文件
[root@host56 ~]# rm -rf /var/lib/redis/6379/*
第3步:把备份的aof文件拷贝到数据库目录
[root@host56 ~]# cp /opt/appendonly.aof /var/lib/redis/6379/
第4步:启动redis服务并查看数据
[root@host56 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
使用自带命令修改有问题的aof文件
命令格式 [root@host56 ~]# redis-check-aof --fix /目录名/日志文件名
redis-cli -h 192.168.4.56 -p 6379 shutdown 停止服务
[root@host56 ~]# echo "daaaa" >> /var/lib/redis/6379/appendonly.aof 在日志追加错误格式的命令
[root@host56 ~]# /etc/init.d/redis_6379 start 启动服务
Starting Redis server...
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6379 连接服务
Could not connect to Redis at 192.168.4.56:6379: Connection refused 提示连接失败 说明服务没启动
Could not connect to Redis at 192.168.4.56:6379: Connection refused
not connected> exit 退出登录提示
[root@host56 ~]# tail -1 /var/log/redis_6379.log 查看日志文件的最后1行 (最新的日志信息都记录在日志文件的末尾) ,会显示报错原因的解决办法
5662:M 26 Nov 16:53:09.530 # Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>
[root@host56 ~]# redis-check-aof --fix /var/lib/redis/6379/appendonly.aof 恢复日志
0x 78: Expected prefix '*', got: 'd'
AOF analyzed: size=126, ok_up_to=120, diff=6
This will shrink the AOF from 126 bytes, with 6 bytes, to 120 bytes
Continue? [y/N]: y 同意修复
Successfully truncated AOF
[root@host56 ~]# /etc/init.d/redis_6379 start 启动服务
/var/run/redis_6379.pid exists, process is already running or crashed 提示PID文件存储
[root@host56 ~]# rm -rf /var/run/redis_6379.pid 删除文件
[root@host56 ~]# /etc/init.d/redis_6379 start 启动服务
Starting Redis server...
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6379 连接服务查看数据
192.168.4.56:6379> keys * 查看数据
1) "a"
2) "e"
3) "b"
4) "c"
5) "d"
192.168.4.56:6379>
与aof 相关的配置项 ( vim /etc/redis/6379.conf )
appendfsync always //时时记录,并完成磁盘同步
appendfsync everysec //每秒记录一次,并完成磁盘同步
appendfsync no //写入aof ,不执行磁盘同步
auto-aof-rewrite-min-size 64mb //首次重写触发值
auto-aof-rewrite-percentage 100 //再次重写,增长百分比
.5.6 AOF文件的优缺点
AOF优点
可以灵活设置持久化方式
出现意外宕机时,仅可能丢失1秒的数据
AOF缺点
持久化文件的体积通常会大于RDB方式
执行fsync策略时的速度可比RDB方式慢