20181101 大作业

需求:
1 设计你认为合理的架构,用visio把架构图画出来
2 搭建lnmp、tomcat+jdk环境
3 三个站点分别为:discuz论坛、dedecms企业网站以及zrlog博客
4 由于机器有限,尽可能地把三个站点放到同一台服务器上,然后做负载均衡集群,要求所有站点域名解析到一个ip上,也就是说只有一个出口ip
5 需要共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录)
6 设计合理的目录、文件权限,比如discuz的data目录需要给php-fpm进程用户可写权限,其他目录不用写的就不要给写权限(目录755,文件644,属主属组root)
7 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo
8 给所有服务器做一个简单的命令审计功能
9 php-fpm服务要求设置慢执行日志,超时时间为2s,并做日志切割,日志保留一月
10 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月
11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器
12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器
12 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据

13 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性,
14 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警
15 定制自定义监控脚本,监控mysql的队列,接入zabbix,成图,设置触发器,队列超过300告警
16 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数
17 利用jmx,在zabbix上监控tomcat
18 给三个站点的后台访问做二次认证,增加安全性
19 用shell脚本实现文件、代码同步上线(参考分发系统)

1.架构图  

参考文章 :一句话总结
1大型网站架构之架构演变https://blog.csdn.net/xiaoyuerp/article/details/83627678
2.304状态码:客户端已经执行了GET,但文件未变化:http://www.cnblogs.com/ziyunfei/archive/2012/11/17/2772729.html
3.CDN服务商提供边缘网络缓存服务 https://www.cnblogs.com/tinywan/p/6067126.html
4.反向代理缓存,例如Nginx反向代理设置缓存空间:https://blog.csdn.net/lmy_1/article/details/52791275
5.分布式缓存:社交网站等需求,均衡数据分布:通过一致性哈希算法计算找到节点‘/
https://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E7%BC%93%E5%AD%98/16344817?fr=aladdin
6.本地应用缓存:例子html5中本地存储及缓存 cookie https://blog.csdn.net/herion_liu/article/details/51604493 
HTTP缓存技术详解 https://www.jianshu.com/p/4f07740d68e4
7.一篇文读懂缓存在大型分布式系统中的最佳应用 https://blog.csdn.net/hotdust/article/details/73123598
8.NoSQL和搜索引擎阶段:关系型和非关系型数据库的区别? https://blog.csdn.net/longxingzhiwen/article/details/53896702
  一文读懂非关系型数据库(NoSQL) https://www.cnblogs.com/bldly1989/p/6721758.html

其他说明:服务搭建后完成以下任务

1.企业生产环境用户权限集中管理方案案例:http://blog.51cto.com/ouyangtao/2137450?source=dra (搭建系统时为效率使用root)
2.推荐一个 zsh 和 oh-my-zsh 有了这个,命令行就智能了好多,操作起来非常地方便,有兴趣的自己去找找文档
3.阿里宣布开源容器技术Pouch和P2P文件分发系统“蜻蜓”http://news.mydrivers.com/1/556/556455.htm
4.可否使用共享镜像功能 https://help.aliyun.com/document_detail/25463.html

1.批量创建admin用户

需要在9台机器上创建admin用户,并设置密码

1.1、登录192.168.106.109    NFS发布服务器,安装expect

1.2、创建expect文件

批量修改密码或批量创建用户:阿里云默认账户Administrator ,拿到机器后有一个简单的初始密码

vim mvPasswd.expect   #赋予useradd.expect执行权限
 vim mvPasswd.sh   # 批量执行
vim ip.txt  # IP列表

2.分配好机器后,编写脚本配置所有机器的防火墙规则

防火墙的种类:关闭selinux、firewalld

Mysql端口、web端口、NFS端口、客户端、服务器、Zabbix端口、mycat端口

3.服务器的命令审计   ???

4.密匙登陆配置

5.Mysql读写分离配置

6.高可用配置

7.负载均衡配置

8.安装服务

9.zabbix配置

10.共享静态文件

11.php-fpm服务要求设置慢执行日志

12.所有站点都需要配置访问日志,并做日志切割

13.MyCat配置

13.1安装Mysql

  1. 下载mysql到/usr/local/src/ [root@localhost src]# cd /usr/local/src/    [root@localhost src]# wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
  2. 解压 [root@localhost src]# tar zxvf /usr/local/src/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz   #zxvf解压缩 zcvf压缩
  3. 把解压完的数据移动到/usr/local/mysql[root@localhost src]# mv mysql-5.6.39-linux-glibc2.12-x86_64 /usr/local/mysql
  4. 建立mysql用户[root@localhost src]# useradd -s /sbin/nologin mysql  #只是不允许系统login,可以使用其他ftp等服务
  5. 初始化数据库
    [root@localhost src]# cd /usr/local/mysql
    [root@localhost mysql]# mkdir -p /data/mysql ; chown -R mysql:mysql /data/mysql #-R 级联目录更改 
    [root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql #安装
    --user 定义数据库的所属主, --datadir 定义数据库安装到哪里,建议放到大空间的分区上,这个目录需要自行创建。这一步骤很关键,如果你看到两个 “OK” 说明执行正确,否则请仔细查看错误信息 论坛 (http://www.aminglinux.com/bbs/forum-40-1.html)
  6. 拷贝配置文件[root@localhost mysql]# cp support-files/my-default.cnf /etc/my.cnf
  7. 拷贝启动脚本文件并修改其属性
    [root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
    [root@localhost mysql]# chmod 755 /etc/init.d/mysqld
  8. 修改启动脚本[root@localhost mysql]# vim /etc/init.d/mysqld
    需要修改的地方有 “datadir=/data/mysql” (前面初始化数据库时定义的目录)
  9. 把启动脚本加入系统服务项,并设定开机启动,启动mysql
    [root@localhost mysql]# chkconfig --add mysqld
    [root@localhost mysql]# chkconfig mysqld on
    [root@localhost mysql]# service mysqld start

    如果启动不了,请到 /data/mysql/ 下查看错误日志,这个日志通常是主机名.err. 检查mysql是否启动的命令为:
    [root@localhost mysql]# ps aux |grep mysqld

13.2安装php

这里要先声明一下,针对Nginx的php安装和针对apache的php安装是有区别的,因为Nginx中的php是以fastcgi的方式结合nginx的,可以理解为nginx代理了php的fastcgi,而apache是把php作为自己的模块来调用的。建议你使用5.3版本。php官方下载地址: http://www.php.net/downloads.php   #CGI全称是“通用网关接口”

  1. 下载php  [rot@localhost httpd-2.2.24]# cd /usr/local/src [root@localhost src]# wget http://am1.php.net/distributions/php-5.3.27.tar.gz
  2. 解压php   [root@localhost src]# tar zxf php-5.3.27.tar.gz
  3. 创建相关账户[root@localhost src]# useradd -s /sbin/nologin php-fpm
  4. 配置编译参数:
    [root@localhost src]# cd php-5.3.27
    [root@localhost php-5.3.27]# ./configure \ --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --enable-fpm \ --with-fpm-user=php-fpm \ --with-fpm-group=php-fpm \ --with-mysql=/usr/local/mysql \ --with-mysql-sock=/tmp/mysql.sock \ --with-libxml-dir \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-iconv-dir \ --with-zlib-dir \ --with-mcrypt \ --enable-soap \ --enable-gd-native-ttf \ --enable-ftp \ --enable-mbstring \ --enable-exif \ --disable-ipv6 \ --with-pear \ --with-curl \ --with-openssl
    该过程中,如果出现如下错误,请按照阿铭给出的解决办法解决,如果出现的错误并没有写出来,请参考上一章LAMP的php安装步骤(http://study.lishiming.net/chapter17.html#php)错误信息:configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/ 解决办法:yum install -y libcurl-devel  一般都是缺少依赖安装包
  5. 编译php[root@localhost php-5.3.27]# make
    在这一步,你通常会遇到一些错误,没有关系,遇到错误是好事,这样可以增加你处理问题的经验。错误:/usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/fpm/php-fpm] 错误 1 阿铭是这样解决的:yum install -y libtool-ltdl-devel
  6. 安装php[root@localhost php-5.3.27]# make install
    以上每一个步骤,如果没有完全执行正确,那么下一步是无法进行的,是否还记得判断执行是否正确的方法? 使用 echo $? 看结果是否为 “0” , 如果不是,就是没有执行正确。

    $$   Shell本身的PID(ProcessID,即脚本运行的当前进程ID号)
    $!   Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)
    $?   最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
    $-   显示shell使用的当前选项,与set命令功能相同
    $*   所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。   
    $@   所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
    $@  跟$*类似,但是可以当作数组用
    $#   添加到Shell的参数个数
    $0   Shell本身的文件名
    $1~$n   添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

  7. 修改配置文件
    cp php.ini-production /usr/local/php/etc/php.ini
    vim /usr/local/php/etc/php-fpm.conf
    把如下内容写入该文件:
    [global]
    pid = /usr/local/php/var/run/php-fpm.pid
    error_log = /usr/local/php/var/log/php-fpm.log
    [www]
    listen = /tmp/php-fcgi.sock
    user = php-fpm
    group = php-fpm
    pm = dynamic
    pm.max_children = 50
    pm.start_servers = 20
    pm.min_spare_servers = 5
    pm.max_spare_servers = 35
    pm.max_requests = 500
    rlimit_files = 1024
    保存配置文件后,检验配置是否正确的方法为:/usr/local/php/sbin/php-fpm -t 如果出现诸如 “test is successful” 字样,说明配置没有问题。
  8. 启动php-fpm
    cp /usr/local/src/php-5.3.27/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    chmod 755 /etc/init.d/php-fpm
    service php-fpm start

    如果想让它开机启动,执行:chkconfig php-fpm on
    检测是否启动:ps aux |grep php-fpm 看看是不是有很多个进程(大概20多个)。

13.3安装nginx

Nginx官方网站(http://nginx.org), 从官方网站可以看到nginx更新速度很快,这也反映了一个事实,目前使用nginx跑网站的公司或者个人越来越多。当前最新版本为1.5, 但是阿铭不建议你安装这么新的,因为它还太新,难免会有一些bug或者漏洞,所以建议你安装1.4版本的nginx.

  1. 下载nginx cd /usr/local/src/ wget http://nginx.org/download/nginx-1.4.4.tar.gz
  2. 解压nginx tar zxvf nginx-1.4.4.tar.gz
  3. 配置编译参数
    cd nginx-1.4.4
    ./configure \
    --prefix=/usr/local/nginx \
    --with-http_realip_module \
    --with-http_sub_module \
    --with-http_gzip_static_module \
    --with-http_stub_status_module  \
    --with-pcre
  4. 编译nginx :  make
  5. 安装nginx  : make install 因为nginx比较小,所以很快就会安装完,而且也不会出什么错误,(http://www.aminglinux.com/bbs/forum-40-1.html)
  6. 编写nginx启动脚本,并加入系统服务   vim /etc/init.d/nginx 写入如下内容(nginx启动脚本):
    #!/bin/bash
    # chkconfig: - 30 21
    # description: http service.
    # Source Function Library
    . /etc/init.d/functions
    # Nginx Settings
    
    NGINX_SBIN="/usr/local/nginx/sbin/nginx"
    NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
    NGINX_PID="/usr/local/nginx/logs/nginx.pid"
    RETVAL=0
    prog="Nginx"
    
    start() {
            echo -n $"Starting $prog: "
            mkdir -p /dev/shm/nginx_temp
            daemon $NGINX_SBIN -c $NGINX_CONF
            RETVAL=$?
            echo
            return $RETVAL
    }
    
    stop() {
            echo -n $"Stopping $prog: "
            killproc -p $NGINX_PID $NGINX_SBIN -TERM
            rm -rf /dev/shm/nginx_temp
            RETVAL=$?
            echo
            return $RETVAL
    }
    
    reload(){
            echo -n $"Reloading $prog: "
            killproc -p $NGINX_PID $NGINX_SBIN -HUP
            RETVAL=$?
            echo
            return $RETVAL
    }
    
    restart(){
            stop
            start
    }
    
    configtest(){
        $NGINX_SBIN -c $NGINX_CONF -t
        return 0
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      reload)
            reload
            ;;
      restart)
            restart
            ;;
      configtest)
            configtest
            ;;
      *)
            echo $"Usage: $0 {start|stop|reload|restart|configtest}"
            RETVAL=1
    esac
    
    exit $RETVAL
  7. 更改nginx配置首先把原来的配置文件清空:
    > /usr/local/nginx/conf/nginx.conf “>”    #这个符号为重定向的意思,可以把一个文本文档快速清空。
    vim /usr/local/nginx/conf/nginx.conf   #写入如下内容:
    user nobody nobody;
    worker_processes 2;
    error_log /usr/local/nginx/logs/nginx_error.log crit;
    pid /usr/local/nginx/logs/nginx.pid;
    worker_rlimit_nofile 51200;
    
    events
    {
        use epoll;
        worker_connections 6000;
    }
    
    http
    {
        include mime.types;
        default_type application/octet-stream;
        server_names_hash_bucket_size 3526;
        server_names_hash_max_size 4096;
        log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
        '$host "$request_uri" $status'
        '"$http_referer" "$http_user_agent"';
        sendfile on;
        tcp_nopush on;
        keepalive_timeout 30;
        client_header_timeout 3m;
        client_body_timeout 3m;
        send_timeout 3m;
        connection_pool_size 256;
        client_header_buffer_size 1k;
        large_client_header_buffers 8 4k;
        request_pool_size 4k;
        output_buffers 4 32k;
        postpone_output 1460;
        client_max_body_size 10m;
        client_body_buffer_size 256k;
        client_body_temp_path /usr/local/nginx/client_body_temp;
        proxy_temp_path /usr/local/nginx/proxy_temp;
        fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
        fastcgi_intercept_errors on;
        tcp_nodelay on;
        gzip on;
        gzip_min_length 1k;
        gzip_buffers 4 8k;
        gzip_comp_level 5;
        gzip_http_version 1.1;
        gzip_types text/plain application/x-javascript text/css text/htm application/xml;
    
    server
    {
        listen 80;
        server_name localhost;
        index index.html index.htm index.php;
        root /usr/local/nginx/html;
    
        location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass unix:/tmp/php-fcgi.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
        }
    
    }
    
    }
    保存配置后,先检验一下配置文件是否有错误存在:/usr/local/nginx/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

    启动nginx:service nginx start   # 如果不能启动,请查看 “/usr/local/nginx/logs/error.log” 文件,
    检查nginx是否启动:ps aux |grep nginx   #  看是否有进程。

测试是否解析php文件
创建测试文件:vim /usr/local/nginx/html/2.php
内容如下:<?php echo "测试php是否解析"; ?>
测试:[root@localhost nginx]# curl localhost/2.php #测试网站配置正常https://www.cnblogs.com/duhuo/p/5695256.html

13.4安装JDK环境

mycat需要JDK环境:Tomcat的安装分为两个步骤:安装JDK和安装Tomcat.
下载jdk-6u23-linux-i586.bin:你也可以从官方网站(https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)下载其他版本。

1.cd /usr/local/src/
wget http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz

2.[root@hao-01 src]# rz     #貌似以上wget无法下载,所有先下载到本地,rz会跳出文件框选择本地文件 yum install -y lrzsz
   [root@hao-01 src]# tar zxvf jdk-8u191-linux-x64.tar.gz
3.[root@hao-01 src]# mv jdk1.8.0_191 /usr/local/jdk1.8

4.设置环境变量:vim /etc/profile # 在末尾输入以下内容:系统环境变量

JAVA_HOME=/usr/local/jdk1.8/
JAVA_BIN=/usr/local/jdk1.8/bin
JRE_HOME=/usr/local/jdk1.8/jre
PATH=$PATH:/usr/local/jdk1.8/bin:/usr/local/jdk1.8/jre/bin
CLASSPATH=/usr/local/jdk1.8/jre/lib:/usr/local/jdk1.8/lib:/usr/local/jdk1.8/jre/lib/charsets.jar

export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH

5.保存文件后,使其生效:   source /etc/profile
6.检测是否设置正确:   java -version
如果显示如下内容,则配置正确:

java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing)

7. 搜索openjdk命令是否安装 ?[root@hao-01 src]# rpm -qa |grep openjdk #源码原生JDK不同于SUN公司JDK 

1.apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩
2.apache和tomcat都可以做为独立的web服务器来运行。但是apache不能解释java程序(jsp,serverlet)
3.Apache是普通服务器,本身只支持html即普通网页。不过可以通过插件支持PHP,还可以与Tomcat连通(单向Apache连接Tomcat,就是说通过Apache可以访问Tomcat资源。反之不然)
4.两者都是一种容器,只不过发布的东西不同。apache是html容器,功能像IIS一样,tomcat是jsp/servlet容器,用于发布JSP及JAVA的,类似的有IBM的webshere、EBA的Weblogic,sun的JRun等
5.apache和tomcat是独立的,在通一台服务器上可以集成。
打个比方:apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),tomcat就是一个桶(装像JAVA这样的水),而这个桶也可以不放在卡车上。

13.5 Mysql 主从配置

https://blog.csdn.net/xiaoyuerp/article/details/83059450

13.6 安装Mycat

下载MYcat  http://dl.mycat.io  Mycat(入门篇)??? https://blog.csdn.net/qq_28804275/article/details/80892100
Mycat:下载地址:https://github.com/MyCATApache/Mycat-download。任意选中RELEASE版本,进入RELEASE版本目录

cd /usr/local/src/
wget 
http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz #或以下地址
wget https://github.com/coderczp/MycatLB/blob/master/bin/centos_x86_64_czplb.tar.gz
tar zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/  #-C指定需要解压到的目录

Linux下还需配置Mycat的解压目录:vim /etc/profile,配置完成后使用:source /etc/profile:???

export JAVA_HOME=/usr/local/jdk1.6.0_23/ 前方已有
export MYCAT_HOME=/usr/local/mycat/

运行(Linux):

./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动(暂未实现)
./mycat remove 取消随系统自动启动(暂未实现)
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态

修改JVM配置参数不确定???  https://blog.csdn.net/qq_28804275/article/details/80892100

Mycat目录说明

bin:启动目录
conf:配置文件目录
server.xml:是Mycat服务器参数调整和用户授权的配置文件
schema.xml:是逻辑库定义和表以及分片定义的配置文件,
逻辑库、表、分片规则、DataNode 以及 DataSource
rule.xml: 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT
log4j.xml: 日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题
autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件
lib:jar包目录
logs :日志目录
tmlogs:临时日志目录

server.xml #添加用户

    <user name="mycat">
        <property name="password">mycat</property>
        <property name="schemas">mycats</property><!--schemas:逻辑库名称,具体配置在scheme.xml中-->
    </user>

schema.xml  #添加如下配置:水平切分,数据按Id取模均匀划分到两个数据库中

    <schema name="mycats" checkSQLschema="false" sqlMaxLimit="100">
        <!-- 逻辑表配置 -->
        <table name="tb_user" dataNode="dn1,dn2" rule="mod-long" /><!--name:实际物理库的数据表名;dataNode:表对应的分片;rule:分片规则名称,具体配置在rule.xml中-->
    </schema>
 
    <dataNode name="dn1" dataHost="host1" database="mycat1" /><!--name:分片名称;database:实际物理库的数据库名-->
    <dataNode name="dn2" dataHost="host1" database="mycat2" />
 
    <dataHost name="host1" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
       <heartbeat>select user()</heartbeat><!--mysql心跳检测命令-->
       <writeHost host="hostM1" url="localhost:3306" user="root" password="xxx" /><!--实际物理库的配置信息-->
    </dataHost>

 rule.xml  #添加如下配置:水平切分,数据按Id取模均匀划分到两个数据库中

    <tableRule name="mod-long"> <!-- 对应表的分片规则 -->
        <rule>
            <columns>id</columns><!-- 对应数据表要取模的字段名称 -->
            <algorithm>mod-long</algorithm><!-- 对应function的名称 -->
        </rule>
    </tableRule>
    
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- name:对应tableRule的名称;class:切分规则对应的切分类 -->
        <!--  scheme.xml中有多少个dataNode就改成多少个 -->
        <property name="count">2</property>
    </function>

代码测试(SpringBoot + JPA)https://blog.csdn.net/qq_28804275/article/details/80892095
Mycat(实践篇 - 基于Mysql的水平切分、主从复制、读写分离)https://blog.csdn.net/qq_28804275/article/details/80892107

mycat在应用当中的作用可以看下图

mycat可以让程序员只需要关心业务代码的编写,而不用担心后端数据库集群的负载均衡,读写分离,分库分表的数据分片逻辑的编写,只要直接连接mycat就可以了

1.首先我们准备一台干净的centos机器,安装好jdk:java -vesion

2.到cd /usr/local/src/下: wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz #http://www.mycat.io/

3.解压:tar zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz

4.移动:mv mycat /usr/local/mycat

5.设置mycat变量 vi /etc/profile

export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin

6.使配置文件立即生效 :source /etc/profile

7.进入mycat的配置文件目录  :cd /usr/local/mycat/conf/

# 把自带的配置文件重命名,作为备份
[root@localhost ~]$ mv /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml_bak# 新建配置文件
[root@localhost ~]$ vim /usr/local/mycat/conf/schema.xml
vi schema.xml    #这个配置文件主要是用来配置数据库节点,逻辑表等等东西的

<?xml version="1.0"?>  #xml文件格式;
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  #文件标签属性;
<mycat:schema xmlns:mycat="http://io.mycat/">  默认"http://org.opencloudb/"更改为 "http://io.mycat/"  #Mycat起始标签
    <!-- 定义MyCat的逻辑库,与server.xml指定库名保持一致,绑定数据节点dn1; -->
    <schema name="pyzctest001" checkSQLschema="false" sqlMaxLimit="100" dataNode="pyNode"></schema>
    <!-- 定义MyCat的数据节点数据库节点:单节点数据库软件一台服务器。双节点数据库软件在两台服务器上 -->
    <dataNode name="pyNode" dataHost="pyHost" database="pyzc001" />
    <!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->
    <!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->
    <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
    <!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->
    <dataHost name="pyHost" maxCon="500" minCon="20" balance="3"
        writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
        <!--心跳检测 检测后端MYSQL实例,SQL语句;show slave status换成select user()-->
        <heartbeat>select user()</heartbeat>
        <!--配置后台数据库的IP地址和端口号,还有账号密码 需要查看数据源 show @@datasource; -->
        <writeHost host="hostMaster???" url="192.168.106.130:3306" user="root" password="py07">
        <readHost host="hostSlave???" url="192.168.106.131:3306" user="root" password="py07" />
         </writeHost>
    </dataHost>    
</mycat:schema>

Balance均衡策略设置:
1)  balance=0  不开启读写分离机制,所有读操作都发送到当前可用writehost;
2)  balance=1  全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡
3)  balance=2  所有读操作都随机的在readhost和writehost上分发;
4)  balance=3  所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力。
writeType 写入策略设置
1)  writeType=0, 所有写操作发送到配置的第一个writeHost;
2)  writeType=1,所有写操作都随机的发送到配置的writeHost;
3)  writeType=2,不执行写操作。
switchType 策略设置
1)  switchType=-1,表示不自动切换;
2)  switchType=1,默认值,自动切换;
3)  switchType=2,基于MySQL 主从同步的状态决定是否切换;
4)  switchType=3,基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。

 vi server.xml:接下来配置用户权限,系统变量,是Mycat服务器参数调整和用户授权的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
    <!-- 这里配置的都是一些系统属性,可以自己查看mycat文档 -->
    <property name="defaultSqlParser">druidparser</property>
    <property name="charset">utf8mb4</property>
    </system>                            
    <!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群 -->
    <user name="user1">
        <property name="password">root</property>
        <property name="schemas">pyzctest001</property>
    </user>         
                  
    <!-- 用户2,只读权限-->
    <user name="user2">
        <property name="password">root</property>
        <property name="schemas">pyzctest001</property>
        <property name="readOnly">true</property>
    </user> 

</mycat:server>
修改防火墙,允许mycat的端口被外界访问

 vi /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9066 -j ACCEPT

然后重启防火墙

service iptables restart
cd /usr/local/mycat/bin/

进入mycat的脚本目录


运行启动命令  ./mycat start
我们可以使用mysql客户端连接或者navicat来连接mycat


接下来我们测试一下读写分离

进入mycat的日志目录

cd /usr/local/mycat/logs/

先测试一下读操作

我们连接到mycat发送一句select *命令试试

可以看到select 操作被路由到了192.168.1.7也就是我们的slave节点

那么我们执行多次看看

结果还是被路由到了读节点

接下来我们测试一下写操作

可见插入被路由到了master节点

最后我们看看master的数据是否被同步到slave

记录成功的同步过来了,可见读写分离搭建成功。
 

# useradd mycat
# passwd mycat

需求:

  • 本地server访问备份server不需要输入密码(做双机密钥认证)
  • 本地脚本备份不需要输入提示任何输入用户名和密码
  • 每天晚上3点开始执行备份,并把日志输出到指定文件。
  • 本机数据保存1个月,备份server保存3个月。

密钥认证:

$ sudo mkdir /root/.ssh    创建一个.ssh的文件夹
$ sudo chmod 700 /root/.ssh   给.ssh的文件夹授权
$ sudo vi /root/.ssh/authorized_keys    复制公钥到此文件

在 /etc/my.cnf中添加mysqldump的user和password

[mysqldump]
user=root
password[email protected]123

备份整个数据库脚本,并删除本地30天以外的数据库!

#! /bin/bash

##backup all of mysql we used
##written by zhdya_20170928

d=`date +%Y%m%d`

mysqldump --all-databases  > /bak/mysql/$d.sql

rsync -az /bak/mysql/$d.sql 192.168.14.107:/bak/mysql/

find /bak/mysql/ -mtime +30 -name '*[1-9].sql' -exec rm -rf {} \;

echo "mysql backup end at `date +"%F %T"`." >>/var/log/mysqlbak.log

linux定时备份mysql数据并同步到其他服务器

(备份还原操作)

###导出数据库

/usr/bin/mysqldump -u root -pwd database > database20180808.sql

###导入数据库

mysql -u root -p database < database20180808.sql

(备份到压缩文件从压缩文件导入)

### 备份到压缩文件

/usr/bin/mysqldump -u root -pwd database | gzip > database20180808.sql.gz

### 压缩文件中解压出来

gzip < database20180808.sql.gz | mysql -u root -p database

(crontab定时备份)

创建备份目录

mkdir -p /bak/mysqlbak

cd /bak/mysqldata

编写运行脚本

vi /usr/sbin/bakmysql.sh

脚本代码

        #!/bin/bash

        # Name:bakmysql.sh

        # This is a ShellScript For Auto DB Backup and Delete old backup

        #

        backupdir=/bak/mysqlbak

        time='date +%Y%m%d%H'

        mysql_bin_dir/mysqldump -u root -pwd database | gzip > $backupdir/database$time.sql.gz

        #

        find $backupdir -name "name_*.sql.gz" -type f -mtime +7 -exec rm {} ; > /dev/null 2>&1

        #

(脚本说明:

  • backupdir mysql备份地址

  • root mysql用户名

  • pwd mysql密码

  • database 数据库名

  • mysql_bin_dir mysql的bin路径;

  • time=` date +%Y%m%d%H `也可以写为time="$(date +"%Y%m%d$H")"其中`符号是TAB键上面的符号,不是ENTER左边的'符号,还有date后要有一个空格。

  • type f 表示查找普通类型的文件,f表示普通文件。

  • mtime +7 按照文件的更改时间来查找文件,+5表示文件更改时间距现在7天以前;如果是 -mmin +5 表示文件更改时间距现在5分钟以前。

  • exec rm {} \ 表示执行一段shell命令,exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个,最后是一个分号。

  • /dev/null 2>&1 把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面;其中的& 表示让该命令在后台执行。

)

3、为脚本添加执行权限

# chmod +x /usr/sbin/bakmysql.sh

4、设置crontab定时执行

vi /etc/crontab

#在最后一行中加入: 00 3 * * * root /usr/sbin/bakmysql.sh

#表示每天3点00分执行备份

注:crontab配置文件格式如下:

分 时 日 月 周  命令

5、重启crontab

/etc/rc.d/init.d/crond restart

这样就完了定时备份并清理前7天的备份数据

同步到其它服务器

这里使用Linux同步文件工具rsync+inotify来进行文件的同步

rsync

rsync是类unix系统下的数据镜像备份工具——remote sync。一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH、rsync主机同步

用法

rsync src dest

这是最简单的用法,表示同步src,dest文件。(即,执行之后,dest的文件与src的相同,以src的为准)

常用选项

  • -a: 等价于-rlptgoD,归档式

  • -r: 递归

  • -l: 复制软件链接

  • -p: 保留权限信息

  • -t: 将src的修改时间,同步到dest

  • -g: 同步组信息(group)

  • -o: 同步拥有者信息(own)

  • -D: 保持字符与块设备文件

  • -z: 启用压缩传输

  • -–delete:如果src没有此文件,那么dest也不能有,即在dest删除src里没有的文件。(如果你使用这个选项,就必须搭配-r选项一起)

## 将本地/bak/mysqlbak/文件同步到 远程服务器 /bak/mysql/bak 目录下面 排除 mysqlbak/index目录 通过ssh端口

rsync -vzacu /bak/mysqlbak/ [email protected]:/bak/mysqlbak --exclude "mysqlbak/index" -e "ssh -p 22"# 将远程目录 /bak/mysqlbak下的文件同步到本地 /bak/mysqlbak/目录下

rsync -vzrtopg --progress --delete [email protected]:/bak/mysqlbak /bak

启用rsync服务器端同步远程文件

rsycn的服务端为服务器的文件接收端,rsycn的客户端为服务器的文件推动端。

rsycn的服务端/文件接收端配置

服务端需要开启rsyncd服务

添加配置文件rsyncd.conf

vi /etc/rsyncd.conf

#以下是全局配置

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

lock file = /var/lock/rsyncd

[mysqlbak] #模块名,在源服务器指定这个名字

comment = sync rsync/home #描述信息

path = /bak/mysqlbak #备份目录

use chroot=no #不使用chroot,不用root权限

read only = no #设置本地备份目录为读写权限

uid=root

gid=root

max connections=10 #客户端最大连接数

auth users = root #指定数据同步用户

secrets file = /etc/rsyncd.pass #指定数据同步用户信息文件

hosts allow=192.168.53.0/85 #允许连接的客户端

ignore errors = yes #忽略出现I/O错误

timeout = 600

创建认证文件

vi /etc/rsyncd.pass

##代码 root:root #格式是用户名:密码

#属主要有权限读这个文件,否则会报没权限

chmod 600 /etc/rsyncd.pass

修改/etc/xinetd.d/rsync文件,disable 改为 no

service rsync

{

disable = no

socket_type = stream

wait = no

user = root

server = /usr/bin/rsync

server_args = --daemon

log_on_failure += USERID

}

启动服务端

rsync --daemon --config=/etc/rsyncd.conf

rsycn的客户端/文件发送端配置

客户端配置简单 只需要配置密码既可

vi /etc/rsync_client.pwd

##代码

root #只需要填写rsync服务的密码

#属主要有权限读这个文件,否则会报没权限

chmod 600 /etc/rsync_client.pwd

客户端同步测试

/usr/bin/rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd /bak/mysqlbak/ [email protected]::mysqlbak

rsync只是一次性同步,如果需要实时同步就需要引入另一个工具了

inotify

Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。

Inotify只需要要按照部署在同步的客户端,当监控的文件有变化触动 rsync脚本来同步

安装

yum install inotify-tools

配置监控的文件路径

vi /etc/inotify_exclude.lst

#代码/bak/mysqlbak #监控目录

@/bak/log #排除监控目录

rsync排除监控文件目录

vi /etc/rsyncd.d/rsync_exclude.lst

#代码

src/*.html*

src/js/

src/2014/20140[1-9]/

客户端同步到远程的脚本rsync.sh

#rsync auto sync script with inotify#variables

current_date=$(date +%Y%m%d_%H%M%S)

source_path=/bak/mysqlbak/

log_file=/var/log/rsync_client.log

#rsync

rsync_server=192.168.53.86

rsync_user=root

rsync_pwd=/etc/rsync_client.pwd

rsync_module=mysqlbak

INOTIFY_EXCLUDE='(.*/*\.log|.*/*\.swp)$|^/tmp/src/mail/(2014|20.*/.*che.*)'

RSYNC_EXCLUDE='/bak/rsync_exclude.lst'#rsync client pwd checkif [ ! -e ${rsync_pwd} ];then

echo -e "rsync client passwod file ${rsync_pwd} does not exist!"

exit 0

fi#inotify_functioninotify_fun(){

/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \

--exclude ${INOTIFY_EXCLUDE} -e modify,delete,create,move,attrib ${source_path} \

| while read file

do

/usr/bin/rsync -auvrtzopgP --exclude-from=${RSYNC_EXCLUDE} --progress --bwlimit=200 --password-file=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server}::${rsync_module}

done

}

#inotify log

inotify_fun >> ${log_file} 2>&1 &

给脚本执行权限,执行后就可以了

chmod 777 rsync.sh

./rsync.sh

13.2 NFS发布服务器,安装expect

13.3 脚本一键安装

14.Mysql、静态文件备份方案

制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器 

制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器

15.数据恢复文档

编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据

16 给三个站点的后台访问做二次认证,增加安全性

17 用shell脚本实现文件、代码同步上线(参考分发系统)

猜你喜欢

转载自blog.csdn.net/xiaoyuerp/article/details/83594309