0x01 前言

真的很快速,只要拥有足够的内存,和CPU资源,一切都可以很快,因为这篇文章不涉及调优的部分。而下一篇文章会涉及调优、vip和测试的部分。

0x02 准备

大型集群肯定要有足够多的机器,所以我的redis和哨兵是分开部署的,为了避免脑裂,需要至少3+3台虚拟机:

然后下载最新的安装包:

这篇文章使用6.0.4,操作系统使用centos 7.8。

因为涉及两个组件,所以有些步骤是不一样的,在操作之前先执行共通的命令,以下命令需要在6台服务器中执行:

# 调优
cat >> /etc/sysctl.conf << EOF
net.core.somaxconn=2048
vm.overcommit_memory=1
EOF

# 开启透明大页
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local \
 && chmod +x /etc/rc.d/rc.local

# 重启
reboot

# 安装devtoolset9用于编译
yum -y install epel-release \
 && yum -y install centos-release-scl \
 && yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils \
 && scl enable devtoolset-9 bash

# 添加用户及创建目录
groupadd redis \
 && useradd -g redis redis \
 && mkdir -pv /usr/local/redis/{bin,conf,logs}

然后在root目录下创建临时目录、下载源码、解压和编译安装:

cd /root/ \
 && mkdir -p codex/redis \
 && cd codex/redis \
 && curl http://download.redis.io/releases/redis-6.0.4.tar.gz > redis-6.0.4.tar.gz \
 && tar zxvf redis-6.0.4.tar.gz \
 && cd redis-6.0.4 \
 && make -j PREFIX=/usr/local/redis install

至此,所有准备工作均已完成,如果一切正常,那么会是这样的:

/usr/local/redis/bin 下会有可执行的二进制文件:

0x03 配置

因为有两个组件,所以配置分为两部分,而server和哨兵的配置文件是不一样的,先配置主从架构。

需要注意的是,主从的英文并不是master-slave,而是master-replica。

0x03.1 主从架构

在三台server服务器中执行以下命令:

cp redis.conf /usr/local/redis/conf \
 && chown -R redis:redis /usr/local/redis

然后在主服务器中执行以下命令:

sed -i "s@bind 127.0.0.1@bind 0.0.0.0@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@daemonize no@daemonize yes@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@[email protected]@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@logfile \"\"@logfile \"/usr/local/redis/logs/redis.log\"@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@dir ./@dir /usr/local/redis@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@# requirepass foobared@requirepass Passw0rd@g" /usr/local/redis/conf/redis.conf

以上命令会修改配置文件中的以下信息:

  • 将监听IP修改为0.0.0.0
  • 开启daemonize
  • 修改pid文件名
  • 修改日志文件路径
  • 修改软件目录为绝对路径
  • 修改密码

请根据实际情况指定一个强密码。

紧接着执行以下命令以建立service:

cat > /etc/systemd/system/redis-server.service << EOF
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=always
Type=forking

[Install]
WantedBy=multi-user.target
EOF

最后执行以下命令即可完成主服务器的配置和启动工作:

systemctl daemon-reload \
 && systemctl enable redis-server.service \
 && systemctl start redis-server.service 

紧接着配置从服务器,而这部分的配置和主服务器有所区别:

sed -i "s@bind 127.0.0.1@bind 0.0.0.0@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@daemonize no@daemonize yes@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@[email protected]@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@logfile \"\"@logfile \"/usr/local/redis/logs/redis.log\"@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@dir ./@dir /usr/local/redis@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@# requirepass foobared@requirepass Passw0rd@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@# replicaof <masterip> <masterport>@replicaof 10.1.3.89 6379@g" /usr/local/redis/conf/redis.conf \
 && sed -i "s@# masteruser <username>@masterauth \"Passw0rd\"@g" /usr/local/redis/conf/redis.conf

除主服务器的配置项外,从服务器增加以下配置的修改:

  • 指定主服务器的IP及端口
  • 指定主服务器的密码用于同步数据

请根据实际情况修改最后两行中的相关内容。

随后执行主服务器建立service的命令和启动命令即可完成两台从服务器的配置和服务启动工作。如果一切正常,那么日志显示如下:

0x03.2 哨兵

sentinel,也就是哨兵,主要用于监控集群状态和推选master,至少需要3个节点以避免脑裂。以下命令直接在三个哨兵节点上执行即可。

首先将源码文件夹里的复制配置文件到指定位置:

cp cp sentinel.conf /usr/local/redis/conf/ \
 && chown -R redis:redis /usr/local/redis

然后修改该配置文件:

sed -i "s@bind 127.0.0.1@bind 0.0.0.0@g" /usr/local/redis/conf/sentinel.conf \
 && sed -i "s@daemonize no@daemonize yes@g" /usr/local/redis/conf/sentinel.conf \
 && sed -i "s@logfile \"\"@logfile \"/usr/local/redis/logs/redis.log\"@g" /usr/local/redis/conf/sentinel.conf \
 && sed -i "s@dir ./@dir /usr/local/redis@g" /usr/local/redis/conf/sentinel.conf \
 && sed -i "s@# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd@sentinel auth-pass ngxmaster Passw0rd@g" /usr/local/redis/conf/sentinel.conf \
 && sed -i "s@sentinel monitor mymaster 127.0.0.1 6379 2@sentinel monitor ngxmaster 10.1.3.89 6379 2@g" /usr/local/redis/conf/sentinel.conf \
 && sed -i "s@sentinel down-after-milliseconds mymaster 30000@sentinel down-after-milliseconds ngxmaster 30000@g" /usr/local/redis/conf/sentinel.conf \
 && sed -i "s@sentinel parallel-syncs mymaster 1@sentinel parallel-syncs ngxmaster 1@g" /usr/local/redis/conf/sentinel.conf \
 && sed -i "s@sentinel failover-timeout mymaster 180000@sentinel failover-timeout ngxmaster 180000@g" /usr/local/redis/conf/sentinel.conf

需要将配置文件中mymaster的名称全部修改,当然,使用默认的也没问题,用于识别而已。随后写入service文件:

cat > /etc/systemd/system/redis-sentinel.service << EOF
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/sentinel.conf --sentinel
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=always
Type=forking

[Install]
WantedBy=multi-user.target
EOF

最后启动即可:

systemctl daemon-reload \
 && systemctl enable redis-sentinel.service \
 && systemctl start redis-sentinel.service

如果一切正常,哨兵的日志是这样的:

当尝试关闭master会尝试推算新master和切换:

0x04 结语

很简单,没啥要补充的。

接下来要调优和配置vip,顺便测试哨兵接口。