Redis 集群(解决单进程和多核cpu不匹配时redis集群配置)、Germand实现 mysql 的缓存服务器(lnmp架构)

主机环境:rhel7.3 selinux and firewalld disabled

主机名 ip 服务
server1 172.25.254.1 nginx
server2 172.25.254.2 redis
server3 172.25.254.3 mariadb

一、基础概念

redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;
那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;
那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
综上所述,每个Redis集群理论上最多可以有16384个节点。

二、如何解决单进程和多核cpu不匹配时redis集群搭建?

http://www.redis.cn/topics/cluster-tutorial.html ##配置复制官网的

搭建步骤:

1.将之前的redis服务关闭
[root@server1 redis]# /etc/init.d/redis_6379 stop

2.创建redis目录

[root@server1 redis]# mkdir /usr/local/rediscluster
[root@server1 redis]# cd /usr/local/rediscluster
[root@server1 rediscluster]# ls
[root@server1 rediscluster]# mkdir 700{1..6}
[root@server1 rediscluster]# ls
7001  7002  7003  7004  7005  7006

3.进入各个目录下建立配置文件

[root@server1 rediscluster]# cd 7001/
[root@server1 7001]# vim redis.conf
  1 port 7001
  2 cluster-enabled yes
  3 cluster-config-file nodes.conf
  4 cluster-node-timeout 5000
  5 appendonly yes
  6 pidfile "/usr/local/rediscluster/7001/redis.pid"
  7 logfile "/usr/local/rediscluster/7001/redis.log"
  8 daemonize yes
  9 dir "/usr/local/rediscluster/7001"

4.redis-server启动,查看

[root@server1 7001]# redis-server redis.conf 
[root@server1 7001]# ps ax

在这里插入图片描述

5.7002~7006操作相同(配置文件里的要和目录名对应)

[root@server1 7001]# cp redis.conf ../7002
[root@server1 7001]# cp redis.conf ../7003
[root@server1 7001]# cp redis.conf ../7004
[root@server1 7001]# cp redis.conf ../7005
[root@server1 7001]# cp redis.conf ../7006

[root@server1 7001]# cd …
[root@server1 rediscluster]# cd 7002/
[root@server1 7002]# vim redis.conf
[root@server1 7002]# redis-server redis.conf
[root@server1 7002]# ps ax

在这里插入图片描述

扫描二维码关注公众号,回复: 6109037 查看本文章

6.创建集群,查看集群状态信息

[root@server1 7006]# 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

询问时输入yes
–cluster-replicas 1表示为每一个master创建1个slave
在这里插入图片描述
查看集群信息

[root@server1 7006]# redis-cli --cluster info 127.0.0.1:7001	##输入其他端口也可以,但是必须输一个端口

在这里插入图片描述

测试:

进入1个master,写入信息

[root@server1 7006]# redis-cli -c -p 7001
127.0.0.1:7001> set name dd
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get name
“dd”
127.0.0.1:7002> exit

#数据保存在5798个哈希槽中,在7002上

在任意节点都可以获取到信息,但是都会跳转到7002
在这里插入图片描述

测试1:尝试将7002关闭,会发现拿到key的从成为master

[root@server1 7006]# redis-cli -c -p 7006
127.0.0.1:7006> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
“dd”
127.0.0.1:7002> SHUTDOWN
not connected>

在这里插入图片描述

在这里插入图片描述

如果此时将7005再关闭,会破坏数据库结构,因为此时的7005下没有slave
[root@server1 7006]# redis-cli -c -p 7001
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7005
“dd”
127.0.0.1:7005> SHUTDOWN
(0.81s)
not connected>

当再次进行数据查询时,会出现错误
在这里插入图片描述
在这里插入图片描述

恢复方法:

因为数据最开始是在7002里存储的,所以进入到7002里查看,另外ssh连上一台server1进入7005里查看
在这里插入图片描述

在这里插入图片描述

在7002和7005下分别重新加载配置文件:注意5和2一定是匹配的

[root@server1 7002]# redis-server redis.conf
[root@server1 7005]# redis-server redis.conf

此时再次进行信息的查看,并进行状态查看
在这里插入图片描述

Redis 新节点的添加

1.查看状态(此时是3主3从)
[root@server1 7005]# redis-cli --cluster info 127.0.0.1:7001
在这里插入图片描述
2.建立目录,编辑信息,开启服务

[root@server1 rediscluster]# mkdir 7007
[root@server1 rediscluster]# mkdir 7008
[root@server1 rediscluster]# ls
7001  7002  7003  7004  7005  7006  7007  7008
[root@server1 rediscluster]# cd 7001/
[root@server1 7001]# cp redis.conf ../7007/
[root@server1 7001]# cp redis.conf ../7008/

进入到7007和7008里进行修改,开启服务,ps ax查看
在这里插入图片描述

3.再次查看集群状态,并且添加节点
[root@server1 7008]# redis-cli --cluster info 127.0.0.1:7001 #此时没有改变
在这里插入图片描述

将7007添加到集群里,选择添加的节点位置为7001

[root@server1 7008]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
[root@server1 7008]# redis-cli -c -p 7007
127.0.0.1:7007> cluster nodes		#查看状态(可以查看到7007的id号,后续要用)

在这里插入图片描述
#尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点, 所以在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中,所以要添加一个slave

4.ssh重新连上server1,继续添加节点

[root@server1 7005]# redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id ccaaf1154a1bb4806579ecb6888a0eda8346825d

在这里插入图片描述
[root@server1 7005]# redis-cli -c -p 7001
127.0.0.1:7001> cluster nodes #此时7008也添加了,但是主7007并没有分配哈希槽
在这里插入图片描述

5.此时查看集群状态,可以看见7007没有哈希槽
在这里插入图片描述

6.给7007分配哈希槽(此处的id号依然是7007的)

[root@server1 7008]# redis-cli --cluster reshard 127.0.0.1:7007
300,ccaaf1154a1bb4806579ecb6888a0eda8346825d,all,yes

在这里插入图片描述

8.对master进行均分数据槽(master的数据槽一定要均分,不均分可能会导致数据的不同步)

[root@server1 7008]# redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001

在这里插入图片描述
在这里插入图片描述

三、Redis可以作mysql的前端缓存(存储)

数据访问流程:client -> app -> redis -> mysql -> redis -> client
客户端用app访问,先在redis里读数据,因为快,redis没有才去mysql读,读完保存在redis里,然后返回客户端,下次再读就快

搭建步骤:

1.将server1的redis关闭

[root@server1 ~]# killall redis-server
-bash: killall: command not found
[root@server1 ~]# yum whatprovides /usr/bin/killall
[root@server1 ~]# yum install psmisc-22.20-11.el7.x86_64 -y
[root@server1 ~]# killall redis-server(ps ax看到服务关闭)
[root@server1 ~]# netstat -antlp | grep 6379	#过滤不到

2.给server1安装nginx、php

nginx的搭建
在这里插入图片描述
在这里插入图片描述

[root@server1 conf]# ps aux #查看nginx开启了没
在这里插入图片描述

php的搭建:
在这里插入图片描述

[root@server1 rhel7]# yum install * -y
[root@server1 rhel7]# systemctl start php-fpm
[root@server1 rhel7]# systemctl status php-fpm

在这里插入图片描述

3.给server2上搭建redis(让他作为主,不作为任何的从)

[root@server2 redis]# /etc/init.d/redis_6379 status
Redis is running (11545)

[root@server2 ~]# vim /etc/redis/6379.conf	#查看70行正确否,slave是否存在(不存在正常),看最后一行是否有内容(有的话删除)
[root@server2 ~]# /etc/init.d/redis_6379 restart
[root@server2 ~]# redis-cli 		#测试是否是主

在这里插入图片描述

4.在server3上搭建mariadb(因为实验,方便效果的查看用这个)

(##卸载原来的mysql(如果有安装过mysql,,没有忽略此操作)
[root@server3 ~]# rpm -e rpm -qa | grep mysql --nodeps
#清除原来数据目录里的内容
[root@server3 ~]# cd /var/lib/mysql
[root@server3 mysql]# rm -fr *)

[root@server3 ~]# yum install -y mariadb-server
[root@server3 ~]# systemctl start mariadb
[root@server3 ~]# systemctl status mariadb
[root@server3 ~]# mysql_secure_installation	#安全初始化
[root@server3 ~]# mysql -uroot -predhat
MariaDB [(none)]> create database test;		#创建表
MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'redhat';	#授权
MariaDB [(none)]> flush privileges;	#刷新

5.得到一个php的动态脚本,配置测试页面
在这里插入图片描述

[root@server1 redis]# cp test.php /usr/local/nginx/html/
[root@server1 redis]# cd /usr/local/nginx/html/
[root@server1 html]# mv test.php index.php
[root@server1 html]# vim index.php#(310行修改redis和mysql)
3         $redis->connect('172.25.254.2',6379) or die ("could net connect redi    s server");
10                         $connect = mysql_connect('172.25.254.3','redis','red    hat');

在这里插入图片描述

6.获得一个写好的数据库信息,将他导入server3的数据库里

[root@server1 redis]# pwd
/root/redis
[root@server1 redis]# scp test.sql server3:/root/

[root@server3 ~]# ls
redis-5.0.3  test.sql
[root@server3 ~]# mysql -predhat <test.sql

测试:

浏览器输入172.25.254.1,第一次是mysql,刷新后redis
在这里插入图片描述

在这里插入图片描述

此时环境下的缺陷

这个时候有个问题,如果此时mysql数据发生变更,redis会同步吗?

在server3上更新数据库的信息,但是redis不能同步到

server3:
[root@server3 ~]# mysql -uroot -predhat
MariaDB [(none)]> use test;
MariaDB [test]> update test set name=‘westos’ where id=1; #更新信息
在这里插入图片描述

server2:
[root@server2 ~]# redis-cli #信息没同步
127.0.0.1:6379> get 1
“test1”

在浏览器上输入172.25.254.1查看,并没有得到同步
在这里插入图片描述

在server2上redis更新数据,在浏览器上可以看到
[root@server2 ~]# redis-cli
127.0.0.1:6379> set 1 westos
OK
127.0.0.1:6379> get 1
“westos”
127.0.0.1:6379> exit

在浏览器上输入172.25.254.1查看,1的信息得到同步
在这里插入图片描述

这样很麻烦,每次都要手动,当大量信息被更改时,就会造成工作量加大

配置 Germand 实现 mysql 和 redis 的数据同步

1.获得gearmand资源,安装,打开
在这里插入图片描述
gearmand-1.1.12-18.el7.x86_64.rpm此包已经安装,所以此处打开就可以

[root@server1 rhel7]# systemctl start gearmand
[root@server1 rhel7]# systemctl status gearmand

2.在server3的mariadb端进行资源获取,解压
在这里插入图片描述

[root@server3 ~]# unzip lib_mysqludf_json-master.zip 
-bash: unzip: command not found
[root@server3 ~]# yum install unzip -y
[root@server3 ~]# unzip lib_mysqludf_json-master.zip

在这里插入图片描述

3.安装mariadb-devel服务

[root@server3 ~]# yum install mariadb-devel -y

4.进入解压的目录下,用gcc进行编译模块

[root@server3 lib_mysqludf_json-master]# pwd
/root/lib_mysqludf_json-master
[root@server3 lib_mysqludf_json-master]# ls
lib_mysqludf_json.c     lib_mysqludf_json.so   README.md
lib_mysqludf_json.html  lib_mysqludf_json.sql
[root@server3 lib_mysqludf_json-master]# yum install gcc -y

[root@server3 lib_mysqludf_json-master]#gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

5.将模块放到mysql插件目录

[root@server3 ~]# cp lib_mysqludf_json-master/lib_mysqludf_json.so /usr/lib64/mysql/plugin/

6.在server3上进入数据库,查看插件

[root@server3 ~]# mysql -uroot -predhat
MariaDB [(none)]> show global variables like 'plugin_dir';

在这里插入图片描述

7.注册udf函数

MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

8.获取资源,安装插件管理gearman的分布式队列
在这里插入图片描述

[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz

获得资源包
在这里插入图片描述
在这里插入图片描述

先安装libgearman

[root@server3 rhel7]# yum install -y libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-*

编译安装gearman插件

[root@server3 gearman-mysql-udf-0.6]# pwd
/root/gearman-mysql-udf-0.6
[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

9.注册udf函数

[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';

10.查看函数,指定german服务信息

MariaDB [(none)]> select * from mysql.func;

在这里插入图片描述

MariaDB [(none)]> SELECT gman_servers_set('172.25.254.1:4730');

在这里插入图片描述

11.编写mysql触发器

[root@server3 ~]# vim test.sql

在这里插入图片描述

12.导入数据库,查看触发器

[root@server3 ~]# mysql -predhat <test.sql
[root@server3 ~]# mysql -uroot -predhat
MariaDB [(none)]> SHOW TRIGGERS FROM test;

在这里插入图片描述

13.编写german的worker端

[root@server1 redis]# pwd
/root/redis
[root@server1 redis]# cp worker.php /usr/local/
[root@server1 redis]# cd /usr/local/
[root@server1 local]# vim worker.php
7 $redis->connect('172.25.254.2', 6379);

在这里插入图片描述

14.后台运行worker

[root@server1 local]# nohup php /usr/local/worker.php &> /dev/null &

测试:

在server3修改数据库内容

MariaDB [(none)]> use test;
MariaDB [test]> update test set name='Linux' where id=2;

在这里插入图片描述

在redis上查看
在这里插入图片描述

在浏览器输入172.25.254.1查看,数据得到同步
在这里插入图片描述

参考:http://www.redis.cn/topics/cluster-tutorial.html

猜你喜欢

转载自blog.csdn.net/weixin_44209804/article/details/89605688
今日推荐