CentOS 7.5 编译安装redis集成至系统服务(包括集群环境)

用户

需要一个有sudo权限的用户或者是root用户

#若没有可执行下面的操作
#赋予一个用户(如learn)拥有sudo权限(centos7),需要root权限
id learn #查看已加入的用户组
#下面是我的结果,还加入了nobody用户组
#uid=1000(learn) gid=1000(learn) group=1000(learn),99(nobody)

我们把它加入wheel组.为啥是这个组?因为在/etc/sudoers文件中是这样描述的

 ## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
 
## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL
#所以执行,别忘了加上之前的已经附加的组.因为-G 参数 会替换除了gid指定的其他组.
#这里我不在需要nobody用户组了,所有不写.
usermod -G 1000,wheel learn #or usermod -G 99,wheel learn
#如果需要sudo 不要密码验证的话,请删除/etc/sudoers中 %wheel  ALL=(ALL)       NOPASSWD: ALL 列之前的#号符
#然后重启一下系统或者source /etc/sudoers

CentOS 版本

#首先你需要一个能获得sudo权限的用户或者root用户
#确认你版本不要与下面相差太大
sudo rpm -q centos-release
#centos-release-7-5.1804.el7.centos.x86_64

执行安装

#安装依赖
sudo yum install  gcc g++ gcc-c++ make
#安装redis,wget命令执行当前目录,只要拥有权限即可
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz
cd redis-5.0.3 #后续所有操作都基于此目录完成,若变换目录,请注意路径
#如果上次make失败,解决好依赖之后,先执行 make distclean 或者删除整个解压后文件再解压一次
make distclean
make #会需要一下时间,可以去喝个茶
#示例基于/opt目录进行,也可自己制定任意路径,但是需要注意权限问题.
#在/opt下创建redis软件包,
sudo mkdir -p /opt/redis/bin 
sudo mkdir -p /opt/redis/conf 
sudo mkdir -p /opt/redis/data/6379 
sudo mkdir -p /opt/redis/log
#复制可执行文件值bin目录
find ./src -perm /+x -type f | xargs sudo cp -t /opt/redis/bin

若不需要单机环境,可直接跳转至 集群搭建部分

#复制配置文件值conf目录
sudo cp redis.conf /opt/redis/conf/6379.conf
#至此已经安装完成,可以使用绝对路径命令和指定配置文件运行

修改6379.conf必要要的配置信息(主要是为配置为服务做准备,可自由发挥)

sudo vim /opt/redis/conf/6379.conf
daemonize yes
logfile /opt/redis/log/6379.log
dir /opt/redis/data/6379

添加专门用户管理(可省略,用root用户代替)

#新增redis用户及用户组,没有登录权限
sudo groupadd redis
#-c 新账户描述信息 
#-s 新账户的登录shell,只作为本地服务使用,redis用户是不需要远程登录,故使用/sbin/nologin 
#-d 新账户home目录(主目录),此处无需在/home目录下创建redis子目录,可以使用/opt/redis目录 
#-g 新账户主组的名称或ID
#-G 新账户的附加组列表,即表示此用户同时属于root用户组,(opt目录下默认需要root用户组的权限)
sudo useradd -c "Redis Server v5.0.3" -M -d /opt/redis -g redis -G root -s /sbin/nologin redis
#若用户已存在且没有其他什么作用,可以使用sudo userdel redis ; sudo rm -rf /var/spool/mail/redis,
#然后重复上述创建组合用户的操作,mail为useradd默认的创建的邮件目录
#赋予root用户组rwx权限,若是redis以root用户运行则不需要修改权限
sudo chmod -R 775 /opt/redis/data
sudo chmod -R 775 /opt/redis/log
#权限数字解释:读r为4,写w为2,执行x为1,无权限为0,所有组合:7(rwx),6(rw-),5(r-x),4(r--),3(-wx),2(-w-),1(--x),0(---)
#权限拥有者有三种,所属用户本身(所有者,可使用chown 用户名;修改),所属用户组(文件所在组,可使用chgrp 组名;修改),任何人.
#所以只有三位数,排列顺序固定,ls -l 命令只显示所属用户本身,所属用户组
#执行权限修改后如下所示
#$ ll /opt/redis
#总用量 0
#drwxr-xr-x. 2 root root 178 2月  27 15:55 bin
#drwxr-xr-x. 2 root root  23 2月  27 18:12 conf
#drwxrwxr-x. 3 root root  18 2月  27 18:13 data
#drwxrwxr-x. 2 root root  22 2月  28 09:52 log
#{chomd管辖}. 2 {chown} {chgrp}  22 2月  28 09:52 log

映射为系统服务

sudo vim /usr/lib/systemd/system/redis.service

并输入以下内容

[Unit]
Description=Redis server v5.0.3  daemon
After=network.target

[Service]
Type=forking
ExecStart=/opt/redis/bin/redis-server /opt/redis/conf/6379.conf --daemonize yes 
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/opt/redis/bin/redis-cli -p 6379 shutdown
User=redis 
Group=redis
PrivateTmp=true

[Install]
WantedBy=multi-user.target

若没有创建redis相关的用户和用户组,请设置

User=root
Group=root

保存成功之后,重新加载系统服务

#重新加载服务
sudo systemctl daemon-reload

安装服务后检查

#查看状态
sudo systemctl status redis #或者 sudo systemctl status redis.service
#启动服务
sudo systemctl start redis
#连接测试
sudo /opt/redis/bin/redis-cli -p 6379
#127.0.0.1:6379> exit
#重启服务
sudo systemctl restart redis
#关闭服务
sudo systemctl stop redis
#设置开机启动
sudo systemctl enable redis.service
#Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service
#同sudo ln -s '/usr/lib/systemd/system/redis.service' '/etc/systemd/system/multi-user.target.wants/redis.service'
#关闭开机启动
sudo systemctl disable redis.service
#Removed symlink /etc/systemd/system/multi-user.target.wants/redis.service.
# 同sudo rm '/etc/systemd/system/multi-user.target.wants/redis.service'
#若有错误查看服务操作的详细信息
sudo journalctl -xe #会显示最近服务操作命令的details

若在服务和权限都没有问题的情况下出现 Unit xxx.service entered failed state 之类的错误,可使用下面语句清除失败的单元

#查看启动失败的单元(一般为开机启动失败,不需要的可以禁用)
sudo systemctl --failed
#清除失败服务单元
sudo systemctl reset-failed
#系统中不需要的服务,最好删除或者禁用.
sudo systemctl disable 服务名.service

配置局域网络访问(版本为5.0.3 )

修改 6379.conf

#添加redis-server所在机器网卡的静态地址(如:192.168.10.11)
bind 127.0.0.1 192.168.10.11 
 #redis6379为自定义的密码,且对本机不生效,对局域网其他地址生效
requirepass redis6379

防火墙打开redis-server端口

#查看网络端口和服务,查看redis-server的端口号,示例为6379
sudo netstat -npl -tu #tu 代表tcp和udp协议 同sudo netstat -npltu
#Active Internet connections (only servers)
#Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
#tcp        0      0 192.168.10.11:6379      0.0.0.0:*               LISTEN      2162/redis-server 1 
#tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2162/redis-server 1 
# 若没有netstat命令请仔细 yum install net-tools
#永久打开端口
sudo firewall-cmd --permanent --add-port=6379/tcp --zone=public
#永久关闭某端口
sudo firewall-cmd --permanent --remove-port=6379/tcp --zone=public
#或者 sudo firewall-cmd --permanent --remove-port=6379/tcp
#生效命令
sudo firewall-cmd --reload
#查看已开放端口
sudo firewall-cmd --zone=public --list-ports 
#或者 sudo firewall-cmd --list-ports 
#查看已开放服务
sudo firewall-cmd --list-services
#查看所有已开的端口和服务
sudo firewall-cmd --list-all
#或者关闭防火墙
sudo systemctl stop firewalld #sudo systemctl stop firewalld.service

重启Redis服务.在局域网内即可连接

集群环境(示例为两台实际的机器)

主机A:192.168.10.11

sudo cp redis.conf /opt/redis/conf/cluster_6381.conf

修改配置文件cluster_6381.conf,集群模式下不需要绑定127.0.0.1

bind 192.168.10.11
port 6381
daemonize yes
pidfile /var/run/redis_cluster_6381.pid
logfile /opt/redis/log/cluster_6381.log
dir /opt/redis/data/cluster_6381
appendonly yes
appendfilename "cluster_6381_appendonly.aof"
cluster-enabled yes
cluster-config-file /opt/redis/data/cluster_6381/nodes_cluster_6381.conf
cluster-node-timeout 15000

映射系统服务

#创建dir配置的文件夹并赋权
sudo mkdir -p /opt/redis/data/cluster_6381
#若是redis以root用户运行则不需要修改权限
sudo chmod -R 775 /opt/redis/data/cluster_6381 
#创建服务文件
sudo vim /usr/lib/systemd/system/redis_cluster_6381.service
[Unit]
Description=Redis server v5.0.3 daemon,cluster_6381
After=network.target

[Service]
Type=forking
ExecStart=/opt/redis/bin/redis-server /opt/redis/conf/cluster_6381.conf --daemonize yes 
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/opt/redis/bin/redis-cli -c -h 192.168.10.11 -p 6381 shutdown
User=redis 
Group=redis
PrivateTmp=true

[Install]
WantedBy=multi-user.target

若没有创建redis相关的用户和用户组,请设置

User=root
Group=root
#重新加载服务
sudo systemctl daemon-reload

处理本机另外两个节点
处理配置文件,6382端口节点

#处理配置文件
sudo cp /opt/redis/conf/cluster_6381.conf /opt/redis/conf/cluster_6382.conf
#替换所有端口号
sudo sed -i 's/6381/6382/g' /opt/redis/conf/cluster_6382.conf
#若你的配置文件太过复杂可以使用正则表达式处理
#sed -i -r 's/(active:[ ]*)[dev|prod|sit]+/\1sit/g' file_name;-i表示编辑修改,-r表示使用正则表达式,\1表示第一个正则捕获项
#查看验证一下修改的地方
sudo cat /opt/redis/conf/cluster_6382.conf | grep 6382
#port 6382
#pidfile /var/run/redis_cluster_6382.pid
#logfile /opt/redis/log/cluster_6382.log
#dir /opt/redis/data/cluster_6382
#appendfilename "cluster_6382_appendonly.aof"
#cluster-config-file /opt/redis/data/cluster_6382/nodes_cluster_6382.conf

处理文件夹和权限

#创建dir配置的文件夹并赋权
sudo mkdir -p /opt/redis/data/cluster_6382
#若是redis以root用户运行则不需要修改权限
sudo chmod -R 775 /opt/redis/data/cluster_6382 
#创建服务文件
sudo cp /usr/lib/systemd/system/redis_cluster_6381.service /usr/lib/systemd/system/redis_cluster_6382.service
sudo sed -i 's/6381/6382/g' /usr/lib/systemd/system/redis_cluster_6382.service
#检查一下
sudo cat /usr/lib/systemd/system/redis_cluster_6382.service | grep 6382
#Description=Redis server v5.0.3 daemon,cluster_6382
#ExecStart=/opt/redis/bin/redis-server /opt/redis/conf/cluster_6382.conf 
#ExecStop=/opt/redis/bin/redis-cli -c -h 192.168.10.11 -p 6382 shutdown
#重新加载服务
sudo systemctl daemon-reload

6383端口节点的相关处理同6382的处理.,将命令中的6382改成6383即可.

#打开防火墙访问的相关端口通道,若防火墙关闭则忽略,这里配置服务便于集中管理和修改
sudo vim /usr/lib/firewalld/services/redis_cluster.xml

修改并加入如下xml内容

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>redis_cluster</short>  
  <description>redis cluster,6381,6382,6383 port firewall setting.</description>
  <port protocol="tcp" port="6381"/>
  <port protocol="tcp" port="16381"/> <!-- The command port and cluster bus port offset is fixed and is always 10000,more details see in https://redis.io/topics/cluster-tutorial -->
  <port protocol="tcp" port="6382"/>
  <port protocol="tcp" port="16382"/>
  <port protocol="tcp" port="6383"/>
  <port protocol="tcp" port="16383"/>
</service>
#添加服务至防火墙
sudo firewall-cmd --add-service=redis_cluster --permanent --zone=public
sudo firewall-cmd --reload #修改后记得重载
sudo firewall-cmd --list-all

主机B:192.168.10.12

接下来就是将在主机B上进行与主机A同样的操作.(端口也可为6381,6382,6383)
ps: 如果你的是虚拟机的话,就直接克隆吧,记得修改IP地址哦,示例操作如下:

#修改IP地址,(如果有uuid,和HWADDR,删除uuid,修改hwaddr为新的mac或者删除)
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33 
#删除/etc/udev/rules.d/70-persistent-ipoib.rules文件如果有
sudo rm -f /etc/udev/rules.d/70-persistent-ipoib.rules
#修改主机名
sudo vim /etc/hostname 
#重启网络服务
sudo systemctl restart network.service
#修改redis配置文件的IP地址
sudo sed -i 's/192.168.10.11/192.168.10.12/g' /opt/redis/conf/*
#修改服务文件地址
sudo sed -i 's/192.168.10.11/192.168.10.12/g' /usr/lib/systemd/system/redis_cluster_*service
sudo systemctl daemon-reload

创建集群

首先先启动所有的集群节点,

sudo systemclt start redis_cluster_端口号
#然后执行下面的语句创建集群
sudo /opt/redis/bin/redis-cli --cluster create 192.168.10.11:6381 192.168.10.11:6382 192.168.10.11:6383 192.168.10.12:6381 192.168.10.12:6382 192.168.10.12:6383 --cluster-replicas 1
#若创建集群失败,先检查错误后重新创建,重新创建若遇到 节点不是空的之类的错误
#请删除之前的创建的node.conf,aof,rdb文件
sudo find /opt/redis/data/cluster* -type f #查看
sudo find /opt/redis/data/cluster* -type f | xargs rm -rf #删除

成功后会打印如下信息:


>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.10.12:6382 to 192.168.10.11:6381
Adding replica 192.168.10.11:6383 to 192.168.10.12:6381
Adding replica 192.168.10.12:6383 to 192.168.10.11:6382
M: 07650e015f13a2fff6cbb130f3ff201ec60c19ba 192.168.10.11:6381
   slots:[0-5460] (5461 slots) master
M: f42eb04c3a4d1208eeb61fe7abd8d390fbd83d07 192.168.10.11:6382
   slots:[10923-16383] (5461 slots) master
S: a02ec21fb2d01037eaff726bffe137710fe134d5 192.168.10.11:6383
   replicates 0fe7a1d58f1390effd5c450071cb2c4a418daaef
M: 0fe7a1d58f1390effd5c450071cb2c4a418daaef 192.168.10.12:6381
   slots:[5461-10922] (5462 slots) master
S: 66630d57a23eba92a8693d795420d614f89059de 192.168.10.12:6382
   replicates 07650e015f13a2fff6cbb130f3ff201ec60c19ba
S: 9cc688f8f859fcfc911d9926efc53eb0ed3adb66 192.168.10.12:6383
   replicates f42eb04c3a4d1208eeb61fe7abd8d390fbd83d07
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.....
>>> Performing Cluster Check (using node 192.168.10.11:6381)
M: 07650e015f13a2fff6cbb130f3ff201ec60c19ba 192.168.10.11:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 66630d57a23eba92a8693d795420d614f89059de 192.168.10.12:6382
   slots: (0 slots) slave
   replicates 07650e015f13a2fff6cbb130f3ff201ec60c19ba
S: a02ec21fb2d01037eaff726bffe137710fe134d5 192.168.10.11:6383
   slots: (0 slots) slave
   replicates 0fe7a1d58f1390effd5c450071cb2c4a418daaef
S: 9cc688f8f859fcfc911d9926efc53eb0ed3adb66 192.168.10.12:6383
   slots: (0 slots) slave
   replicates f42eb04c3a4d1208eeb61fe7abd8d390fbd83d07
M: 0fe7a1d58f1390effd5c450071cb2c4a418daaef 192.168.10.12:6381
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: f42eb04c3a4d1208eeb61fe7abd8d390fbd83d07 192.168.10.11:6382
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covere

如果长时间卡在 Waiting for the cluster to join…
1,请先关闭防火墙,看看是不是没有开放cluster bus port ,网络相关服务是否正常
2,如果关了防火墙,还是waiting,请查看你的配置文件 bind 这个选项配置的IP 是否为当前主机IP(not 127.0.0.1,不要配置成回环地址),且只有一个,如果有多个的话请先删除试试.
3,还是不行,把bind 的IP改成0.0.0.0 试试.检查网络通信.
4,都不行的话,有毒.赶快Google找解药.还可以抢救一下.

#登录查看
sudo /opt/redis/bin/redis-cli -h 192.168.10.11 -c -p 6381
#登录后,以下集群的管理操作摘自网络.
#集群
cluster nodes #查看集群节点信息
cluster info #打印集群的信息
#节点
cluster meet <ip> <port> #将ip和port所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> #从集群中移除 node_id 指定的节点。
cluster replicate <node_id> #将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig #将节点的配置文件保存到硬盘里面。
#槽(slot)
cluster addslots <slot> [slot ...] #将一个或多个槽(slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] #移除一个或多个槽对当前节点的指派。
cluster flushslots #移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> #将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> #将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> #从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable #取消对槽 slot 的导入(import)或者迁移(migrate)。

#键
cluster keyslot <key> #计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> #返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> #返回 count 个 slot 槽中的键 。

关闭集群

关闭所有节点后就像
再次启动,只要启动所有节点就行了

PS:额外可配置补充

对于关闭所有节点,如果是在开发环境,对于每台机器,可以配置一个父级服务或者目标,方便集群的启动和停止.(或者是专用的话直接加入开机启动,不需要父级服务或者目标)

#首先创建
sudo vim /usr/lib/systemd/system/redis_cluster.target

输入下面的内容.并保存.

[Unit]
Description=Redis server v5.0.3 daemon,redis_cluster
After=redis_cluster_6381.service redis_cluster_6382.service redis_cluster_6383.service
Requires=redis_cluster_6381.service redis_cluster_6382.service redis_cluster_6383.service

[Install]
WantedBy=multi-user.target

这样就设置好统一启动了.
接下来,是设置停止.我们可以设置当redis_cluster_*.service守护进程不在被需要的时候自动停止.
在/usr/lib/systemd/system/redis_cluster_6381.service 的单元文件中的加入StopWhenUnneeded=yes

最后单元文件配置如下:

[Unit]
Description=Redis server v5.0.3 daemon,cluster_6381
After=network.target
StopWhenUnneeded=yes

[Service]
Type=forking
ExecStart=/opt/redis/bin/redis-server /opt/redis/conf/cluster_6381.conf 
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/opt/redis/bin/redis-cli -c -h 192.168.10.11 -p 6381 shutdown
User=redis 
Group=redis
PrivateTmp=true

[Install]
WantedBy=multi-user.target

其他的端口的同6381配置.主机B 192.168.10.12的配置同主机A
设置好记得重载服务

#启动
sudo systemctl start redis_cluster.target
#查看一下进程
sudo ps aux | grep redis
#查看一下相关端口
sudo netstat -npltu | sudo grep redis
#为了方便在主机A上测试,我们把安装的redis命令加入到系统环境变量中去
#在export PATH 前添加PATH=$PATH:/opt/redis/bin
sudo sed -i -r '/export.+PATH/i\PATH=$PATH:/opt/redis/bin' /etc/profile
source /etc/profile #若没有权限,则可更改为root用户执行,或者加入到用户环境变量文件 ~/.bash_profile 然后再执行source /etc/profile
sudo redis-cli -c -h 192.168.10.11 -p 6381 #即可进入集群
#若你在主机A不想指定IP地址就进入集群 即redis-cli -c -p 6381
#你需要修改A主机的节点6381这个端口的配置文件的绑定IP
sudo vim /opt/redis/conf/cluster_6381.conf

修改如下

bind 192.168.10.11 127.0.0.1  #127.0.0.1必须在后,不然节点无法加入集群
#然后重启改节点
sudo systemctl restart redis_cluster_6381.service
redis-cli -c -p 6381 #or sudo redis-cli -c -p 6381
#集群密码管理,创建完成集群之后设置.
sudo /opt/redis/bin/redis-cli -c -h 192.168.10.11 -p 6381
#在集群内设置
config set masterauth 123 #重启节点后失效
config set requirepass 123 #重启节点后失效
auth 123 #重启节点后失效
config rewrite  #写入配置文件
#上面的三个密码设置成一样,所有节点重复上述设置密码的操作.密码一样.访问是添加 -a 123即可
sudo /opt/redis/bin/redis-cli -c -h 192.168.10.11 -p 6381 -a '123'
# 然而你如果只是开发的话不建议去弄密码(到时候再说).
# redis优化,
#1.把redis日志里面的建议解决了,比如fail message received from, fail error
#2.读写分离
#3.日志看着舒服,服务没啥问题就不要去优化了.
#4.努力达到财务自由,雇人(或者开发个AI)给你优化.

若是帮到了您,赏个包子钱吧!
收集整理不易,转载请注明出处并带上我的打赏码
商家服务-支付宝

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值