week7
完成作业:
\1. postgresql架构与原理。
\2. 基于流复制完成postgresql的高可用。
\3. 实现postgresql的时间点还原。
\4. 规划高可用的LAMP,要求wordpress网站放在NFS共享存储上,并且用户可以正常发布博客,上传图片。尝试更新wordpress版本,测试网站仍可用。
\5. redis数据类型有哪些?
\6. redis RDB和AOF比较?
\7. redis配置文件详解。
1 2 3pgsql暂时没看
4.wordpress+nfs架构
环境:
10.0.0.128 apache+wordpress服务,数据库主库指向10.0.0.132,基于docker来安装,映射出来,docker安装wordpress
10.0.0.132 MySQL(主),备份服务器
10.0.0.129 MySQL(从),NAS服务器,NAS服务器指向
1.docker搭建wordpress+MySQL
docker run的时候,需要-v映射到nfs的共享目录,单个docker的映射目录()
docker pull wordpress
docker run --name wordpress -p 8002:80 -v /apps/wordpress:/var/www/html/ -d wordpress
#docker run --name wordpress -p 8002:80 -v /apps/uploads:/var/www/html/wp-content/uploads -d wordpress
docker stop `docker ps | grep wordpress | awk '{print $1}'`
docker rm -f `docker ps -a | grep wordpress | awk '{print $1}'`
##查看工作目录,查看从docker仓库下载下来的docker image镜像
##docker inspect imageID/image name,就是查看dockerfile
[root@master ~]#docker inspect wordpress | grep -i working
"WorkingDir": "/var/www/html",
[root@master ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
974257bc8c36 wordpress "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:8002->80/tcp, :::8002->80/tcp wordpress
ss -ntl | grep 8002
LISTEN 0 128 *:8002 *:*
LISTEN 0 128 [::]:8002 [::]:*
10.0.0.128:8002
##MySQL操作,需要提前建库和用户
##所有的建站信息全部存放在表里
[(none)]>create database wordpress;
Query OK, 1 row affected (0.01 sec)
[(none)]>grant all on wordpress.* to wp@'%';
Query OK, 0 rows affected (0.01 sec)
[(none)]>flush privileges;
Query OK, 0 rows affected (0.00 sec)
新建一篇文章发布
2.rsync直接同步uploads目录到备份机[wp]
docker搭建映射出来的路径,不能再进行一次挂载,所以说API服务器有两个,IP+相同的端口号,uploads的rsync直接指向到10.0.0.132的复制目录,/data/bak
[root@master uploads]#exportfs -r
exportfs: /apps/wordpress/wp-content/uploads does not support NFS export
如果是多个web前端的话,程序可以控制写到LB的IP,负载均衡两个WEB,两个WEB的图片备份都指向备份机器,且两台WEB之间同步图片
##安装rsync工具和inotify-tools工具
rpm -q rsync &> /dev/null || yum -y install rsync
rpm -q inotify-tools &> /dev/null || yum -y install inotify-tools
#1.站点图片目录,有记录日期,直接同步这个文件夹,发布新文章,新图片上面都有
/apps/wordpress/wp-content/uploads
[root@master 10]#ls
0923test-01-1024x640.jpg 0923test-01-300x188.jpg 0923test-01.jpg image-150x150.png image-1568x842.png image-768x412.png
0923test-01-150x150.jpg 0923test-01-768x480.jpg image-1024x550.png image-1536x825.png image-300x161.png image.png
#2.直接使用sersync或者是脚本同步uploads到备份服务器10.0.0.132
scp sersync2.5.4_64bit_binary_stable_final.tar.gz 10.0.0.128:/root
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz /apps/sersync
#3.编辑xml文件
vim confxml.xml
<sersync>
<localpath watch="/apps/wordpress/wp-content/uploads"> <!--/apps/wordpress/wp-content/uploads -->
<remote ip="10.0.0.132" name="wp"/> <!--修改远端rsync备份服务器和备份目录 -->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/> <!--鉴权用户名,调用本地的password文件 -->
#4.编辑备份端
rpm -q rsync &> /dev/null || yum -y install rsync
vim /etc/rsyncd.conf
[wp]
path = /data/wordpress/
##记得要写path/
read only = no
##不只读,可写
auth users = rsyncuser
##默认用户
secrets file = /etc/rsync.pas
##默认密码
##重启服务
systemctl restart rsyncd
#5.运行脚本,监控/data/wordpress/2022/10/的变化
#同步前先进行scp同步一遍先
scp /apps/wordpress/wp-content/uploads/* 10.0.0.132:/data/wordpress/
#执行脚本
master:[root@master GNU-Linux-x86]#./sersync2 -dro confxml.xml
nohup ./sersync2 -dro confxml.xml
ps aux | grep ser
root 13227 0.0 0.0 125108 712 ? Ssl 23:02 0:00 ./sersync2 -dro confxml.xml
##监控变化
backup:watch -n0.5 ll /data/wordpress/2022/10/
在wordpress站点发布图片,图片名字为10044444test.jpg
3.rsync使用脚本(在没有包的情况下,常用)
顺便安装了rsync和inotify,可以作为定时任务,或者nohup也行
缺点:调用多次rsync,有点小毛病,调用多次create,attribu等指令
vim inotify_rsync.sh
nohup ./inotify_rsync.sh
##监控NAS目录的变化
SRC='/apps/wordpress/wp-content/uploads/'
##备份服务器为132的bak,调用rsync的协议
DEST='[email protected]::wp'
rpm -q rsync &> /dev/null || yum -y install rsync
rpm -q inotify-tools &> /dev/null || yum -y install inotify-tools
#修改参数,监控文件数量
echo 50000000 > /proc/sys/fs/inotify/max_user_watches
echo 327679 > /proc/sys/fs/inotify/max_queued_events
echo "starting monitor file change..."
sleep 2
#持续前台监控特定事件,定义时间格式、日期格式、动作(新建、删除、移动---重命名、写入、权限变化) + nas目录,输入到while内
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
##表示新建=新建,删除=删除
rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST
echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
#日志在129上面,在129上执行的脚本
done
Every 0.5s: tree /data/wordpress/2022/10/
├── test11-1024x640.jpg
├── test11-150x150.jpg
├── test11-300x188.jpg
├── test11-768x480.jpg
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
如果不执行nohup则是前台执行
4.负载均衡架构
nginx:前端负载均衡
web01,web02:docker部署
备份服务器:web01和web02互相使用rsync脚本同步,同步前先完成一遍复制确保一致
web01和web02再备份一次到备份服务器
3方---4方---多方同步解决
目前只能实现docker单节点部署wordpress,通过脚本自动备份到远端132的机器
1.环境:可以在slave1上面搭建web02站点
搭建docker环境,搭建私有仓库
1.关闭防火墙,SELINUX
sed 's/enable/disabled/g' /etc/config/selinux
2.卸载旧版本的docker包
rpm -qa | grep docker
yum -y remove docker*,删除掉所有的依赖
3.docker安装存储库
yum install -y yum-utils device-mapper-persistent-data lvm2
4.添加阿里云的yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
修改内部的gpgcheck
:%s/gpgcheck=1/gpgcheck=0/g
sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/docker-ce.repo
5.安装docker-ce
yum install docker-ce docker-ce-cli containerd.io -y
scp -r /etc/docker/* 10.0.0.129:/etc/docker/
6.修改docker的源daemon.json
systemctl daemon-reload;systemctl restart docker
7.测试安装服务
docker images
docker ps -a
yum -y install httpd php php-mysqlnd php-json
chown apache.apache /var/www/html/*
ll /var/www/html/*
2.拷贝所有web01站点的信息过去,docker需要映射出来
1.配置docker基础环境
--拉取最新镜像
docker pull wordpress
--拉取仓库镜像,运行
docker pull registry
docker run -d -p 5000:5000 --restart=always --name registry -v /apps/myregistry:/var/lib/registry registry
--打标签
docker image tag wordpress 10.0.0.128:5000/wordpress:v1.0
[root@master registry]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.128:5000/wordpress v1.0 c3c92cc3dcb1 9 months ago 616MB
--配置insucure的镜像仓库地址
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://plqjafsr.mirror.aliyuncs.com"
],
"exec-opts": [
"native.cgroupdriver=systemd"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"insecure-registries": ["10.0.0.128:5000"] ---配置本地仓库
}
--重新加载
systemctl daemon-reload
systemctl restart docker
--推送,查看
docker push 10.0.0.128:5000/wordpress:v1.0
curl http://10.0.0.128:5000/v2/_catalog
{"repositories":["wordpress"]}
--slave1尝试
[root@slave1 ~]#curl http://10.0.0.128:5000/v2/_catalog
{"repositories":["wordpress"]}
2.slave1拉取镜像,运行
--slave1
docker pull 10.0.0.128:5000/wordpress:v1.0
docker run --name wordpress -p 8002:80 --restart=always -v /apps/wordpress:/var/www/html/ -d 10.0.0.128:5000/wordpress:v1.0
docker run --name wordpress -p 8002:80 --restart=always -v /apps/wordpress:/var/www/html/ -d wordpress
docker start `docker ps -a | grep wordpress | awk '{print $1}'`
--拷贝web01的文件到/apps/wordpress
scp -r -p /apps/wordpress/* 10.0.0.129:/apps/wordpress/
rsync -a /apps/wordpress/* 10.0.0.129:/apps/wordpress/
3.试运行
docker stop `docker ps -a | grep wordpress | awk '{print $1}'`
docker start `docker ps -a | grep wordpress | awk '{print $1}'`
docker rm -f `docker ps -a | grep wordpress | awk '{print $1}'`
3.配置WEB01的DNS解析,添加A记录
4.前端添加一个nginx,实现前端负载均衡
##mysql创建库和用户
1.部署数据库
create database wordpress;
[(none)]>drop user wordpress@'%';
Query OK, 0 rows affected (0.00 sec)
[(none)]>flush privileges;
Query OK, 0 rows affected (0.00 sec)
##删除用户后需要刷新权限
[(none)]>create user wordpress@'%' identified by 'wordpress';
Query OK, 0 rows affected (0.02 sec)
[(none)]>grant all on wordpress.* to wordpress@'%';
Query OK, 0 rows affected (0.01 sec)
[(none)]>flush privileges;
Query OK, 0 rows affected (0.00 sec)
2.获取wordpress包,修改wordpress的权限
wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@master wordpress]#cp -p -r wordpress/* /apps/nginx/html/php/
cp: overwrite ‘/apps/nginx/html/php/index.php’? y
chown -R nginx.nginx php/
3.修改nginx代理支持php,安装mysql支持包,json包,因为里面有json格式的文件
yum -y install php-fpm php-mysqlnd php-json
##非.php的文件,会在本机找,所以本机需要有这些文件,最好是PHP程序和nginx在一台机器上,不用分开找这些文件
root /apps/nginx/html/mobile/php;
[root@slave1 mobile]#ls php/
index.php readme.html wp-activate.php wp-blog-header.php wp-config-sample.php wp-cron.php wp-links-opml.php wp-login.php wp-settings.php wp-trackback.php
license.txt test.php wp-admin wp-comments-post.php wp-content wp-includes wp-load.php wp-mail.php wp-signup.php xmlrpc.php
location ~ \.php$ {
root /apps/nginx/html/php; ##默认是html/php
fastcgi_pass 10.0.0.128:9000; ##PHP服务器地址,默认本机
fastcgi_index index.php; ##默认php页面
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; #此文件默认系统已提供,存放的相对路径为/conf下,是一个固定的参数,用于nginx转换到fastcgi
}
location ~ ^/(ping|php_status)$ {
fastcgi_pass 10.0.0.128:9000;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
include fastcgi_params;
}
4.访问http://mobile.catyer.cn/wp-admin/
5.部署
6.修改上传最大size
access_log /apps/nginx/logs/mobile_access.log main;
root /apps/nginx/html/mobile/php;
index index.php;
client_max_body_size 20m; ##nginx参数
##仅存在于代理服务器+php服务器的情况
7.使用nfs共享PHP服务器的路径
vim /etc/exports
/apps/nginx/html/php *(rw,no_root_squash)
##生效,show一下路径
[root@master html]#exportfs -r
[root@master html]#exportfs -v
/apps/nginx/html/php
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
##129挂载
[root@slave1 conf.d]#mount 10.0.0.128:/apps/nginx/html/php /apps/nginx/html/mobile/php
10.0.0.128:/apps/nginx/html/php nfs4 38G 22G 17G 57% /apps/nginx/html/mobile/php
8.写入到永久挂载
echo "10.0.0.128:/apps/nginx/html/php /apps/nginx/html/mobile/php nfs defaults,_netdev 0 0" >> /etc/fstab
9.如果是多个wordpress机器,则使用nfs共享目录即可,nginx服务可以是两个机器,目录一个即可,rsync来备份upload下面的信息即可
[root@slave1 uploads]#pwd
/apps/nginx/html/mobile/php/wp-content/uploads
sersync同步过去即可,带权限同步到备份机器
rsync -a /apps/nginx/html/mobile/php/wp-content/uploads
10.代理可以转发到后端的两台php机器,php机器只要保证目录数据一致即可,PHP支持程序代码
upstream wordpress{
ip_hash;
server 10.0.0.128 weight=1;
server 10.0.0.129 weight=1;
}
location /php {
proxy_pass https://wordpress/;
}
5. redis数据类型有哪些?
key:string类型,指定键值对
字符串类型
##key的
set key value
get key
mset key1 value1 key2 value2...
mget key1 key2...
##key大小写敏感,不一样的大小写的key不一样
##可选选项
127.0.0.1:6379> set key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
##设置这个变量10s后过期,比如红包100块,10s后过期
set hongbao 100 EX 10
127.0.0.1:6379> get hongbao
(nil)
##type:查看key类型
127.0.0.1:6379> set c1 1
OK
127.0.0.1:6379> set c2 2
OK
127.0.0.1:6379> type c1
string
##ttl:查看key的有效期
127.0.0.1:6379> set hongbao 100 ex 100
OK
127.0.0.1:6379> ttl hongbao
(integer) 97
##递增INCR=INCREMENT,类似MySQL的主键递增,id auto_increment
127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> INCR num
(integer) 11
127.0.0.1:6379> INCR num
(integer) 12
list:类似数组,称为列表
类似数组
定义一个数组
array=(0,1,2,3)
下标:array[0],[1]以此类推
LPUSH:从左边开始编号,索引为0,1,2,3...
RPUSH:从右边开始编号,索引为-1.-2,-3...
lindex:从左边开始查看
rindex:从右边
##顺序:a b c,先推c,再ba
127.0.0.1:6379> lpush list1 c b a
(integer) 3
127.0.0.1:6379> lindex list1 0 --->最左边为a
"a"
127.0.0.1:6379> lindex list1 -1 --->最右边为c
"c"
type list1
127.0.0.1:6379> type list1
list
sets:集合,取交集/并集/差集,共同认识的好友
集合:无序的字符串放在里面,同一个集合内的元素不能重复,唯一的;不同的集合之间可以取并集,实现统计,例如共同好友等
里面可以是各种字符串
集合之间的操作
##定义两个无序集合
sadd my mary tom bob
sadd your mary tony jerry
##里面有3个元素
127.0.0.1:6379> sadd my mary tom bob
(integer) 3
127.0.0.1:6379> sadd your mary tony jerry
(integer) 3
##集合之间的操作,sinter:共同的元素,交集
##smembers:查看集合的元素
127.0.0.1:6379> smembers my
1) "tom"
2) "bob"
3) "mary"
127.0.0.1:6379> smembers your
1) "tony"
2) "jerry"
3) "mary"
127.0.0.1:6379> sinter my your
1) "mary"
##sunion:并集,所有合起来,不包括重复的,因为集合内的元素都是唯一的
127.0.0.1:6379> sunion my your
1) "mary"
2) "bob"
3) "tom"
4) "tony"
5) "jerry"
##sdiff:差集,set1有set2没有,或者是set2有set1没有,比如一群朋友就是一个集合等;社交场景可能认识的人
127.0.0.1:6379> sdiff my your
1) "tom"
2) "bob"
sorted sets:有序集合,常用于排行榜(名字-分数对)
按照一定的次序进行集合内的排序,比如排行榜,百度搜索的集合;或者是基于ES推荐的
ES内存储的就是无序集合
每个元素都是由score和value组成的,可以根据分数来对人(value)进行排名,或者是别的值,比如说商品根据购买量、好评数等参数来进行排序,就可以使用有序集合sorted
##添加一个集合,music歌手的排行榜
##有序集合内有多个键值对
127.0.0.1:6379> ZADD music 99 jay 90 eason 85 feiniao 70 joey
(integer) 4
##正序排序,由小到大,=order by ,最左边是最后插入的,索引为0;最右边为最先插入的,索引为1,这条是遍历所有的值
127.0.0.1:6379> ZREVRANGE music 0 -1
1) "jay"
2) "eason"
3) "feiniao"
4) "joey"
##倒序排序
127.0.0.1:6379> ZRANGE music 0 -1
1) "joey"
2) "feiniao"
3) "eason"
4) "jay"
hash:哈希值
hash map操作
6. redis RDB和AOF比较?
redis RDB:实现redis的持久化存储,重启redis服务会重新加载rdb存储,存储路径可以在redis内自定义,RDB类似MySQL的mysqldump,全量复制
可以基于.RDB文件进行定时的备份,
data rdb save dir
AOF:实时的数据更新,只要有redis库的数据更新,则更新一份.aof文件,包括增删改等操作;
采用COW机制:copy on write,只要有数据更新,就会实时写入到.aof文件,无论是增加(set value)、删除(del value)、修改(set value)都一样
AOF的优先级高于RDB,如果两项都开启的话,默认redis读.aof
.aof的数据写入磁盘规则,每秒钟写一次磁盘,无论在1s(everysec)内有多少数据更新都是整合成一次IO进行写入
always规则:已有更新就写入,适用于金融型的场景的交易数据,需要写成always
--appendfsync always
--appendfsync everysec
# appendfsync no
##共同点
都可以实现redis保存数据的持久化,不必说redis重启或者其他操作导致数据丢失
##执行方式
1.RDB:通过save/bgsave来保存当前状态下的快照,不会实时记录数据变化
2.AOF:实时记录数据变化,实时写入AOF文件
##缺点
1.RDB:不会实时记录数据变化,安全性较低
2.AOF:造成大量数据的写入,占用磁盘空间
##应用场景
1.如果redis只是缓存,则只启动RDB就行,主要的备份还是MySQL那些,因为主要的数据加速读写还是MySQL、sql server作为主库
2.如果数据安全性要求高,建议RDB和AOF同时开启
7. redis配置文件详解。
sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e "/# requirepass/a requirepass $PASSWORD" -e "/^dir .*/c dir ${INSTALL_DIR}/data/" -e "/logfile .*/c logfile ${INSTALL_DIR}/log/redis-6379.log" -e "/^pidfile .*/c pidfile ${INSTALL_DIR}/run/redis_6379.pid" ${INSTALL_DIR}/etc/redis.conf
sed -e表示修改多个地方
bind 0.0.0.0 ##修改监听,远程连接,/^bind
requirepass 123456 ##启用密码,/^require
dir /apps/redis/data/ ##数据目录
logfile /apps/redis/log/redis-6379.log ##日志目录,记录redis的日志
=pidfile /apps/redis/run/redis_6379.pid ##进程ID号文件
slowlog-log-slower-than 1000 ##默认10ms,还是太长了
slowlog-max-len 128 #记录最近的128条慢日志
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
tcp-backlog 511:全连接队列,这里必须是写的511,所以之前的net.core.somaxconn = 1024,需要根据程序调大一点
dbfilename dump.rdb ##持久化数据文件,默认开启RDB功能
##查看配置文件,默认值,自动触发bgsave的默认配置规则
/^# save
save 3600 1
save 300 100
save 60 10000
##aof配置
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
#单节点客户端最高是10000并发
maxclients 10000
# maxclients 10000
标签:##,apps,6379,wordpress,docker,php,week7
From: https://www.cnblogs.com/catyer/p/16913112.html