需求:
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
- 下载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
- 解压 [root@localhost src]# tar zxvf /usr/local/src/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz #zxvf解压缩 zcvf压缩
- 把解压完的数据移动到/usr/local/mysql[root@localhost src]# mv mysql-5.6.39-linux-glibc2.12-x86_64 /usr/local/mysql
- 建立mysql用户[root@localhost src]# useradd -s /sbin/nologin mysql #只是不允许系统login,可以使用其他ftp等服务
- 初始化数据库
[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)- 拷贝配置文件[root@localhost mysql]# cp support-files/my-default.cnf /etc/my.cnf
- 拷贝启动脚本文件并修改其属性
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# chmod 755 /etc/init.d/mysqld- 修改启动脚本[root@localhost mysql]# vim /etc/init.d/mysqld
需要修改的地方有 “datadir=/data/mysql” (前面初始化数据库时定义的目录)- 把启动脚本加入系统服务项,并设定开机启动,启动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全称是“通用网关接口”
- 下载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
- 解压php [root@localhost src]# tar zxf php-5.3.27.tar.gz
- 创建相关账户[root@localhost src]# useradd -s /sbin/nologin php-fpm
- 配置编译参数:
[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 一般都是缺少依赖安装包- 编译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- 安装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参数…。- 修改配置文件
cp php.ini-production /usr/local/php/etc/php.ini
vim /usr/local/php/etc/php-fpm.conf
把如下内容写入该文件:保存配置文件后,检验配置是否正确的方法为:/usr/local/php/sbin/php-fpm -t 如果出现诸如 “test is successful” 字样,说明配置没有问题。[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
- 启动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.
- 下载nginx cd /usr/local/src/ wget http://nginx.org/download/nginx-1.4.4.tar.gz
- 解压nginx tar zxvf nginx-1.4.4.tar.gz
- 配置编译参数
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
- 编译nginx : make
- 安装nginx : make install 因为nginx比较小,所以很快就会安装完,而且也不会出什么错误,(http://www.aminglinux.com/bbs/forum-40-1.html)
- 编写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
- 更改nginx配置首先把原来的配置文件清空:
> /usr/local/nginx/conf/nginx.conf “>” #这个符号为重定向的意思,可以把一个文本文档快速清空。
vim /usr/local/nginx/conf/nginx.conf #写入如下内容:保存配置后,先检验一下配置文件是否有错误存在:/usr/local/nginx/sbin/nginx -t #如果显示内容如下,则配置正确,否则需要根据错误提示修改配置文件: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; } } }
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.jarexport 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/
wgethttp://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/80892095Mycat(实践篇 - 基于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/ root@192.168.53.86:/bak/mysqlbak --exclude "mysqlbak/index" -e "ssh -p 22"# 将远程目录 /bak/mysqlbak下的文件同步到本地 /bak/mysqlbak/目录下
rsync -vzrtopg --progress --delete root@192.168.53.85:/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/ root@192.168.53.86::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脚本实现文件、代码同步上线(参考分发系统)