redis—安装、主从复制、主从切换、集群、代理twemproxy

编程入门 行业动态 更新时间:2024-10-26 08:28:42

redis—安装、<a href=https://www.elefans.com/category/jswz/34/1768145.html style=主从复制、主从切换、集群、代理twemproxy"/>

redis—安装、主从复制、主从切换、集群、代理twemproxy

1、redis编译及安装

实验环境:
将之前server1、server2、server3安装的数据库都停掉
/etc/init.d/mysqld stop

server1的redis编译及安装:
[root@foundation50 redis]# scp  redis-6.2.1.tar.gz  server1:/mnt  将下载好的redis拷贝到server1上
[root@server1 mnt]# tar zxf redis-6.2.1.tar.gz  解压
[root@server1 redis-6.2.1]# make USE_SYSTEMD=yes  加上USE_SYSTEMD=yes 此参数表示脚本是用systemd来启动
[root@server1 redis-6.2.1]# make install  
[root@server1 redis-6.2.1]# cd /usr/local/bin/  进入此目录,可以发现生成了redis二进制指令
goaccess  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server
[root@server1 bin]# cd /mnt/redis-6.2.1/  进入源码目录
[root@server1 redis-6.2.1]# cd utils/
[root@server1 utils]# cp systemd-redis_server.service /usr/lib/systemd/system/redis.service  拷贝systemd脚本到system目录 ; redis.service 脚本名字自己起[root@server1 utils]# vim /usr/lib/systemd/system/redis.service  编辑[Unit]Description=Redis data structure serverDocumentation==your_application.service another_example_application.serviceAssertPathExists=/var/lib/redis   打开,redis的数据目录Wants=network-online.targetAfter=network-online.target[Service]#ExecStart=/usr/local/bin/redis-server --supervised systemd --daemonize no  禁掉,启动参数写到配置文件里## Alternatively, have redis-server load a configuration file:ExecStart=/usr/local/bin/redis-server  /etc/redis/redis.conf   指定配置文件        ExecReload=/bin/kill -s HUP $MAINPID  添加relod参数ExecStop=/usr/local/bin/redis-cli -p 6379 shutdown    添加stop参数LimitNOFILE=10032NoNewPrivileges=yes#OOMScoreAdjust=-900PrivateTmp=yes  打开自己的临时目录Type=notify            #TimeoutStartSec=infinity   禁掉#TimeoutStopSec=infinity  禁掉UMask=0077#User=redis#Group=redis#WorkingDirectory=/var/lib/redis[Install]WantedBy=multi-user.target[root@server1 utils]# systemctl daemon-reload   重新加载
[root@server1 utils]# mkdir /etc/redis   建立主配置目录
[root@server1 utils]# mkdir /var/lib/redis  建立工作目录
[root@server1 ~]# cd /mnt/redis-6.2.1/  进入源码
[root@server1 redis-6.2.1]# cp redis.conf /etc/redis/   将redis.conf 拷贝到主配置目录里
[root@server1 redis-6.2.1]# cd /etc/redis/  进入主配置目录
[root@server1 redis]# vim redis.conf   编辑配置文件bind 0.0.0.0  更改, 监听本机所有接口daemonize yes  打入后台打开,将no改成yessupervised auto  打开注释 自动
[root@server1 redis]# redis-cli    进入redis

redis常用指令:

127.0.0.1:6379> CONFIG GET databases   查看配置
1) "databases"
2) "16"    表示总共有16个数据库
127.0.0.1:6379> select 1  选者数据库1
OK
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> select 0  选择数据库0
OK
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> FLUSHDB  清空当前数据库
OK
127.0.0.1:6379> get name    当前数据库没有了
(nil)---------------------------------------------------
127.0.0.1:6379> select 1   
OK
127.0.0.1:6379[1]> set name westos  
127.0.0.1:6379[1]> SELECT 0  切换到数据库0
OK
127.0.0.1:6379> FLUSHALL  表示切换所有数据库
OK
127.0.0.1:6379> select 1  再次切换到数据库1
OK
127.0.0.1:6379[1]> get name   数据都没有了
(nil)-----------------------------------------------------127.0.0.1:6379[1]> select 0  进入数据库0
OK
127.0.0.1:6379> set name westos  
OK
127.0.0.1:6379> EXPIRE name 5  设置过期时间为5秒
(integer) 1
127.0.0.1:6379> get name  
"westos"
127.0.0.1:6379> get name   5秒后数据就没有了
(nil)

server2上redis编译安装:

每个节点安装rsync:
[root@server1 bin]# yum install rsync -y
[root@server1 bin]# ssh server2 yum install rsync -y  server2上安装rsync
[root@server1 bin]# ssh server3 yum install rsync -y  server3上安装rsync[root@server1 ~]# cd /usr/local/bin  进入bin目录
[root@server1 bin]# rsync -a * server2:/usr/local/bin/   将server1上的bin目录里的内容同步到server2上,-a表示保留软连接
[root@server1 bin]# scp -r /etc/redis/ server2:/etc  将redis目录拷贝到server2的etc目录里
[root@server2 bin]# mkdir /var/lib/redis  建立数据目录
[root@server1 ~]# cd /usr/lib/systemd/system  
[root@server1 system]# scp redis.service server2:/usr/lib/systemd/system 将server1的systemd脚本拷贝到server2上
[root@server2 bin]# systemctl daemon-reload --------------------------------------------------
127.0.0.1:6379> keys na*
(empty array)
127.0.0.1:6379> set name westos
OK
127.0.0.1:6379> keys na*  查询
1) "name"
127.0.0.1:6379> exists name  查询是否存在
(integer) 1

具体命令用法可以查看官网:redis命令

2、server1、server2上做redis主从复制

[root@server2 bin]# cd /etc/redis/  进入配置目录
[root@server2 redis]# vim redis.conf   编辑redis配置文件,做主从发复制

[root@server2 redis]# systemctl start redis  启动redis
[root@server2 redis]# redis-cli  登陆
127.0.0.1:6379> info 查看

测试:
[root@server1 system]# redis-cli 
127.0.0.1:6379> set name westos  在server1上改动数据
OK
在server2上也会出现
127.0.0.1:6379> get name
"westos"

2、1主从复制工作原理

原理图:

从服务器和主服务器连接,从服务器通过设置 replicaof 172.25.50.1 告诉从服务器的位置和端口,从而进行连接主服务器
并且从服务器会发送sync同步请求给主服务器,主服务器收到同步请求会执行BGsave(异步模式)把所有数据生成快照,并且记录在此期间写的命令,然后把快照发送给从服务器,从服务器接到快照他会刷掉本机所有的数据,然后加载内存快照(内存快照格式是rdb),但是在此期间主服务器还会有相应的写入动作cache会缓存写入,当做完全量同步后,缓存会把存入写的指令通过replicationfeed函数一个个发送到slave端去执行,直到主从同步。

3、redis高可用-主从切换

redis高可用主从切换文档
server3搭建redis:

[root@server2 ~]# cd /usr/local/bin/  进入bin目录
[root@server2 bin]# rsync -a * server3:/usr/local/bin/  
[root@server2 bin]# scp -r /etc/redis/ server3:/etc/   
[root@server2 bin]# scp /usr/lib/systemd/system/redis.service server3:/usr/lib/systemd/system/  同步脚本到server3
[root@server3 ~]# mkdir /var/lib/redis/  创建数据目录
[root@server3 ~]# systemctl daemon-reload   加载一下服务
[root@server3 ~]# systemctl start redis 启动redis
[root@server3 ~]# redis-cli   登陆redis
127.0.0.1:6379> get name
"westos"    有westos,成功色

sentinel做主从切换配置

[root@server1 ~]# cd /mnt/redis-6.2.1/  进入源码
[root@server1 redis-6.2.1]# cp sentinel.conf /etc/redis/   将脚本拷贝到/etc/redis/  
[root@server1 redis-6.2.1]# cd /etc/redis/ 进入配置目录
[root@server1 redis]# vim sentinel.conf  编辑
26 daemonize no   表示不打入后台,yes表示打入后台
84 sentinel monitor mymaster 172.25.50.1 6379 2  设置master节点,2表示有3个sentinel节点中必须要有2个sentinel投票,才认为master挂掉了
125 sentinel down-after-milliseconds mymaster 10000  表示master 的超时间,本次设置10s
[root@server1 redis]# scp sentinel.conf server2:/etc/redis/   将配置好的sentinel.conf拷贝到server2的redis配置目录里,注意:要在sentinel重启之前
sentinel.conf                                                              100%   13KB  12.2MB/s   00:00    
[root@server1 redis]# scp sentinel.conf server3:/etc/redis/   将配置好的sentinel.conf拷贝到server3的redis配置目录里,注意:要在sentinel重启之前
sentinel.conf 
[root@server1 redis]# redis-sentinel /etc/redis/sentinel.conf   启动sentinel

[root@server2 ~]#  redis-sentinel /etc/redis/sentinel.conf  启动sentinel

[root@server3 ~]#  redis-sentinel /etc/redis/sentinel.conf   启动sentinel

[root@server1 ~]# redis-cli   从开一个server1,登陆redis
127.0.0.1:6379> SHUTDOWN   关闭
[root@server2 ~]#  redis-sentinel /etc/redis/sentinel.conf   

[root@server1 ~]# systemctl start redis.service   启动redis
[root@server1 ~]# redis-cli  登陆redis


注意:有个问题,一旦网络断开slave端的两个sentinel连不上前面的master端的sentinel,后端两个sentinel就会投票,就会认为master挂掉了,其中一个slave会变成master,当网路恢复后原来的master端发现集群发生了变化,他会把自己变成slave去接入新的master,但是客户端对之前的master写的数据,变成slave后去同步数据会flushall刷掉所有数据,数据就会丢失,所以需要加一个参数min-slaves-to-write=2 表示master最少有两个slave可写,如果不满足master不允许客户端往里面写数据,减少数据丢失

4、 redis集群

[root@server1 redis]# systemctl stop redis.service  停掉server1上redis
[root@server1 redis]# mkdir /usr/local/redis-cluster  创建目录
[root@server1 redis]# cd /usr/local/redis-cluster/  进入目录
[root@server1 redis-cluster]# mkdir 7000 7001 7002 7003 7004 7005    建立不同的示例目录
[root@server1 redis-cluster]# cd 7000
[root@server1 7000]# vim redis.conf   建立配置文件,添加参数
port 7000
cluster-enabled yes   激活集群
cluster-config-file nodes.conf    集群配置文件
cluster-node-timeout 5000  超时时间
appendonly yes
daemonize yes  打入后台
[root@server1 7000]# redis-server redis.conf   启动
[root@server1 7000]# ps ax

[root@server1 7000]# cp redis.conf ../7001/  将配置文件 拷贝到7001目录
[root@server1 7000]# cp redis.conf ../7002/  将配置文件 拷贝到7002目录
[root@server1 7000]# cp redis.conf ../7003/   将配置文件 拷贝到7003目录
[root@server1 7000]# cp redis.conf ../7004/ 将配置文件 拷贝到7004目录
[root@server1 7000]# cp redis.conf ../7005/   将配置文件 拷贝到7005目录7001:
[root@server1 redis-cluster]# cd 7001 进入7001目录
[root@server1 7001]# vim redis.conf  
port 7001  端口改为7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
[root@server1 7001]# redis-server redis.conf 
[root@server1 7001]# ps ax

7002:
[root@server1 redis-cluster]# cd 7002
[root@server1 7002]# vim redis.conf   编辑配置文件
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
[root@server1 7002]# redis-server redis.conf  启动
[root@server1 7002]# ps ax

7003:[root@server1 redis-cluster]# cd 7003[root@server1 7003]# vim redis.conf port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
[root@server1 7003]# redis-server redis.conf  
[root@server1 7003]# ps ax

7004:
[root@server1 redis-cluster]# cd 7004
[root@server1 7004]# vim redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
[root@server1 7004]# redis-server redis.conf 

7005:
[root@server1 redis-cluster]# cd 7005  进入数据库
[root@server1 7005]# vim redis.conf 
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
[root@server1 7005]# redis-server redis.conf  启动

[root@server1 ~]# redis-cli --cluster   help  查看帮助, 集群命令参数
[root@server1 ~]# redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 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   
创建集群 ,--cluster-replicas 1 表示每个master有1个slave

[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7000  查看任何一个节点,都可拿到信息

[root@server1 ~]# redis-cli --cluster check 127.0.0.1:7000   查看集群信息,查看相互之间的关系

[root@server1 ~]# redis-cli -c -p 7000  -c表示连接集群   -p表示端口
127.0.0.1:7000> info  查看信息

127.0.0.1:7000> set name westos  
-> Redirected to slot [5798] located at 127.0.0.1:7001  重定向到另外一个master7001,无中心化
OK
127.0.0.1:7001> get name
"westos"
[root@server1 ~]# redis-cli -c -p 7003  连接7003 salve
127.0.0.1:7003> get name
-> Redirected to slot [5798] located at 127.0.0.1:7001  直接定位到7001
"westos"127.0.0.1:7001> SHUTDOWN  将7001master关闭
[root@server1 ~]# redis-cli --cluster check 127.0.0.1:7001   查看信息

[root@server1 ~]# redis-cli -c -p 7003  连接7003
127.0.0.1:7003> get name
-> Redirected to slot [5798] located at 127.0.0.1:7005
"westos"    可以访问到数据
[root@server1 ~]# cd /usr/local/redis-cluster/  
[root@server1 redis-cluster]# cd 7001
[root@server1 7001]# redis-server redis.conf   启动7001
[root@server1 7001]# redis-cli --cluster check 127.0.0.1:7001  查看

[root@server1 7001]# redis-cli -c -p 7005
127.0.0.1:7005> SHUTDOWN

[root@server1 7001]# redis-cli -c -p 7001  进入7001
127.0.0.1:7001> SHUTDOWN  关闭
[root@server1 7001]# redis-cli -c -p 7001 
127.0.0.1:7001> SHUTDOWN
not connected> get name
Could not connect to Redis at 127.0.0.1:7001: Connection refused   连续down两个集群就坏了
[root@server1 7001]# redis-server redis.conf  启动
[root@server1 7001]# redis-cli --cluster check 127.0.0.1:7001  查看集群信息

在集群中添加slave节点

[root@server1 ~]# cd /usr/local/redis-cluster/
[root@server1 redis-cluster]# mkdir 7006
[root@server1 redis-cluster]# cp 7000/redis.conf 7006/
[root@server1 redis-cluster]# cd 7006/
[root@server1 7006]# vim redis.conf 
port 7006
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
[root@server1 7006]# redis-server redis.conf  启动
[root@server1 7006]# redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 5553734d775c0a39ed990fcf0d73fa4ac9c92d47 add-node表示添加新的节点,新的节点为127.0.0.1:7006  ,后面跟的127.0.0.1:7000表示新的节点要连入的集群,此从可以选者集群中任何一个节点,--cluster-slave 表示添加的这个节点作为slave  ,--cluster-master-id  表示要复制那个主的数据,本次复制的是7001主的数据,后面跟7001的id			

在集群中添加master节点

[root@server1 redis-cluster]# cd 7005/  
[root@server1 7005]# rm -fr nodes.conf  dump.rdb appendonly.aof  删除之前加入集群的信息,得到纯净的节点
[root@server1 7005]# redis-server redis.conf  启动
[root@server1 7005]# redis-cli --cluster add-node 127.0.0.1:7005 127.0.0.1:7000  添加集群让7005成为主


再次添加slave节点

[root@server1 redis-cluster]# mkdir 7007  
[root@server1 redis-cluster]# cp 7000/redis.conf 7007/
[root@server1 redis-cluster]# cd 7007/
[root@server1 7007]# vim redis.conf  编辑
port 7007
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
[root@server1 7007]# redis-server redis.conf   启动
[root@server1 7007]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 730a4075153b80089879d2be0c78c665ec0320e0    在集群中添加slave节点 ,作为7005的slave


如何迁移哈希槽?

[root@server1 7007]# redis-cli --cluster help

[root@server1 7007]# redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from e2fbb4592b120fc5ce4f0926b75a6d33c1ea99c0 --cluster-to 730a4075153b80089879d2be0c78c665ec0320e0 --cluster-slots 1000 --cluster-yes
reshard 127.0.0.1:7000 表示连接集群  , --cluster-from 表示从那迁,此次从7000迁 后面跟7000的id ,
--cluster-to 表示迁到那,此次迁到7005,后面跟7005的id ,--cluster-slots 表示迁移槽的个数 ,-cluster-yes 表示集群
[root@server1 7007]# redis-cli --cluster check 127.0.0.1:7001  查看集群信息

另一种创建redis集群的方法(简单)

[root@server1 7007]# killall redis-server  杀掉所有集群节点进程
[root@server1 ~]# cd /mnt/redis-6.2.1/utils/create-cluster/
[root@server1 create-cluster]# ls
create-cluster  README
[root@server1 create-cluster]# less README 查看帮助
[root@server1 create-cluster]# ./create-cluster  start  启动
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
[root@server1 create-cluster]# ./create-cluster create  创建集群

[root@server1 create-cluster]# redis-cli --cluster check 127.0.0.1:3001  查看集群,集群创建成功

[root@server1 create-cluster]# ./create-cluster --help 查看集群帮助
Usage: ./create-cluster [start|create|stop|watch|tail|clean|call]
start       -- Launch Redis Cluster instances.
create [-f] -- Create a cluster using redis-cli --cluster create.
stop        -- Stop Redis Cluster instances.
watch       -- Show CLUSTER NODES output (first 30 lines) of first node.
tail <id>   -- Run tail -f of instance at base port + ID.
tailall     -- Run tail -f for all the log files at once.
clean       -- Remove all instances data, logs, configs.
clean-logs  -- Remove just instances logs.
call <cmd>  -- Call a command (up to 7 arguments) on all nodes.
[root@server1 create-cluster]# ./create-cluster stop  停掉集群
Stopping 30001
Stopping 30002
Stopping 30003
Stopping 30004
Stopping 30005
Stopping 30006
[root@server1 create-cluster]# ./create-cluster clean   清除

redis添加代理 twemproxy

server2上安装twemproxy:
[root@foundation50 redis]# scp twemproxy-master.zip server2:/mnt  将下载好的软件拷贝到server2的mnt里
[root@server2 mnt]# yum install unzip -y  下载解unzip解压工具
[root@server2 mnt]# unzip twemproxy-master.zip   解压
[root@server2 twemproxy-master]# cd /mnt/
[root@server2 mnt]# cd twemproxy-master/  进入解压目录
[root@server2 twemproxy-master]# yum install -y autoconf automake libtool 安装依赖性
[root@server2 twemproxy-master]# autoreconf -fvi   
[root@server2 twemproxy-master]# ./configure --prefix=/usr/local/twemproxy  执行,指定了安装路经
[root@server2 twemproxy-master]# make  编译
[root@server2 twemproxy-master]# make install  安装
[root@server2 sbin]# cd /mnt/twemproxy-master/  进入源码目录
[root@server2 twemproxy-master]# cd conf
[root@server2 conf]# ls
nutcracker.leaf.yml  nutcracker.root.yml  nutcracker.yml
[root@server2 conf]# cp nutcracker.yml /usr/local/twemproxy/    
[root@server2 conf]# cd /usr/local/twemproxy/
[root@server2 twemproxy]# ls
nutcracker.yml  sbin  share
[root@server2 twemproxy]# vim nutcracker.yml   编辑文件
alpha:listen: 0.0.0.0:22121hash: fnv1a_64distribution: ketamaauto_eject_hosts: trueredis: trueserver_retry_timeout: 2000server_failure_limit: 1servers:- 172.25.50.1:6379:1  - 172.25.50.3:6379:1 
[root@server2 twemproxy]# /usr/local/twemproxy/sbin/nutcracker  -d -c /usr/local/twemproxy/nutcracker.yml  运行让server3变成master:
[root@server3 ~]# systemctl stop redis 停止redis

删除之前slave信息

[root@server3 redis]# systemctl start redis  启动redis
[root@server3 redis]# redis-cli 
127.0.0.1:6379> info 

[root@server2 twemproxy]# cd /usr/local/bin/ 
[root@server2 bin]# rsync -a * server4:/usr/local/bin/    将server2上bin目录里的内容拷贝到server4的bin目录里
[root@server1 redis]# redis-cli   关闭server1上redis保护模式
127.0.0.1:6379> CONFIG SET protected-mode no
OK
[root@server3 redis]# redis-cli   关闭server3上redis保护模式
127.0.0.1:6379> CONFIG SET protected-mode no
OK
[root@server2 twemproxy]# ps ax


server2为twemproxy ,server1、server3为master,如果节点多还可以增加slave,做主从切换
测试:

[root@server1 redis]# redis-cli  刷掉之前的数据
127.0.0.1:6379> FLUSHALL
OK
[root@server3 redis]# redis-cli  刷掉之前的数据
127.0.0.1:6379> FLUSHALL
OK
[root@server4 ~]# redis-cli -h 172.25.50.2 -p 22121  客户端连接
172.25.50.2:22121> set name westos
OK
[root@server1 redis]# lsof -i :6379  数据均衡到server2上了

172.25.50.2:22121> set dame test  继续添加数据
OK
172.25.50.2:22121> get dame
"test"
[root@server3 redis]# redis-cli    数据被均衡到server3上
127.0.0.1:6379> get dame
"test"

练习:codis?

查看文档

更多推荐

redis—安装、主从复制、主从切换、集群、代理twemproxy

本文发布于:2023-07-28 19:50:04,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1292429.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:主从   集群   redis   twemproxy

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!