Redis学习笔记之安装
一、Windown 下安装
2. 解压:
3. 加入环境变量(就不需要到解压目录运行命令)
//redis-server.exe运行程序
//redis.windows.conf配置文件, 可以不加,会使用默认配置
redis-server.exe redis.windows.conf
二、Linux 下安装
2.1 下载 安装及编译
//放到特定位置
//这里放到/usr/local/
cd /usr/local/
//注意权限问题,需要权限,则加上sudo 运行
//下载
wget http://download.redis.io/releases/redis-6.0.0.tar.gz
//解压
tar xzf redis-6.0.0.tar.gz
//切换到解压目录
cd redis-6.0.0
//编译
make
linux 安装
sudo apt remove apparmor
解决:
Could not create server TCP listening socket 0.0.0.0:6379: unable to bind socket, errno: 13
2.2 启动
src/redis-server
三、Docker 安装(推荐)
3.1 创建文件夹
mkdir -p $PWD/redis/{data,conf}
3.2 拷贝配置文件
#先启动一个redis 服务
docker run -p 6379:6379 --name redis -d redis:6.0
#拷贝配置文件(可能找不到)
docker cp redis:/etc/redis/redis.conf $PWD/conf
#到官网下载
#https://redis.io/download
#https://github.com/antirez/redis/blob/6.0/redis.conf
wget https://raw.githubusercontent.com/antirez/redis/6.0/redis.conf
3.3 配置(进入配置文件修改以下属性)
port 6379
requirepass 123456 #设置密码
protected-mode no #保护模式(yes|no)
bind 127.0.0.1 #绑定访问的地址,如果想任何地址都能访问,加上注释
3.4 启动
docker container stop redis
docker container rm redis
docker run -d -p 6379:6379 \
--name redis \
-v $PWD/redis/conf/redis.conf:/conf/redis.conf \
-v $PWD/redis/data:/data \
--restart=always \
--privileged=true \
redis:6.0 redis-server /conf/redis.conf #指定配置文件启动
四、docker搭建主从
4.1 修改配置
wget http://download.redis.io/redis-stable/redis.conf
port 6123 #这里修改了默认端口6379
protected-mode no #关闭保护模式
bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定ip
requirepass test #密码
masterauth test #主节点验证密码
port 6124 #这里修改了默认端口6379
protected-mode no #关闭保护模式
bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定ip
requirepass test #密码
#指定主节点
replicaof redis-master 6123
masterauth test #主节点验证密码
port 6125 #这里修改了默认端口6379
protected-mode no #关闭保护模式
bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定ip
requirepass test #密码
#指定主节点
replicaof redis-master 6123
4.2 docker-compose.yml
version: '3'
services:
redis-master:
image: 'redis:6.0'
container_name: 'redis-server-master'
restart: always
privileged: true
expose:
- 6123
environment:
TZ: "Asia/Shanghai" #时区,保证时间正确
volumes:
- '$PWD/redis/master/conf/redis.conf:/usr/local/etc/redis/redis.conf'
- '$PWD/redis/master/data:/data'
networks:
- ms-redis-netword
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
redis-slave-1:
image: 'redis:6.0'
container_name: 'redis-server-slave-1'
restart: always
privileged: true
expose:
- 6124
environment:
TZ: "Asia/Shanghai" #时区,保证时间正确
volumes:
- '$PWD/redis/slave1/conf/redis.conf:/usr/local/etc/redis/redis.conf'
- '$PWD/redis/slave1/data:/data'
networks:
- ms-redis-netword
depends_on:
- redis-master
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
redis-slave-2:
image: 'redis:6.0'
container_name: 'redis-server-slave-2'
restart: always
privileged: true
expose:
- 6125
environment:
TZ: "Asia/Shanghai" #时区,保证时间正确
volumes:
- '$PWD/redis/slave2/conf/redis.conf:/usr/local/etc/redis/redis.conf'
- '$PWD/redis/slave2/data:/data'
networks:
- ms-redis-netword
depends_on:
- redis-master
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
networks:
ms-redis-netword:
driver: bridge
4.3 启动验证
#连接master
docker exec -it redis-server-master bash
#连接redis
redis-cli -p 6123
#验证
127.0.0.1:6123> auth test
OK
#查看分片情况
127.0.0.1:6123> info replication
# Replication
role:master
connected_slaves:2 #有两个从节点
slave0:ip=192.168.48.3,port=6125,state=online,offset=826,lag=0
slave1:ip=192.168.48.4,port=6124,state=online,offset=826,lag=0
master_replid:b540d4dbee52d6284bda72186b55bec1b8064ab0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:826
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:826
# 设置值
127.0.0.1:6123> set test1 java
## 登录从节点,看是否有同步
docker exec -it redis-server-slave-1 bash
#连接redis
redis-cli -p 6124
#验证
127.0.0.1:6124> auth test
OK
127.0.0.1:6124> get test1
"java"
五、搭建简单的集群
5.1 redis配置文件模板redis.cluster.template
#关闭保护模式
protected-mode no
#端口
port ${PORT}
#后台运行
daemonize no
#配置,数据文件路径
dir ./
#是否开启持久化
appendonly yes
#是否开启集群
cluster-enabled yes
#集群配置文件
cluster-config-file nodes.conf
#节点连接超时时间
cluster-node-timeout 15000
5.2 初始化配置文件脚本 init_redis_cluster.sh
#!/bin/bash
#删除创建的文件
rm -rf $PWD/master $PWD/slave
#master 和 slave 文件夹
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
mkdir -p $PWD/$ms/$port/conf \
&& mkdir -vp $PWD/$ms/$port/data \
&& PORT=$port envsubst < ./redis.cluster.template > $PWD/$ms/$port/conf/redis.conf;
done
5.3 创建redis容器脚本(create_redis_cluster.sh)
#!/bin/bash
#运行docker redis 的 master 和 slave 实例
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
if [ "$(docker ps -q -f name=redis-cluster-$ms-$port)" ]; then
#stop
docker container stop redis-cluster-$ms-$port
fi
if [ "$(docker ps -aq -f status=exited -f name=redis-cluster-$ms-$port)" ]; then
#cleanup
docker container rm redis-cluster-$ms-$port
fi
# run your container
docker run -d -p $port:$port -p 1$port:1$port \
-v $PWD/$ms/$port/conf:/conf \
-v $PWD/$ms/$port/data:/data \
--privileged=true --restart always \
--name redis-cluster-$ms-$port \
--net network-redis-cluster \
redis redis-server /conf/redis.conf;
done
5.4 执行脚本,启动容器
#注意,模板和脚本要在同一文件目录下
sudo sh ./init_redis_cluster.sh
sudo sh ./create_redis_cluster.sh
#查看容器是否正常启动
docker ps -a --filter "network=network-redis-cluster"
5.5 分配启动集群
#!/bin/bash
#拼接masters : slaves 节点参数
matches=""
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
matches=$matches$(docker inspect --format '{{(index .NetworkSettings.Networks "network-redis-cluster").IPAddress}}' "redis-cluster-$ms-${port}"):${port}" ";
done
# 创建docker-cluster
# redis 4 or 3版本
#需要redis-trib 镜像
#docker run -it --rm --net redis-cluster-net redis-trib ruby redis-trib.rb create --replicas 1 $matches
#redis 5 版本
docker run -it --rm --net network-redis-cluster --privileged=true redis redis-cli --cluster create $matches --cluster-replicas 1
#如果权限不够,则添加一下参数
#--privileged=true
5.6 测试
#登录7001redis
docker exec -it redis-cluster-master-7001 bash
#连接
root@a70b1d940dae:/usr/local# redis-cli -c -p 7001
127.0.0.1:7001> set foo bar
-> Redirected to slot [12182] located at 172.20.0.5:7002
OK
172.20.0.5:7002> set hello world
-> Redirected to slot [866] located at 172.20.0.4:7000
OK
172.20.0.4:7000> get foo
-> Redirected to slot [12182] located at 172.20.0.5:7002
"bar"
172.20.0.5:7002> get hello
-> Redirected to slot [866] located at 172.20.0.4:7000
"world"
172.20.0.4:7000>
5.7 这里还涉及(待续...)
参考