本次实验的是一主两从三个哨兵,单机服务器搭建
1、redis 安装配置
首先从 redis 官网下载 redis 源代码并解压,这里使用的是 redis-4.0.6.tar.gz 版本。
先去 http://download.redis.io/releases/ 下载 redis 安装包
mkdir /data
tar -xf redis-4.0.6.tar.gz -C /data
yum -y install gcc-c++ # 编译用
cd /data/redis-4.0.6/
make MALLOC=libc # 加 MALLOC=libc 为了防止编译出错,具体百度 make MALLOC=libc
make install PREFIX=/data/redis # 目标安装路径
安装完成后,/data/redis/bin 目录下会生成几个可执行的文件
可执行文件 | 作用 |
---|---|
redis-server | 启动 redis 服务 |
redis-cli | 命令行客户端 |
redis-benchmark | redis 基准测试工具 |
redis-check-aof | redis AOF 持久化文件检测和修复工具 |
redis-check-rdb | redis RDB 持久化文件检测和修复工具 |
redis-sentinel | 启动 sentinel |
复制 redis 相关命令到 /usr/local/bin/ 目录下,这样就可以直接执行这些命令了,不用写路径
cd /data/redis/bin/
cp redis-server redis-cli redis-sentinel /usr/local/bin/
准备 redis 配置文件
mkdir /data/redis/{conf,db,log,redispid,sentinel} # 配置文件及相关目录
cd /data/redis/conf
cp /data/redis-4.0.6/redis.conf redis1000.conf
cp /data/redis-4.0.6/redis.conf redis2000.conf
cp /data/redis-4.0.6/redis.conf redis3000.conf
cp /data/redis-4.0.6/sentinel.conf sentinel1001.conf
cp /data/redis-4.0.6/sentinel.conf sentinel2001.conf
cp /data/redis-4.0.6/sentinel.conf sentinel3001.conf
vim redis1000.conf (主库) 修改以下
bind 192.168.128.128 # 绑定本机 IP地址
protected-mode no # 保护模式修改为否,允许远程连接
port 1000 # 端口号
timeout 300 # 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
daemonize yes # 设置后台启动
pidfile "/data/redis/redispid/redis_1000.pid" # pid 文件
loglevel notice # 日志级别,可用的级别有debug.verbose.notice.warning
logfile "/data/redis/log/redis1000.log" # 日志目录
databases 16 # 数据库数量
rdbcompression yes # 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储
dbfilename "dump1000.rdb" # 数据文件名称
dir "/data/redis/db" # 数据目录
masterauth "123456" # 设定主库密码与当前库密码同步,保证从库能够提升为主库
slave-priority 10 # 优先级,哨兵将挑选优先级最小数字为master
requirepass "123456" # 设定密码
maxclients 100 # 设置同一时间最大客户连接数
appendonly yes # 打开 AOF 持久化
appendfilename "appendonly1000.aof" # 指定更新日志文件名
从库 redis2000.conf 和 redis3000.conf 与主库 redis1000.conf 基本相同,需要修改各自的ip、端口、优先级等等
从库需要添加主库同步配置:slaveof 192.168.128.128 1000
vim sentinel1001.conf (哨兵配置) 含有 mymaster 的配置,都必须放置在 sentinel monitor mymaster 192.168.128.128 1000 2 之后,否则会出现问题。修改以下
protected-mode no # 关闭保护模式
daemonize yes # 守护进程模式
port 1001 # 端口号
logfile "/data/redis/log/sentinel1001.log" # 日志文件
sentinel myid 37e5b3bd915b4cb956e743927237b900c8c15578 # 这一行由启动成功的哨兵自己写入
sentinel monitor mymaster 192.168.128.128 1000 2 # 监控master节点所在的IP端口,并设置2个哨兵监控到master节点挂掉才能启动故障转移,把其中一台slave升级为master,如果旧master恢复正常,加入slave。
sentinel down-after-milliseconds mymaster 5000 # 5秒内服务器没有响应,说明服务器挂了
sentinel failover-timeout mymaster 15000 # 15秒内master没有活起来,就重新选举主节点
sentinel parallel-syncs mymaster 2 # 表示如果master重新选出来后,其它slave节点能同时并行从新master同步缓存的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保定的设置为1,只同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel auth-pass mymaster 123456 # 主数据库密码
# 集群启动成功后自动生成
sentinel config-epoch mymaster 2
sentinel leader-epoch mymaster 2
sentinel known-slave mymaster 192.168.128.128 2000
sentinel known-slave mymaster 192.168.128.128 3000
sentinel known-sentinel mymaster 192.168.128.128 2001 ad9ea7f15c79cf466b74589d52a984c06bb995bb
sentinel known-sentinel mymaster 192.168.128.128 3001 58cea0bd40d7dc5a06259a3f61de0111e83dacb0
sentinel current-epoch 2
哨兵 sentinel2001.conf 和 sentinel3001.conf 与哨兵 sentinel1001.conf 基本相同,需要修改各自的ip和端口号
2、启动 redis
启动需要按照 master --> slave --> sentinel 的顺序进行启动
cd /data/redis/conf
redis-server redis1000.conf
redis-server redis2000.conf
redis-server redis3000.conf
redis-sentinel sentinel1001.conf
redis-sentinel sentinel2001.conf
redis-sentinel sentinel3001.conf
ps aux | grep redis
3、检查集群同步状态
>> redis-cli -h 192.168.128.128 -p 1000 -a 123456
>> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.128.128,port=3000,state=online,offset=53159307,lag=0
slave1:ip=192.168.128.128,port=2000,state=online,offset=53159163,lag=1
master_replid:05ec360afadbd0de717c76e42b9459b10a839e30
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:53159465
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:52110890
repl_backlog_histlen:1048576
>> exit
>> redis-cli -h 192.168.128.128 -p 2000 -a 123456
>> info replication
# Replication
role:slave
master_host:192.168.128.128
master_port:1000
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:53188591
slave_priority:50
slave_read_only:1
connected_slaves:0
master_replid:05ec360afadbd0de717c76e42b9459b10a839e30
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:53188591
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:52140016
repl_backlog_histlen:1048576
>> exit
>> redis-cli -h 192.168.128.128 -p 3000 -a 123456
>> info replication
# Replication
role:slave
master_host:192.168.128.128
master_port:1000
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:53205119
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:05ec360afadbd0de717c76e42b9459b10a839e30
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:53205119
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:52156544
repl_backlog_histlen:1048576
>> exit
4、测试读写是否同步
>> redis-cli -h 192.168.128.128 -p 1000 -a 123456
>> set xm wxk
OK
>> get xm
"wxk"
>> exit
>> redis-cli -h 192.168.128.128 -p 2000 -a 123456
>> get xm
"wxk"
>> exit
>> redis-cli -h 192.168.128.128 -p 3000 -a 123456
>> get xm
"wxk"
>> exit
>> redis-cli -h 192.168.128.128 -p 2000 -a 123456
>> set xm zx
(error) READONLY You can't write against a read only slave.
>> exit
>> redis-cli -h 192.168.128.128 -p 3000 -a 123456
>> set xm zx
(error) READONLY You can't write against a read only slave.
>> exit
从数据库只允许读操作,不允许写操作。
想要从节点有写操作,修改主节点的配置文件: slave-read-only yes(只读)(默认)
slave-read-only no (读写) 一般不用
5、查看 sentinel
查看 sentinel1001.log 日志 (sentinel2001.log 和 sentinel3001.log 与 sentinel1001.log 一样,不做累述了)
cat /data/redis/log/sentinel1001.log
11337:X 16 Dec 17:15:22.329 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11337:X 16 Dec 17:15:22.330 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=11337, just started
11337:X 16 Dec 17:15:22.330 # Configuration loaded
11338:X 16 Dec 17:15:22.332 * Increased maximum number of open files to 10032 (it was originally set to 1024).
11338:X 16 Dec 17:15:22.334 * Running mode=sentinel, port=1001.
11338:X 16 Dec 17:15:22.335 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
11338:X 16 Dec 17:15:22.340 # Sentinel ID is 37e5b3bd915b4cb956e743927237b900c8c15578
11338:X 16 Dec 17:15:22.340 # +monitor master mymaster 192.168.128.128 1000 quorum 2
11338:X 16 Dec 17:15:22.342 * +slave slave 192.168.128.128:2000 192.168.128.128 2000 @ mymaster 192.168.128.128 1000
11338:X 16 Dec 17:15:22.344 * +slave slave 192.168.128.128:3000 192.168.128.128 3000 @ mymaster 192.168.128.128 1000
11338:X 16 Dec 17:15:28.174 * +sentinel sentinel ad9ea7f15c79cf466b74589d52a984c06bb995bb 192.168.128.128 2001 @ mymaster 192.168.128.128 1000
11338:X 16 Dec 17:15:32.192 * +sentinel sentinel 58cea0bd40d7dc5a06259a3f61de0111e83dacb0 192.168.128.128 3001 @ mymaster 192.168.128.128 1000
查看 sentinel 的连接状态 (其他两个连接状态与这个一样,不做累述了)
>> redis-cli -h 192.168.128.128 -p 1001 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.128.128:1000,slaves=2,sentinels=3
6、测试是否可以自动切换
>> redis-cli -h 192.168.128.128 -p 1000 -a 123456 shutdown
>> redis-server /data/redis/conf/redis1000.conf
查看 sentinel1001.log 日志
主从节点自动切换,端口为 2000 的成为了主节点,端口为 1000 的成为了从节点
redis1000.conf 配置文件:结尾自动添加:slaveof 192.168.128.128 2000
redis2000.conf 配置文件:关于 slaveof 的自动删除
redis3000.conf 配置文件:slaveof 192.168.128.128 1000 自动改为 slaveof 192.168.128.128 2000
OK