主从复制、主从切换、集群、代理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
发布评论