企业9,redis的运用。实现主从复制,储存数据的特点。
redis
1、指出多多种数据类型,存储。
2、时间较长,数据变动较少的。放到redis缓存,读写速度快。
3、单线程,数据不会丢失。比较简单,减少不必要的上下文切换。
3、多路io复用。请求可以不断进,不影响速度。
5、主栈更新数据,redis也要跟新
6、memcache,数据没有实际东西保存东西,断电会丢失。redis会在文件追加,不怕。
7、codis,有代理。解决
打开两台虚拟机
[root@server1 ~]# systemctl stop mysqld ##mysql要停止 [root@server1 ~]# systemctl disable mysqld Removed symlink /etc/systemd/system/multi-user.target.wants/mysqld.service. [root@server1 ~]# tar zxf redis-5.0.3.tar.gz ##解压 [root@server1 ~]# cd redis-5.0.3/ [root@server1 redis-5.0.3]# make && make install ##编译,下载 [root@server1 redis-5.0.3]# cd utils/ [root@server1 utils]# ./install_server.sh ##启动脚本 全部默认yes,默认开启 [root@server1 utils]# netstat -tnlp ##自动安装 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5317/redis-server 1
更改配置文件bind为0.0.0.0
[root@server1 utils]# vim /etc/redis/6379.conf [root@server1 utils]# /etc/init.d/redis_6379 restart ##脚本重起 [root@server1 utils]# netstat -tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 5347/redis-server 传到server2 [root@server1 ~]# scp -r redis-5.0.3 root@172.25.38.2:/root #传到server2
server2: [root@server2 ~]# cd redis-5.0.3/ [root@server2 redis-5.0.3]# make install ##直接下载 [root@server2 redis-5.0.3]# cd utils/ [root@server2 utils]# ./install_server.sh ##安装 [root@server2 utils]# netstat -tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1512/redis-server 1 [root@server2 utils]# vim /etc/redis/6379.conf ##更改bind [root@server2 utils]# /etc/init.d/redis_6379 restart [root@server2 utils]# netstat -tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1572/redis-server 0
两台虚拟机的redis开启成功
主从复制:
[root@server2 utils]# vim /etc/redis/6379.conf slaveof 172.25.38.1 6379 ##加入句,在最后一行
测试
srver1: [root@server1 ~]# redis-cli ##用客户端测试 127.0.0.1:6379> set name wsp OK 127.0.0.1:6379> get name "wsp" 127.0.0.1:6379> server2: [root@server2 utils]# redis-cli ##server2来看数据 127.0.0.1:6379> get name "wsp" 127.0.0.1:6379>
AOF不怕突然停机,重新读取。求稳
RDB快照的方式。速度快
高可用,在redis的slave,被称为哨兵。看哨兵
将server3配置安装redis与server2一样:
并加入slave。主从。
在server1中复制高可用的配置文件
[root@server1 redis-5.0.3]# cp sentinel.conf /etc/redis/ 更改配置文件 [root@server1 ~]# vim /etc/redis/sentinel.conf ##传给其他两个点 [root@server1 ~]# scp /etc/redis/sentinel.conf root@172.25.254.2:/etc/redis/ [root@server1 ~]# scp /etc/redis/sentinel.conf root@172.25.38.3:/etc/redis/
启动
[root@server1 ~]# redis-server /etc/redis/sentinel.conf --sentinel [root@server2 utils]# redis-server /etc/redis/sentinel.conf --sentinel [root@server3 utils]# redis-server /etc/redis/sentinel.conf --sentinel
测试:
关闭server1:
[root@server1 ~]# redis-cli 127.0.0.1:6379> shutdown ##打开关闭 [root@server1 ~]# /etc/init.d/redis_6379 start Starting Redis server... 我们可以看到自动转化,将master传到3
[root@server1 ~]# /etc/init.d/redis_6379 start Starting Redis server... [root@server1 ~]# redis-cli -p 26379 127.0.0.1:26379> info ##master转换到3 master0:name=mymaster,status=ok,address=172.25.38.3:6379,slaves=2,sentinels=3 [root@server1 ~]# vim /etc/redis/6379.conf 配置文件自动更改
redis集群
适合,资源简单的。
codis缺点,集成的redis版本较低。有点,有代理
我们可以通过proxy来收集信息,不会出现管理问题
耗费资源。适合资源较多的。hash方式
集群的设置: 创建文件,及所用节点 [root@server1 ~]# mkdir /usr/local/rediscluster [root@server1 ~]# cd /usr/local/rediscluster [root@server1 rediscluster]# mkdir 700{1..6} [root@server1 rediscluster]# cd 7001 配置文件,和启动7001. [root@server1 7001]# vim redis.conf [root@server1 7001]# redis-server redis.conf [root@server1 7001]# ps ax | grep redis 5558 ? Ssl 0:00 redis-server *:7001 [cluster] 5563 pts/0 S+ 0:00 grep --color=auto redis [root@server1 7001]# redis-cli -p 7001 ##进入查看信息 127.0.0.1:7001> info # Cluster #是集群 cluster_enabled:1
将7001的配置文件复制一份给其他节点。
[root@server1 7001]# cd .. [root@server1 rediscluster]# cp 7001/redis.conf 7002 [root@server1 rediscluster]# cp 7001/redis.conf 7003 [root@server1 rediscluster]# cp 7001/redis.conf 7004 [root@server1 rediscluster]# cp 7001/redis.conf 7005 [root@server1 rediscluster]# cp 7001/redis.conf 7006 ##更改配置文件的节点将7001换为各自所在的文件名 [root@server1 rediscluster]# vim 7002/redis.conf [root@server1 rediscluster]# vim 7003/redis.conf [root@server1 rediscluster]# vim 7004/redis.conf [root@server1 rediscluster]# vim 7005/redis.conf [root@server1 rediscluster]# vim 7005/redis.conf [root@server1 rediscluster]# vim 7006/redis.conf 启动各节点 [root@server1 rediscluster]# redis-server 7002/redis.conf [root@server1 rediscluster]# redis-server 7003/redis.conf [root@server1 rediscluster]# redis-server 7004/redis.conf [root@server1 rediscluster]# redis-server 7005/redis.conf [root@server1 rediscluster]# redis-server 7006/redis.conf [root@server1 rediscluster]# ps aux | grep redis ##看是否启动 root 5558 0.3 1.1 159456 12024 ? Ssl 11:57 0:01 redis-server *:7001 [cluster] root 5640 0.3 0.7 153824 7696 ? Ssl 12:03 0:00 redis-server *:7002 [cluster] root 5645 0.3 0.7 153824 7696 ? Ssl 12:03 0:00 redis-server *:7003 [cluster] root 5650 0.3 0.7 153824 7696 ? Ssl 12:03 0:00 redis-server *:7004 [cluster] root 5655 0.4 0.7 153824 7700 ? Ssl 12:03 0:00 redis-server *:7005 [cluster] root 5660 0.4 0.7 153824 7696 ? Ssl 12:03 0:00 redis-server *:7006 [cluster] root 5665 0.0 0.0 112664 972 pts/0 S+ 12:03 0:00 grep --color=auto redis
将他们节点加入集群中,分为三个主三副。
将这个文件复制到bin下
[root@server1 ~]# cd redis-5.0.3/src/ [root@server1 src]# cp redis-trib.rb /usr/local/bin/ [root@server1 src]# yum install -y ruby ##下载ruby [root@server1 src]# cd ##分为三主三副 [root@server1 ~]# redis-cli --cluster create --cluster-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 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 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 S: 08bcc01067c10378eda7d1caaf8dc18a4b099d8e 127.0.0.1:7006 slots: (0 slots) slave replicates 87e13fc8f2b68b512746763c13372a3b2112334e M: 87e13fc8f2b68b512746763c13372a3b2112334e 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s)
查看他们,其中2-6是主从。2-6是主从
[root@server1 ~]# redis-cli --cluster info 127.0.0.1 ##查看 [ERR] Invalid arguments: you need to pass either a valid address (ie. 120.0.0.1:7000) or space separated IP and port (ie. 120.0.0.1 7000) [root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001 127.0.0.1:7001 (5c8b01bd...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7002 (87e13fc8...) -> 0 keys | 5462 slots | 1 slaves. 127.0.0.1:7003 (7e646d7e...) -> 0 keys | 5461 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average. root@server1 ~]# redis-cli -c -p 7001 ##在节点1创建自动分给2 127.0.0.1:7001> set name wsp -> Redirected to slot [5798] located at 127.0.0.1:7002 OK 127.0.0.1:7002> get name "wsp" 在其他节点可以看到 [root@server1 ~]# redis-cli -c -p 7006 127.0.0.1:7006> get name -> Redirected to slot [5798] located at 127.0.0.1:7002 "wsp"
现在我们将其中一个节点挂掉。
127.0.0.1:7002> shutdown 将2挂调, not connected> [root@server1 ~]# redis-cli -c -p 7004 副节点有数据 127.0.0.1:7004> get name -> Redirected to slot [5798] located at 127.0.0.1:7006 "wsp" [root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001 副节点数据 Could not connect to Redis at 127.0.0.1:7002: Connection refused 127.0.0.1:7001 (5c8b01bd...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7006 (08bcc010...) -> 1 keys | 5462 slots | 0 slaves. 127.0.0.1:7003 (7e646d7e...) -> 0 keys | 5461 slots | 1 slaves. [OK] 1 keys in 3 masters. 0.00 keys per slot on average. 进入7006这个节点 [root@server1 ~]# redis-cli -c -p 7006 127.0.0.1:7006> sutdown 将副节点也挂掉,主副都挂 [root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001 连接不上 Could not connect to Redis at 127.0.0.1:7006: Connection refused Could not connect to Redis at 127.0.0.1:7002: Connection refused 127.0.0.1:7001 (5c8b01bd...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7003 (7e646d7e...) -> 0 keys | 5461 slots | 1 slaves. [root@server1 ~]# redis-cli -c -p 7001 数据查找不到 127.0.0.1:7001> get name (error) CLUSTERDOWN The cluster is down 127.0.0.1:7001> 在配置文件这里有数据 [root@server1 7002]# cat appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $4 name $3 wsp [root@server1 7002]# redis-server redis.conf 进入配置文件打开2,6,。文件恢复 [root@server1 7002]# redis-server ../7006/ appendonly.aof dump.rdb nodes.conf redis.conf redis.log [root@server1 7002]# redis-server ../7006/redis.conf [root@server1 7002]# cd [root@server1 ~]# redis-cli -c -p 7001 127.0.0.1:7001> get name -> Redirected to slot [5798] located at 127.0.0.1:7006 "wsp" 127.0.0.1:7006>
添加一个新节点;
不加从节点不给hash槽
分配hash槽,不均等的hash槽
均分hash槽
##创建两个文件并且开启它,配置文件更改为各自的节点 [root@server1 rediscluster]# mkdir 7007 7008 [root@server1 rediscluster]# cp 7001/redis.conf 7007/ [root@server1 rediscluster]# cp 7001/redis.conf 7008/ [root@server1 rediscluster]# vim 7007/redis.conf [root@server1 rediscluster]# vim 7008/redis.conf [root@server1 rediscluster]# redis-server 7007/redis.conf [root@server1 rediscluster]# redis-server 7008/redis.conf #增加一个主节点 [root@server1 rediscluster]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 怎加一个slave节点 root@server1 7008]# redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id 32e97aeab317bd6fb31a013bac060211ce28c5b2 检查节点 [root@server1 7008]# redis-cli --cluster check 127.0.0.1:7001 手动给300个harsh槽 [root@server1 7008]# redis-cli --cluster reshard 127.0.0.1:7007
[root@server1 7008]# redis-cli --cluster check 127.0.0.1:7001 127.0.0.1:7001 (5c8b01bd...) -> 0 keys | 5362 slots | 1 slaves. 127.0.0.1:7006 (08bcc010...) -> 1 keys | 5361 slots | 1 slaves. 127.0.0.1:7007 (32e97aea...) -> 0 keys | 299 slots | 1 slaves. 127.0.0.1:7003 (7e646d7e...) -> 0 keys | 5362 slots | 1 slaves. 平均分配harsh槽 [root@server1 7008]# redis-cli --cluster rebalance 127.0.0.1:7001 --cluster-use-empty-masters --cluster-threshold 1
redis,与mysql连接。需要服务器。我们因此在打开一个虚拟机server4
配置nginx。用它来发布页面 [root@server1 nginx-1.17.0]# vim auto/cc/gcc [root@server1 nginx-1.17.0]# ./configure --prefix=/usr/local/nginx [root@server1 nginx-1.17.0]# make && make install [root@server1 nginx-1.17.0]# vim /usr/local/nginx/conf/nginx.conf 65 location ~ \.php$ { 66 root html; 67 fastcgi_pass 127.0.0.1:9000; 68 fastcgi_index index.php; 69 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 70 include fastcgi.conf; 71 } 43 location / { 44 root html; 45 index index.php index.html index.htm; 46 } 进入配置文件并且打开nginx [root@server1 nginx-1.17.0]# cd /usr/local/nginx/conf/ [root@server1 conf]# ../sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@server1 conf]# ../sbin/nginx [root@server1 conf]# curl localhost [root@server1 ~]# ls anaconda-ks.cfg MHA-7 nginx-1.17.0.tar.gz redis-5.0.3.tar.gz haproxy-2.0.2 nginx-1.16.0 openresty-1.15.8.1 rhel7 haproxy-2.0.2.tar.gz nginx-1.16.0.tar.gz openresty-1.15.8.1.tar.gz mha4mysql-node-0.58-0.el7.centos.noarch.rpm nginx-1.17.0 redis-5.0.3 php
将server1的redis停止
[root@server1 ~]# cd rhel7/ [root@server1 rhel7]# rpm -qa | grep openssl [root@server1 rhel7]# yum remove openssl-devel-1.0.1e-60.el7.x86_64 -y [root@server1 rhel7]# yum install -y * [root@server1 ~]# systemctl start php-fpm.service [root@server1 ~]# /etc/init.d/redis_6379 stop [root@server1 ~]# cd /usr/local/nginx/html/ [root@server1 html]# ls 50x.html index.html [root@server1 html]# mv index.html index.html.bak [root@server1 html]# cd [root@server1 ~]# mv test.php /usr/local/nginx/html/index.html [root@server1 html]# mv index.html index.php [root@server1 html]# pwd /usr/local/nginx/html 编辑php页面 [root@server1 html]# vim index.php 2 $redis = new Redis(); 3 $redis->connect('172.25.38.2',6379) or die ("could net connect redis server"); 4 # $query = "select * from test limit 9"; 5 $query = "select * from test"; 6 for ($key = 1; $key < 10; $key++) 7 { 8 if (!$redis->get($key)) 9 { 10 $connect = mysql_connect('172.25.38.3','redis','redhat'); 11 mysql_select_db(test); 12 $result = mysql_query($query); 13 //如果没有找到$key,就将该查询sql的结果缓存到redis 14 while ($row = mysql_fetch_assoc($result))
server2中:我们用redis来做缓存,看是否正常
[root@server2 utils]# vim /etc/redis/6379.conf [root@server2 utils]# /etc/init.d/redis_6379 restart Stopping ... Redis stopped Starting Redis server... [root@server2 utils]# redis-c redis-check-aof redis-check-rdb redis-cli [root@server2 utils]# redis-cli 127.0.0.1:6379> get name "wsp" 127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> get name (nil) 127.0.0.1:6379>
server3中我们来做数据库
移除mysql,我们用mariadb,来进行储存数据。
[root@server3 ~]# cd /var/lib/mysql [root@server3 mysql]# rm -fr * [root@server3 ~]# rpm -qa | grep mysql [root@server3 ~]# yum remove mysql-community-* [root@server3 lib]# yum install mariadb-server -y [root@server3 lib]# systemctl start mariadb [root@server3 lib]# mysql_secure_installation [root@server3 lib]# mysql -uroot -predhat MariaDB [(none)]> show databases; MariaDB [(none)]> create database test; MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'redhat'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> Ctrl-C -- exit! [root@server3 lib]# cd [root@server3 ~]# ls anaconda-ks.cfg redis-5.0.3 mha4mysql-node-0.58-0.el7.centos.noarch.rpm test.sql mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz [root@server3 ~]# vim test.sql [root@server3 ~]# mysql -predhat < test.sql
在server4中来配置调度器,调度器会连接到server3的数据库,server2进行缓存的redis,server1的发布页面。当数据库的数据改变时,让我们的缓存也可以在及时的更改做自己的数据。
[root@server1 ~]# systemctl start gearmand.service 触发器的一个模块 [root@server3 ~]# systemctl start mariadb.service [root@server3 ~]# unzip lib_mysqludf_json-master.zip [root@server3 ~]# yum install unzip -y [root@server3 ~]# cd lib_mysqludf_json-master/ [root@server3 lib_mysqludf_json-master]# yum install gcc -y [root@server3 lib_mysqludf_json-master]# yum install -y mariadb-devel [root@server3 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c [root@server3 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/ MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so'; [root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz [root@server3 ~]# yum install libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-1.1.12-18.el7.x86_64.rpm libgearman-devel-1.1.12-18.el7.x86_64.rpm -y [root@server3 gearman-mysql-udf-0.6]# ./configure --libdir=/usr/lib64/mysql/plugin --with-mysql [root@server3 gearman-mysql-udf-0.6]# make && make install 数据库的相关设定 [root@server3 ~]# mysql -uroot -predhat MariaDB [(none)]> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so'; MariaDB [(none)]> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so'; MariaDB [(none)]> select * from mysql.func; +--------------------+-----+-------------------------+----------+ | name | ret | dl | type | +--------------------+-----+-------------------------+----------+ | json_object | 0 | lib_mysqludf_json.so | function | | gman_do_background | 0 | libgearman_mysql_udf.so | function | | gman_servers_set | 0 | libgearman_mysql_udf.so | function | +--------------------+-----+-------------------------+----------+ [root@server3 ~]# mysql -p < test.sql Enter password: [root@server3 ~]# work: [root@server1 ~]# cp worker.php /usr/local/ [root@server1 ~]# cd /usr/local/ [root@server1 local]# vim worker.php $redis->connect('172.25.38.2', 6379); [root@server1 local]# nohup php /usr/local/worker.php &> /dev/null & [2] 2468 [root@server1 local]# MariaDB [(none)]> select gman_servers_set('172.25.38.1:4730'); +--------------------------------------+ | gman_servers_set('172.25.38.1:4730') | +--------------------------------------+ | 172.25.38.1:4730 | +--------------------------------------+ MariaDB [(none)]> 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 MariaDB [test]> update test set name='linux' where id=2; server2的redis缓存也在实时变换 [root@server2 ~]# redis-cli 127.0.0.1:6379> get 1 "test1" 127.0.0.1:6379> get 1 "test1" 127.0.0.1:6379> get 2 "linux"
- 点赞
- 收藏
- 分享
- 文章举报
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 实现多台服务器上Redis的数据主从复制的功能
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制(3)(转载)
- 在多台服务器上简单实现Redis的数据主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- redis数据集合特征。主从复制Replication
- redis实现主从复制-单机测试
- 使用Sentinel机制实现Redis高可用主从复制
- redis主从复制和集群实现原理
- 企业实战-KeepAlived+Redis+Haproxy实现主从热备、负载均衡、秒级切换