首页 > 其他分享 >week7

week7

时间:2022-11-21 20:48:08浏览次数:50  
标签:## apps 6379 wordpress docker php week7

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)

img

新建一篇文章发布

img

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

img

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:类似数组,称为列表

类似数组

img

定义一个数组

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:集合,取交集/并集/差集,共同认识的好友

集合:无序的字符串放在里面,同一个集合内的元素不能重复,唯一的;不同的集合之间可以取并集,实现统计,例如共同好友等

里面可以是各种字符串

集合之间的操作

img

##定义两个无序集合
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内存储的就是无序集合

img

每个元素都是由score和value组成的,可以根据分数来对人(value)进行排名,或者是别的值,比如说商品根据购买量、好评数等参数来进行排序,就可以使用有序集合sorted

img

##添加一个集合,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

相关文章

  • Week7-Application Layer
    Week7-ApplicationLayer现在有两个基本问题需要应用层解决其一是那个应用将获得数据,这个问题通过一个叫做端口的机制解决WhatdoestheApplicationLayerexpect......