Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步
Linux企业化运维
实验所用系统为Redhat-rhel7.6。
目录
- Linux企业化运维
- Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步
- 一、简介
- 1、软件下载及安装
- 2、redis支持的数据类型
- 3、redis常用指令
- 二、redis配置及主从复制
- 三、redis常用指令使用指南
- 四、redis主从自动切换(基于sentinel)
- 五、集群
- 1、集群构建
- 1)手动构建
- 2)脚本构建
- 2、自动切换
- 3、添加节点和分片
- 六、redis+mysql 即 Redis作mysql的缓存服务器
- 七、配置 gearman 实现数据同步
Linux企业化运维–(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步
一、简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
1、软件下载及安装
https://redis.io/download
tar zxf redis-5.0.8.tar.gz
make && make install
utils/install_server.sh
2、redis支持的数据类型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
3、redis常用指令
config get * ##查看配置
select 1 ##选择数据库
flushdb ##清空当前数据库
flushall ##清空所有数据库
move key 1 ##移动key
del key ##删除
rename oldkey newkey ##改名
expire key 10 ##设置过期时间
persist key ##设置持久化
keys user* ##查询
exists key ##判断是否存在
二、redis配置及主从复制
Redis 使用异步复制,因此无法确保 slave 是否实际接收到给定的写命令。
过程:
当主机连接新的从机时,从机会删除自己的所有数据flushall,发生此种情况还有可能是连接中从机超时,重新连接也会删除数据。然后从机开始从主机复制数据。如果主机持续写入,从机则按照主机的记录复制执行。
首先在server1
主机,安装并编译redis。
###server1
cd
lftp 172.25.254.250
> cd pub/docs/redis
> get redis-6.2.4.tar.gztar zxf redis-6.2.4.tar.gz
cd redis-6.2.4/
make
make install
运行自带的安装程序,安装失败,修改文件,重新安装。
cd utils/
ls
./install_server.sh ##运行自带的安装程序,失败
vim install_server.sh ##将下文部分注释
///
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
///
./install_server.sh ##成功
此时切换到配置目录下,可以看到自动生成了配置文件,查看端口,端口开启。修改该配置文件,重启服务。
cd /etc/redis
ls ##6379.conf
netstat -antlp ##6379
vim 6379.conf
///94 protected-mode no ##设定关闭保护模式75 #bind 127.0.0.1 -::1 ##链接redis 时只能通过本地localhost (127.0.0.1)来链接,而不能用网络ip(192.168..)链接,因为处于保护模式,只能本地链接,所以将该设定注释
///
/etc/init.d/redis_6379 stop
/etc/init.d/redis_6379 start
netstat -antlp | grep :6379
将此安装包复制给server2主机。
cd
scp redis-6.2.4.tar.gz server2:
在server2
主机,使用另一种方式来配置redis
。
首先,同样先解压,然后使用systemd
支持进行构建,但此时缺少依赖gcc
,安装依赖,重新make
,仍然失败,提醒缺少依赖jemalloc
。此时选择删除redis目录,即删除c环境下生成的缓存,重新解压,make,提醒缺少systemd
,安装后继续make,成功,make install
。
###server2
ls./install_server.sh
tar zxf redis-6.2.4.tar.gz
cd redis-6.2.4/
make USE_SYSTEMD=yes ##使用systemd支持进行构建,失败,需要c编译器
yum install -y gcc
make USE_SYSTEMD=yes ##还是需要下载依赖jemalloc
cd
rm -rf redis-6.2.4 ##删除c环境下生成的缓存
tar zxf redis-6.2.4.tar.gz ##重新解压
cd redis-6.2.4/
make USE_SYSTEMD=yes ##重新make
yum install -y systemd-devel ##安装systemd
make USE_SYSTEMD=yes ##重新make
make install
此时,切换到utils
目录下,运行自带的安装程序,将服务文件复制到目录自动存放启动文件的配置位置,重载配置文件,重启服务。
cd utils/
./install_server.sh
cp systemd-redis_server.service /usr/lib/systemd/system/redis.service ##目录自动存放启动文件的配置位置
systemctl daemon-reload ##重载配置文件
systemctl start redis.service
修改redis.service
文件,建立配置文件和数据文件存放的目录,编辑配置文件,同是设定server2主机为server1主机的slave端
,即主从复制
设定,重载配置文件,重启服务。
cd /usr/lib/systemd/system/
vim redis.service ##注意仔细修改该文件
///
[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
#Before=your_application.service another_example_application.service
#AssertPathExists=/var/lib/redis
Wants=network-online.target
After=network-online.target[Service]
#ExecStart=/usr/local/bin/redis-server --supervised systemd --daemonize no
## Alternatively, have redis-server load a configuration file:
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
#LimitNOFILE=10032
#NoNewPrivileges=yes
#OOMScoreAdjust=-900
#PrivateTmp=yes
Type=forking
#TimeoutStartSec=infinity
#TimeoutStopSec=infinity
#UMask=0077
#User=redis
#Group=redis
#WorkingDirectory=/var/lib/redis
///
mkdir /etc/redis
mkdir /var/lib/redis
cd
cd redis-6.2.4/
cp redis.conf /etc/redis/
vim /etc/redis/redis.conf
///302 logfile "/var/log/redis.log" ##日志存放目录94 protected-mode no ##关闭保护模式75 #bind 127.0.0.1 -::1 ##注释,允许网络ip链接redis454 dir /var/lib/redis ##数据文件放置的目录257 daemonize yes ##以守护进程的方式运行
2052 slaveof 172.25.24.1 6379 ##主从复制
///
systemctl daemon-reload
systemctl restart redis
此时在server1
主机上插入数据,可以在server2
主机上看到,即主从复制设定成功。
###server1
redis-cli
> set name westos
> get name###server2
redis-cli
> get name
三、redis常用指令使用指南
redis常用指令:
config get * //查看配置
select 1 //选择数据库
flushdb //清空当前数据库
flushall //清空所有数据库
move key 1 //移动key
del key //删除
rename oldkey newkey //改名
expire key 10 //设置过期时间
persist key //设置持久化
keys user* //查询
exists key //判断是否存在
实验:
###server2
[root@server2 system]# redis-cli
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> select 1 ##选择数据库
OK
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> set user zxc
(error) READONLY You can't write against a read only replica. ##slave端只读
###server1
[root@server1 redis]# redis-cli
127.0.0.1:6379> select 1 ##选择数据库
OK
127.0.0.1:6379[1]> set user zxc
OK
127.0.0.1:6379[1]> get user
"zxc"
127.0.0.1:6379[1]> FLUSHDB ##清空当前数据库
OK
127.0.0.1:6379[1]> get user ##为空
(nil)
127.0.0.1:6379[1]> FLUSHALL ##清空所有数据库
OK
127.0.0.1:6379[1]> SELECT 0
OK
127.0.0.1:6379> get name ##为空
(nil)
127.0.0.1:6379> set name westos
OK
127.0.0.1:6379> EXPIRE name 5 ##设置过期时间
(integer) 1
127.0.0.1:6379> get name
"westos"
...wait
127.0.0.1:6379> get name ##5s后过期
(nil)
127.0.0.1:6379> set user1 qwe
OK
127.0.0.1:6379> set user2 asd
OK
127.0.0.1:6379> set user3 zxc
OK
127.0.0.1:6379> keys user* ##查询
1) "user3"
2) "user2"
3) "user1"
127.0.0.1:6379> EXISTS user1 ##判断是否存在
(integer) 1 ##1为存在
127.0.0.1:6379> EXISTS user
(integer) 0 ##0为不存在
四、redis主从自动切换(基于sentinel)
Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel是redis高可用的解决方案,sentinel系统可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。
sentinel可以让redis实现主从复制,当一个集群中的master失效之后,sentinel可以选举出一个新的master用于自动接替master的工作,集群中的其他redis服务器自动指向新的master同步数据。一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换。
原理:
一主两从的情况下,当master与两个slave或因网络关系断掉的情况下,客户端并不知道master失联,会持续写入数据,但此时slave端已经不能复制数据。
slave会选举一个变成新的master,形成新的主从关系。
如果此时master恢复,重新加入主从关系,会转为一个新的slave,但因为超时连接,会清除自己的所有数据,那么客户端写入的数据就会丢失。
如果需要解决此问题,则需要两个slave同时认定不能连接master,或者,超过设定时间不能连接,则此时master端会拒绝客户端继续写入,那么重新接入变成slave时就不会造成数据丢失。
实验开始~
在server1主机将redis复制至server3。
scp redis-6.2.4.tar.gz server3:
在server3主机进行配置。解压,安装gcc,make,删除c环境下生成的缓存,重新解压,make install,修改安装文件,运行自带的安装程序。与前面基本一致,不赘述。
###server3
ls
tar zxf redis-6.2.4.tar.gz
cd redis-6.2.4/
make
yum install -y gcc
make
cd
rm -rf redis-6.2.4 ##删除c环境下生成的缓存
tar zxf redis-6.2.4.tar.gz ##重新解压
cd redis-6.2.4/
make
make install
cd utils/
vim install_server.sh
///
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
///
./install_server.sh
修改配置文件,重启服务,进入redis
,info
可以看到role:slave
master_host:172.25.24.1
,即,当前主机server3为server1的从机
。
vim /etc/redis/6379.conf
///
2052 slaveof 172.25.24.1 637994 protected-mode no75 #bind 127.0.0.1 -::1
///
/etc/init.d/redis_6379 restart
redis-cli
> info ##role:slave master_host:172.25.24.1
在server1
主机中,配置sentinel
,并复制到server2和server3中。
配置哨兵模式,即高可用
###server1
cd redis-6.2.4/
cp sentinel.conf /etc/redis/
cd /etc/redis/
vim sentinel.conf
///
sentinel monitor mymaster 172.25.24.1 6379 2 ##master为server1,2表示需要两票通过,这台主机就被认定宕掉
sentinel down-after-milliseconds mymaster 10000 ##连接超时为10s
///
scp sentinel.conf server2:/etc/redis/
scp sentinel.conf server3:/etc/redis/
redis-sentinel /etc/redis/sentinel.conf ##可以看到两个slave端
此时在server2和server3,可以看到一个master和两个slave端,并且相互连接。
###server2 & server3
redis-sentinel /etc/redis/sentinel.conf
重新连接一个server1,info
查看当前为master,有两个slave端,然后关闭当前主机。
###server1(重新ssh一个)
redis-cli
> info ##role:master connected_slaves:2
> shutdown
在原来的server1中,可以看到本机down,并且新的slave为1和3,即新的master为2,而且此时的slave1是挂掉的。
在新的server1中,连接到server2,info查看到当前为master,有一个slave端,因为server1当前为挂掉状态。
###server1(新)
redis-cli -h 172.25.24.2 ##连接到2
> info ##可以看到role:master connected_slaves:1,一个slave端
重新开启server1,info查看,当前为slave状态,并且master端为server2主机。即就是,当master宕机时,sentinel自动切换master主机成功。
/etc/init.d/redis_6379 start
redis-cli
> info ##role:slave master_host:172.25.24.2,当前为slave,master为2
五、集群
1、集群构建
1)手动构建
在server1主机(master),重启redis,开启AOF模式,建立medis目录,并建立集群7001~7006目录,切入7001,修改配置文件,启动服务。将配置文件复制到其他几个实例目录中,根据情况做修改。
###server1(master)
/etc/init.d/redis_6379 restart
vim /etc/redis/6379.conf
///
appendonly yes ##开启AOF模式
///
cd /usr/local
mkdir redis
cd redis/
mkdir 700{1..6}
cd 7001
vim redis.conf
///
port 7001
cluster-enabled yes ##开启集群
cluster-config-file nodes.conf ##集群配置文件
cluster-node-timeout 5000 ##节点超时
appendonly yes ##开启AOF模式
daemonize yes ##用守护线程的方式启动
///
redis-server redis.conf ##启动服务
ps ax ##redis-server *:7001 [cluster]
cp redis.conf ../7002/ ##复制配置文件到7002
cp redis.conf ../7003/
cp redis.conf ../7004/
cp redis.conf ../7005/
cp redis.conf ../7006/cd ..
cd 7002 ##同样的配置
vim redis.conf
///
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
///
redis-server redis.conf 7003~7006相同
ps ax
重启redis
。
修改配置文件,设定开启AOF
模式。
建立集群目录,修改实例7001的配置文件。
7001
配置文件内容。
ps
查看是否设定成功。
复制配置文件到其他实例。
修改实例7002配置文件内容。
7002
配置文件内容。
7003~7006相同配置。
ps
查看。
使用redis-cli
来进行集群的交互,使用客户端连接任意一个节点,使用-c
表示以集群的方式登录,-p
指定端口。info查看,当前为master,没有slave端。创建集群主从节点,–cluster-replicas
参数为数字,1
表示每个主节点需要1个从节点。然后检查集群,查看集群信息。
redis-cli -c -p 7001
> info
redis-cli --cluster create 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 --cluster-replicas 1
redis-cli --cluster check 127.0.0.1:7001 ##检查集群
redis-cli --cluster info 127.0.0.1:7001 ##集群信息查看
2)脚本构建
cd
cd redis-6.2.4/
cd utils/create-cluster/
./create-cluster start ##开启实例Starting 30001~30006
ps ax
./create-cluster stop ##停止所有实例,使用手动构建的集群来做接下来的实验
ps ax
2、自动切换
由上图可知,7004为7002的slave
。当连接7002端口,并关掉当前节点,7004会自动切换为主节点,此时没有从节点。开启server2,此时为从节点,检查集群,可以看到7004有一个从节点。
redis-cli -c -p 7002
> SHUTDOWN
ps ax ##7002消失
redis-cli --cluster check 127.0.0.1:7001 ##7004 0 slaves
cd ..
cd 7002
redis-server redis.conf
ps ax ##redis-server *:7002 [cluster]
redis-cli --cluster check 127.0.0.1:7001 ##7004 1 slaves为7002
3、添加节点和分片
先和之前一样创建两个节点。
cd ..
mkdir 700{7,8}
cd 7007
cp ../7001/redis.conf .
vim redis.conf
///
port 7007
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
///
redis-server redis.conf 7008相同
ps ax
将7007
节点加入集群中,但是并没有分配slot,所以这个节点并没有真正的开始分担集群工作,所以要进行分片。重新分片基本上意味着将哈希槽从一组节点移动到另一组节点,并且像群集创建一样。
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
##将节点加入了集群中,但是并没有分配slot,所以这个节点并没有真正的开始分担集群工作
redis-cli --cluster check 127.0.0.1:7001
##7007 0 slaves slots: (0 slots) masterredis-cli --cluster reshard 127.0.0.1:7001 ##重新分片
^^^^^^^^^^^^^^^^^^^分片操作
How many slots do you want to move (from 1 to 16384)? 1000 ##移动的插槽数量
What is the receiving node ID?41719c77f58af0a4bda6e5c13a48653fff8a80be ##接收节点的ID
Source node #1: all
##从哪些节点获取这些密钥,键入all以从所有其他主节点获取一些哈希槽
Do you want to proceed with the proposed reshard plan (yes/no)? yes ##确定是否要继续重新分片,输入yes
^^^^^^^^^^^^^^^^^^^
检查集群,此时7007
节点有1000哈希槽,没有从节点,于是把7008
节点加入到7001
节点的集群中,并且当做node_id
为 41719c77f58af0a4bda6e5c13a48653fff8a80be的从节点。如果不指定 --cluster-master-id
会随机分配到任意一个主节点。检查集群,此时7007有一个从节点。
redis-cli --cluster check 127.0.0.1:7001
##7007 1000 slots | 0 slaves
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 --cluster-slave --cluster-master-id 41719c77f58af0a4bda6e5c13a48653fff8a80be
##把7008 节点加入到7001 节点的集群中,并且当做node_id为 41719c77f58af0a4bda6e5c13a48653fff8a80be的从节点。
##如果不指定 --cluster-master-id 会随机分配到任意一个主节点。
redis-cli --cluster check 127.0.0.1:7001
##7007 1 slaves
六、redis+mysql 即 Redis作mysql的缓存服务器
在server1
主机安装进程管理工具,便于使用killall
命令,关掉redis
所有进程。
yum install -y psmisc ##便于使用killall命令
killall redis-server
ps ax ##没有redis且nginx和php正常
补充:
Psmisc
的内容
安装的程序: fuser, killall, pstree, pstree.x11(pstree)
程序 | 用法 |
---|---|
fuser | 报告使用所给文件或文件系统的进程的进程ID(PID)。 |
killall | 通过进程名来终止进程,它发送消息到所有正在运行任意所给指令的进程。 |
oldfuser | 报告使用所给文件或文件系统的进程的进程ID(PID)。 |
pstree | 以目录树的形式显示所有正在运行的进程 |
pstree.x11 | 同 pstree ,只是它在退出前要求确认 |
在server3
主机,停掉rdis
,并且取消开机自启。删除redis
环境变量并且生效。
/etc/init.d/redis_6379 stop
chkconfig redis_6379 off ##取消开机自启
vim .bash_profile
///
PATH=$PATH:$HOME/bin
///
source .bash_profile
安装mariadb
。还原mysql
的配置文件,删除mysql所有数据文件,开启mariadb
。
yum install -y mariadb-server.x86_64
vim /etc/my.cnf
///
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
[mysqld_safe]
log-error=/var/lib/mysql/mysqld.log
pid-file=/var/lib/mysql/mysqld.pid
///
cd /data/mysql/
rm -rf *
systemctl start mariadb
在server2
主机开启redis
,info
查看信息,当前为server1的从机
。修改配置文件,删除关于主从的设定,重启redis
。info
查看此时为master
主机。
###server2
systemctl start redis
redis-cli
> info ##role:slave master_host:172.25.24.1
vim /etc/redis/redis.conf
///
replicaof 172.25.24.1 6379 ##删除这一条
///
systemctl restart redis
redis-cli
> info ##role:master connected_slaves:0
在server1主机,修改测试页内容,修改主从ip。
###server1
cd /usr/local/nginx/html/
> cd pub/docs/redis/
> get test.php
vim test.php
///3 $redis->connect('172.25.24.2',6379)10 $connect = mysql_connect('172.25.24.3','redis','westos');
///
test.php
源码
<?php$redis = new Redis();$redis->connect('127.0.0.1',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('127.0.0.1','redis','westos');mysql_select_db(test);$result = mysql_query($query);//如果没有找到$key,就将该查询sql的结果缓存到rediswhile ($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>";}
?>
在server3
,进入数据库,可以看到test
库,导入一个sql
文件,是test库的内容。进入数据库,可以看到导入的数据,给授权。
###server3
cd
mysql
> show databases; ##test
lftp 172.25.254.250
> cd pub/docs/redis/
> get test.sql
mysql < test.sql
mysql
> use test
> show tables;
> select * from test; ##test1~test9
> grant all on test.* to redis@'%' identified by 'westos';
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 ;
在server1安装PHP redis 驱动和phpredis扩展,phpize
扩展,然后进行configure
-make
-make install
。修改pho配置文件,设定时区和redis扩展,重启php-fpm。查看扩展。
###server1
cd
lftp 172.25.254.250
> cd pub/docs/redis/
> get phpredis-master.zip ##phpredis扩展
> get phpredis-5.3.4.tgz ##PHP redis 驱动
unzip phpredis-master.zip
tar zxf phpredis-5.3.4.tgz
cd phpredis-master/
cd redis-5.3.4/
phpize
./configure --enable-redis
make
make install
cd /usr/local/lnmp/php/etc
vim php.ini
///963 date.timezone = Asia/Shanghai939 extension=redis ##redis扩展
///
systemctl reload php-fpm.service
php -m | grep redis ##redis
php -m | grep mysql ##mysqli mysqlnd pdo_mysql
,
关闭php-fpm,修改变量,下载依赖,修改配置文件,重启php-fpm,可以在浏览器打开测试页。
cd
vim .bash_profile
///
PATH=$PATH:$HOME/bin
///
source .bash_profile
lftp 172.25.254.250
> cd pub/docs/redis/
> mirror rhel7/
cd rhel7/
yum install -y *.rpm
cd /etc/php-fpm.d/
vim www.conf
///39 user = nginx41 group = nginx
///
systemctl restart php-fpm.service
pa sx ##php-fpm###浏览器
http://172.25.24.1/test.php
七、配置 gearman 实现数据同步
Gearman 是一个支持分布式的任务分发框架:
Gearman Job Server: Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。
Gearman Client:可以理解为任务的请求者。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理。
大致流程:下面要编写的 mysql 触发器,就相当于 Gearman 的客户端。修改表,插入表就相当于直接下发任务。然后通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后在通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中,最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。
在server3
安装数据库的开发包,通过 lib_mysqludf_json
UDF 库函数将关系数据映射为 JSON 格式,拷贝 lib_mysqludf_json.so
模块。进入数据库,查看mysql 的模块目录,注册 UDF 函数,查看函数。
###server3
yum install -y mariadb-devel.x86_64 ##数据库的开发包
lftp 172.25.254.250
> cd pub/docs/redis/
> get lib_mysqludf_json-master.zip
unzip lib_mysqludf_json-master.zip
yum install -y gcc
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c ##UDF库函数将关系数据映射成json输出
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/ ##拷贝 lib_mysqludf_json.so 模块
mysql
> show global variables like 'plugin_dir'; ##查看 mysql 的模块目录
> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so'; ##注册 UDF 函数
> select * from mysql.func; ##查看函数
下载并解压gearman
。
cd
lftp 172.25.254.250
> cd pub/docs/redis/
> get gearman-mysql-udf-0.6.tar.gz
tar zxf gearman-mysql-udf-0.6.tar.gz
将server1主机上的rpm包复制至server3主机。
###server1
cd rhel7/
ls
scp libgearman-1.1.12-18.el7.x86_64.rpm libgearman-devel-1.1.12-18.el7.x86_64.rpm libevent-devel-2.0.21-4.el7.x86_64.rpm server3:
在server3
主机,安装rpm包,对gearman
进行编译。
###server3
cd
yum install -y libgearman-devel-1.1.12-18.el7.x86_64.rpm
yum install -y libgearman-1.1.12-18.el7.x86_64.rpm
yum install -y libevent-devel-2.0.21-4.el7.x86_64.rpm
cd gearman-mysql-udf-0.6/
./configure --libdir=/usr/lib64/mysql/plugin/
make
make install
进入数据库,注册UDF
函数,查看函数是否注册成功。指定 gearman
的服务信息。
mysql
> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so'; ##注册 UDF 函数
> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
> select * from mysql.func;
> SELECT gman_servers_set('172.25.24.1:4730'); ##指定 gearman 的服务信息
编写 mysql
触发器,取消注释,重新导入数据库。进入数据库,查看触发器。
vim test.sql ##编写 mysql 触发器
///
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 BEGINSET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));END$$
DELIMITER ;
///
mysql < test.sql
mysql
> SHOW TRIGGERS FROM test; ##查看触发器
在server1
启动服务,查看php扩展和端口确定服务开启。编写 gearman
的 worker
端。后台运行 worker。
###server1
systemctl start gearmand ##启动服务
php -m | grep gearman ##gearman
netstat -antlp ##:4730
cd
cd rhel7/
vim worker.php ##编写 gearman 的 worker 端
///7 $redis->connect('172.25.24.2', 6379);18 $redis->set($work->id, $work->name); ##(未做更改)这条语句就是将 id 作 KEY 和name 作 VALUE 分开存储,需要和前面写的 php 测试代码的存取一致。
///
nohup php worker.php & ##后台运行 worker
ps ax ##php worker.php
在server3
更新 mysql 中的数据。
###server3
> use test
> update test set name='hello' where id=1; ##更新 mysql 中的数据
在server2
进行查看。
###server2
redis-cli ##查看 redis
> get 1 ##hello
在浏览器可以查看,此时server1端已经同步了server3中mysql
经由server2中redis
上传的数据。
###浏览器
http://172.25.24.1/test.php ##number is 1 name is hello
Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步相关推荐
- 《Linux运维实战:Centos7.6一键离线部署mongodb4.2.23副本集群》
一.部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统,而作为基础组件中的mongodb针对不同的客户环境需要多次部署,作为一个运维工程师,提升工作效率也是工作中的重要一环.所以 ...
- redis 高可用(持久化、主从复制、哨兵、集群)以及集群的三种模式
Redis高可用定义 在web服务器中,高可用代表服务器可以正常访问的时间,一般使用百分比来衡量多长时间内可以提供正常服务 但是在redis中,高可用的定义还要更广泛一点,除了提供正常的服务(如主从分 ...
- java redis 故障切换_java使用Redis6–sentinel单点故障主从自动切换
Redis Sentinel Sentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中 一.Sentinel作用: 1):Master状态检测 ...
- Linux企业运维 6.6 -- Redis部署及主从切换、Redis+Mysql读写分离
目录 Redis简介 redis的编译.安装 1.server1的redis配置 2.server2的redis安装 3.server3配置redis 三.redis主从复制 四.Sentine主从自 ...
- 《Linux运维篇:Linux系统运维指南》
一.Linux运维之知识篇 二.Linux运维之系统篇 <Linux运维总结:使用U盘制作Linux镜像> <Linux运维实战:创建LVM挂载到指定目录> <Linux ...
- 零基础转行Linux云计算运维工程师获得20万年薪的超级学习技巧
云计算概念一旦产生便一发不可收拾,成为移动互联网时代最为火热的行业之一.国内各大互联网公司例如阿里.腾讯.百度.网易等纷纷推出自己的云计算产品,3月10日,腾讯云0.01元投标时间更是让云计算在普罗大 ...
- 要成为linux网站运维工程师必须要掌握的技能
我是一名linux运维工程师,确切的说是网站运维工程师,从事linux工作有2年多了,对这方面有一些体会,给新手一点借鉴: 首先说下运维种类:有办公网系统运维(就是网管),有IDC外网运维,外网运维里 ...
- 新开班全栈Linux运维-Linux云计算运维与高级架构班课程 全新自动化运维必学课程
新开班全栈Linux运维-Linux云计算运维与高级架构班课程 全新自动化运维必学课程 全栈Linux运维的课程意义,在于让同学们从Liunx基础课程开始,一路直通Liunx运维高级架构师的级别.全新 ...
- 全栈Linux运维-Linux云计算运维与高级架构班课程 全新自动化运维必学课程
全栈Linux运维-Linux云计算运维与高级架构班课程 全新自动化运维必学课程 全栈Linux运维的课程意义,在于让同学们从Liunx基础课程开始,一路直通Liunx运维高级架构师的级别.全新的Li ...
最新文章
- 高斯混合模型(GaussianMixture Model, GMM)聚类、可视化最优协方差形式、通过TSNE进行结果可视化分析、抽取核心特征因子
- android 如何将WPS文档转成PDF
- c语言之动态分配空间
- 新年开篇,一起成长,送书 7 本!TF + PyTorch方向
- salt 文件push使用方法
- 坐标转换计算七参数matlab代码,坐标系转换:已知控制点计算七参数并对数据批量转换...
- 手写Maven的archetype项目脚手架
- Mac工具PullTube如何在下载列表中创建重复项
- python mysql_Python-操作 MySQL
- 热敏电阻制作温度传感器的c语言,NTC热敏电阻温度测量和控制系统.doc
- c语言卷积交织,卷积编码码率是什么?怎么计算
- android 百度网盘 播放器,最好用的安卓播放器,支持云盘播放,看电影必备
- 一段简单的C/C++病毒源程序
- 哈雷拆分LiveWire上市,冲击美股电摩第一股
- 运维的本质是什么?阿里“无人化”智能运维平台的演进
- ubuntu 安装openssl-devel
- 友声电子秤手机app_友声TM-xA条码秤数据管理软件V2.53D
- SQL Server数据库SP命令祥解
- 基于php和mysql的商城_基于PHP和MySQL的网上购物系统设计与实现
- CSDN的评论区怎么添加超链接?
热门文章
- 前端中的icon几种用法
- 华为交换机怎么查看接口流量
- Python日记(1)——求dy/dx
- html给div设置宽度无效,HTML学习之给div高度设置百分比不生效的问题
- C语言笔记-进制转换
- linux可以怎么玩(以阿里云Ubuntu服务器为例)(三)——Python零代码搞定个人云盘
- jira 切换 语言_JIRA中的标记语言的语法参考
- 【Cat.1模组】 广和通L610 基于OpenCPU的SDK二次开发
- 操作系统(COPY自wk)
- 中国2019最有价值的科幻类影视游戏IP 网络科幻小说《公元2119年》、