redis实现负载均衡高可用集群以及做mysql的缓存服务

redis的理解

REmote DIctionary Server(Redis) 是key-value存储系统。通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

redis工作原理
Redis客户端对服务端的每次调用都经历了发送命令、执行命令、返回结果三个过程,其中执行命令阶段,由于redis是单线程来处理命令的,所以每一条到达服务端的命令不会立即执行,所有的命令都会进入一个队列中,然后逐个被执行,并且多个客户端发送的命令的执行顺序是不确定的,但是可以确定的是不会有两个命令被同时执行,不会产生并发问题;

Redis 与其他key - value缓存产品有以下三个特点:

  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  3. 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套接字文件或者修改名称,重新启动数据库就可以了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值