redis的理解
REmote DIctionary Server(Redis) 是key-value存储系统。通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
redis工作原理
Redis客户端对服务端的每次调用都经历了发送命令、执行命令、返回结果三个过程,其中执行命令阶段,由于redis是单线程来处理命令的,所以每一条到达服务端的命令不会立即执行,所有的命令都会进入一个队列中,然后逐个被执行,并且多个客户端发送的命令的执行顺序是不确定的,但是可以确定的是不会有两个命令被同时执行,不会产生并发问题;
Redis 与其他key - value缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
优点
1.读写速度极高,性能极优
2.丰富的数据类型
3.原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务
4.并发:做为数据库的缓存时,请求量很大时会导致数据库的连接会出现异常,使用redis作为访问对象缓冲阶段,
redis存储方式
redis使用了两种文件格式:全量数据和增量请求。
全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;
增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis的单线程工作模式
1.纯内存操作;
2.单线程工作模式避免进行切换产生内存的消耗;
3.数据结构简单,对数据操作也简单;
4.使用多路I/O复用模型,非阻塞IO;
5.使用底层模型不同,Redis直接自己构建了VM 机制 ,系统调用系统函数会浪费一定的时间;
redis基础命令
启动客户端
连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。
redis 127.0.0.1:6379> PING
PONG
远程服务上执行命令
redis-cli -h host -p port -a password
查看redis库详细信息
127.0.0.1:6379> info
# Keyspace
db0:keys=2,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
db2:keys=1,expires=0,avg_ttl=0
db3:keys=3,expires=0,avg_ttl=0
db4:keys=1,expires=0,avg_ttl=0
db5:keys=2,expires=0,avg_ttl=0
db6:keys=6,expires=0,avg_ttl=0
redis源码包安装
server2-master:
[root@server2 ~]# tar zxf redis-4.0.1.tar.gz
[root@server2 ~]# cd redis-4.0.1
[root@server2 redis-4.0.1]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests
BUGS deps MANIFESTO runtest sentinel.conf utils
CONTRIBUTING INSTALL README.md runtest-cluster src
[root@server2 redis-4.0.1]# make && make install
[root@server2 redis-4.0.1]# cd utils/
[root@server2 utils]# ls
build-static-symbols.tcl hashtable redis_init_script.tpl
cluster_fail_time.tcl hyperloglog redis-sha1.rb
corrupt_rdb.c install_server.sh releasetools
create-cluster lru speed-regression.tcl
generate-command-help.rb redis-copy.rb whatisdoing.sh
graphs redis_init_script
[root@server2 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@server2 utils]# cd /etc/redis/
[root@server2 redis]# ls
6379.conf
[root@server2 redis]# vim 6379.conf
70 bind 0.0.0.0
[root@server2 utils]# /etc/init.d/redis_6379 restart
[root@server2 redis]# netstat -antp | grep :6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1517/redis-server 1
redis主从复制
server2-master server3-slave
slave按照以上步骤安装redis:
[root@server3 utils]# vim /etc/redis/6379.conf
70 bind 0.0.0.0
282 # slaveof <masterip> <masterport>
283 slaveof 172.25.60.2 6379
[root@server3 utils]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@server3 utils]# redis-cli
127.0.0.1:6379> info
# Replication
role:slave
master_host:172.25.60.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e208b214ef036ff79751b129d34584ac07762270
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
master测试:
[root@server2 redis]# redis-cli
127.0.0.1:6379> set user westos
OK
127.0.0.1:6379> get user
"westos"
###查看slave是否同步###
[root@server3 ~]# redis-cli
127.0.0.1:6379> get user
"westos"
redis高可用
server4-slave按照以上步骤设置主从复制
# Replication
role:slave
master_host:172.25.60.2
master_port:6379
master_link_status:up
server2-master操作:
[root@server2 ~]# cd /etc/redis/
[root@server2 redis]# cp /root/redis-4.0.1/sentinel.conf .
[root@server2 redis]# vim sentinel.conf
17 protected-mode no
67 # Note: master name should not include special characters or spaces.
68 # The valid charset is A-z 0-9 and the three characters ".-_".
69 sentinel monitor mymaster 172.25.60.2 6379 2
97 # Default is 30 seconds.
98 sentinel down-after-milliseconds mymaster 5000
[root@server2 redis]# scp sentinel.conf 172.25.60.3:/etc/redis/
sentinel.conf 100% 7606 7.4KB/s 00:00
[root@server2 redis]# scp sentinel.conf 172.25.60.4:/etc/redis/
sentinel.conf 100% 7606 7.4KB/s 00:00
[root@server2 redis]# cp sentinel.conf /mnt/
[root@server2 redis]# redis-server --help
Usage: ./redis-server [/path/to/redis.conf] [options]
./redis-server - (read config from stdin)
./redis-server -v or --version
./redis-server -h or --help
./redis-server --test-memory <megabytes>
Examples:
./redis-server (run the server with default conf)
./redis-server /etc/redis/6379.conf
./redis-server --port 7777
./redis-server --port 7777 --slaveof 127.0.0.1 8888
./redis-server /etc/myredis.conf --loglevel verbose
Sentinel mode:
./redis-server /etc/sentinel.conf --sentinel
###启动监控命令,此时只能处于界面,不能退出###
[root@server2 ~]# redis-server /etc/redis/sentinel.conf --sentinel
1562:X 12 Jul 10:15:54.742 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1562:X 12 Jul 10:15:54.742 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1562, just started
1562:X 12 Jul 10:15:54.742 # Configuration loaded
1562:X 12 Jul 10:15:54.743 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.1 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 1562
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
1562:X 12 Jul 10:15:54.743 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1562:X 12 Jul 10:15:55.051 # Sentinel ID is 72f306052ba437474db468b7647bf98bec17978f
1562:X 12 Jul 10:15:55.051 # +monitor master mymaster 172.25.60.2 6379 quorum 2 ###监控主机
1562:X 12 Jul 10:15:55.051 * +slave slave 172.25.60.3:6379 172.25.60.3 6379 @ mymaster 172.25.60.2 6379 ###slave从机
1562:X 12 Jul 10:15:55.245 * +slave slave 172.25.60.4:6379 172.25.60.4 6379 @ mymaster 172.25.60.2 6379 ###slave从机
server3开启监控命令:
[root@server3 redis-4.0.1]# redis-server /etc/redis/sentinel.conf --sentinel
1613:X 12 Jul 10:19:42.515 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1613:X 12 Jul 10:19:42.515 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1613, just started
1613:X 12 Jul 10:19:42.515 # Configuration loaded
1613:X 12 Jul 10:19:42.516 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.1 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 1613
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
1613:X 12 Jul 10:19:42.517 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1613:X 12 Jul 10:19:42.574 # Sentinel ID is 2f934269f28ed71c5aef9a90591767fe89e50e39
1613:X 12 Jul 10:19:42.575 # +monitor master mymaster 172.25.60.2 6379 quorum 2
1613:X 12 Jul 10:19:42.575 * +slave slave 172.25.60.3:6379 172.25.60.3 6379 @ mymaster 172.25.60.2 6379
1613:X 12 Jul 10:19:42.623 * +slave slave 172.25.60.4:6379 172.25.60.4 6379 @ mymaster 172.25.60.2 6379
1613:X 12 Jul 10:19:42.954 * +sentinel sentinel 72f306052ba437474db468b7647bf98bec17978f 172.25.60.2 26379 @ mymaster 172.25.60.2 6379
server4开启监控命令:
[root@server4 utils]# redis-server /etc/redis/sentinel.conf --sentinel
4793:X 12 Jul 10:21:32.149 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4793:X 12 Jul 10:21:32.149 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=4793, just started
4793:X 12 Jul 10:21:32.149 # Configuration loaded
4793:X 12 Jul 10:21:32.149 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.1 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 4793
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
4793:X 12 Jul 10:21:32.150 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4793:X 12 Jul 10:21:32.564 # Sentinel ID is e98f6bba5b0df16f3dfe8239b7965c1f3fb31065
4793:X 12 Jul 10:21:32.564 # +monitor master mymaster 172.25.60.2 6379 quorum 2
4793:X 12 Jul 10:21:32.565 * +slave slave 172.25.60.3:6379 172.25.60.3 6379 @ mymaster 172.25.60.2 6379
4793:X 12 Jul 10:21:32.613 * +slave slave 172.25.60.4:6379 172.25.60.4 6379 @ mymaster 172.25.60.2 6379
4793:X 12 Jul 10:21:32.887 * +sentinel sentinel 72f306052ba437474db468b7647bf98bec17978f 172.25.60.2 26379 @ mymaster 172.25.60.2 6379
4793:X 12 Jul 10:21:32.976 * +sentinel sentinel 2f934269f28ed71c5aef9a90591767fe89e50e39 172.25.60.3 26379 @ mymaster 172.25.60.2 6379
测试:当server1-master宕掉以后,是否会从server3-slave和server4-slave选举一个master
模拟server2-master故障:
重新远程连接server2:
[root@server2 ~]# redis-cli
127.0.0.1:6379> SHUTDOWN
not connected> EXIT
查看信息:当masetr挂掉以后,会再次尝试连接master,在时间内没有应答会从server3和server4选举master,最后两行信息显示server2和server4当前状态为slave,选举server3为master
1613:X 12 Jul 10:19:42.954 * +sentinel sentinel 72f306052ba437474db468b7647bf98bec17978f 172.25.60.2 26379 @ mymaster 172.25.60.2 6379
1613:X 12 Jul 10:21:34.850 * +sentinel sentinel e98f6bba5b0df16f3dfe8239b7965c1f3fb31065 172.25.60.4 26379 @ mymaster 172.25.60.2 6379
1613:X 12 Jul 10:27:12.058 # +sdown master mymaster 172.25.60.2 6379
1613:X 12 Jul 10:27:12.116 # +odown master mymaster 172.25.60.2 6379 #quorum 2/2
1613:X 12 Jul 10:27:12.116 # +new-epoch 1
1613:X 12 Jul 10:27:12.116 # +try-failover master mymaster 172.25.60.2 6379
1613:X 12 Jul 10:27:12.727 # +vote-for-leader 2f934269f28ed71c5aef9a90591767fe89e50e39 1
1613:X 12 Jul 10:27:12.727 # e98f6bba5b0df16f3dfe8239b7965c1f3fb31065 voted for e98f6bba5b0df16f3dfe8239b7965c1f3fb31065 1
1613:X 12 Jul 10:27:12.973 # 72f306052ba437474db468b7647bf98bec17978f voted for e98f6bba5b0df16f3dfe8239b7965c1f3fb31065 1
1613:X 12 Jul 10:27:13.700 # +config-update-from sentinel e98f6bba5b0df16f3dfe8239b7965c1f3fb31065 172.25.60.4 26379 @ mymaster 172.25.60.2 6379
1613:X 12 Jul 10:27:13.700 # +switch-master mymaster 172.25.60.2 6379 172.25.60.3 6379
1613:X 12 Jul 10:27:13.701 * +slave slave 172.25.60.4:6379 172.25.60.4 6379 @ mymaster 172.25.60.3 6379
1613:X 12 Jul 10:27:13.701 * +slave slave 172.25.60.2:6379 172.25.60.2 6379 @ mymaster 172.25.60.3 6379
1613:X 12 Jul 10:27:18.702 # +sdown slave 172.25.60.2:6379 172.25.60.2 6379 @ mymaster 172.25.60.3 6379
查看server3信息:
[root@server3 ~]# redis-cli
127.0.0.1:6379> info
###当前状态信息显示只有一个slave-server4连接###
# Replication
role:master
connected_slaves:1
slave0:ip=172.25.60.4,port=6379,state=online,offset=208990,lag=0
重新启动server2的redis服务,server3信息显示连接
[root@server2 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@server3 ~]# redis-cli
127.0.0.1:6379> info
# Replication
role:master
connected_slaves:2
slave0:ip=172.25.60.4,port=6379,state=online,offset=248726,lag=0
slave1:ip=172.25.60.2,port=6379,state=online,offset=248726,lag=1
redis集群
[root@server3 ~]# mkdir /usr/local/cluster
[root@server3 ~]# cd /usr/local/cluster/
[root@server3 cluster]# mkdir 700{1..6}
[root@server3 cluster]# ls
7001 7002 7003 7004 7005 7006
[root@server3 cluster]# cd 7001/
[root@server3 7001]# vim redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /usr/local/cluster/7001
logfile /usr/local/cluster/7001/redis.log
daemonize yes
pidfile /usr/local/cluster/7001/redis.pid
[root@server3 7001]# cp redis.conf ../7002
[root@server3 7001]# cp redis.conf ../7003
[root@server3 7001]# cp redis.conf ../7004
[root@server3 7001]# cp redis.conf ../7005
[root@server3 7001]# cp redis.conf ../7006
修改7002目录下的redis.conf文件,将7001依次改为7002,后面依次修改到7006:
[root@server3 7001]# vim ../7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /usr/local/cluster/7002
logfile /usr/local/cluster/7002/redis.log
daemonize yes
pidfile /usr/local/cluster/7002/redis.pid
[root@server3 7001]# vim ../7003/redis.conf
[root@server3 7001]# vim ../7004/redis.conf
[root@server3 7001]# vim ../7005/redis.conf
[root@server3 7001]# vim ../7006/redis.conf
[root@server3 7001]# vim ../7006/redis.conf
###依次启动每个redis服务###
[root@server3 7001]# redis-server redis.conf
[root@server3 7001]# redis-server ../7002/redis.conf
[root@server3 7001]# redis-server ../7003/redis.conf
[root@server3 7001]# redis-server ../7004/redis.conf
[root@server3 7001]# redis-server ../7005/redis.conf
[root@server3 7001]# redis-server ../7006/redis.conf
[root@server3 7001]# ps ax
2215 ? Ssl 0:00 redis-server *:7001 [cluster]
2221 ? Ssl 0:00 redis-server *:7002 [cluster]
2226 ? Ssl 0:00 redis-server *:7003 [cluster]
2231 ? Ssl 0:00 redis-server *:7004 [cluster]
2236 ? Ssl 0:00 redis-server *:7005 [cluster]
2241 ? Ssl 0:00 redis-server *:7006 [cluster]
[root@server3 ~]# cd redis-4.0.1/src/
[root@server3 src]# cp redis-trib.rb /usr/local/bin/
[root@server3 ~]# re
read redhat-support-tool redis-trib.rb resizecons
readarray redis-benchmark refer restart
readelf redis-check-aof reload restorecon
readlink redis-check-rdb rename restorecond
readonly redis-cli renice return
readprofile redis-sentinel reset rev
reboot redis-server resize2fs
[root@server3 ~]# redis-trib.rb --help
/usr/bin/env: ruby: No such file or directory
[root@server3 ~]# yum install -y rubygems-1.3.7-5.el6.noarch.rpm
[root@server3 ~]# gem list
*** LOCAL GEMS ***
[root@server3 ~]# gem install --local redis-4.0.1.gem
ERROR: Error installing redis-4.0.1.gem:
redis requires Ruby version >= 2.2.2.
[root@server3 ~]# yum install -y ruby-2.2.3-1.el6.x86_64.rpm
** Found 5 pre-existing rpmdb problem(s), 'yum check' output follows:
perl-DBD-MySQL-4.013-3.el6.x86_64 has missing requires of libmysqlclient.so.16()(64bit)
perl-DBD-MySQL-4.013-3.el6.x86_64 has missing requires of libmysqlclient.so.16(libmysqlclient_16)(64bit)
2:postfix-2.6.6-2.2.el6_1.x86_64 has missing requires of libmysqlclient.so.16()(64bit)
2:postfix-2.6.6-2.2.el6_1.x86_64 has missing requires of libmysqlclient.so.16(libmysqlclient_16)(64bit)
2:postfix-2.6.6-2.2.el6_1.x86_64 has missing requires of mysql-libs
[root@server3 ~]# yum install -y ruby-2.2.3-1.el6.x86_64.rpm
再次进行安装ruby-2.2.3-1.el6.x86_64.rpm不会进行报错!
[root@server3 ~]# gem list
*** LOCAL GEMS ***
bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)
[root@server3 ~]# gem install --local /root/redis-4.0.1.gem
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 0 seconds
1 gem installed
[root@server3 ~]# gem list
*** LOCAL GEMS ***
bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
redis (4.0.1) ##支持redis
test-unit (3.0.8)
[root@server3 ~]# redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: 92021051de7848dd2bec5ee23bff5372f9b660a7 127.0.0.1:7001
slots:0-5460 (5461 slots) master
M: 0dcc81cf389477b58fceb601313fb70a501bd0e1 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: d314d6ed553ac5fdc632b7db1c6fc819513698f5 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
S: 15094f2c11f0e7dedccaa35b656392fb61a7b931 127.0.0.1:7004
replicates 92021051de7848dd2bec5ee23bff5372f9b660a7
S: b8a2ff596027b22f495d2df8edebf53c03b034ee 127.0.0.1:7005
replicates 0dcc81cf389477b58fceb601313fb70a501bd0e1
S: 7d2814176e3849e884865a6982dc2a3523195730 127.0.0.1:7006
replicates d314d6ed553ac5fdc632b7db1c6fc819513698f5
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 127.0.0.1:7001)
M: 92021051de7848dd2bec5ee23bff5372f9b660a7 127.0.0.1:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: d314d6ed553ac5fdc632b7db1c6fc819513698f5 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 7d2814176e3849e884865a6982dc2a3523195730 127.0.0.1:7006
slots: (0 slots) slave
replicates d314d6ed553ac5fdc632b7db1c6fc819513698f5
S: b8a2ff596027b22f495d2df8edebf53c03b034ee 127.0.0.1:7005
slots: (0 slots) slave
replicates 0dcc81cf389477b58fceb601313fb70a501bd0e1
S: 15094f2c11f0e7dedccaa35b656392fb61a7b931 127.0.0.1:7004
slots: (0 slots) slave
replicates 92021051de7848dd2bec5ee23bff5372f9b660a7
M: 0dcc81cf389477b58fceb601313fb70a501bd0e1 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
测试:
节点之间的存储时可以共享
[root@server3 ~]# redis-cli -c -p 7001
127.0.0.1:7001>
127.0.0.1:7001> set name westos
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get name
"westos"
127.0.0.1:7002> exit
[root@server3 ~]# redis-cli -c -p 7006
127.0.0.1:7006> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"westos"
127.0.0.1:7002> exit
[root@server3 ~]# redis-cli -c -p 7005
127.0.0.1:7005> set passwd 123
-> Redirected to slot [4876] located at 127.0.0.1:7001
OK
127.0.0.1:7001> exit
[root@server3 ~]# redis-cli -c -p 7003
127.0.0.1:7003> get passwd
-> Redirected to slot [4876] located at 127.0.0.1:7001
"123"
127.0.0.1:7001> exit
[root@server3 ~]# redis-trib.rb info 127.0.0.1:7001
127.0.0.1:7001 (92021051...) -> 1 keys | 5461 slots | 1 slaves.
###测试时对7001写入一个数据###
127.0.0.1:7003 (d314d6ed...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (0dcc81cf...) -> 1 keys | 5462 slots | 1 slaves.
###对7002写入一个数据###
[OK] 2 keys in 3 masters.
0.00 keys per slot on average.
redis作为mysql的缓存服务器
server2 : 安装php + nginx + mysql
server3 : redis服务
server4:redis服务-slave +mysql
server2安装环境
1.安装php:
[root@server2 ~]# ls
php-5.3.3-38.el6.x86_64.rpm php-gd-5.3.3-38.el6.x86_64.rpm
php-cli-5.3.3-38.el6.x86_64.rpm php-mbstring-5.3.3-38.el6.x86_64.rpm
php-common-5.3.3-38.el6.x86_64.rpm php-mysql-5.3.3-38.el6.x86_64.rpm
php-devel-5.3.3-38.el6.x86_64.rpm php-pdo-5.3.3-38.el6.x86_64.rpm
php-fpm-5.3.3-38.el6.x86_64.rpm
[root@server2 ~]# yum install -y php-*
###修改配置文件的php运行用户和组###
[root@server2 phpredis-master]# vim /etc/php-fpm.d/www.conf
39 user = nginx
41 group = nginx
[root@server2 phpredis-master]# id nginx
uid=500(nginx) gid=500(nginx) groups=500(nginx)
###修改配置文件的时区为上海###
[root@server2 phpredis-master]# vim /etc/php.ini
943 [Date]
944 ; Defines the default timezone used by the date functions
945 ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
946 date.timezone = Asia/Shanghai
2.安装php的redis的扩展:
[root@server2 ~]# unzip phpredis-master.zip
[root@server2 ~]# cd phpredis-master
[root@server2 phpredis-master]# phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
[root@server2 phpredis-master]# ./configure --with-php-config=/usr/bin/php-config
[root@server2 phpredis-master]# make && make install
[root@server2 phpredis-master]# vim /etc/php.d/redis.ini
extension=redis.so
[root@server2 phpredis-master]# /etc/init.d/php-fpm start
Starting php-fpm: [ OK ]
###查看php模块是否支持redis###
[root@server2 phpredis-master]# php -m | grep redis
redis
###查看php是否启动###
[root@server2 ~]# netstat -antplue | grep :9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 0 15876 3969/php-fpm
3.安装nginx以及配置:
[root@server2 ~]# rpm -ivh nginx-1.8.0-1.el6.ngx.x86_64.rpm
warning: nginx-1.8.0-1.el6.ngx.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY
Preparing... ########################################### [100%]
1:nginx ########################################### [100%]
----------------------------------------------------------------------
Thanks for using nginx!
Please find the official documentation for nginx here:
* http://nginx.org/en/docs/
Commercial subscriptions for nginx are available on:
* http://nginx.com/products/
###修改配置文件支持index.php文件以及支持php###
[root@server2 html]# cd /etc/nginx/conf.d/
[root@server2 conf.d]# ls
default.conf example_ssl.conf
[root@server2 conf.d]# vim default.conf
8 location / {
9 root /usr/share/nginx/html;
10 index index.php index.html index.htm;
11 }
30 location ~ \.php$ {
31 root html;
32 fastcgi_pass 127.0.0.1:9000;
33 fastcgi_index index.php;
34 fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/$fastcgi_script_nam e;
35 include fastcgi_params;
36 }
[root@server2 ~]# /etc/init.d/nginx start
Starting nginx: [ OK ]
[root@server2 ~]# netstat -antplue | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 16165 4009/nginx
server4数据库环境:
[root@server4 ~]# yum install -y mysql mysql-server
[root@server4 ~]# /etc/init.d/mysqld start
[root@server4 ~]# cat test.sql
use test;
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');
#DELIMITER $$
#CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
# SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
# END$$
#DELIMITER ;
[root@server4 ~]# mysql < test.sql
[root@server4 ~]# mysql ###没有设置密码,直接回车进入数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from test; ###查看导入的数据文件test
+----+-------+
| id | name |
+----+-------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
| 4 | test4 |
| 5 | test5 |
| 6 | test6 |
| 7 | test7 |
| 8 | test8 |
| 9 | test9 |
+----+-------+
9 rows in set (0.00 sec)
mysql> grant all on test.* to westos@'%' identified by 'westos';
###server2导入测试文件test.php###
[root@server2 ~]# cp test.php /usr/share/nginx/html/
[root@server2 ~]# vim /usr/share/nginx/html/test.php
<?php
$redis = new Redis();
$redis->connect('172.25.60.3',6379) or die ("could net connect redis server");
# $query = "select * from test limit 9";
$query = "select * from test";
for ($key = 1; $key < 10; $key++)
{
if (!$redis->get($key))
{
$connect = mysql_connect('172.25.60.4','westos','westos');
mysql_select_db(test);
$result = mysql_query($query);
//如果没有找到$key,就将该查询sql的结果缓存到redis
while ($row = mysql_fetch_assoc($result))
{
$redis->set($row['id'],$row['name']);
}
$myserver = 'mysql';
break;
}
else
{
{
$myserver = "redis";
$data[$key] = $redis->get($key);
}
}
echo $myserver;
echo "<br>";
for ($key = 1; $key < 10; $key++)
{
echo "number is <b><font color=#FF0000>$key</font></b>";
echo "<br>";
echo "name is <b><font color=#FF0000>$data[$key]</font></b>";
echo "<br>";
}
?>
浏览器测试:测试前清空浏览器缓存
实验时遇见的错误:
1.测试的时候如果一直是空白页面,数据库可能没有装mysql-php,直接重新安装,加载php服务!
2.mysql启动报错:sock套接字已经启用,原因是关机是mysql数据库没有正常关闭,强制退出。解决办法删除/var/lib/mysql/mysql.sock套接字文件或者修改名称,重新启动数据库就可以了。