Redis集群简介
Redis集群和高可用有几种方式:其中一种是主从复制,实现数据的多机备份和读操作的负载均衡。一主多从,主库支持读写操作,从库只支持读。在主从复制基础上,哨兵实现了自动化的故障恢复。通过哨兵监控主节点状态,主节点宕机时自动切换到从节点。另外一种是集群,多节点分片存储,结合主从复制,实现故障切换。本例主要介绍主从复制加哨兵模式和集群模式。
2 Redis配置规划
2.1 Redis哨兵模式规划
本次计划使用两台虚拟机进行Redis哨兵,每台虚拟机运行Redis节点一个、Redis哨兵服务一个。10.10.1.45上的Redis节点为初始的主节点、10.10.1.46上的Redis节点为初始的从节点。
服务器 服务器一 服务器二
IP地址 10.10.1.45 10.10.1.46
安装用户 kylin(管理员)
安装目录 /data/redis
节点数据目录 /data/redis/data
节点配置目录 /data/redis/conf
节点日志目录 /data/redis/logs
Redis端口 6379
Redis密码 142857
哨兵端口 26379
哨兵密码 无
主从同步密码 142857
主从组名 mymaster
2.2 Redis集群模式规划
本次计划使用三台虚拟机进行Redis集群,每台虚拟机运行集群主、备节点各一个。三台服务器的节点遵循循环主备关系,即A服务器上的主节点对应备节点在B服务器上,B服务器上的主节点对应备节点在C服务器上,C服务器上的主节点对应备节点在A服务器上。
服务器 服务器一 服务器二 服务器三
IP地址 10.10.1.41 10.10.1.42 10.10.1.43
安装用户 kylin(管理员)
安装目录 /data/redis
主节点数据目录 /data/redis/data/6379
从节点数据目录 /data/redis/data/6380
节点配置目录 /data/redis/conf
节点日志目录 /data/redis/logs
主节点端口 6379
从节点端口 6380
Redis密码 142857
主从同步密码 142857
3 安装Redis软件
3.1 安装版本说明
银河麒麟V10的桌面版和高级服务器版的安装体系差异较大,默认已经安装的包也不同,因此在编译Redis之前,银河麒麟V10的桌面版和高级服务器版需要安装不同的包。本例基于以下银河麒麟版本建立。
Kylin-Desktop-V10-GFB-HWE-Release-020-X86_64
Kylin-Desktop-V10-GFB-020-Release-20.1.3-ARM64
Kylin-Server-V10-GFB-Release-030-X86_64
Kylin-Server-V10-GFB-030-Release-30.1.3-ARM64
3.2 麒麟V10桌面版(GFB)
3.2.1 安装前准备
使用管理员用户,创建安装文件目录。
kylin@KL1:~$ mkdir Install
3.2.2 安装g++
银河麒麟V10国防桌面版使用源代码编译的方式安装Redis,需要先安装g++。银河麒麟V10使用的gcc版本是9.3.0,g++也应使用相同的版本,需要安装g++和libstdc++两个包。可以从Ubuntu网站获取“g++-9_9.3.0-10ubuntu2_amd64.deb”、“libstdc++-9-dev_9.3.0-10ubuntu2_amd64.deb”两个包。
kylin@KL1:~$ gcc --version
gcc (Ubuntu 9.3.0-10kylin2) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
管理员账户使用sudo dpkg -i命令安装libstdc++和g++。
kylin@KL1:~/Install$ sudo dpkg -i libstdc++-9-dev_9.3.0-10ubuntu2_amd64.deb g++-9_9.3.0-10ubuntu2_amd64.deb
正在选中未选择的软件包 libstdc++-9-dev:amd64。
(正在读取数据库 ... 系统当前共安装有 186622 个文件和目录。)
准备解压 libstdc++-9-dev_9.3.0-10ubuntu2_amd64.deb ...
正在解压 libstdc++-9-dev:amd64 (9.3.0-10ubuntu2) ...
正在选中未选择的软件包 g++-9。
准备解压 g++-9_9.3.0-10ubuntu2_amd64.deb ...
正在解压 g++-9 (9.3.0-10ubuntu2) ...
正在设置 libstdc++-9-dev:amd64 (9.3.0-10ubuntu2) ...
正在设置 g++-9 (9.3.0-10ubuntu2) ...
正在处理用于 man-db (2.9.1-1kylin0k1) 的触发器 ...
建立一个符号连接,把/usr/bin目录下的x86_64-linux-gnu-g++-9链接到g++。
kylin@KL1:~/Install$ sudo ln -s /usr/bin/x86_64-linux-gnu-g++-9 /usr/bin/g++
3.2.3 安装tcl
银河麒麟V10国防桌面版使用源代码编译的方式安装Redis,需要先安装tcl。Redis8.2要求tcl版本8.5以上,需要安装tcl和libtcl两个包。从银河麒麟网站获取“libtcl8.6_8.6.10+dfsg-1_amd64.deb”包,从Ubuntu网站上获取“tcl8.6_8.6.1-4ubuntu1_amd64.deb”包。
管理员账户使用sudo dpkg -i命令安装libtcl和tcl。
kylin@KL1:~/Install$ sudo dpkg -i libtcl8.6_8.6.10+dfsg-1_amd64.deb tcl8.6_8.6.1-4ubuntu1_amd64.deb
正在选中未选择的软件包 libtcl8.6:amd64。
(正在读取数据库 ... 系统当前共安装有 187471 个文件和目录。)
准备解压 libtcl8.6_8.6.10+dfsg-1_amd64.deb ...
正在解压 libtcl8.6:amd64 (8.6.10+dfsg-1) ...
正在选中未选择的软件包 tcl8.6。
准备解压 tcl8.6_8.6.1-4ubuntu1_amd64.deb ...
正在解压 tcl8.6 (8.6.1-4ubuntu1) ...
正在设置 libtcl8.6:amd64 (8.6.10+dfsg-1) ...
正在设置 tcl8.6 (8.6.1-4ubuntu1) ...
正在处理用于 libc-bin (2.31-0kylin9.1k20.8) 的触发器 ...
正在处理用于 man-db (2.9.1-1kylin0k1) 的触发器 ...
3.3 银河麒麟高级服务器版(GFB)
3.3.1 安装前准备
银河麒麟V10高级服务器版,允许使用root直接登录,这里安全起见,创建用户kylin并加入wheel组,作为管理员用户使用。
[root@localhost ~]# adduser kylin
[root@localhost ~]# passwd kylin
更改用户 kylin 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# usermod -aG wheel kylin
再使用root用户创建/data共享目录。
[root@localhost ~]# mkdir /data
[root@localhost ~]# chmod a+rwx /data
[root@localhost ~]# chmod -t /data
使用root用户修改主机名,并重新登录。
[root@localhost ~]# hostnamectl set-hostname KL1
[root@localhost ~]# logout
使用kylin用户创建目录Install用于放置所有安装文件。
[kylin@KL1 ~]$ mkdir Install
3.4 编译Redis
解压缩redis-8.2.1.tar.gz包。
kylin@KL1:~/Install$ tar -zxf redis-8.2.1.tar.gz
进入redis解压后目录下的deps目录,运行make fast_float和make jemalloc。银河麒麟高级服务器版不需要此步骤。
kylin@KL1:~/Install$ cd redis-8.2.1/deps/
kylin@KL1:~/Install/redis-8.2.1/deps$ make fast_float
MAKE fast_float
cd fast_float && make libfast_float CFLAGS="" LDFLAGS=""
make[1]: 进入目录“/home/kylin/redis-8.2.1/deps/fast_float”
g++ -Wall -O3 -std=c++11 -DFASTFLOAT_ALLOWS_LEADING_PLUS -c fast_float_strtod.cpp
ar -r libfast_float.a fast_float_strtod.o
ar: 正在创建 libfast_float.a
make[1]: 离开目录“/home/kylin/Install/redis-8.2.1/deps/fast_float”
kylin@KL1:~/Install/redis-8.2.1/deps$ make jemalloc
MAKE jemalloc
cd jemalloc && ./configure --disable-cxx --with-version=5.3.0-0-g0 --with-lg-quantum=3 --disable-cache-oblivious --with-jemalloc-prefix=je_ CFLAGS="" LDFLAGS=""
checking for xsltproc... false
checking for gcc... gcc
…………
这里有很多提示信息,此处省略。
…………
make[1]: 离开目录“/home/kylin/Install/redis-8.2.1/deps/jemalloc”
进入redis解压后目录,使用make指令编译Redis。
kylin@KL1:~/Install/redis-8.2.1/deps$ cd ..
kylin@KL1:~/Install/redis-8.2.1$ make
for dir in src; do make -C $dir all; done
make[1]: 进入目录“/home/kylin/Install/redis-8.2.1/src”
CC Makefile.dep
rm -rf redis-server redis-sentinel redis-cli redis-benchmark redis-check-rdb redis-check-aof *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep *.so
…………
这里有很多提示信息,此处省略。
…………
LINK redis-benchmark
INSTALL redis-check-rdb
INSTALL redis-check-aof
Hint: It's a good idea to run 'make test' ;)
make[1]: 离开目录“/home/kylin/Install/redis-8.2.1/src”
使用make test指令进行测试。
kylin@KL1:~/Install/redis-8.2.1$ make test
for dir in src; do make -C $dir test; done
make[1]: 进入目录“/home/kylin/Install/redis-8.2.1/src”
Cleanup: may take some time... OK
Starting test server at port 21079
[ready]: 387245
Testing unit/acl-v2
…………
这里有很多提示信息,此处省略。
…………
515 seconds - defrag
0 seconds - list-large-memory
1 seconds - set-large-memory
\o/ All tests passed without errors!
Cleanup: may take some time... OK
make[1]: 离开目录“/home/kylin/Install/redis-8.2.1/src”
3.5 安装Redis
按照规划创建redis目录。(哨兵模式不需要创建6380目录)。
kylin@KL1:~/Install/redis-8.2.1$ mkdir /data/redis
kylin@KL1:~/Install/redis-8.2.1$ mkdir /data/redis/data
kylin@KL1:~/Install/redis-8.2.1$ mkdir /data/redis/data/6379
kylin@KL1:~/Install/redis-8.2.1$ mkdir /data/redis/data/6380
kylin@KL1:~/Install/redis-8.2.1$ mkdir /data/redis/conf
kylin@KL1:~/Install/redis-8.2.1$ mkdir /data/redis/logs
使用make install指令进行安装,使用PREFIX参数指定安装目录。
kylin@KL1:~/Install/redis-8.2.1$ make install PREFIX=/data/redis
for dir in src; do make -C $dir install; done
make[1]: 进入目录“/home/kylin/Install/redis-8.2.1/src”
Hint: It's a good idea to run 'make test' ;)
INSTALL redis-server
INSTALL redis-benchmark
INSTALL redis-cli
make[1]: 离开目录“/home/kylin/Install/redis-8.2.1/src”
修改配置文件,加入REDIS_HOME环境变量,扩充PATH环境变量。
kylin@KL1:~/Install/redis-8.2.1$ sudo vi /etc/profile
…………
原有的配置信息。
…………
export REDIS_HOME=/data/redis
export PATH=$PATH:$REDIS_HOME/bin
在另外两台服务器上同样安装Redis。注意,银河麒麟V10高级服务器版默认已经安装了Redis 4.0.11版,如果直接输入redis-server、redis-cli会默认调用Redis 4.0.11版的相应程序,因此在后续配置时需要指明程序目录,如:“/data/redis/bin/redis-server”、“/data/redis/bin/redis-cli”。
4 配置Redis哨兵模式
4.1 开放防火墙端口
麒麟高级服务器版默认开启了防火墙,需要开放规划的Redis相关的端口,包括6379、26379等,以上端口均为TCP协议。
kylin@KL5 ~$ sudo firewall-cmd --add-port=6379/tcp --permanent
success
kylin@KL5 ~$ sudo firewall-cmd --add-port=26379/tcp --permanent
success
kylin@KL5 ~$ sudo firewall-cmd --reload
success
kylin@KL5 ~$ sudo firewall-cmd --list-ports
6379/tcp 26379/tcp
4.2 修改配置文件
从redis解压后目录复制文件redis.conf到“/data/redis/conf/”目录并改名为redis_6379.conf,从redis解压后目录复制文件sentinel.conf到“/data/redis/conf/”目录。
kylin@KL5:~/Install/redis-8.2.1$ cp redis.conf /data/redis/conf/redis_6379.conf
kylin@KL5:~/Install/redis-8.2.1$ cp sentinel.conf /data/redis/conf/
kylin@KL5:~/Install/redis-8.2.1$ cd /data/redis/conf/
修改每台服务器上的配置文件redis_6379.conf中以下内容。
kylin@KL5:/data/redis/conf$ vi redis_6379.conf
# 监听所有网络,默认127.0.0.1。
bind 0.0.0.0
# 监听端口。
port 6379
# 允许后台运行。
daemonize yes
# PID 存放路径。
pidfile /data/redis/redis_6379.pid
# 日志存放路径。
logfile /data/redis/logs/redis_6379.log
# 数据目录。
dir /data/redis/data/6379
# 主服务器地址,只在从机上配置。
replicaof 10.10.1.45 6379
# 主从同步master的密码。
masterauth 142857
# Redis密码。
requirepass 142857
修改每台服务器上的配置文件sentinel.conf中以下内容。其中最少切换哨兵数量为最少几个哨兵认为主服务器不可用时,就启动切换。如果是三台服务器集群,则此值应为2。
kylin@KL5:/data/redis/conf$ vi sentinel.conf
# 禁用保护模式。
protected-mode no
# 允许后台运行。
daemonize yes
# PID 存放路径。
pidfile /data/redis/sentinel.pid
# 日志存放路径。
logfile /data/redis/logs/sentinel.log
# 哨兵监控集群名称、主机地址、主机端口、最少切换哨兵数量。
sentinel monitor mymaster 10.10.1.45 6379 1
# 哨兵的认证密码。
sentinel auth-pass mymaster 142857
启动Redis服务和哨兵服务,启动顺序为主Redis服务、从Redis服务、主从哨兵服务。
kylin@KL5:~$ redis-server /data/redis/conf/redis_6379.conf
kylin@KL6:~$ redis-server /data/redis/conf/redis_6379.conf
kylin@KL5:~$ redis-sentinel /data/redis/conf/sentinel.conf
kylin@KL6:~$ redis-sentinel /data/redis/conf/sentinel.conf
4.3 测试主从复制
使用客户端工具连接主机,插入一条数据。
主机插入数据
使用客户端工具连接从机,可以看到从主机插入的数据。
从机查看数据
使用客户端工具连接从机,插入数据,会报只读错误。
从机插入数据