本文共 23067 字,大约阅读时间需要 76 分钟。
yum -y install centos-release-scl && yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils && scl enable devtoolset-9 bash
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
4.解压安装
tar -xf redis-4.0.10.tar.gzcd redis-4.0.10make && make install
mkdir /etc/rediscd redis-4.0.10/cp redis.conf /etc/redis/6379.conf
守护进程的方式启动服务时,即使执行启动服务命令的终端关闭,服务仍然可以在后台运行。
配置 centos7 systemd 管理 redis 服务
在/lib/systemd/system目录下创建一个脚本文件redis.service,里面的内容如下:
[Unit]Description=RedisAfter=network.target[Service]Type=simpleExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf --daemonize noExecStop=/usr/local/bin/redis-cli -p 6379 shutdown[Install]WantedBy=multi-user.target
[Unit] 表示这是基础信息配置块Description 是描述After 开启自启动时候的顺序, 指定的服务必须先于次此服务启动,一般是网络服务启动后启动[Service] 表示这里是服务信息配置块Type 指定启动服务的类型, simple 是默认的方式EnvironmentFile 指定服务启动时用到的配置文件ExecStart 是启动服务的命令ExecStop 是停止服务的指令[Install] 表示这是是安装信息配置块WantedBy 是以哪种方式启动:multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
授权在主机启动的时候同时启动服务
systemctl enable redis.service
关于 server 文件的详细参数介绍参考这里:
1.使用 systemctl 操作
刷新配置,让 systemd 识别刚刚添加的 redis 服务
systemctl daemon-reload
启动服务
systemctl start redis
设置监听地址
shell> vi /etc/redis/6379.conf # bind 127.0.0.1 192.168.1.10
bind 参数若都注释掉,则会监听服务器上的所有 ip可以指定一个或者多个,打开注释。注意此配置项可能在 71 行左右。默认是 bind 127.0.0.1
检查并测试
检查默认端口 6379 是否监听shell> redis-cli127.0.0.1:6379> info#Serverredis_version:4.0.10redis_git_sha1:00000000redis_git_dirty:0redis_build_id:cfb22f7d67db356d... 略 ...
手动使用命令指定配置文件启动服务
/usr/local/bin/redis-server /etc/redis/6379.conf
这种方式执行,默认 Redis 服务侯会在前台运行。
设置使用守护进程都方式运行服务
需要编辑配置文件 /etc/redis/6379.confdaemonize yes # 守护进程的方式启动服务
客户端指定端口访问
redis-cli -p 6379
手动停止服务
redis-cli -p 6379 shutdown
1044:M 27 Feb 14:47:21.993 # Server initialized1044:M 27 Feb 14:47:21.993 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.1044:M 27 Feb 14:47:21.993 # Short read or OOM loading DB. Unrecoverable error, aborting now.1044:M 27 Feb 14:47:21.993 # Internal error in RDB reading function at rdb.c:1666 -> Unexpected EOF reading RDB file
echo "vm.overcommit_memory = 1" >> /etc/sysctl.confsysctl -p
error, aborting now.1344:M 27 Feb 14:59:33.466 # Internal error in RDB reading function at rdb.c:1666 -> Unexpected EOF reading RDB file
移动 dump.db 文件或者更名,可以删除。
rm dump.rdb
127.0.0.1:6379> help setSET key value [EX seconds] [PX milliseconds] [NX|XX]
在 Redis 中设置值,默认,不存在则创建,存在则修改参数:ex,过期时间(秒)px,过期时间(毫秒)nx,假如设置为True,则只有 name 不存在时,当前 set 操作才执行xx,假如设置为True,则只有 name 存在时,当前 set 操作才执行
Example
127.0.0.1:6379> set name shark EX 10OK127.0.0.1:6379> get name"shark"
setnx
127.0.0.1:6379> help setnx SETNX key value
设置值,只有name 不存在时,执行设置操作(添加)
Example127.0.0.1:6379> setnx age 10(integer) 1127.0.0.1:6379> get age"10"127.0.0.1:6379> setnx age 20(integer) 0127.0.0.1:6379> get age"10"127.0.0.1:6379>
setex
127.0.0.1:6379> help setex SETEX key seconds value
设置 key 和 value,并且指的过期时间(单位: 秒)
Example
127.0.0.1:6379> setex name 5 sharkOKget
获取一个 key 的 value
127.0.0.1:6379> get name"shark"ttl
查看一个 key 的过期时间
127.0.0.1:6379> ttl age(integer) -1
-1 永不过期
-2 已经过期 expire设置一个 key 的过期时间(单位: 秒)
127.0.0.1:6379> EXPIRE age 10(integer) 1127.0.0.1:6379> ttl age(integer) 7persist key
移除 key 的过期时间
mset
一次添加多个值
127.0.0.1:6379> mset name shark age 10OKmget
一次获取多个 key 的值
127.0.0.1:6379> MGET name age1) "shark"2) "10incr
对一个 key 的值自增 1
127.0.0.1:6379> incr age(integer) 11decr
对一个 key 的值自减 1
127.0.0.1:6379> DECR age(integer) 10append
向一个 key 的值后面追加内容
127.0.0.1:6379> get n"10"127.0.0.1:6379> APPEND n 10(integer) 4127.0.0.1:6379> get n"1010"
getrange
127.0.0.1:6379> GETRANGE n 0 -1"1010"
del
删除 一个或者多个 key127.0.0.1:6379> del name age(integer) 2
EXISTS
判断一个 key 是否存在, 返回 1 表示存在, 0 表示不存在127.0.0.1:6379> exists age(integer) 1127.0.0.1:6379> exists aaa(integer) 0127.0.0.1:6379>
TYPE
返回key存储的类型,如果不存在则返回nonetype key
keys
通过通配符来获取匹配到的 key 一般不在生产环境中使用此命令127.0.0.1:6379> keys *1) "num"2) "age"3) "n"127.0.0.1:6379> keys n*1) "num"2) "n"127.0.0.1:6379> keys a[f-g](empty list or set)127.0.0.1:6379> keys a[e-g]?1) "age"
scan
dbsize
返回数据库种 key 的总数
dbsize
EXPIRE
设置key的过期时间,如果key不存在则返回0,否则返回1.如果key已经存在过期时间则再设置会覆盖之前的过期时间
b. List 操作
lpush向列表左端添加元素,values是按左到右依次插入的,返回值为列表中元素个数,列表元素可以重复
最后加入到元素,在列表的第一位
127.0.0.1:6379> LPUSH list a b c(integer) 3127.0.0.1:6379> LPUSH list a b c(integer) 6
rpush
向列表右端依次的添加元素,最后加入的元素在列表的最后位置127.0.0.1:6379> RPUSH list d e f(integer) 9
LINDEX
通过元素在列表中的位置获取到这个元素,位置称为索引号/下标,
位置支持正整数和负整数
列表中元素的位置中,第一位是 0,最后一位是列表总长度减 1 或者是 -1
127.0.0.1:6379> LINDEX list 0"c"
LRANGE
获取列表表一个区间的值
127.0.0.1:6379> LRANGE list 0 21) "c"2) "b"3) "a"
LPUSHX
向列表左端添加元素,只有key存在时才可以添加
127.0.0.1:6379> EXISTS list1 (integer) 0127.0.0.1:6379> LPUSHX list1 a(integer) 0127.0.0.1:6379> LPUSHX list g(integer) 10
RPUSHX
向列表右端添加元素,其他与LPUSHX相同
LPOP
将左端列表元素弹出,会将其从列表中删除,如果key不存在则返回(nil)
127.0.0.1:6379> LPOP list"g"127.0.0.1:6379> LPOP list"c"
RPOP
将右端列表元素弹出,其他同LPOP
LLEN
返回列表的长度,如果列表不存在则返回0
127.0.0.1:6379> LLEN list(integer) 8127.0.0.1:6379> LLEN list1(integer) 0
LREM
lrem key count value
删除列表中指定的值,返回值为删除的元素的个数,count值有以下几种:
count > 0: 从列表的头开始,向尾部搜索,移除与value相等的元素,移除count个
count < 0: 从列表尾部开始,向头部搜索,移除与value相等的元素,移除-count个 count == 0: 移除列表中所有与value相等的 c. Hash将哈希表key中的域 (field) 设置成指定的value,如果key不存在则新建一个hash表,如果域不存在则新建域,如果域已存在则更新域,如果field不存在返回1表示新建,存在则返回0表示更新
127.0.0.1:6379> HSET userinfo username 'shark'(integer) 1127.0.0.1:6379> HSET userinfo userpsw '123456'(integer) 1127.0.0.1:6379> HSET userinfo userpsw '654321'(integer) 0
HGET key field
获取哈希表key中的域field的值,如果key或者field不存在则返回(nil)127.0.0.1:6379> HGET userinfo2 username(nil)127.0.0.1:6379> HGET userinfo username"stronger"127.0.0.1:6379> HGET userinfo email(nil)
HSETNX key field value
将哈希表中的域field设置成指定的值,只有field不存在时才可以成功,如果field存在操作无效,返回0
127.0.0.1:6379> HGET userinfo username"stronger"127.0.0.1:6379> HSETNX userinfo username 'fish'(integer) 0127.0.0.1:6379> HGET userinfo username"stronger"
HMSET key field vale [field value]
同时将多个field-value设定到hash表中,如果field已存在值则会被覆盖掉
127.0.0.1:6379> HMSET userinfo email 'yangdm@gmail.com' sex 'male'OK
HMGET key field [field]
同时获得key存储的hansh表中多个field的值,如果不存在则返回(nil)
127.0.0.1:6379> HMGET userinfo email sex age1) "yangdm@gmail.com"2) "male"3) (nil)
HGETALL key
返回key存储的所有field及value
127.0.0.1:6379> HGETALL userinfo1) "username"2) "stronger"3) "userpsw"4) "654321"5) "email"6) "yangdm@gmail.com"7) "sex"8) "male"127.0.0.1:6379> HGETALL userinfo2(empty list or set)
HKEYS key
返回hash的所有域
127.0.0.1:6379> HKEYS userinfo1) "username"2) "userpsw"3) "email"4) "sex"
HVALS key
返回hash的所有域的值
127.0.0.1:6379> HVALS userinfo1) "stronger"2) "654321"3) "yangdm@gmail.com"4) "male"
HEXISTS key field
检测key中存储的hash中field是否存在,存在返回1,否则返回0
127.0.0.1:6379> HEXISTS userinfo username(integer) 1127.0.0.1:6379> HEXISTS userinfo age(integer) 0
HLEN key
返回key中存储的hash表中field的数量
127.0.0.1:6379> HLEN userinfo(integer) 4
HINCRBY key field increment
给key中存储的hash表field增加increment,如果此field不存在,则创建值为0的field,然后增加increment。操作的字段必须是整数,参照字符串处理
127.0.0.1:6379> HINCRBY userinfo age 10(integer) 10
HINCRBYFLOAT key field increment
给key中存储的hash表field增加increment,可以为浮点数,参照字符串处理
127.0.0.1:6379> HINCRBYFLOAT userinfo salary 150.56"150.56"
HDEL key field [field]
删除key中存储的hash表的field,可以删除一个或多个,成功返回被移除域的数量
127.0.0.1:6379> HKEYS userinfo1) "username"2) "userpsw"3) "email"4) "sex"5) "age"6) "salary"127.0.0.1:6379> HDEL userinfo salary age(integer) 2127.0.0.1:6379> HKEYS userinfo1) "username"2) "userpsw"3) "email"4) "sex"
Set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的。
// 向集合中添加一个或者多个元素SADD key member [member ...]// 返回一个集合中的所有成员SMEMBERS key// 获取集合中元素的个数SCARD key// 返回所有集合的差集,就是存在于第一个集合中,且不存在于其他集合中的成员SDIFF key [key ...] // 交集,就是所有集合共有的元素SINTER key [key ...] // 并集, 就是所有集合的元素合并在一起,并去重SUNION key [key ...] // 差集, 返回第一集合中独有的元素SDIFF key [key...]
Example
127.0.0.1:6379> sadd s1 a b(integer) 2127.0.0.1:6379> sadd s2 a b c d(integer) 4127.0.0.1:6379> sadd s3 c d e f(integer) 4127.0.0.1:6379> sdiff s2 s11) "d"2) "c"127.0.0.1:6379> SINTER s1 s21) "b"2) "a"127.0.0.1:6379> SUNION s1 s2 s31) "b"2) "c"3) "d"4) "f"5) "a"6) "e"127.0.0.1:6379> SMEMBERS s11) "b"2) "a"
Sort Set 操作
有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。// 向有序集合添加一个或多个成员,或者更新已存在成员的分数ZADD key score1 member1 [score2 member2]// score1 是成员的分数// member 是有序集合中的成员// 获取有序集合的元素个数ZCARD key // 返回有序集合中的所有成员127.0.0.1:6379> zrange sort_s 0 -11) "no"2) "hello"// 返回有序集合中的所有成员及其索引号(分数)127.0.0.1:6379> zrange sort_s 0 -1 withscores1) "no"2) "1"3) "hello"4) "2"127.0.0.1:6379>
出现下面的错误,是操作的命令和这个命令所能操作的数据类型不符合。
(error) WRONGTYPE Operation against a key holding the wrong kind of value
三、Redis 的认证连接
// 在配置文件中找到以下配置项,大约在第500
行 shell> vi /etc/redis/6379.confrequirepass mypasswordmypassword 就是密码了,更改好后重启服务
使用设置好的密码认证
// 使用 auth 进行密码认证127.0.0.1:6379> infoNOAUTH Authentication required.127.0.0.1:6379> auth mypasswordOK127.0.0.1:6379> info Serverredis_version:4.0.10...略...
或者在 shell 命令行里使用 -a 选项指定密码,会出现警告信息
[root@localhost ~]# redis-cli -a foobared infoWarning: Using a password with '-a' option on the command line interface may not be safe. # Serverredis_version:4.0.10...略...
开始在 PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP。
安装 phpredis 驱动
点我进入下载页面,,注意选择版本[root@s2 ~]# wget https://github.com/phpredis/phpredis/archive/4.2.0.tar.gzshell> shell> cd php7-redis
yum install php-devel
shell> phpize
[root@s2 phpredis-4.2.0]# find / -name php-config/usr/bin/php-config[root@s2 phpredis-4.2.0]# ./configure --with-php-config=/usr/bin/php-config ... 略...checking whether to build shared libraries... yeschecking whether to build static libraries... noconfigure: creating ./config.statusconfig.status: creating config.hconfig.status: executing libtool commands
编译安装
[root@s2 phpredis-4.2.0]# make && make install ...略...Build complete.Don't forget to run 'make test'.Installing shared extensions: /usr/lib64/php/modules/
[root@s2 phpredis-4.2.0]# php -vPHP 5.4.16 (cli) (built: Oct 30 2018 19:30:51)Copyright (c) 1997-2013 The PHP GroupZend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
[root@s2 phpredis-4.2.0]# find / -name php.ini/etc/php.ini[root@s2 phpredis-4.2.0]# vi /etc/php.ini[root@s2 phpredis-4.2.0]# tail /etc/php.ini;mcrypt.modes_dir=[dba];dba.default_handler=; Local Variables:; tab-width: 4; End:extension=redis.so[root@s2 phpredis-4.2.0]# php -m | grep redisredis
[root@s2 phpredis-4.2.0]# php -m | grep redisredis
RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。
AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。
第二种情况,主动执行 bgsave 命令 (异步,非阻塞 )
配置文件中相关选项的默认值如下表:
关于 RDB 文件的配置信息
默认文件名dbfilename dump.rdb默认文件保存位置dir ./假如 bgsave 执行中发生错误,是否停止写入,默认是 yes , 表示假如出错,就停止写入。stop-writes-on-bgsave-error yes是否使用压缩|rdbcompression yes是否进行数据的校验rdbchecksum yes
建议的最佳配置
关闭自动生成 RDB 文件 在配置文件中注释掉如下内容#save 900 1#save 300 10#save 60 10000
使用不同端口号进行区分,因为,有可能会在同一台主机上开启多个 Redis 实例。
防止多个实例产生的数据信息写到一个文件中。dbfilename dump-${ port}.rdb
指定一个大硬盘的路径
dir /redis_data
假如出现错误,停止继续写入
stop-writes-on-bgsave-error yes
采用压缩
rdbcompression yes
进行校验
rdbchecksum yes
实验
修改配置文件中的相关选项,使其成为如下内容中显示的值:dbfilename dump-6379.rdbdir /redis_data # 此目录需要自己创建stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yes
假如你的 Redis 服务器允许客户端可以从非本机访问,应该在配置文件中,把 protected-mode 的值设置问 no。
这样的话,客户端就可以从其他主机访问 Redis 服务器了,并且不需要密码。
重启服务后,在 Rdis 命令行客户端中输入 save 命令。
[root@s1 ~]# redis-cli127.0.0.1:6379> saveOK127.0.0.1:6379>
该命令将在配置文件重配置的指定目录中创建 dump-6379.rdb文件。
恢复数据时,只需要保证此文件完好,并且在配置文件中指定的目录下即可。这样 Rdis 启动时就会把此文件中的数据恢复到当前的服务器中。
bgsave 命令和 save基本一样,就是 bgsave 命令不会产生阻塞
127.0.0.1:6379> bgsaveBackground saving started127.0.0.1:6379>
查看当前服务器的数据文件目录
127.0.0.1:6379> CONFIG GET dir1) "dir"2) "/"
实现方式同样有两种: 命令方式和配置文件方式
只需要在从服务器上执行如下命令即可
slaveof 主服务器的IP 端口号
slaveof 命令是异步的,不阻塞。并且此时,从服务器现有的数据会先被清空,之后再同步主服务器的数据。
停止一台从服务器的复制操作,在此台服务器上执行如下命令
slaveof no one
配置文件的方式如下
只需要在从服务器上配置即可修改配置文件
假如主服务器 IP 是: 172.16.153.178 端口是: 6379#slaveofslaveof 172.16.153.178 6379// 配置此服务器只提供读取操作slave-read-only yes
之后重启从主机的 Redis 服务
查看主从信息
127.0.0.1:6379> info replication
Redis Sentinel是Redis官方的高可用性解决方案。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将主从复制组合中的其中一个从服务器升级为新的主服务器, 并让其他从服务器指向新的主服务器; 当客户端试图连接失效的主服务器时, Sentinel也会向客户端返回新主服务器的地址, 使得新主服务器代替失效服务器。
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis 为 Sentinel 生成一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器。
此种模式下,客户端要访问的 服务 IP 不是主节点,而是 sentiner 服务器的 IP。
架构图
port 6380daemonize yesprotected-mode nopidfile /var/run/redis-6380.pidlogfile /var/log/redis-6380.logdir /redis/data/
假如是多个主机实现的,就需要更改为 protected-mode yes,
并且添加 bind 0.0.0.0[root@s1 ~]# sed 's/6380/6381/g' /etc/redis/redis-6380.conf > /etc/redis/redis-6381.conf[root@s1 ~]# sed 's/6380/6382/g' /etc/redis/redis-6380.conf > /etc/redis/redis-6382.conf
查看配置文件内容,检验配置结果
[root@s1 ~]# cat /etc/redis/redis-6381.confport 6381daemonize yespidfile /var/run/redis-6381.pidlogfile /var/log/redis-6381.logdir /redis/data/[root@s1 ~]# cat /etc/redis/redis-6382.confport 6382daemonize yespidfile /var/run/redis-6382.pidlogfile /var/log/redis-6382.logdir /redis/data/[root@s1 ~]#
c. 配置主从关系
[root@s1 ~]# echo "slaveof 172.16.153.178 6380" >> /etc/redis/redis-6381.conf[root@s1 ~]# echo "slaveof 172.16.153.178 6380" >> /etc/redis/redis-6382.conf[root@s1 ~]#
d. 启动服务,并验证进程
[root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6380.conf[root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6381.conf[root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6382.conf[root@s1 ~]# ps -ef |grep redisroot 4335 1 0 19:30 ? 00:00:03 /usr/local/bin/redis-server *:6380root 4490 1 0 20:17 ? 00:00:00 /usr/local/bin/redis-server *:6381root 4495 1 0 20:17 ? 00:00:00 /usr/local/bin/redis-server *:6382root 4500 3755 0 20:17 pts/0 00:00:00 grep --color=auto redis[root@s1 ~]#
假如日志中出现如下警告信息
4668:S 17 Feb 20:28:42.107 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.4668:S 17 Feb 20:28:42.107 # Server initialized4668:S 17 Feb 20:28:42.108 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.4668:S 17 Feb 20:28:42.108 * DB loaded from disk: 0.000 seconds4668:S 17 Feb 20:28:42.110 * Before turning into a slave, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
解决办法
The TCP backlog… 方法1: 临时设置生效:shell> sysctl -w net.core.somaxconn=1024
方法2: 永久生效:
修改/etc/sysctl.conf文件,增加一行net.core.somaxconn=1024
然后执行命令
sysctl -p
WARNING overcommit_memory …
方法1: 临时设置生效:
shell> sysctl -w vm.overcommit_memory=1
方法2: 永久生效:
修改/etc/sysctl.conf文件,增加一行vm.overcommit_memory=1
然后执行命令
sysctl -p
运行一个 Sentinel 所需的最少配置如下所示:
Redis 源码中包含了一个名为 sentinel.conf 的文件, 这个文件是一个带有详细注释的 Sentinel 配置文件示例。
运行一个 Sentinel 所需的最少配置如下所示:
// 监控一个 Redis 服务器// 名称为 mymaster ,IP 为 127.0.0.1 端口为 6380// 最后的 2 是指最少有 2 给 Sentinel 实例同意一台 redis 服务器宕机,才会认为 客观下线。// sentinel monitor 自定义的主节点名称 主节点的 IP 主节点端口 票数 sentinel monitor mymaster 127.0.0.1 6380 2sentinel down-after-milliseconds mymaster 3000// 180 秒后开始故障自动装换sentinel failover-timeout mymaster 5000sentinel parallel-syncs mymaster 1
各个选项的功能如下:
down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。
将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。
parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
sentinel-27000.conf
daemonize yesport 27000dir "/tmp"logfile "27000.log"sentinel monitor mymaster 127.0.0.1 6380 2sentinel down-after-milliseconds mymaster 3000sentinel failover-timeout mymaster 5000sentinel parallel-syncs mymaster 1
哨兵的领导者选举
票数和领导者选举有关系领导者选举的事件发生,必须满足下面的条件
max(票数, (哨兵的个数 / 2) + 1 ) 个哨兵参加选举
才可以选举出领导者,从而完成故障转移。
比如有 5 个哨兵, 配置的票数是 4
max(4, (5 / 2) + 1)
max(4, 3.5)4 最大结果就是需要 4 个哨兵参与选举才可以。
快速创建三个 sentinel 配置文件
进入到 Redis 源码的目录下,执行如下命令daemonize yesdir /redis/data/logfile "sentinel-${port}.log"
最后别忘了修改监控的主服务器的 IP 和端口正确的 6380
最终其中一个的配置文件应该是这样的
启动服务的语法:
shell> redis-sentinel sentinel的配置文件
[root@s1 ~]# redis-cli -p 27001 info...略...#Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3[root@s1 ~]#
停止 Master 节点的服务
[root@s1 ~]# redis-cli -p 6380 shutdown
不断的刷新其中一个 Sentinel 节点的信息,观察最后一行信息的变化
[root@s1 ~]# redis-cli -p 27001 info...略...master0:name=mymaster,status=ok,address=127.0.0.1:6382,slaves=2,sentinels=3
主从复制
实现了高可用
数据分片存储
配置开启集群节点配置 meet指派槽配置主从
实例操作
准备两台虚拟机: 一台启动三个 Redis 实例作为 主节点 另一台启动三个 Redis 实例作为 从节点先编辑一个集群的配置文件
编译配置文件 /etc/redis/cluster-redis-7001.conf, 添加如下内容:bind 0.0.0.0port 7001daemonize yes#允许任何地址不使用密码访问我protected-mode nodir "/redis/data/"logfile "cluster-7001.log"dbfilename "cluster-dump-7001.log"cluster-enabled yescluster-config-file cluster-redis-7001.conf#不需要集群的全部节点完好才提供服务cluster-require-full-coverage no
[root@s1 redis]# sed 's/7001/7002/g' cluster-redis-7001.conf > cluster-redis-7002.conf[root@s1 redis]# sed 's/7001/7003/g' cluster-redis-7001.conf > cluster-redis-7003.conf[root@s1 redis]# sed 's/7001/7011/g' cluster-redis-7001.conf > cluster-redis-7011.conf[root@s1 redis]# sed 's/7001/7012/g' cluster-redis-7001.conf > cluster-redis-7012.conf[root@s1 redis]# sed 's/7001/7013/g' cluster-redis-7001.conf > cluster-redis-7013.conf
拷贝从节点的配置文件到另外一台主机上
需要保证另一台主机上有目录 /etc/redis/, 因为这里计划把所有的配置文件放在此目录下
[root@s1 redis]# scp -r cluster-redis-701* root@172.16.153.179:/etc/redis/
首先,需要启动主节点的服务进程
[root@s1 ~]# redis-server /etc/redis/cluster-redis-7001.conf[root@s1 ~]# redis-server /etc/redis/cluster-redis-7002.conf[root@s1 ~]# redis-server /etc/redis/cluster-redis-7003.conf
之后,再启动从节点的服务进程
[root@s2 ~]# mkdir -p /redis/data[root@s2 ~]# redis-server /etc/redis/cluster-redis-7011.conf[root@s2 ~]# redis-server /etc/redis/cluster-redis-7012.conf[root@s2 ~]# redis-server /etc/redis/cluster-redis-7013.conf
ps -ef | grep redis-server
假设你现在去连接到任意一个节点上执行操作会返回集群目前是没有启动的信息。
原因是目前集群各节点之间没有进行 meet 操作,都是各自孤立的状态
redis-cli --cluster create 192.168.122.230:7001 192.168.122.230:7002 192.168.122.230:7003 192.168.122.230:7011 192.168.122.230:7012 192.168.122.230:7013 --cluster-replicas 1
完全配置好后,可以观察集群的数据槽的分配情况
redis-cli -p 7011 cluster slots
最后用客户端登录集群的方式登录到集群中的任意一个节点,设置键值对进行测试。
[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7002 -c set name xiguatianOK[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7002 -c get name"xiguatian"[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7003 -c get name"xiguatian"[root@ela2 ~]# redis-cli -h 192.168.122.218 -p 7013 -c get name"xiguatian"
准备节点
启动两个新的 redis 实例, 分别监听不同端口 比如 7004 和 7014我这里是分别在两台主机上启动 redis 实例
[root@s1 redis]# cp cluster-redis-7001.conf cluster-redis-7004.conf[root@s1 redis]# sed -i 's/7001/7004/g' cluster-redis-7004.conf[root@s1 redis]# redis-server cluster-redis-7004.conf
[root@s2 redis]# cp cluster-redis-7011.conf cluster-redis-7014.conf [root@s2 redis]# sed -i 's/7011/7014/g' cluster-redis-7014.conf [root@s2 redis]# redis-server cluster-redis-7014.conf
2.加入集群中
添加一个新的节点为主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port// new_host:new_port 为新添加的节点信息// existing_host:existing_port 集群中任意节点的信息
添加一个新节点为某一个主节点的从节点
redis-cli --cluster add-node 从节点 IP:端口 集群中任意一个节点 ip:端口 --cluster-slave --cluster-master-id 集群中某一个主节点id
主节点 ID 可以使用如下命令查看,此命令还同时输出了各个节点的角色
redis-cli --cluster check 127.0.0.1:7001
向新加入的主节点中分配槽
目前redis cli只能在管理员支持的情况下执行reshard, 需要我们自己指定希望重新分配多少插槽[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.How many slots do you want to move (from 1 to 16384)?
假设,我们这里重新分配 1000 个
How many slots do you want to move (from 1 to 16384)? 1000What is the receiving node ID?
接着,我们应该告诉 Redis 谁接收这次哈希插槽,需要提供某个 master 的 ID
How many slots do you want to move (from 1 to 16384)? 1000What is the receiving node ID? 6ab8f7fdfba1758c969e62cf07e584faca657bd5Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs.Source node #1:
这里的意思是重新分配的 1000 插槽由哪些节点提供,这里我们输入 all, 表示当前集群中所有由插槽的节点都提供一部分。
Moving slot 11254 from 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7 Moving slot 11255 from 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7Do you want to proceed with the proposed reshard plan (yes/no)? yes键入 yes
你将会看到分配的过程
M: 72dd63854cf5cb9ab43d0bf4ca5fa32d5d5e098e 127.0.0.1:7001 slots:[333-5460] (5128 slots) master 1 additional replica(s)M: 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7 192.168.122.230:7003 slots:[11256-16383] (5128 slots) master 1 additional replica(s)M: 6ab8f7fdfba1758c969e62cf07e584faca657bd5 192.168.122.230:7004 slots:[0-332],[5461-5794],[10923-11255] (1000 slots) master 1 additional replica(s) replicates 6ab8f7fdfba1758c969e62cf07e584faca657bd5M: 4a749969bb98334c5bc950823753c1376179e4b5 192.168.122.230:7002 slots:[5795-10922] (5128 slots) master
转载地址:http://lexv.baihongyu.com/