您的位置:首页 > 数据库 > Redis

企业9,redis的运用。实现主从复制,储存数据的特点。

2020-01-31 19:07 766 查看

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"

  • 点赞
  • 收藏
  • 分享
  • 文章举报
weixin_45466471 发布了47 篇原创文章 · 获赞 0 · 访问量 916 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: