第二十一周学习作业

人生处万类,知识最为贤。这篇文章主要讲述第二十一周学习作业相关的知识,希望能为你提供帮助。
1、简述redis集群的实现原理在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。
为了解决单机性能的瓶颈,提高Redis 性能,可以使用分布式集群的解决方案
早期Redis 分布式集群部署方案:

  • 客户端分区:由客户端程序决定key写分配和写入的redis node,但是需要客户端自己实现写入分配、高可用管理和故障转移等
  • 代理方案:基于三方软件实现redis proxy,客户端先连接之代理层,由代理层实现key的写入分配,对客户端来说是有比较简单,但是对于集群管节点增减相对比较麻烦,而且代理本身也是单点和性能瓶颈。
redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接
Redis Cluster特点如下:
  1. 所有Redis节点使用(PING机制)互联
  2. 集群中某个节点的是否失效,是由整个集群中超过半数的节点监测都失效,才能算真正的失效
  3. 客户端不需要proxy即可直接连接redis,应用程序中需要配置有全部的redis服务器IP
  4. redis cluster把所有的redis node 平均映射到 0-16383个槽位(slot)上,读写需要到指定的redis node上进行操作,因此有多少个redis node相当于redis 并发扩展了多少倍,每个redis node 承担16384/N个槽位
  5. Redis cluster预先分配16384个(slot)槽位,当需要在redis集群中写入一个key -value的时候,会使用CRC16(key) mod 16384之后的值,决定将key写入值哪一个槽位从而决定写入哪一个Redis节点上,从而有效解决单机瓶颈。
2、基于redis5的redis cluster部署环境说明(本实验用的是版本6.2.4)
【第二十一周学习作业】
2.1 部署多实例redis
## 每个节点都执行
##一键编译安装6379端口redis实例
#!/bin/bash

VERSION=redis-6.2.4
PASSWORD=123456
INSTALL_DIR=/apps/redis

install()
yum install -y gcc jemalloc-devel wget make & > /dev/null
if [ $? -eq 0 ] ; then
echo "依赖包给成功部署!!"
else
echo "依赖包部署失败!!"
exit 0
fi
echo "redis软件下载中..."
wget http://download.redis.io/releases/$VERSION.tar.gz & > /dev/null
if [ $? -eq 0 ]; then
echo "redis软件下载完成!"
else
echo "请检查网络!!"
exit 0
fi

tar xf $VERSION.tar.gz
cd $VERSION
echo "编译进行中..."
make PREFIX=$INSTALL_DIR install& > /tmp/redis_make.log
if [ $? -eq 0 ]; then
echo "编译成功!!"
rm -rf /tmp/redis_make.log
else
echo "编译失败!,请查看/tmp/redis_make.log!!"
exit 0
fi

ln -s $INSTALL_DIR/bin/redis-* /usr/bin/
mkdir -p $INSTALL_DIR/etc,log,data,run
cp redis.conf $INSTALL_DIR/etc/redis_6379.conf

sed -i -e s/bind 127.0.0.1/bind 0.0.0.0/ -e "/# requirepass/a requirepass $PASSWORD" -e "/^dir .*/c dir $INSTALL_DIR/data/" -e /^dbfilename dump.rdb/c dbfilename dump_6379.rdb -e "/logfile .*/c logfile $INSTALL_DIR/log/redis_6379.log" -e "/^pidfile .*/c pidfile $INSTALL_DIR/run/redis_6379.pid" $INSTALL_DIR/etc/redis_6379.conf

id redis & > /dev/null
if [ $? -eq 0 ]; then
echo "Redis 用户已存在!"
else
useradd -r -s /sbin/nologin redis
echo "Redis 用户创建成功!"
fi
chown -R redis:redis $INSTALL_DIR

cat > > /etc/sysctl.conf < < EOF
net.core.somaxconn = 1024
vm.overcommit_memory = 1
EOF
sysctl -p
echo echo never > /sys/kernel/mm/transparent_hugepage/enabled > > /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
/etc/rc.d/rc.local
cat > /usr/lib/systemd/system/redis_6379.service < < EOF
[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=$INSTALL_DIR/bin/redis-server $INSTALL_DIR/etc/redis_6379.conf --supervised systemd
ExecStop=/bin/kill -s QUIT \\$MAINPID
#Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target

EOF
systemctl daemon-reload
systemctl start redis_6379
sleep 3
redis-cli -p 6379 -a $PASSWORD INFO Server 2> /dev/null
if [ $? -eq 0 ] ; then
echo "redis 服务安装并启动完成!!"
else
echo "redis 服务启动失败!!"
fi


install
[root@redis-01 ~]# sh install_redis.sh
依赖包给成功部署!!
redis软件下载中...
redis软件下载完成!
编译进行中...
编译成功!!
Redis 用户创建成功!
net.core.somaxconn = 1024
vm.overcommit_memory = 1
# Server
redis_version:6.2.4
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:fc1523280a0a76e6
redis_mode:standalone
os:Linux 3.10.0-1160.49.1.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:6031
process_supervised:no
run_id:0563ee35bb09715c03413b7eada97cba16d3d5e1
tcp_port:6379
server_time_usec:1653127322441191
uptime_in_seconds:3
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:8960154
executable:/apps/redis/bin/redis-server
config_file:/apps/redis/etc/redis_6379.conf
io_threads_active:0
redis 服务安装并启动完成!!

#启动配置6380端口redis实例
[root@redis-01 ~]# cp /apps/redis/etc/redis_6379.conf /apps/redis/etc/redis_6380.conf
[root@redis-01 ~]# sed -i -e s/port 6379/port 6380/ -e "/^dir .*/c dir /apps/redis/data/" -e /^dbfilename dump_6379.rdb/c dbfilename dump_6380.rdb -e "/logfile .*/c logfile /apps/redis/log/redis_6380.log" -e "/^pidfile .*/c pidfile /apps/redis/run/redis_6380.pid" /apps/redis/etc/redis_6380.conf
[root@redis-01 ~]# cp /lib/systemd/system/redis_6379.service /lib/systemd/system/redis_6380.service
[root@redis-01 ~]# sed -i s/6379/6380/ /lib/systemd/system/redis_6380.service
[root@redis-01 ~]# systemctl daemon-reload
[root@redis-01 ~]# systemctl start redis_6380.service
[root@redis-01 ~]# ss -nltp
StateRecv-Q Send-QLocal Address:PortPeer Address:Port
LISTEN0511*:6379*:*users:(("redis-server",pid=6065,fd=6))
LISTEN0511*:6380*:*users:(("redis-server",pid=12729,fd=6))
LISTEN0128*:22*:*users:(("sshd",pid=1104,fd=3))
LISTEN0100127.0.0.1:25*:*users:(("master",pid=1300,fd=13))
LISTEN0511[::1]:6379[::]:*users:(("redis-server",pid=6065,fd=7))
LISTEN0511[::1]:6380[::]:*users:(("redis-server",pid=12729,fd=7))
LISTEN0128[::]:22[::]:*users:(("sshd",pid=1104,fd=4))
LISTEN0100[::1]:25[::]:*users:(("master",pid=1300,fd=14))
[root@redis-01 ~]# tree /apps/redis/
/apps/redis/
├── bin
│├── redis-benchmark
│├── redis-check-aof -> redis-server
│├── redis-check-rdb -> redis-server
│├── redis-cli
│├── redis-sentinel -> redis-server
│└── redis-server
├── data
│├── dump_6379.rdb
│└── dump_6380.rdb
├── etc
│├── redis_6379.conf
│└── redis_6380.conf
├── log
│├── redis_6379.log
│└── redis_6380.log
└── run
├── redis_6379.pid
└── redis_6380.pid

5 directories, 14 files

2.2 启用redis cluster 配置
##每个节点都进行修改配置文件,一键修改
sed -i.bak -e /^# masterauth .*/amasterauth 123456 -e /^# cluster-enabled yes/a cluster-enabled yes -e /^# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf -e /^# cluster-require-full-coverage yes/a cluster-require-full-coverage no /apps/redis/etc/redis_6379.conf
sed -i.bak -e /^# masterauth .*/amasterauth 123456 -e /^# cluster-enabled yes/a cluster-enabled yes -e /^# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6380.conf -e /^# cluster-require-full-coverage yes/a cluster-require-full-coverage no /apps/redis/etc/redis_6380.conf
##重启redis服务
[root@redis_01 ~]# systemctl restart redis_6379.service redis_6380.service
[root@redis_01 ~]# ss -nltp
StateRecv-Q Send-QLocal Address:PortPeer Address:Port
LISTEN0511*:16379*:*users:(("redis-server",pid=14764,fd=9))
LISTEN0511*:16380*:*users:(("redis-server",pid=14765,fd=9))
LISTEN0511*:6379*:*users:(("redis-server",pid=14764,fd=6))
LISTEN0

    推荐阅读