关于Redis - 主从关系 及 配置文件参数

一个银行柜台在一定时间内处理的业务是不能与几个柜台处理的快,压力也挺大的有点不便时就没有人服务了。

相关环境版本:

redis 5.0.4  下载传送门

Linux:Centos7 

关于2.6至今5.0.4的复制方式演进:W-D的 这篇演进关系部分

目录

搭建主从关系:

关于日志警告:

①配置文件中配置了:tcp-backlog  

② Transparent Huge Pages (THP) support enabled 

关于日志内容初始化信息:

关于配置文件:

① 网络部分

② 通用部分

③ 快照部分

④  复制部分

⑤ 安全配置

⑥ 客户端配置

⑦ 内存配置管理

⑧ AOF相关配置

⑨ 慢日志



 

其实所谓主从关系,简单说是以主库为准,从库内容异步复制主数据库,从而达成主从内容基本一致的情况。实际而言,也有从数据库作主数据库再次接着从数据库的操作(这种操作根据个人情况而言使用)

其实搭建主从关系并不难,只是配置上的细节,后面会详解额外配置及版本更新的配置。

搭建主从关系:

搭建主从关系:

采用三个节点配置:

 127.0.0.1 6379

 127.0.0.1 6380

 127.0.0.1 6381

待服务器端编译过后,拷贝redis.conf:

主要分成: 6379_master.conf 、6380_slave.conf 、6381_slave.conf

#建立三个redis目录
mkdir -p /opt/redisTemp/{redis6379,redis6380,redis6381} 

#------------------------如果是配置文件放置( 非 )同一目录下--------------------------------- 
#从源码中拷贝配置文件,下方rediscode 等同于你的源码编译目录
cp rediscode/redis.conf /opt/redisTemp/redis6379/6379.conf
cp rediscode/redis.conf /opt/redisTemp/redis6380/6380.conf 
cp rediscode/redis.conf /opt/redisTemp/redis6381/6381.conf

#------------------------如果是配置文件放置同一目录下--------------------------------- 
则下方配置中
# #工作目录,存放持久化数据的目录
dir ./   ==> 需要变更为上述创建的三个目录 
#主库基本配置
daemonize yes #守护线程 这里便于后台运行

pidfile /var/run/redis_6379.pid #这里本身就是默认值 ,用于存放执行中配置文件所对应的进程id

port 6379  #对应端口

logfile "./logs/master_6379.log" # 该项可不设置,默认输出到/dev/null,若没文件夹需先建立

slave-read-only yes # 表示从库只读,如果设置成no,表示从库也是可以写入的


dir ./
# 这里默认值是当前文件夹,一般是启动程序下
# 请注意,您必须在这里指定一个目录,而不是文件名。
# 用于存放rdb文件的位置

从库配置方式:

#从库基本配置
daemonize yes #守护线程 这里便于后台运行

pidfile /var/run/redis_6380.pid #这里本身就是默认值 ,用于存放执行中配置文件所对应的进程id

port 6380  #对应端口

logfile "./logs/slave_6380.log" # 该项可不设置,默认输出到/dev/null(如果daemonize yes),若没#文件夹需先建立

slave-read-only yes # 表示从库只读,如果设置成no,表示从库也是可以写入的

dir ./
# 这里默认值是当前文件夹,一般是启动程序下
# 请注意,您必须在这里指定一个目录,而不是文件名。
# 用于存放rdb文件的位置

①直接配置

slaveof 127.0.0.1 6379 #指向主库服务器IP和端口。
(这里的127.0.0.1只是示例,实际中填写自己服务器ip地址,不然项目调用会连接不上)

# masterauth <master-password> #如果主服务器设置了密码,则需要加入
masterauth "yourpassword" #这里输入你的密码

②连接配置

#下方 host 、port 分别为ip地址与端口号,yourpassword 为主数据库密码
#######利用redis-cli 连接客户端后
#主数据库没有密码 --------------
slaveof {host} {port} 
config rewire


#主数据库存在密码密码  -------------
slaveof {host} {port} 
config rewire
config  set masterauth yourpassword

Tips:

 如果主库设置了密码,而从库不填入masterauth的话就会出现

而不是目标:

当然,调试直接输入 redis-cli 就是默认进入6379

      如果存在密码,先输入 auth ,之后输入你的密码

     127.0.0.1:6379> AUTH yourpassword 

否则:info replication 即可看到关系。


关于日志警告:

①配置文件中配置了:tcp-backlog  

而所在的服务器somaxconn  参数少于你定义的值时会出现的问题


7730:S 12 Jun 2019 22:01:02.883 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

关于:The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

  主要警告是担心 somaxconn 参数:

  Linux官方解释:定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为1024,(而我的只有128,故出现此警告)【大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助,总得来说是怕处理不过里来】

解决方式:修改Linux内核默认值

#下方number 为你设置的值
echo  {number} > /proc/sys/net/core/somaxconn

② Transparent Huge Pages (THP) support enabled 

7730:S 12 Jun 2019 22:01:02.883 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

google翻译:

警告您在内核中启用了透明大页面(THP)支持。 这将导致Redis的延迟和内存使用问题。 要解决此问题,请以root身份运行命令'echo never> / sys / kernel / mm / transparent_hugepage / enabled',并将其添加到/etc/rc.local中,以便在重新启动后保留设置。 禁用THP后必须重新启动Redis。

从上可得:

 一、若是临时性处理

echo never > /sys/kernel/mm/transparent_hugepage/enabled

二、一劳永逸

进入/etc/rc.local

...

if 

test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled;

then

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

fi

关于日志内容初始化信息:

1、从库的日志

存在密码

不存在密码(这里指正确密码)

主要分为如下几部

①加载硬盘快照数据

②校验主从关系,利用配置尝试连接主库

③尝试利用socket连接主库(ping)

    分支一:

        1、建立连接,等待主库响应(响应后执行下一步)

        2、开始与主库同步数据发送请求

        3、 保持接收更新数据(保持心跳来等待从库更新命令)

# Slaves send PINGs to server in a predefined interval. It's possible to change
# this interval with the repl_ping_slave_period option. The default value is 10
# seconds.
#
# repl-ping-slave-period 10 默认心跳间隔是10秒

    分支二:验证密码失败,尝试重连(循环尝试)

关于配置文件:

 其实有机会的话这里面与源码内的redis.config可以读一下

 https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf

懂英文还是很舒服的。(当然我也枚举下常用的几个配置)【其实文档还是很有条理的】

① 网络部分

################################## NETWORK (网络部分) #####################################
1、tcp-backlog 511 
# Linux官方解释:定义了系统中每一个端口最大的监听队列的长度,上述已经提及[511只是自定义的]

2、timeout 0 
# Close the connection after a client is idle for N seconds (0 to disable)
# 在空闲多少秒后关闭链接(0是禁用此功能)

3、tcp-keepalive 300
# 官方推荐300 ,这里以秒为单位,上面是默认值。若为0 ,则为关闭配置
# 用于发送ack 进行校验两端

② 通用部分


################################# GENERAL (通用部分)#####################################

1、daemonize no
# 如果你需要使用,则“yes”。#注意,Redis默认将在/var/run/redis.pid中写入一个PID文件
# 当然pid 文件位置可以通过 pidfile 来自定义
# 为yes则是后台运行

2、supervised no 
# 这里额外提及到一个组件 - supervisor,可以用于替换默认的守护进程(可以了解一下)
# 用于监听你的redis进程行为
# (1)supervised no  默认模式,不搞这么多骚操作
# (2)supervised upstart  利用 upstart  来进行管理
# (3)supervised systemd  利用 systemd  来管理
# (4)supervised auto  #based on UPSTART_JOB or NOTIFY_SOCKET environment variables
#  最后一个参数我不是很能理解就不去利用,因为基本上是我目前不操作的部分。

3、pidfile /var/run/redis_6379.pid
#这是上述第一条内的默认值,因为默认端口是6379,这个用于存放pid端口,只有 daemonize 为yes时生效

4、loglevel notice
#日志级别:相信不用多描述了
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)

5、logfile ""
# 这里建议自己补充日志输出位置及文件名,目前没有找到直接配置按天分配的方法

6、databases 16
# 设置数据库的数量。默认的数据库是DB 0

上述提及内容:upstart的内容      、  systemd的内容

③ 快照部分


################################ SNAPSHOTTING(快照)  ################################
1、save <seconds> <changes>
# 如果满足上面其中一个参数的要求,则将数据保存到磁盘上
# 例如 save 60 2 ,如果达到 2 次修改,则经过 60秒后 将记录结果并保存到磁盘上
# 删除储存点方式: save ""

2、stop-writes-on-bgsave-error yes
# yes 情况下,启用了RDB快照[(至少有一个保存点],如果最后一次的后台保存RDB snapshot出错,redis就会# 拒绝所有写请求,官方说这是一个报警,如果自己定义了监听持久化快照的解决方案,可以禁用这个属性

3、rdbcompression yes
# 启用后,则使用LZF压缩算法来对转储的.rdb进行压缩,当然会消耗一些额外的cpu,如果你想节省cpu的话,可# 可以取消,但是这样做,一旦遇到比较大的数据集,转储后的rdb可能会占用更多的空间

4、rdbchecksum yes
# 5版本的RDB内的CRC64校验码和位于文件末尾,抗损坏能力相对强,但是会带带大约10%的性能损耗,这意味着
# 你可以选择禁用它来提高大约百分10的性能


5、dbfilename dump.rdb
# The filename where to dump the DB,相信不需要我解释了

6、dir ./
# 这里默认值是当前文件夹,一般是启动程序下
# 请注意,您必须在这里指定一个目录,而不是文件名。

④  复制部分

################################# REPLICATION #################################
1、replicaof <masterip> <masterport>
# 将当前数据库变成辅数据库,同步复制主数据库的内容,对应ip 、端口号
# 连接辅数据库输入 REPLICAOF NO ONE ,则重新恢复成主数据库

2、masterauth <master-password>
# 若主数据库设置了密钥,则需要设置对应密钥才能连接成功

3、replica-serve-stale-data yes
# 当Redis失去了与主Redis的连接,或者主从同步正在进行中时,Redis该如何处理外部发来的访问请求的方式
# yes: 即使主从断了,从依然响应客户端的请求。
# no :主从断开了,则从会提示客户端"SYNC with master in progress",但有些指令还可以使用(参考最新 # 所使用的redis.conf文件详解)

4、replica-read-only yes
# 定义从数据库是否只读


5、repl-diskless-sync no
# 用于定义主从同步数据的策略
# 一、磁盘形式,就是先将数据写到rdb文件里,然后传输rdb文件到从上(以增量方式将文件传输到副本)
# 二、socket形式,就是直接通过网络传输变更的数据到从服务器上,不接触磁盘
# 第二种形式:WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY

6、repl-diskless-sync-delay 5
#  需要 5 开启了无盘模式(socket)情况下才需要设置
# 如果使用了通过socket的形式传输数据,则需要考虑一个主下面有多个从的情况,因为一旦基于Diskless的# 复制传送开始, 主就无法顾及新的从的到来。所以,就有了这个延迟的设置,比如延迟5秒,这样在主从传 # 输数据之前,所有的从都能有时间被识别了, 这样主就可以多开几个线程来同时给所有的从进行数据传输了

7、repl-ping-replica-period 10
#复制副本以预定义的间隔向服务器发送ping ,相当于心跳检测时间,单位(秒)

8、repl-timeout 60
# 超时时间,包括从master看slave,从slave看master,要大于上边的repl-ping-slave-period


9、repl-disable-tcp-nodelay no
# 默认:SYNC完毕后,在slave的socket里关闭TCP_NODELAY。
# 如果是yes,reids发送少量的TCP包给slave,但可能导致最高40ms的数据延迟。
# 如果是no,那可能在复制的时候,会消耗 少量带宽。
# 默认我们是为了低延迟优化而设置成no,如果主从之间有很多网络跳跃。那设置成yes吧。
# 额外: 关于tcp_nodelay有个nagle算法,可以了解一下


10、repl-backlog-size 1mb
# 这里的backlog是主上的一个内存缓冲区,它存储的数据是当主和从断开连接时,主无法将数据传给从了,这# 时候主先将更新的数据 暂时存放在缓存去里。如果主从再次连接时,就不需要重新传输所有数据,而是只需要# 传输缓冲区的这一部分即可。

11、repl-backlog-ttl 3600
# 与上方 10 的设置的同源的
# 如果主Redis等了一段时间之后,还是无法连接到从Redis,那么缓冲队列中的数据将被清理掉。我们可以设# 置主Redis要等待的时间长度。 如果设置为0,则表示永远不清理。默认是1个小时。


12、replica-priority 100 
# 设置redis的优先级,仅能在 10, 100, 25 之间,若为0 则永远也不会选择它升级
# 在主Redis持续工作不正常的情况,优先级高的从Redis将会升级为主Redis。而编号越小,优先级越高

⑤ 安全配置

################################## SECURITY(安全) ###################################

1、requirepass foobared
# 访问redis时设置的密码

2、rename-command CONFIG ""
# 可以禁用一些关键字,比如上述的CONFIG,相当于禁用CONFIG

⑥ 客户端配置

maxclients 10000

# 此限制设置为10000个客户端,但是,如果Redis服务器无法将进程文件限制配置为允许指定的限制,
# 则允许客户端的最大数# # 量设置为当前文件限制#减去32(因为Redis保留了几个文件描述符供内部使用)
# 一旦达到限制,Redis将关闭所有新连接,并返回:max number of clients reached 错误

⑦ 内存配置管理

############################## MEMORY MANAGEMENT ################################

1、maxmemory <bytes>
# 如果redis用内存超过了设置的限制,第一,开始用maxmemory-policy配置的策略往外删数据,如果配置成了 # noeviction。所有write都会拒绝,比如set,lpush等。所有读请求可以接受。
# 主要用在把redis用在LRU缓存,或者用在一个内存吃紧又不能删除的策略上。
# 如果你有slave,你应该把最大内存别设置的太大,留一些系统内存给slave output buffers(如果是noeviction策略,就无需这样设置了)


2、maxmemory-policy volatile-lru
# 内存策略。(上面是默认值)
# 一、volatile-lru ->用LRU删除设置了ttl的key
# 二、allkeys-lru ->用LRU删除任何key
# 三、volatile-random ->随机删除有ttl的key
# 四、allkeys-random ->随机删除任何key
# 五、volatile-ttl ->删除即将ttl到期的key
# 六、noeviction ->不删,有write的时候报错。

# 如下操作会返回错误
 #       set setnx setex append
 #       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
 #       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
 #       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
 #       getset mset msetnx exec sort

3、maxmemory-samples 3
# LRU、LFU和最小TTL算法不是精确的算法,而是近似的算法(以节省内存),因此您可以根据速度或精度对其进行 # 调整;
# 默认的5会产生足够好的结果。10非常接近真正的LRU算法,但花费更多的CPU。3更快,但不太准确。

⑧ AOF相关配置

==========================APPEND ONLY MODE ====================================
1、appendonly no
# 默认redis异步的dump数据到disk。但如果断电了,那么就会导致几分钟的写操作丢失(根据save的配置);
# AOF提供更好模式。如用默认的AOF,redis只丢失最近一秒的数据(断电情况),或者最后一个write操作#(redis自身错误,os正常)。每个write操作写一次AOF;
#   当AOF文件太大了,redis会自动重写一个aof文件出来。
#   AOF和RDB持久化可以同时启用。redis会优先读AOF恢复数据。
# https://redis.io/topics/persistence 里面存在描述AOF、RDB的内容

2、appendfilename "appendonly.aof"
# AOF的文件名,上述属于默认值

3、appendfsync everysec
# Redis支持三种不同的写入模式(主要是fsync函数)[上述是默认值]
# no:不调用fsync()。而是让操作系统自行决定sync的时间。这种模式下,Redis的性能会最快。
# always:在每次写请求后都调用fsync()。这种模式下,Redis会相对较慢,但数据最安全。
# everysec:每秒钟调用一次fsync()。这是性能和安全的折衷。

4、no-appendfsync-on-rewrite no
# 当fsync方式设置为always或everysec时,存在:
# 如果后台持久化进程需要执行一个很大的磁盘IO操作,那么Redis可能会在fsync()调用时卡住。 目前尚未修 # 复这个问题,即使在另一个新的线程中去执行fsync(),也会阻塞住同步写调用;
#
# 为“yes” 时,当BGSAVE或BGWRITEAOF运行时,fsync()在主进程中的调用会被阻止。 这意味着当另一路进程 # 正在对AOF文件进行重构时,Redis的持久化功能就失效了
#
# 如果Redis有时延问题,那么可以将该选项设置为yes。否则请保持no,这是保证数据完整性的最安全的选择


5、auto-aof-rewrite-percentage 100
6、auto-aof-rewrite-min-size 64mb
# 我们允许Redis自动重写aof。当aof增长到一定规模时,Redis会隐式调用BGREWRITEAOF来重写log文件, # 以缩减文件体积。
#
# Redis是这样工作的:Redis会记录上次重写时的aof大小。
# 假如Redis自启动至今还没有进行过重写,那么启动时aof文件的大小会被作为基准值。 这个基准值会和当前 # 的aof大小进行比较。如果当前aof大小超出所设置的增长比例,则会触发重写。
# 【另外还需要设置一个最小大小,是为了防止在aof很小时就触发重写。】
#
# 如果设置auto-aof-rewrite-percentage为0,则会关闭此重写功能。


7、aof-load-truncated yes
# 由于某种原因(aof文件损坏)有可能导致利用aof文件恢复redis数据时发生异常,该参数决定redis服务接  # 下来的行为。
#
#一、 如果设置为yes,则aof文件会被加载(但数据一定不全),并且会记录日志说明情况。
#二、 如果设置为no,则redis服务根本就启动不起来。【同时用户要求 在重新启动 服务器之前使用          # “redis-check-aof”实用程序修复AOF文件
# 执行:redis-check-aof --fix appendonly.aof(为当前redis的aof文件) 



8、aof-use-rdb-preamble yes
#  [RDB file][AOF tail] -> RDB-AOF 混合持久化
# 这种持久化能够通过 AOF 重写操作创建出一个同时包含RDB数据和AOF数据的AOF文件;
# 正如示例解释中的摆放:
# 其中RDB数据位于AOF文件的开头, 它们储存了服务器开始执行重写操作时的数据库状态:至于那些在重写操# 作执行之后执行的Redis命令,则会继续以AOF格式追加到AOF文件的末尾,也即是RDB数据之后

⑨ 慢日志

1、latency-monitor-threshold 0
#  只记录大于等于下边设置的值的操作。
# 0的话,就是关闭监视。可以动态开启。
# 直接运行CONFIG SET latency-#monitor-threshold <milliseconds> 

猜你喜欢

转载自blog.csdn.net/CoffeeAndIce/article/details/91633181