ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 1.Linux基础 ### 1.1 sudo 命令 > 场景:普通用户在执行某些Linux命令时,由于权限的关系导致执行失败。sudo 命令请求超级用户权限来提升用户的权限,使得Linux命令得以顺利执行。 > * sudo的工作过程如下: > 1)当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限 > 2)确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认 > 3)若密码输入成功,则开始执行sudo后续的命令 > 4)root执行sudo时不需要输入密码(eudoers文件中有配置root ALL=(ALL) ALL这样一条规则) > 5)若欲切换的身份与执行者的身份相同,也不需要输入密码 ### 1.2 给用户赋予执行sudo命令的权限 > * Linux对用户执行sudo命令的权限配置是在 /etc/sudoers文件中,想要用户可以执行sudo命令,需要经过一下几部 > 1)chmod u+w /etc/sudoers ---------------这个文件为只读文件 > 2)vi /etc/sudoers > 3)加入 用户名 ALL=(ALL:ALL) ALL > 4)保存退出 > 5)chmod u-w /etc/sudoers ---------------将文件的权限改回来 ### 1.3 shell脚本 ~~~ #!/bin/bash ---定义变量 REDIS_PORT=6379 REDIS_ETC=/etc/redis REDIS_INITD=/etc/init.d ---创建对应得目录 sudo mkdir $REDIS_ETC sudo mkdir -p ~/data/redis/$REDIS_PORT sudo mkdir -p /var/log/redis ---把redis得启动脚本复制到/etc/init.d系统服务启动文件中 sudo cp ./redis-3.2.5/utils/redis_init_script ${REDIS_INITD}/redis_${REDIS_PORT} sudo cp ./redis-3.2.5/redis.conf ${REDIS_ETC}/${REDIS_PORT}.conf ~~~ * * * * * ## 2.安装redis ### 2.1 redis集群搭建 #### 2.1.1 单机安装 1. 安装环境 ubuntu14.04 server `wget http://download.redis.io/releases/redis-3.2.5.tar.gz` ~~~ tar -xzvf ./redis-3.2.5.tar.gz cd redis-3.2.5/ ~/redis-3.2.5$ sudo apt-get install gcc ~/redis-3.2.5$ sudo apt-get install make ~/redis-3.2.5$ make MALLOC=libc ~/redis-3.2.5$ sudo make install # 将可执行文件导入/usr/local/bin 目录 ~~~ > 在执行了make install之后,查看默认安装目录:/usr/local/bin,包含如下文件: > redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何 服务启动起来后执行 ~~~ redis-check-aof:修复有问题的AOF文件 redis-check-dump:修复有问题的dump.rdb文件 redis-cli:客户端,操作入口 redis-sentinel:redis集群使用 redis-server:Redis服务器启动命令 ~~~ 2. 修改redis.conf的配置 ~~~ bind 192.168.1.152 127.0.0.1 #绑定ip,原始只有127.0.0.1 port 6379 daemonize yes #是否常驻进程运行,原始是no dir /home/aexit1/data/redis/6379 #数据文件持久化存储路径,原始是./ logfile /var/log/redis/redis.log requirepass <改为你自己的登陆密码> ~~~ linux系统下面redis常用初始化脚本 ~~~ #!/bin/bash REDIS_PORT=6379 REDIS_ETC=/etc/redis REDIS_INITD=/etc/init.d sudo mkdir $REDIS_ETC sudo mkdir -p ~/data/redis/$REDIS_PORT sudo mkdir -p /var/log/redis sudo cp ./redis-3.2.5/utils/redis_init_script ${REDIS_INITD}/redis_${REDIS_PORT} sudo cp ./redis-3.2.5/redis.conf ${REDIS_ETC}/${REDIS_PORT}.conf ~~~ 执行启动命令,守护进程 ~~~ sudo /etc/init.d/redis_6379 start (还可以stop) #redis-server ./redis.conf (这种启动方式,不是生产规范) ~~~ 测试一下基础命令: redis-cli -h 192.168.1.152 -p 6379 redis> set foo bar OK redis> get foo "bar" 2.2.安装之后需要知道的基础知识 redis是单进程工作,利用IO多路复用技术 默认16个数据库,类似数组下表从零开始,初始默认使用零号库,使用select命令切换数据库,如select 2 Redis索引都是从零开始 redis初始没有密码,可以使用统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上 默认端口是6379 * * * * * ### 2.2 主从配置(数据同步) * 数据的安全性 * 扩展主节点处理读的请求 通过对数据的复制,解决redis的单点问题,保证数据的安全。Redis的复制机制是一个主从架构。 1)一个子节点只能有一个主节点,主节点可以有多个子节点。 2)数据复制的流行是单向的,只能有主节点复制到子节点。 #### 主从复制有三种方式: 1. 修改redis的配置文件 1)在充当slave节点的机器上, vi redis.conf 加入 slaveof <master节点IP> <master节点port> masterauth <密码> -------如果主节点配置了 requirepass,这里要与主节点保持一致。 2)启动redis 3)redis@ubuntu:~$ ps -aux|grep redis root 17926 0.1 0.1 34308 3576 ? Ssl 15:39 0:04 redis-server 127.0.0.1:6379 -----服务已经启动 root 17967 0.1 0.3 105660 6636 ? Ss 16:50 0:00 sshd: redis [priv] redis 18040 0.0 0.2 105660 4256 ? S 16:50 0:00 sshd: redis@pts/0 redis 18041 0.4 0.2 22812 5132 pts/0 Ss 16:50 0:00 -bash redis 18055 0.0 0.1 18856 2652 pts/0 R+ 16:50 0:00 ps -aux redis 18056 0.0 0.1 12156 2300 pts/0 S+ 16:50 0:00 grep --color=auto redis 4)redis-cli -h 127.0.0.1 -p 6379 登录redis客户端 5)在每台机器上执行 info命令得到以下界面表示成功 主节点: ![](https://box.kancloud.cn/ae4e2360c3d5537d028d32c4af37de7f_712x238.png) ---------------------------------------------从节点: ![](https://box.kancloud.cn/62b2160903d8a073d20eb2285f0c2800_365x245.png) 2. 在用redis-server启动命令后,执行slaveof <masterhost> <masterport> 3. 直接执行slaveof <masterhost> <masterport>这条命令可以切换对应的主节点。 后两种都是动态的指定。 * * * * * ### 2.3 主从拓扑结构 * 一主一从 当主节点出现故障,从节点提供服务 从节点可以开启AOF,保证数据安全,减轻持久化对主节点造成的压力 问题:但是在重启时因为主节点没有做持久化操作,导致主节点数据为空,导致子节点数据也被清空,所以再重启之前进行 slaveof no one断开与主节点的复制关系。 * 一主多从 读写分离,适用读较多的场景,可以把读命令发送给从节点来分担主节点的压力。如keys、sort命令这种消耗性能的查询命令,可以交给一台从节点执行,防止对主节点造成阻塞。 问题:在高并发写入时,多个节点数据的同步会造成主节点性能的低下。 * 树状主从 树形结构,一个节点既可以作为主节点又可以作为从节点。 通过数据复制中间层,数据向下传递,减少了主节点的压力,弥补了一主多从的缺憾。 * * * * * ### 2.4 数据复制 #### 2.4.1 相关命令 1. slaveof: 是一个异步命令,执行时只保存节点信息后返回,复制流程异步地在节点执行。 2. info replication: 命令可以查看数据复制的状态。 3. slaveof no one:解除主从关系、断开数据复制、升级为主节点。这个命令任然会保存以前从主节点复制过来的数据。 4. info server:查看运行节点ID * * * * * #### 2.4.2 数据复制相关优化 * 从节点只读模式 默认配置salve-read-only=yes 从节点默认为只读模式,由于数据是单向的,主节点无法感知从节点数据的变化会造成数据的不一致。所以最好把从节点弄成只读模式。 * 网络传输延迟 配置repl-disable-tcp-nodelay,默认关闭。 1)关闭 数据复制低延迟 增加网络带宽消耗 使用于同机架或者同机房网络较好的情况 2)开启 主节点合并小数据包,节省带宽 延迟较高 适用在跨机房的主从复杂网络或者带宽紧张的情况 * * * * * ### 2.5 数据复制原理 #### 2.5.1 复制过程 slaveof 数据复制开始,经过一下步骤。info replication命令查看复制状态,包括主节点信息、发送slaveof命令的客户端... 1. 保存主节点信息 slaveof保存主节点信息后直接返回,并未发生其他操作。 2. 子节点通过定时任务发送socket连接。 3. 子ping主 检测网络是否连接成功 检测主节点是否可以接受和处理命令 如果主节点没有回复ping,从节点断开连接,下次定时任务开始时重新发起连接。 4. 权限验证 配置文件中,如果主节点配置了密码验证(requirepass ),子节点必须配置masterauth,保证子节点能够通过主节点的密码验证,保证数据复制正常执行。 5. 同步数据 主从可以正常通信后,开始数据同步,从节点发送同步命令: * redis2.8之前 sync * redis2.8之后 psync <主节点运行ID> <从节点复制偏移量> 1)第一次连接没有主节点运行ID和复制偏移量,发送psync -1。 2)主节点根据psync -1解析出为全量复制,回复+FULLRESYNC响应。 3)从节点接收到主节点响应的数据得到主节点运行ID和偏移量。 4)主节点执行bgsave保存RDB文件到本地。 6. 命令持续复制 不断地数据同步,保证数据的一致性。支持无盘复制repl-diskless-sync参数控制,RDB文件不保存到硬盘中,直接通过网络传输给子节点。 #### 2.5.2 同步方式 1. 全量复制 早期redis支持全量复制,主节点一次性把数据同步给从节点,对主节点性能和网络造成很大影响 2. 部分复制 用于处理数据丢失场景,在连接正常后,补发丢失的数据。 * psync需要以下支持 1)主从节点各自复制偏移量 2)主节点复制积压缓冲区 3)主节点运行id * 复制偏移量 主从节点都会维护自身复制偏移量。主节点( master)在处理完写入命令后,会把命令的字节长度 做累加记录,统计信息在info relication中的master_ repl_ offset中。 从节点每分钟上报给主节点自己的复制偏移量,子节点偏移量保存在info replication命令输出的slave_repl_offset中。 * 复制的健康度 master_ repl_ offset-slave_repl_offset如果差值较大说明同步的状况不是很好,注意网络和阻塞的问题。 * 复制积压缓冲区 主节点有子节点时创建的固定长度的队列,某人为1MB。可以保存最近复制的数据,可以进行数据补救。 * 主节点运行ID 每个redis节点启动后都会分配一个id(重启改变),标识redis节点。info server命令可以查看运行id * * * * * ### 2.6 主从之哨兵 * 解决主节点发生故障时,从节点自动升级为主节点 * * * * * #### 2.6.1实现高可用 哨兵(sentinel)可以自动的发现故障,并且实现故障转移,并且通知应用方。 * 哨兵是一个分布式架构,包含多个sentinel,如果发现某个sentinel不可达,切这个节点时主节点,则把主节点下架,并且和其他sentinel通信选举主节点,并告知应用方。 ~~~ cd redis-3.2.5 vim sentinel.conf # 修改redis master IP和端口,最后边的1,表示只要有1个哨兵认为master挂了,就定义master挂了,视哨兵数量而定 ~~~ ![](https://box.kancloud.cn/ba9b81f5d03cfafb3ce46f8bc45daa52_552x95.png) * 开启哨兵服务 `redis-sentinel sentinel.conf &` * * * * * ## 3.集群搭建 * 目标搭建一个3个主节点,每个主节点都有一个从节点的redis集群 * 在一台机器上开启六个redis服务,对应端口 | 主(port) |从(port) | | --- | --- | | 6382 | 6385| | 6383| 6386| | 6384| 6387| 和单机安装一样,解压编译,接着执行以下步骤 1. 修改redis.conf,主要配置 ~~~ bind 127.0.0.1 192.168.33.130 port 6382 ---配置六个不同的端口 daemonize yes pidfile /var/run/redis_6382.pid logfile /var/log/redis/redis6382.log dir /home/tuna/data/redis/6382 cluster-enabled yes cluster-config-file nodes.conf ~~~ 2. 安装ruby环境 ~~~ apt-get install -y ruby,contos执行yum install rubygems gem install redis ~~~ 3. 启动六个redis实例 redis-server 6382.conf ... 4. 在src目录下执行 ~~~ sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 127.0.0.1:6387 ~~~ ---这个脚本自动分配槽(slot) --replicas 代表给主节点分配几个slave 后面紧接着的 <ip> <port>两个为一组,前面是主,后面是从 5. 登录redis客户端 执行 cluster nodes 命令,得到以下信息 注意:redis-cli -c 集群模式客户端,对不同的key跳转到对应的redis主机操作 ![](https://box.kancloud.cn/b07784de5979ac2cb3c860a91a674dd6_794x462.png) 在执行这个命令之后,可以看到有三个主节点和三个从节点,并且三个主平均分配了16383个slot 6. 安装中遇到的问题 问题一: /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in require': cannot load such file -- redis (LoadError) from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /opt/cluster_test/redis-unstable/src/redis-trib.rb:25:in <main> 解决办法: 执行命令 `gem install redis` 问题二: 如果在初始化集群时,由于粗心造成初识话错误,想要重新初始化集群,此时会提示你存在某些数据的问题 解决办法: 删除在你配置dir的路径下的dump.rdb nodes.conf两个文件,再去执行初始化命令(第四步中的脚本)