DBA Day8
该阶段的2天内容,都会和数据库中间件,集群配置有关.
什么是中间件?
通俗来说,就是在正式文件内容从客户端发送或获取请求时,在传播过程中地点中间商,负责管理请求,并对其进行分类。
环境准备:
准备一台虚拟机,配置好YUM仓库,IP.
redis介绍
什么是字典型数据库?
类似 : key:value (和函数的定义赋值类似 变量名: 值)
一、部署Redis服务
步骤一:在主机redis64运行redis服务
命令操作如下所示:
- [root@redis64 ~]# yum -y install redis 安装软件
- [root@redis64 ~]# systemctl start redis 启动服务
- [root@redis64 ~]# netstat -utnlp | grep redis-server 查看端口
- tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1970/redis-server 1
- [root@redis64 ~]# redis-cli 连接服务
- 127.0.0.1:6379> ping 检查能否正在访问
- PONG 表示可以正常访问、
- 127.0.0.1:6379> set school tarena 存储变量
- OK
- 127.0.0.1:6379> keys * 查看已有变量
- 127.0.0.1:6379> get school 查看变量值
- "tarena"
- 127.0.0.1:6379> exit 断开连接
- [root@redis64 ~]#
步骤二:修改服务运行参数
先停止服务
- [root@redis64 ~]# systemctl stop redis
修改配置文件 .在具体行数修改配置文件.
[root@redis64 ~]# vim /etc/redis.conf 69 bind 192.168.88.64 #IP地址 92 port 6364 #端口号 647 requirepass 123 #密码 :wq
查看端口
- [root@redis64 ~]# netstat -utnlp | grep redis-server
- tcp 0 0 192.168.88.64:6364 0.0.0.0:* LISTEN 2009/redis-server 1
- [root@redis64 ~]#
连接服务
- [root@redis64 ~]# redis-cli -h 192.168.88.64 -p 6364 –a 123
- 192.168.88.64:6364> keys * 查看存储的变量
- 1) "school"
- 192.168.88.64:6364> exit 断开连接
或者
- [root@redis64 ~]# redis-cli -h 192.168.88.64 -p 6364 连接服务
- 192.168.88.64:6364> ping 不输入密码无法正常访问
- (error) NOAUTH Authentication required.
- 192.168.88.64:6364> auth 123 #输入密码
- OK
- 192.168.88.64:6364> keys * #查看存储的变量
- 1) "school"
- 192.168.88.64:6364> exit #断开连接
- [root@redis64 ~]#
常用命令
1)练习如下命令的使用
- mset mget keys type
- exists ttl expire move select
- del flushdb flushall
mset 一起存储多个变量
- 192.168.88.64:6364> mset name qq age 80 class nsd2403
- OK
- 192.168.88.64:6364> keys *
- 1) "age"
- 2) "classs"
- 3) "name"
- 4) "school"
mget一起查看多个变量值
- 192.168.88.64:6364> mget name age
- 1) "qq"
- 2) "80"
keys 使用统配符查看变量
* 匹配所有变量名
? 一个字符
- 192.168.88.64:6364> keys * 查看所有变量名
- 1) "age"
- 2) "classs"
- 3) "name"
- 4) "school"
- 192.168.88.64:6364> keys ??? 变量名3个字符
- 1) "age"
- 192.168.88.64:6364> keys a* 变量名a 开头的
- 1) "age"
- 192.168.88.64:6364>
- 192.168.88.64:6364> keys gender 查看指定变量是否存在
- (empty list or set) 说明变量没不存在
- 192.168.88.64:6364> keys name 存在
- 1) "name"
- 192.168.88.64:6364>
select 切换库 ,默认库编号 0-15
redis 默认有16个数据库
- 192.168.88.64:6364> select 1 切换到 1号库里
- OK
- 192.168.88.64:6364[1]> keys * 查看数据没有数据
- (empty list or set)
- 192.168.88.64:6364[1]>
- 192.168.88.64:6364[1]> select 0 切回0号库
- OK
- 192.168.88.64:6364> select 16 超出范围报错
- (error) ERR DB index is out of range
move 命令 移动变量到其他库里
- 查看变量
- 192.168.88.64:6364> keys *
- 1) "age"
- 2) "classs"
- 3) "name"
- 4) "school"
- 把age 变量移动到1 号库里
- 192.168.88.64:6364> move age 1
- (integer) 1
- 切换到1号库
- 192.168.88.64:6364> select 1
- OK
- 查看变量
- 192.168.88.64:6364[1]> keys *
- 1) "age"
exists 检查变量是否存储 返回值1 变量存储 返回值是0 变量不存在
- 切换到0号库
- 192.168.88.64:6364[1]> select 0
- OK
- 检查name变量是否存在
- 192.168.88.64:6364> exists name
- (integer) 1
- 192.168.88.64:6364> exists swy
- (integer) 0
EXPIRE 命令设置变量的过期时间 不设置变量永不过期
ttl 检查变量可以在内存里存多久
- 存储变量
- 192.168.88.64:6364> set sex girl
- OK
- 查看过期时间
- 192.168.88.64:6364> ttl sex
- (integer) -1 表示永不过期
- 设置过期时间15 秒
- 192.168.88.64:6364> expire sex 15
- (integer) 1
- 没到过期时间可以查看到变量
- 192.168.88.64:6364> keys sex
- 1) "sex"
- 查看剩余时间
- 192.168.88.64:6364> ttl sex
- (integer) 8 还剩下8秒时间过期
- 192.168.88.64:6364> ttl sex
- (integer) -2 表示已经过期被删除
- 过期后查看不到变量了
- 192.168.88.64:6364> keys sex
- (empty list or set)
- 192.168.88.64:6364>
type 命令检查变量存储数据的类型
- 192.168.88.64:6364> set x 99
- OK
- 192.168.88.64:6364> mset y 108
- OK
- 192.168.88.64:6364> type x
- string
- 192.168.88.64:6364> type y
- String
- 定义类别类型的变量tea
- 192.168.88.64:6364> lpush tea nb wk zzg plj lx
- 查看数据类型
- 192.168.88.64:6364> type tea
- list
del 删除内存里的变量
- 192.168.88.64:6364> keys * 删除前查看
- 1) "y"
- 2) "tea"
- 3) "name"
- 4) "school"
- 5) "x"
- 6) "classs"
- 192.168.88.64:6364> del tea y school 一起删除3个变量
- (integer) 3
- 192.168.88.64:6364> keys * 删除后查看
- 1) "name"
- 2) "x"
- 3) "classs"
- 192.168.88.64:6364>
flushdb 删除当前所在库的所有数据
高危操作:类似于linux删根目录
- 192.168.88.64:6364> keys *
- 1) "name"
- 2) "x"
- 3) "classs"
- 192.168.88.64:6364> flushdb
- OK
- 192.168.88.64:6364> keys *
- (empty list or set)
- 192.168.88.64:6364> SELECT 1
- OK
- 192.168.88.64:6364[1]> keys *
- 1) "age"
Flushall 清空内存
- 192.168.88.64:6364[1]> flushall 删除内存里的所有内存里所有数据 (慎用)
二.创建Redis集群
环境准备:
步骤一:准备集群环境
说明:准备做集群的主机,不允许存储数据、不允许设置连接密码
配置服务器192.168.88.51
思路:
- ]# yum -y install redis 安装软件 #安装软件可以用远程连接软件,同步配置.
- ]# vim /etc/redis.conf 修改主配置文件夹
- 92 port 6379 //端口号
- 69 bind 192.168.88.51 //IP地址 #每台机器的ip 和主机名对应,以此类推.
- 838 cluster-enabled yes //启用集群功能
- 846 cluster-config-file nodes-6379.conf //存储集群信息文件
- 852 cluster-node-timeout 5000 //集群中主机通信超时时间
- :wq
- ]# systemctl start redis 启动服务
- ]# netstat -utnlp | grep redis-serve 查看端口
- tcp 0 0 192.168.88.51:6379 0.0.0.0:* LISTEN 21201/redis-serve
- tcp 0 0 192.168.88.51:16379 0.0.0.0:* LISTEN 21201/redis-serve
步骤二:创建集群
说明:
1、在任意一台redis服务器上都可以执行创建集群的命令。
2、--cluster-replicas 1 给每个master服务器分配1台slave服务器,每个主至少要分配1台slave服务器,不然无法实现redis服务的高可用。
3、创建集群时,会自动创建主从角色,默认把主机列表中的前3台服务器创建为
Master角色的redis服务器,剩下的均配置为slave角色服务器。
4、创建集群时,会自动给master角色的主机分配hash槽 ,通过hash槽实现数据的分布式存储。
- ]# redis-cli --cluster create 192.168.88.51:6379 192.168.88.52:6379 192.168.88.53:6379 192.168.88.54:6379 192.168.88.55:6379 192.168.88.56:6379 --cluster-replicas 1
- #下面是集群的创建与信息展示
- >>> Creating cluster
- >>> Performing hash slots allocation on 6 nodes...
- Using 3 masters:
- 192.168.88.51:6379
- 192.168.88.52:6379
- 192.168.88.53:6379
- Adding replica 192.168.88.55:6379 to 192.168.88.51:6379
- Adding replica 192.168.88.56:6379 to 192.168.88.52:6379
- Adding replica 192.168.88.54:6379 to 192.168.88.53:6379
- M: 0eb3b7aa0493a19189cba35b0c658202cc20884b 192.168.88.51:6379
- slots:0-5460 (5461 slots) master
- M: a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441 192.168.88.52:6379
- slots:5461-10922 (5462 slots) master
- M: f2c1bdb78d8d224c3666fa6440bdf80ba563c581 192.168.88.53:6379
- slots:10923-16383 (5461 slots) master
- S: bdba77868965371680fa825badff59bf8ef95a81 192.168.88.54:6379
- replicates f2c1bdb78d8d224c3666fa6440bdf80ba563c581
- S: 11510f42bfd9cf667bab5f31c01476d94984200a 192.168.88.55:6379
- replicates 0eb3b7aa0493a19189cba35b0c658202cc20884b
- S: fe572ce003ee634c52adc4b42d92d15f847937d7 192.168.88.56:6379
- replicates a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441
- Can I set the above configuration? (type 'yes' to accept): yes 同意
- ....
- ....
- [OK] All nodes agree about slots configuration.
- >>> Check for open slots...
- >>> Check slots coverage...
- [OK] All 16384 slots covered. //创建成功的提示
步骤三:查看集群信息
第一列:主服务器ip地址
第二列:主服务器ID
第三列:存储变量个数
第四列:hash槽个数 (hash槽的作用在集群存储工程过程里讲)
第五列:从服务器数量
]# redis-cli --cluster info 192.168.88.51:6379 192.168.88.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves. 192.168.88.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves. 192.168.88.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average.
三.测试集群
问题
- 命令行连接
- 搭建网站服务器
- 网站连接redis集群
实现此案例需要按照如下步骤进行。
步骤一:命令行连接
[root@host51 ~]# redis-cli -c -h 192.168.88.51 -p 6379 192.168.88.51:6379> set school tarena -> Redirected to slot [8455] located at 192.168.88.52:6379 OK 192.168.88.52:6379> set teacher plj -> Redirected to slot [12541] located at 192.168.88.53:6379 OK 192.168.88.53:6379> set class NSD -> Redirected to slot [741] located at 192.168.88.51:6379 OK 192.168.88.51:6379>
不难发现3个变量,被分别存储到集群中的3台master服务器上,实现了数据的分布式存储。
当连接集群中的任意一台redis服务器存储数据时,会调用集群CRC16算法 得出此次
存储变量使用的hash 槽,然后连接hash 槽 所在的master服务器存储变量。
在创建集群时会把默认的16384个槽平均的分配给集群中的3个master服务器。可以通过查看集群信息查看每个master服务器占用hash槽的个数。
]# redis-cli --cluster info 192.168.88.51:6379 192.168.88.53:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 1 slaves. 192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves. 192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average.
测试数据自动备份
集群中slave角色的主机会自动同步master角色主机的数据,实现数据的自动备份,
分别连接集群中的3台slave服务器查看变量
#分别在不同redis机器上,登录redis查看相关效果。
[root@host54 ~]# redis-cli -c -h 192.168.88.54 -p 6379 192.168.88.54:6379> keys * 1) "class" [root@host55 ~]# redis-cli -c -h 192.168.88.55 -p 6379 192.168.88.55:6379> keys * 1) "school" [root@host56 ~]# redis-cli -c -h 192.168.88.56 -p 6379 192.168.88.56:6379> keys * 1) "teacher"
测试服务高可用
当master角色的服务器宕机时,对应的slave服务器会升级为master 并接手对应的hash槽,实现redis服务的高可用,例如停止host53主机的redis服务,对应的从会升级为master 。(当宕机的master恢复后 自动做当前主的从服务器) 。
#看下备份机器,master结点宕机时,能不能顶上。
测试方法:停止redis服务
- [root@host53 ~]# systemctl stop redis
查看集群信息
[root@host51 ~]#]# redis-cli --cluster info 192.168.88.51:6379 192.168.88.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 0 slaves. 192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves. 192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. keys per slot on average.
启动redis服务
- [root@host53 ~]# systemctl start redis
查看集群信息
[root@host51 ~]#]# redis-cli --cluster info 192.168.88.51:6379 192.168.88.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 1 slaves. 192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves. 192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. keys per slot on average.
步骤二:搭建网站服务器
准备1台新虚拟机,要求如表-3所示。
表-3
![]()
1)在Nginx57主机,安装nginx软件并配置nginx服务
#下面展示的是源码安装,你们可以yum -install 安装服务。
- 安装nginx
- yum -y install nginx
- 安装依赖
- ]#yum -y install gcc pcre-devel zlib-devel make
- 解压源码
- ]# cd /root
- ]# tar -xf nginx-1.22.1.tar.gz
- 进源码目录
- ]#cd nginx-1.22.1
- 配置
- ]#./configure
- 编译 并 安装
- ]#make && make install
- 查看安装目录
- ]# ls /usr/local/nginx/
- conf html logs sbin
- 启动服务
- ]# /usr/local/nginx/sbin/nginx
- #没有配置相应的spec文件,所以不能systemctl 命令启动相关服务。
- 查看端口 #有http服务的虚拟机可以停止httpd服务请求,再启动nginx查看80端口状态。
- ]# netstat -utnlp | grep 80
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10469/nginx: master
2)配置php-fpm服务
- ]#yum -y install php php-fpm php-devel 安装php相关软件
- 修改php-fpm服务配置文件
]# vim /etc/php-fpm.d/www.conf 38 ;listen = /run/php-fpm/www.sock 39 listen = 127.0.0.1:9000 非sock方式运行 :wq
- 启动服务
- ]# systemctl start php-fpm
- 查看端口
- ]# netstat -utnlp | grep 9000
- tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 10477/php-fpm: mast
3)配置动静分离
]# vim +65 /usr/local/nginx/conf/nginx.conf location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi.conf; } :wq ]# /usr/local/nginx/sbin/nginx -t //测试修改
- ]# /usr/local/nginx/sbin/nginx -s reload //重启服务
4)加载redis模块
从真机拷贝软件到虚拟机里
#真机没有就去官网下载。 这里没演示scp方式,是因为它传文件有时候会出现断点,并且不能断点续传,影响文件的传输效率和完整性。 ]# rsync /linux-soft/s3/redis-cluster-4.3.0.tgz root@192.168.88.57:/root/
安装软件
- 解压源码
- ]# tar -xf redis-cluster-4.3.0.tgz
- 进源码目录
- ]# cd redis-4.3.0/
- 获取php版本信息
- ]# phpize
- Configuring for:
- PHP Api Version: 20170718
- Zend Module Api No: 20170718
- Zend Extension Api No: 320170718
- 配置 (--with-php-config=/usr/bin/php-config php配置信息文件)
- [root@redis64 redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config
编译并安装
- ]# make && make install
- ……………
- Installing shared extensions: /usr/lib64/php/modules/ 提示模块安装的位置
查看模块文件
- ]# ls /usr/lib64/php/modules/redis.so
- /usr/lib64/php/modules/redis.so
编辑php.ini文件
]# vim /etc/php.ini 737 extension_dir = "/usr/lib64/php/modules/" 指定模块所在目录 739 extension = "redis.so" 指定模块名
- :wq
重启php-fpm服务
- ]# systemctl restart php-fpm
查看模块
- ]# php -m | grep redis
- redis
步骤三:网站连接redis集群
1)编写存储数据脚本
- [root@nginx57 ~]#
vim /usr/local/nginx/html/set.php <?php $redis_list = ['192.168.88.51:6379','192.168.88.52:6379','192.168.88.53:6379','192.168.88.54:6379','192.168.88.55:6379','192.168.88.56:6379']; $client = new RedisCluster(NUll,$redis_list); $client->set("i","tarenaA "); $client->set("j","tarenaB "); $client->set("k","tarenaC "); echo "save ok\n"; ?> :wq
2)编写查看数据脚本
- [root@nginx57 ~]#
vim /usr/local/nginx/html/get.php <?php $redis_list = ['192.168.88.51:6379','192.168.88.52:6379','192.168.88.53:6379','192.168.88.54:6379','192.168.88.55:6379','192.168.88.56:6379']; //定义redis服务器列表 $client = new RedisCluster(NUll,$redis_list); //定义连接redis服务命令 echo $client->get("i"); //获取变量i 的数据 echo $client->get("j"); //获取变量j 的数据 echo $client->get("k"); //获取变量k 的数据 ?> :wq
3)访问脚本 #测试网页情况
- 访问存储数据脚本
- ]# curl http://192.168.88.57/get.php
- Save ok
- 访问查询数据脚本
- ]# curl http://192.168.88.57/get.php
- tarenaA tarenaB tarenaC
4)命令行连接redis集群主机查看数据
# 3 台 机器分别查看。
- [root@host51 ~]# redis-cli -c -h 192.168.88.51 -p 6379
- 192.168.88.51:6379> keys *
- 1) "j"
- [root@host52 ~]# redis-cli -c -h 192.168.88.52 -p 6379
- 192.168.88.52:6379> keys *
- 1) "k"
- [root@host54 ~]# redis-cli -c -h 192.168.88.54 -p 6379
- 192.168.88.54:6379> keys *
- 1) "i"
DBA Day09
上节课,我们讲了redis中间件的基本集群搭建,这节课将redis的主从复制、哨兵服务的配置与数据的持久化。
持久化的知识中,涉及到数据类型的各类数据类型命令的使用。^_^
环境准备:
一、主从复制
#通俗来说就是就是一个master主节点,带着几个slave节点,master结点自身也有候选人,以备不时之需。
相关命令
步骤一:配置一主一从结构
[root@host61 ~]# vim /etc/redis.conf 69 bind 192.168.88.61 设置服务使用的Ip地址 92 port 6379 使用默认端口即可 :wq [root@host61 ~]# systemctl restart redis 重启服务
连接服务
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379 查看角色 192.168.88.61:6379> info replication # Replication role:master 默认就是主服务器 connected_slaves:0 没有从服务器 master_replid:0aebff37df915061ddf157cc33d8742f14e8773f master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 192.168.88.61:6379> 2)配置salve服务器 修改配置文件 [root@host62 ~]# vim /etc/redis.conf 69 bind 192.162.88.62 设置服务的ip地址 92 port 6379 设置服务的端口号 (默认即可) :wq 重启服务 [root@host62 ~]# systemctl restart redis 连接服务 [root@host62 ~]# redis-cli -h 192.162.88.62 -p 6379 指定主服务器ip地址 和 端口号 192.162.88.62.:6379> replicaof 192.162.88.61 6379 永久保存配置 192.162.88.62.:6379> config rewrite OK 退出服务 192.162.88.62.:6379> exit 查看文件末尾 [root@host62 ~]# tail -1 /etc/redis.conf replicaof 192.162.88.61 6379 连接服务 [root@host62 ~]# redis-cli -h 192.162.88.62 -p 6379 查看角色 192.162.88.62.:6379> info replication #查看从节点服务器情况 # Replication role:slave 从服务器 master_host:192.162.88.61 主服务器ip地址 master_port:6379 主服务器端口号 master_link_status:up 与主服务器连接状态 (up 正常 down 连接失败) master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14 192.162.88.62.:6379>
3)在主服务器host61查看角色
连接服务 [root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379 查看角色 192.168.88.61:6379> info replication # Replication role:master 主服务器 connected_slaves:1 一个从服务器 slave0:ip=192.168.88.62,port=6379,state=online,offset=322,lag=0 从服务器IP地址 master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:322 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:322 存储数据 192.168.88.61:6379> mset x 1 y 2 z 3 OK 查看变量 192.168.88.61:6379> keys * 1) "z" 2) "y" 3) "x"
4)在从服务器查看是否同步数据
[root@host62 ~]# redis-cli -h 192.168.88.62 -p 6379 192.168.88.62.:6379> keys * 1) "y" 2) "x" 3) "z" 192.168.88.62.:6379>
步骤二:配置一主多从结构
要求:把host63也配置为host61的从服务器
1)在host63主机做如下配置:
[root@host63 ~]# vim /etc/redis.conf 修改配置文件 69 bind 192.168.88.63 92 port 6379 :wq [root@host63 ~]# systemctl restart redis 启动服务 [root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 连接服务 192.168.88.63:6379> replicaof 192.168.88.61 6379 指定主服务器ip地址和端口号 OK 192.168.88.63:6379> config rewrite 保存到了redis.conf文件末尾 OK 192.168.88.63:6379> exit 断开连接 [root@host63 ~]# tail -1 /etc/redis.conf 查看文件最后1行 replicaof 192.168.88.61 6379 [root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 连接服务 192.168.88.63:6379> info replication 查看复制信息 # Replication role:slave 角色 master_host:192.168.88.61 主服务器IP master_port:6379 主服务器端口 master_link_status:up 与主服务器连接状态 up 正常连接状态 master_last_io_seconds_ago:9 master_sync_in_progress:0 slave_repl_offset:1171 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1171 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1158 repl_backlog_histlen:14 192.168.88.63:6379> keys * 查看是否同步数据 1) "x" 2) "z" 3) "y" 192.168.88.63:6379>
在host61 查看到有2台从服务器
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379 192.168.88.61:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.88.62,port=6379,state=online,offset=3027,lag=0 slave1:ip=192.168.88.63,port=6379,state=online,offset=3013,lag=1 master_replid:209b3b7ce20c708ab1b6b95a5d1becb2454b0941 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:3027 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:3027 192.168.88.61:6379>
步骤三:配置主从从结构
#通俗来说,就是61设置为主节点,62是61的子节点,63是62的子节点。
要求: 把host63恢复为独立的redis服务器,然后配置为host62的从服务器
1)配置host63
[root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 连接服务 192.168.88.63:6379> replicaof no one 恢复为独立的数据库服务器 OK 192.168.88.63:6379> replicaof 192.168.88.62 6379 指定主服务器为62 OK 192.168.88.63:6379> config rewrite 保存配置 OK 192.168.88.63:6379> exit 断开连接 [root@host63 ~]# tail -1 /etc/redis.conf 查看是否保存 replicaof 192.168.88.62 6379 [root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 连接服务 192.168.88.63:6379> info replication 查看复制信息 # Replication role:slave 角色 master_host:192.168.88.62 主服务器IP master_port:6379 主服务端口 master_link_status:up 与主服务器连接状态 master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:4545 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:4545 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:4420 repl_backlog_histlen:126 192.168.88.63:6379>
2)在host62查看角色
[root@host62 ~]# redis-cli -h 192.168.88.62 -p 6379 连接服务 192.168.88.62.:6379> info replication 查看复制信息 # Replication role:slave 本身是从服务器 master_host:192.168.88.61 主服务器ip master_port:6379 主服务器redis服务端口 master_link_status:up 与主服务器连接状态 master_last_io_seconds_ago:4 master_sync_in_progress:0 slave_repl_offset:4769 slave_priority:100 slave_read_only:1 connected_slaves:1 本身有一个从服务器 slave0:ip=192.168.88.63,port=6379,state=online,offset=4769,lag=0 从服务器信息 master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:4769 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:4769 192.168.88.68.:6379>
案例2:配置带验证的主从复制
#给主机设置连接密码,不然任何用户登录从节点,都可以访问主节点相关信息内容。反过来说,也是为了方式,主节点权限备别人利用,破幻数据的安全性和完整性。
基于案例1做如下配置:
- 配置主机host61,redis服务连接密码为123456
- 主机host62设置连接host61的redis服务密码
方案
给host61主机的Redis服务设置连接密码,如果从服务器不指定连接密码无法同步数据。
步骤
实现此案例需要按照如下步骤进行。
步骤一:配置主机host61,redis服务密码为123456
连接服务
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
查看密码,默认redis服务没有密码
192.168.88.61:6379> config get requirepass
1) "requirepass"
2) ""
设置密码
192.168.88.61:6379> config set requirepass 123456
OK
输入密码
192.168.88.61:6379> auth 123456
OK
保存配置
192.168.88.61:6379> config rewrite
OK
退出
192.168.88.61:6379> exit
保存到文件的末尾
[root@host61 ~]# tail -1 /etc/redis.conf
requirepass "123456"
连接服务
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379 -a 123456
查看复制信息
192.168.88.61:6379> info replication
# Replication
role:master
connected_slaves:0 没有从服务器了 (因为从没有输入连接密码连接不上主服务器)
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5763
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5763
192.168.88.61:6379>
步骤二:配置主机host62
连接服务 [root@host62 ~]# redis-cli -h 192.168.88.62 -p 6379 查看复制信息 192.168.88.62.:6379> info replication # Replication role:slave master_host:192.168.88.61 master_port:6379 master_link_status:down 没设置密码 与master主机是断开状态 master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:1 master_link_down_since_seconds:274 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:7803 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:7803 192.168.88.62:6379> config set masterauth 123456 指定主服务器密码 OK 192.168.88.62:6379> config rewrite 保存配置 OK 192.168.88.62:6379> info replication 查看复制信息 # Replication role:slave master_host:192.168.88.61 master_port:6379 master_link_status:up 设置连接密码后 状态为up master_last_io_seconds_ago:10 master_sync_in_progress:0 slave_repl_offset:5847 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:5847 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:5764 repl_backlog_histlen:84 192.168.88.62.:6379>
#配置好连接密码后,是知道连接密码的内部人员,就都可以访问了。
二、哨兵服务与持久化
环境准备:
#操作都是类似的操作,只是在redis服务器中间,增加了一个哨兵服务,来监控、规范、放行、禁止服务器中类似相关权限的使用。
#熟练主从配置的小伙伴,可以直接看步骤三的 哨兵服务配置。
问题
- 配置主机Host67为master服务器
- 配置主机host68为 slave服务器
- 配置主机host69运行哨兵服务
- 测试配置
3台机器都安装redis服务(host69 主机运行哨兵服务 不存储数据 不需要启动redis服务)
说明:
1)可以使用一主一从 或 一主多从 或 主从从 + 哨兵服务 做服务的高可用 和 数据自动备份
2)如果主从结构中的redis服务设置连接密码的话必须全每台数据库都要设置密码且密码要一样,要么全都不设置密码。
步骤一:配置主机Host67为master服务器
1)配置host67为主服务器
[root@host67 ~]# vim /etc/redis.conf 修改配置文件 69 bind 192.168.88.67 设置redis服务使用IP地址 92 port 6379 设置redis服务使用端口 :wq [root@host67 ~]# systemctl start redis 启动服务 [root@host67 ~]# redis-cli -h 192.168.88.67 -p 6379 连接服务 192.168.88.67:6379> info replication 查看角色 # Replication role:master 默认是master角色 connected_slaves:0 没有从服务器 master_replid:0aebff37df915061ddf157cc33d8742f14e8773f master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 192.168.88.67:6379>
步骤二:配置slave服务器host68
[root@host68 ~]# vim /etc/redis.conf 修改配置文件 69 bind 192.168.88.68 设置服务使用Ip地址 92 port 6379 设置服务监听端口 默认即可 :wq [root@host68 ~]# systemctl start redis 启动服务 [root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379 连接服务 192.168.88.68:6379> replicaof 192.168.88.67 6379 指定主服务器ip和端口 OK 192.168.88.68:6379> config rewrite 永久保存配置 OK 192.168.88.68:6379> exit 断开 [root@host68 ~]# tail -1 /etc/redis.conf 保存到了文件末尾 replicaof 192.168.88.67 6379 [root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379 连接服务 192.168.88.68:6379> info replication 查看复制信息 # Replication role:slave 角色 从服务器 master_host:192.168.88.67 主服务器Ip master_port:6379 主服务端口 master_link_status:up 与主连接状态 master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14 192.168.88.68:6379>
步骤三:配置主机host69运行哨兵服务
]# vim /etc/redis-sentinel.conf 创建并编辑主配置文件 15 bind 192.168.88.69 指定哨兵服务使用ip地址 21 port 26379 指定哨兵服务监听端口 26 daemonize yes 服务守护进程方式运行服务 84 sentinel monitor mymaster 192.168.88.67 6379 1 监视master服务器Host67 :wq [root@host69 ~]# systemctl start redis-sentinel 启动哨兵服务 [root@host69 ~]# netstat -utnlp | grep 26379 查看端口号 tcp 0 0 192.168.88.69:26379 0.0.0.0:* LISTEN 1651/redis-sentinel [root@host69 ~]#
步骤四:测试配置
思路:停止master主机的redis 服务,原slave角色会升级为主,哨兵服务会自动监视新的master服务,宕机的master 主机恢复后自动配置为当前主的从服务器。
停止master主机的redis 服务
- [root@host67 ~]# systemctl stop redis
在slave服务器查看角色
[root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379 192.168.88.68:6379> info replication # Replication role:master 角色升级为主 connected_slaves:0 没从服务器 master_replid:e4d9399cdf19c724b032859e77316019735d391e master_replid2:bd1b8d193de170bedd8b40780ee3fb45f9590a5b master_repl_offset:35343 second_repl_offset:32642 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:183 repl_backlog_histlen:35161 192.168.88.68:6379>
宕机的master 主机恢复后自动配置为当前主的从服务器。
[root@host67 ~]# systemctl start redis 启动服务 [root@host67 ~]# redis-cli -h 192.168.88.67 -p 6379 连接服务 192.168.88.67:6379> info replication 查看角色 # Replication role:slave 从服务器 master_host:192.168.88.68 主服务器ip master_port:6379 主服务器端口 master_link_status:up 连通状态 master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:54542 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:e4d9399cdf19c724b032859e77316019735d391e master_replid2:0000000000000000000000000000000000000000 master_repl_offset:54542 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:54379 repl_backlog_histlen:164 192.168.88.67:6379>
案例:使用RDB文件恢复数据
环境准备:
#安装好 redis服务
问题
- 设置存盘间隔为120秒且10个key改变数据自动存盘
- 使用RDB文件恢复数据
步骤一:设置存盘间隔为120秒且10个key改变自动存盘
查看默认存盘频率
[root@redis70 ~]# vim /etc/redis.conf
save 秒 变量个数
save 900 1
save 300 10
save 60 10000
停止按默认配置运行的服务
[root@redis70 ~]# systemctl stop redis
修改存盘频率
[root@redis70 ~]# vim +219 /etc/redis.conf
save 900 1
#save 300 10
save 120 10 # 2分钟内且有>=10个变量改变
save 60 10000
:wq
清空数据库目录
[root@redis70 ~]# rm -rf /var/lib/redis/*
启动服务( 按新的存盘频率运行)
[root@redis70 ~]# systemctl start redis
没有达到存盘频率前 数据库目录下没有dump.rdb文件
[root@redis70 ~]# ls /var/lib/redis/dump.rdb
ls: 无法访问/var/lib/redis/6379/dump.rdb:
[root@redis70 ~]#
在服务启动后,要在2分钟内存储大于等10个变量
连接服务
[root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379
存储变量
192.168.88.70:6379> mset a 1 b 2 c 3 d 4
OK
存储变量
192.168.88.70:6379> mset x 1 y 2 z 3 k 6 i 7 z 9 f 22 zz 99 cc 66
192.168.88.70:6379> exit 断开连接
满足存盘频率后 创建dump.rdb文件并存储数据
[root@redis70 ~]# ls /var/lib/redis/
dump.rdb
[root@redis70 ~]# ls /var/lib/redis/ -l 显示文件创建的时间
总用量 4
-rw-r--r-- 1 redis redis 159 10月 26 16:30 dump.rdb
[root@redis70 ~]#
步骤二:使用RDB文件恢复数据
1)拷贝 dump.rdb 文件就是对数据的备份
[root@redis70 ~]# cp /var/lib/redis/dump.rdb /opt/
[root@redis70 ~]# ls /opt/*.rdb
/opt/dump.rdb
[root@redis70 ~]#
2)把备份的 dump.rdb 文件 再次拷贝回数据库目录就是恢复
#清空内存
192.168.88.70:6379> FLUSHALL
OK
3)使用备份的dump.rdb文件恢复
第1步 停止内存没有数据的redis服务
第2步 使用有数据的dump.rdb文件覆盖没有数据dump.rdb文件
第3步 修改文件的所有者和所属组用户为redis
第4步 启动redis服务 并连接服务查看数据
[root@redis70 ~]# systemctl stop redis
[root@redis70 ~]# cp /opt/dump.rdb /var/lib/redis/
[root@redis70 ~]# chown –R redis:redis /var/lib/redis
[root@redis70 ~]# systemctl start redis
Starting Redis server...
[root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379
192.168.88.70:6379> keys *
1) "i"
2) "d"
3) "x"
……
……
案例:AOF 持久化配置
问题
- 启用AOF
- 使用AOF文件恢复数据
步骤一:启用AOF
[root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379 连接服务 192.168.88.70:6379> config set appendonly yes 启用aof文件 OK 192.168.88.70:6379> config get appendonly 查看是否启用 1) "appendonly" 2) "yes" 192.168.88.70:6379> config rewrite 保存配置 OK 192.168.88.70:6379> exit 断开连接 数据库目录多了appendonly.aof文件 [root@redis70 ~]# ls /var/lib/redis/ appendonly.aof dump.rdb [root@redis70 ~]#wc –l /var/lib/redis/appendonly.aof 查看文件行数 [root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379 连接服务 192.168.88.70:6379> set x 1 存储变量x OK 192.168.88.70:6379> set y 2 存储变量y OK 192.168.88.70:6379> set z 3 存储变量z OK 192.168.88.70:6379>keys * 查看变量 1) "x" 2) "z" 3) "y" 192.168.88.70:6379> exit 断开连接 [root@redis70 ~]#wc –l /var/lib/redis/ appendonly.aof 再次查看文件行数
步骤二:使用AOF文件恢复数据
1)备份aof文件
[root@redis70 ~]# cp /var/lib/redis/appendonly.aof /opt/ 拷贝到/opt目录
[root@redis70 ~]# ls /opt/
appendonly.aof
[root@redis70 ~]#
2)删除数据
[root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379 连接服务
192.168.88.70:6379> flushall 清空内存
192.168.88.70:6379> exit 断开连接
3)恢复数据
第1步: 把没有数据的服务停止
[root@redis70 ~]# systemctl stop redis
第2步:覆盖aof文件
[root@redis70 ~]# cp /opt/appendonly.aof /var/lib/redis/
第3步:启动redis服务并查看数据
[root@redis70 ~]# systemctl start redis
第4步:连接服务
[root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379
第五步骤:查看数据
192.168.88.70:6379> keys *
1) "v4"
2) "v3"
。。。。。。
。。。。。。
三、数据类型
#作为云计算运维方向的IT人员,需要我们掌握数据类型的使用。
#知道大概用法即可,心有余力者,可花时间研究研究。只知道个大概,也可以通过AI来提示自己如何使用相关数据类型命令的使用,只不过要有大体印象,才能合理利用AI协助自己。
练习命令的使用,具体命令如下:
- set getrange strlen append
- decr decrby incr incrby incrbyfloat
存储变量时 设置变量的有效期 px(毫秒) ex (秒) 192.168.88.70:6379> set name plj ex 10 //变量10秒过期 OK 192.168.88.70:6379> 192.168.88.70:6379> type name //查看类型 string 192.168.88.70:6379> 192.168.88.70:6379> set class nsd px 10 //变量10毫秒过期 OK 192.168.88.70:6379> NX 不覆盖赋值 192.168.88.70:6379> set name plj NX OK 192.168.88.70:6379> get name "plj" XX 覆盖赋值 192.168.88.70:6379> set name yaya XX OK 192.168.88.70:6379> get name "yaya" 192.168.88.70:6379> set 命令完整格式演示 192.168.88.70:6379> set gender girl ex 20 NX OK 192.168.88.70:6379>
set 命令完整格式演示
192.168.88.70:6379> set gender girl ex 20 NX OK 192.168.88.70:6379>
- 递增数字:字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时, Redis 提供了一个实用的命令 INCR,其作用是让当前键值递增,并返回递增后的值。 # 当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。 192.168.88.70:6379> set num 1 //创建变量 192.168.88.70:6379> INCR num //+1 (integer) 2 192.168.88.70:6379> INCR num //+1 (integer) 3 192.168.88.70:6379> GET num "3" - 增加指定的整数 192.168.88.70:6379> INCRBY num 2 //+2 (integer) 5 192.168.88.70:6379> INCRBY num 3 //+3 (integer) 8 - 递减数字 192.168.88.70:6379> DECR num //-1 (integer) 7 192.168.88.70:6379> DECRBY num 3 // (integer) 4 - 向尾部追加值 192.168.88.70:6379> set hi Hello //创建变量hi OK 192.168.88.70:6379> append hi " World" # 因为字符串包含空格,需要使用引号 (integer) 11 # 返回值为hi的总长度 192.168.88.70:6379> get hi "Hello World" - 获取字符串长度 192.168.88.70:6379> strlen hi (integer) 11 - 中文字符返回字节数 192.168.88.70:6379> set name 张三 OK 192.168.88.70:6379> strlen name (integer) 6 # UTF-8编码的中文,由于“张”和“三”两个字的UTF-8编码的长度都是3,所以此例中会返回6。 获取变量部分数据 192.168.88.70:6379> set zfc ABCEF //创建变量 OK 192.168.88.70:6379> get zfc //输出变量值 "ABCEF" 192.168.88.70:6379> getrange zfc 0 1 //输出第1个到第2个字符 "AB" 192.168.88.70:6379> getrange zfc 2 4 //输出第3个到第5个字符 "CEF" 192.168.88.70:6379> getrange zfc -2 -1 //输出倒数第2个到第1个字符 "EF" 192.168.88.70:6379> 案例:列表类型 lpush llen lrange lpop rpush lindex lset rpop linsert 方案 在redis70主机做练习。 步骤一:命令操作如下所示: LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度 //创建变量 192.168.88.70:6379> lpush letter A B C (integer) 3 192.168.88.70:6379> type letter 查看类型 list 192.168.88.70:6379> //头部追加元素 192.168.88.70:6379> lpush letter d e (integer) 5 取出列表所有元素 # 起始下标为0,结束下标为-1 192.168.88.70:6379> lrange letter 0 -1 1) "e" 2) "d" 3) "C" 4) "B" 5) "A" 统计元素个数 192.168.88.70:6379> llen letter (integer) 5 通过下标输出单个元素 第1个元素下标用0表示 第2个元素下标用1表示 最后一个元素下标用-1表示 192.168.88.70:6379> lindex letter 0 "e" 192.168.88.70:6379> lindex letter 2 "C" 192.168.88.70:6379> 192.168.88.70:6379> lindex letter -1 //最后1个 "A" 192.168.88.70:6379> lindex letter -2 //倒数第2个 "B" 192.168.88.70:6379> lset修改元素 192.168.88.70:6379> lrange letter 0 -1 修改前查看 1) "e" 2) "d" 3) "C" 4) "B" 5) "A" 192.168.88.70:6379> lset letter 0 E 修改第1元素 OK 192.168.88.70:6379> lset letter -1 a 修改最后1个元素 OK 192.168.88.70:6379> lrange letter 0 -1 修改后查看 1) "E" 2) "d" 3) "C" 4) "B" 5) "a" 192.168.88.70:6379> 弹出元素(删除元素) 192.168.88.70:6379> lrange letter 0 -1 修改前查看 1) "E" 2) "d" 3) "C" 4) "B" 5) "a" 192.168.88.70:6379> lpop letter 弹出头部元素 "E" 192.168.88.70:6379> rpop letter 弹出尾部元素 "a" 192.168.88.70:6379> lrange letter 0 -1 修改后查看 1) "d" 2) "C" 3) "B" 192.168.88.70:6379> 尾部追加元素 192.168.88.70:6379> rpush letter e f 尾部追加元素 (integer) 5 192.168.88.70:6379> lrange letter 0 -1 追加后查看 1) "d" 2) "C" 3) "B" 4) "e" 5) "f" 192.168.88.70:6379> 插入元素 192.168.88.70:6379> lrange letter 0 -1 插入前查看 1) "d" 2) "C" 3) "B" 4) "e" 5) "f" 192.168.88.70:6379> 192.168.88.70:6379> linsert letter before C C2 值C前插入C2 (integer) 6 192.168.88.70:6379> lrange letter 0 -1 插入后查看 1) "d" 2) "C2" 3) "C" 4) "B" 5) "e" 6) "f" 192.168.88.70:6379> 192.168.88.70:6379> linsert letter after C C3 值C后插入C3 (integer) 7 192.168.88.70:6379> lrange letter 0 -1 插入后查看 1) "d" 2) "C2" 3) "C" 4) "C3" 5) "B" 6) "e" 7) "f" 192.168.88.70:6379>