linux下安装配置redis主从+哨兵

环境:

redhat 7.4、redis-5.0.5、2个节点(节点一:1主+1从+1哨兵,节点二:2从+1哨兵)

1、配置启动第一个节点(1主+1从)

[root@csy3 redis-5.0.5]# yum install gcc gcc-c++ -y
......
[root@csy3 tools]# pwd
/software/tools
[root@csy3 tools]# tar -zxvf redis-5.0.5.tar.gz
[root@csy3 tools]# ls
redis-5.0.5  redis-5.0.5.tar.gz
[root@csy3 tools]# cd redis-5.0.5/
[root@csy3 redis-5.0.5]# ls
00-RELEASENOTES  BUGS  CONTRIBUTING  COPYING  deps  INSTALL  Makefile  MANIFESTO  README.md  redis.conf  runtest  runtest-cluster  runtest-moduleapi  runtest-sentinel  sentinel.conf  src  tests  utils
[root@csy3 redis-5.0.5]# make
cd src && make all
make[1]: Entering directory `/software/tools/redis-5.0.5/src'
    CC Makefile.dep
make[1]: Leaving directory `/software/tools/redis-5.0.5/src'
make[1]: Entering directory `/software/tools/redis-5.0.5/src'
    CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
 #include <jemalloc/jemalloc.h>
                               
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/software/tools/redis-5.0.5/src'
make: *** [all] Error 2
[root@csy3 redis-5.0.5]# cat README.md  | grep -5 jemalloc  #针对上面的报错在README里面有说明
dependencies tree is modified in any other way, make sure to use the following
command in order to really clean everything and rebuild from scratch:

    make distclean

This will clean: jemalloc, lua, hiredis, linenoise.

Also if you force certain build options like 32bit target, no C compiler
optimizations (for debugging purposes), and other similar build time options,
those options are cached indefinitely until you issue a `make distclean`
command.
--
Allocator
---------

Selecting a non-default memory allocator when building Redis is done by setting
the `MALLOC` environment variable. Redis is compiled and linked against libc
malloc by default, with the exception of jemalloc being the default on Linux
systems. This default was picked because jemalloc has proven to have fewer
fragmentation problems than libc malloc.

To force compiling against libc malloc, use:

    % make MALLOC=libc

To compile against jemalloc on Mac OS X systems, use:

    % make MALLOC=jemalloc

Verbose build
-------------
......
[root@csy3 redis-5.0.5]# make MALLOC=libc   #如上说明,直接用README里面的
......
Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory `/software/tools/redis-5.0.5/src'
......
[root@csy3 redis-5.0.5]# cd src/
[root@csy3 src]# ll redis-*   #可以看到生成的redis-server这些直接用的命令
-rwxr-xr-x. 1 root root  354096 Aug 19 14:18 redis-benchmark
-rw-rw-r--. 1 root root   29605 May 16 00:07 redis-benchmark.c
-rw-r--r--. 1 root root  109136 Aug 19 14:18 redis-benchmark.o
-rwxr-xr-x. 1 root root 4046880 Aug 19 14:18 redis-check-aof
-rw-rw-r--. 1 root root    7175 May 16 00:07 redis-check-aof.c
-rw-r--r--. 1 root root   28888 Aug 19 14:18 redis-check-aof.o
-rwxr-xr-x. 1 root root 4046880 Aug 19 14:18 redis-check-rdb
-rw-rw-r--. 1 root root   13545 May 16 00:07 redis-check-rdb.c
-rw-r--r--. 1 root root   66064 Aug 19 14:18 redis-check-rdb.o
-rwxr-xr-x. 1 root root  798904 Aug 19 14:18 redis-cli
-rw-rw-r--. 1 root root  266751 May 16 00:07 redis-cli.c
-rw-r--r--. 1 root root  928640 Aug 19 14:18 redis-cli.o
-rwxr-xr-x. 1 root root 4046880 Aug 19 14:18 redis-sentinel
-rwxr-xr-x. 1 root root 4046880 Aug 19 14:18 redis-server
-rwxrwxr-x. 1 root root    3600 May 16 00:07 redis-trib.rb
[root@csy3 src]# mkdir -p /software/redis/
[root@csy3 src]# cd /software/redis/
[root@csy3 redis]# mkdir 8000 8001 8002
[root@csy3 redis]# \cp /software/tools/redis-5.0.5/redis.conf 8001/master.conf
[root@csy3 redis]# \cp /software/tools/redis-5.0.5/redis.conf 8002/slave.conf
[root@csy3 redis]# \cp /software/tools/redis-5.0.5/sentinel.conf 8000/sentinel.conf
[root@csy3 redis]# \cp /software/tools/redis-5.0.5/src/redis-server .
[root@csy3 redis]# \cp /software/tools/redis-5.0.5/src/redis-cli .
[root@csy3 redis]# vi 8001/master.conf
......
#bind 127.0.0.1   #注释掉
protected-mode no
port 8001      #主节点端口根据自己需要修改
daemonize yes   #后台运行
logfile "/software/redis/8001/8001.log"
dir "/software/redis/8001"
[root@csy3 redis]# vi 8002/slave.conf
......
#bind 127.0.0.1   #注释掉
protected-mode no
port 8002    #修改从节点端口
daemonize yes    #后台运行
logfile "/software/redis/8002/8002.log"
dir "/software/redis/8002"
slaveof 10.104.189.13 8001   #从节点加上主节点的地址
[root@csy3 redis]# ./redis-server 8001/master.conf
[root@csy3 redis]# ./redis-server 8002/slave.conf
[root@csy3 redis]# ps -ef | grep redis
root     27386     1  0 15:22 ?        00:00:00 ./redis-server 127.0.0.1:8001
root     27475     1  0 15:23 ?        00:00:00 ./redis-server 127.0.0.1:8002
root     27485 21868  0 15:23 pts/0    00:00:00 grep --color=auto redis
[root@csy3 redis]# netstat -tlnp | grep redis
tcp        0      0 127.0.0.1:8001          0.0.0.0:*               LISTEN      27386/./redis-serve
tcp        0      0 127.0.0.1:8002          0.0.0.0:*               LISTEN      27475/./redis-serve
[root@csy3 redis]# ./redis-cli -p 8001  #连主节点测试下
127.0.0.1:8001> set test 123
OK
127.0.0.1:8001> get test
"123"
127.0.0.1:8001> incr counter
(integer) 1
127.0.0.1:8001> incr counter
(integer) 2
127.0.0.1:8001> incr counter
(integer) 3
127.0.0.1:8001>

2、配置启动第二个节点(2从)

先按上面方法在另一台机器装好redis
[root@csy4 redis-5.0.5]# mkdir -p /software/redis
[root@csy4 redis-5.0.5]# cd /software/redis/
[root@csy4 redis]# mkdir 8000 8003 8004
[root@csy4 redis]# \cp /software/tools/redis-5.0.5/src/redis-server .
[root@csy4 redis]# \cp /software/tools/redis-5.0.5/src/redis-cli .
[root@csy4 redis]# \cp /software/tools/redis-5.0.5/redis.conf 8003/slave.conf
[root@csy4 redis]# \cp /software/tools/redis-5.0.5/redis.conf 8004/slave.conf
[root@csy4 redis]# \cp /software/tools/redis-5.0.5/sentinel.conf 8000
[root@csy4 redis]# ls
8000  8003  8004  redis-cli  redis-server
[root@csy4 redis]# vi 8003/slave.conf
......
#bind 127.0.0.1   #注释掉
protected-mode no
port 8003   #修改从节点端口
daemonize yes    #后台运行
logfile "/software/redis/8003/8003.log"
dir "/software/redis/8003"
slaveof 10.104.189.13 8001   #从节点加上主节点的地址
[root@csy4 redis]# vi 8004/slave.conf
......
#bind 127.0.0.1   #注释掉
protected-mode no
port 8004    #修改从节点端口
daemonize yes    #后台运行
logfile "/software/redis/8004/8004.log"
dir "/software/redis/8004"
slaveof 10.104.189.13 8001   #从节点加上主节点的地址
[root@csy4 redis]# ./redis-server 8003/slave.conf
32653:C 19 Aug 2019 15:51:06.676 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
32653:C 19 Aug 2019 15:51:06.676 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=32653, just started
32653:C 19 Aug 2019 15:51:06.676 # Configuration loaded
[root@csy4 redis]# ./redis-server 8004/slave.conf
32684:C 19 Aug 2019 15:51:40.889 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
32684:C 19 Aug 2019 15:51:40.889 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=32684, just started
32684:C 19 Aug 2019 15:51:40.889 # Configuration loaded
[root@csy4 redis]# netstat -tlnp | grep redis
tcp        0      0 127.0.0.1:8003          0.0.0.0:*               LISTEN      32654/./redis-serve
tcp        0      0 127.0.0.1:8004          0.0.0.0:*               LISTEN      32685/./redis-serve
[root@csy4 redis]# ps -ef | grep redis
root     32654     1  0 15:51 ?        00:00:00 ./redis-server 127.0.0.1:8003
root     32685     1  0 15:51 ?        00:00:00 ./redis-server 127.0.0.1:8004
root     32692 31395  0 15:52 pts/1    00:00:00 grep --color=auto redis
[root@csy4 redis]# ./redis-cli -p 8003   #登录从节点测试下,可以读出主节点的key
127.0.0.1:8003> get test
"123"
127.0.0.1:8003> quit

3、分别在2个节点配置启动哨兵

[root@csy3 redis]# ./redis-cli -p 8001
127.0.0.1:8001> info Replication   #登主节点,可以看到有3个从节点连上了
# Replication
role:master
connected_slaves:3
slave0:ip=10.104.189.13,port=8002,state=online,offset=601,lag=0
slave1:ip=10.104.189.14,port=8003,state=online,offset=601,lag=1
slave2:ip=10.104.189.14,port=8004,state=online,offset=601,lag=1
master_replid:d21ef0c08d4d2fc9bc01447c91dd7ae14bb09539
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:601
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:601
127.0.0.1:8001>quit
[root@csy3 redis]# vi 8000/sentinel.conf
......
port 8000
daemonize yes
logfile "/software/redis/8000/8000.log"
dir "/software/redis/8000"
sentinel monitor mymaster 10.104.189.13 8001 2  #主机名、IP、端口、投票选取次数
sentinel parallel-syncs mymaster 3   #从节点数量
[root@csy3 redis]# ./redis-server 8000/sentinel.conf --sentinel
[root@csy3 redis]# tail -f 8000/8000.log   #从日志可以看出
2366:X 19 Aug 2019 17:18:32.921 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=2366, just started
2366:X 19 Aug 2019 17:18:32.921 # Configuration loaded
2367:X 19 Aug 2019 17:18:32.925 * Increased maximum number of open files to 10032 (it was originally set to 1024).
2367:X 19 Aug 2019 17:18:32.931 * Running mode=sentinel, port=8000.
2367:X 19 Aug 2019 17:18:32.932 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2367:X 19 Aug 2019 17:18:32.934 # Sentinel ID is 7cef65c8638770aef68826b903ffb8768400a9c3
2367:X 19 Aug 2019 17:18:32.934 # +monitor master mymaster 10.104.189.13 8001 quorum 2
2367:X 19 Aug 2019 17:18:32.937 * +slave slave 10.104.189.13:8002 10.104.189.13 8002 @ mymaster 10.104.189.13 8001
2367:X 19 Aug 2019 17:18:32.939 * +slave slave 10.104.189.14:8003 10.104.189.14 8003 @ mymaster 10.104.189.13 8001
2367:X 19 Aug 2019 17:18:32.941 * +slave slave 10.104.189.14:8004 10.104.189.14 8004 @ mymaster 10.104.189.13 8001
^C
[root@csy3 redis]# ps -ef | grep redis
root       694     1  0 16:54 ?        00:00:02 ./redis-server *:8001
root       709     1  0 16:54 ?        00:00:01 ./redis-server *:8002
root      2367     1  0 17:18 ?        00:00:00 ./redis-server *:8000 [sentinel]
root      2406 21868  0 17:19 pts/0    00:00:00 grep --color=auto redis
[root@csy3 redis]# vi 8000/sentinel.conf  #再看下配置文件,启动后自动更新了一些配置

#下面到第二个节点去配置启动哨兵,配置文件同上
[root@csy4 redis]# vi 8000/sentinel.conf
[root@csy4 redis]# ps -ef | grep redis
root      1214     1  0 16:58 ?        00:00:02 ./redis-server *:8003
root      1227     1  0 16:58 ?        00:00:02 ./redis-server *:8004
root      1633 31395  0 17:26 pts/1    00:00:00 grep --color=auto redis
[root@csy4 redis]# ./redis-server 8000/sentinel.conf --sentinel
[root@csy4 redis]# tail -f 8000/
8000.log       sentinel.conf
[root@csy4 redis]# tail -f 8000/8000.log
1646:X 19 Aug 2019 17:26:45.880 # Configuration loaded
1647:X 19 Aug 2019 17:26:45.885 * Increased maximum number of open files to 10032 (it was originally set to 1024).
1647:X 19 Aug 2019 17:26:45.890 * Running mode=sentinel, port=8000.
1647:X 19 Aug 2019 17:26:45.890 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1647:X 19 Aug 2019 17:26:45.893 # Sentinel ID is 6d585a456becfa9d5c75da8f2e2a2eca7e786f18
1647:X 19 Aug 2019 17:26:45.893 # +monitor master mymaster 10.104.189.13 8001 quorum 2
1647:X 19 Aug 2019 17:26:45.895 * +slave slave 10.104.189.13:8002 10.104.189.13 8002 @ mymaster 10.104.189.13 8001
1647:X 19 Aug 2019 17:26:45.897 * +slave slave 10.104.189.14:8003 10.104.189.14 8003 @ mymaster 10.104.189.13 8001
1647:X 19 Aug 2019 17:26:45.899 * +slave slave 10.104.189.14:8004 10.104.189.14 8004 @ mymaster 10.104.189.13 8001
1647:X 19 Aug 2019 17:26:46.961 * +sentinel sentinel 7cef65c8638770aef68826b903ffb8768400a9c3 10.104.189.13 8000 @ mymaster 10.104.189.13 8001

上面已经配置完2个节点共1主+3从+2哨兵了,配置文件根据自己的实际情况设置。

重启过程是先所有主从起来后再起哨兵,为了方便建议做个重启shell脚本。

安装配置之前要把防火墙关掉,安装启动完主从节点后测试下在每个从节点能否读出主节点设置的key。

可以加上keepalived高可用和zabbix之类的监控报警。

如果连接要加上密码,要设置主节点(master.conf)“masterauth 密码”和从节点(slave.conf)“requirepass 密码”。

完成后测试下,把主节点kill掉,监控哨兵日志,观察下会不会故障迁移到另一个从节点。(哨兵日志主要有下面几种情况)

................................................................................................................................................................................................................

Sentinel模式下的几个事件

  • +reset-master :主服务器已被重置。
  • +slave :一个新的从服务器已经被 Sentinel 识别并关联。
  • +failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
  • +failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
  • +slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了 [SLAVEOF](/commands/slaveof.html) 命令,为实例设置新的主服务器。
  • +slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
  • +slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
  • -dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。
  • +sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
  • +sdown :给定的实例现在处于主观下线状态。
  • -sdown :给定的实例已经不再处于主观下线状态。
  • +odown :给定的实例现在处于客观下线状态。
  • -odown :给定的实例已经不再处于客观下线状态。
  • +new-epoch :当前的纪元(epoch)已经被更新。
  • +try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
  • +elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
  • +failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器。
  • no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
  • selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
  • failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
  • failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
  • failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
  • +switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
  • +tilt :进入 tilt 模式。
  • -tilt :退出 tilt 模式。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章