- 创建:redis.conf
# 为了方便,所有密码可以都设置相同的
requirepass yourPassword
# 为了方便,所有密码可以都设置相同的
masterauth masterPassword
#关闭保护模式
protected-mode no
#开启后,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里
appendonly yes
-
在/data/redis-data路经下创建三个文件夹,node1,node2,node3 并且把redis.conf分别复制到三个文件夹中各一份。
-
运行主节点容器(主)
docker run --name redis1 -v /data/redis-data/node1/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 -p 26379:26379 redis redis-server /usr/local/etc/redis/redis.conf
- 生成容器后运行:
docker inspect 容器id
image.png
- node2和node3文件夹内配置修改文件redis.conf
# 为了方便,所有密码可以都设置相同的
requirepass yourPassword
# 为了方便,所有密码可以都设置相同的
masterauth masterPassword
#关闭保护模式
protected-mode no
#主容器获得
replicaof 172.18.0.2 6379
appendonly yes
- (从)运行从节点俩容器
docker run --name redis2 -v /data/redis-data/node2/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6380:6379 -p 26380:26380 redis redis-server /usr/local/etc/redis/redis.conf
docker run --name redis3 -v /data/redis-data/node3/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6381:6379 -p 26381:26381 redis redis-server /usr/local/etc/redis/redis.conf
- 分别进入三台容器运行:
docker exec -it redis1 bash
redis-cli
info Replication
image.png
- 我们会看到每台服务器都是主节点,这时候,我们要在第二个容器和三个容器内修改一下
#第二台
docker exec -it redis2 bash
redis-cli
SLAVEOF 172.18.0.2 6379
image.png
#第三台
docker exec -it redis3 bash
redis-cli
SLAVEOF 172.18.0.2 6379
image.png
- 这时候我们在回到第一台容器看看,出现了两台丛节点
docker exec -it redis1 bash
redis-cli
info Replication
image.png
-
测试一下 在主节点设置,从节点是否同步。从节点只有读的权限,没有写的权限
image.png
sentinel 配置[redis哨兵]
- 在node1,node2,node3文件夹下分别创建sentinel.conf文件
#node1/sentinel.conf [port:指定哨兵监听端口,dir:#sentinel工作目录,logfile:#日志文件,sentinel monitor nameL#启动哨兵(名称:name) 监听master,daemonize:#后台运行]
port 26379
dir "/data"
logfile "26379.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****开始redis.conf配置的密码
sentinel failover-timeout nameh 180000
daemonize yes
#node2/sentinel.conf [port:指定哨兵监听端口,dir:#sentinel工作目录,logfile:#日志文件,sentinel monitor nameL#启动哨兵(名称:name) 监听master,daemonize:#后台运行]
port 26380
dir "/data"
logfile "26380.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****开始redis.conf配置的密码
sentinel failover-timeout nameh 180000
daemonize yes
#node3/sentinel.conf [port:指定哨兵监听端口,dir:#sentinel工作目录,logfile:#日志文件,sentinel monitor nameL#启动哨兵(名称:name) 监听master,daemonize:#后台运行]
port 26381
dir "/data"
logfile "26381.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****开始redis.conf配置的密码
sentinel failover-timeout nameh 180000
daemonize yes
- 然后分别把不同的sentinel.conf 拷贝到相对应的容器内
docker cp /data/redis-data/node1/sentinel.conf 容器ID:/data
docker cp /data/redis-data/node2/sentinel.conf 容器ID:/data
docker cp /data/redis-data/node3/sentinel.conf 容器ID:/data
-
分别进入容器内/data 路径下,看是否有sentinel.conf 文件 如果存在就启动:
redis-sentinel sentinel.conf
-
如果想开是否启动成功可以
apt-get update
apt-get install procps
ps -ef
image.png
-
再测试一下, 停止主节点容器看其他节点容器会顶替主节点吗?先停掉第一台,等30秒。
image.png -
第二台容器已经显示主节点挂掉了,稍等一下再看看。
image.png -
第二台选择又提示主节点启动了,目前第二台还是从节点,那应该是随机把第三台变成了主节点。去看下。
image.png -
第三台显示成为主节点。到此结束。
PHP 链接哨兵
参考文档:https://segmentfault.com/a/1190000011185598
#前提是php安装了redis扩展
$redis = new Redis();
//连接sentinel服务 host为ip,port为端口
$redis->connect("host", "port");
//获取主库列表及其状态信息
$result = $redis->rawCommand('SENTINEL', 'masters');
print_r($result);
//根据所配置的主库redis名称获取对应的信息
//master_name应该由运维告知(也可以由上一步的信息中获取)
$result1 = $redis->rawCommand('SENTINEL', 'master', $master_name);
print_r($result1);
//根据所配置的主库redis名称获取其对应从库列表及其信息
$result2 = $redis->rawCommand('SENTINEL', 'slaves', $master_name);
print_r($result2);
//获取特定名称的redis主库地址
$result3 = $redis->rawCommand('SENTINEL', 'get-master-addr-by-name', $master_name);
print_r($result3);
网友评论