redis
编译安装redis
按时发财
#安装依赖包
yum -y install gcc jemalloc-devel
#如果支持systemd需要安装下面包
yum -y install gcc jemalloc-devel systemd-devel
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar xvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make PREFIX=/apps/redis install
#如果支持systemd,需要执行下面
make USE_SYSTEMD=yes PREFIX=/apps/redis install
echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
. /etc/profile.d/redis.sh
tree /apps/redis/
mkdir /apps/redis/{etc,log,data,run}
cp redis.conf /apps/redis/etc/
#前台启动
#redis-server /apps/redis/etc/redis.conf
#解决启动时的三个警告提示
echo 'net.core.somaxconn = 1024' >> /etc/sysctl.conf
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
#创建 redis 用户和数据目录
useradd -r -s /sbin/nologin redis
chown -R redis.redis /apps/redis/
ln -sv /apps/redis/bin/redis-* /usr/bin/
#修改配置
sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e "/# requirepass/a requirepass 123456" -e "/^dir .*/c dir /apps/redis/data/" -e "/logfile .*/c logfile /apps/redis/log/redis-6379.log" -e "/^pidfile .*/c pidfile /apps/redis/run/redis_6379.pid" /apps/redis/etc/redis.conf
#复制CentOS8安装生成的redis.service文件,进行修改,或者使用下面的
cat > /usr/lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.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
redis-cli -a 123456 INFO Server
#初始配置修改
#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 "/logfile .*/c logfile ${INSTALL_DIR}/log/redis-6379.log" -e "/^pidfile .*/c pidfile ${INSTALL_DIR}/run/redis_6379.pid" ${INSTALL_DIR}/etc/redis.conf
sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e "/# requirepass/a requirepass 123456" -e "/^dir .*/c dir /apps/redis/data/" -e "/logfile .*/c logfile /apps/redis/log/redis-6379.log" -e "/^pidfile .*/c pidfile /apps/redis/run/redis_6379.pid" /apps/redis/etc/redis.conf
1、redis服务配置文件详解
bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听IP
dir ./ #快照文件保存路径,示例:dir "/apps/redis/data"
requirepass foobared #设置redis连接密码,之后需要AUTH pass,如果有特殊符号,用" "引起来,生产建议设置
loglevel notice #日志级别
logfile "/path/redis.log" #日志路径,示例:logfile "/apps/redis/log/redis_6379.log
pidfile /var/run/redis_6379.pid #pid文件路径,可以修改为/apps/redis/run/redis_6379.pid
2、RDB、AOF详解及优缺点总结
RDB 模式:相当于数据库的完全备份
RDB(Redis DataBase):基于时间的快照,其默认只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前时间点之间未做快照的数据,
优点:
- 每一次执行相当于分出一个子线程把整个数据保存在一个临时文件中,在保存完成之前不会将原有的rdb文件删除,这样做的好处是在遇到如断电之类的因素时,上次保存的数据还在;
- 可以通过脚本执行redis指令bgsave(非阻塞,后台执行)备份多个rdb文件,可根据需求还原到不同时间点;
缺点:
- rdb的特性决定它不能实时保存;也不能过于频繁的备份数据,一般建议备份间隔在5分钟以上,这样当出现故障时,会丢失几分钟的数据;
- 当数据量非常大时,子进程在备份数据时可能会耗费毫秒甚至秒级的时间,取决于磁盘I/O
AOF 模式:相当于二进制日志备份
AOF:AppendOnylFile,按照操作顺序依次将操作追加到指定的日志文件末尾
优点:
- 安全性较高:最低的模式也是秒级的记录操作,故最多丢失1秒的数据
- 追加模式:aof总是在aof文件末尾进行追加数据库的增删改的操作,即使出现宕机情况,也不会损坏已有内容;
- 自动重写aof:当aof文件过大时,可自动对aof文件重写至能恢复到当前数据的最小命令集合;
- 格式清晰:aof的格式非常易于理解;可通过aof可对数据库进行重建
缺点:
- 即使有些操作是重复的也会全部记录,AOF 的文件大小要大于 RDB 格式的文件
- AOF 在恢复大数据集时的速度比 RDB 的恢复速度要慢
- 根据fsync策略不同,AOF速度可能会慢于RDB
- bug 出现的可能性更多
RDB 模式和AOF 模式的选择:
当对数据库数据丢失忍耐性较低时,一般开启同时RDB 模式和AOF 模式,不建议只开启AOF 模式;
3、Redis Cluster扩、缩容
在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。
为了解决单机性能的瓶颈,提高Redis 性能,可以使用分布式集群的解决方案
准备六台主机,地址如下:
192.168.37.103
192.168.37.105
192.168.37.106
192.168.37.107
192.168.37.108
192.168.37.109
前提:六台机器全部配置一致,版本为5.0.7
修改配置文件
vim /etc/redis.conf
bind 0.0.0.0
masterauth 123456 #建议配置,否则后期的master和slave主从复制无法成功,还需再配置
requirepass 123456
cluster-enabled yes #取消此行注释,必须开启集群,开启后redis 进程会有cluster标识
cluster-config-file nodes-6379.conf #取消此行注释,此为集群状态文件,记录主从关系及slot范围信息,由redis cluster 集群自动创建和维护
cluster-require-full-coverage no #默认值为yes,设为no可以防止一个节点不可用导致整个cluster不可能
#或者执行下面命令,批量修改
sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e '/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 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/c cluster-require-full-coverage no' /apps/redis/etc/redis.conf
systemctl restart redis
ps aux |grep redis
#命令redis-cli的选项 --cluster-replicas 1 表示每个master对应一个slave节点
redis-cli -a 123456 --cluster create 192.168.37.103:6379 192.168.37.105:6379 192.168.37.106:6379 192.168.37.107:6379 192.168.37.108:6379 192.168.37.109:6379 --cluster-replicas 1
#观察以上结果,可以看到3组master/slave
master:192.168.37.103---slave:192.168.37.108
master:192.168.37.105---slave:192.168.37.109
master:192.168.37.106---slave:192.168.37.107
#查看主从状态
#发送到全部窗口
redis-cli -a 123456 -c INFO replication
#查看cluster的说明
redis-cli --cluster help
#验证集群状态
redis-cli -a 123456 cluster info
#查看任意节点的集群状态
redis-cli -a 123456 --cluster info 192.168.37.109:6379
redis-cli -a 123456 CLUSTER NODES