- 需要使用高版本的JDBC驱动,“mysql-connector-java 8”以上版本,具体可通过数据库版本取maven库中查看驱动版本
- JDBC driver 由“com.mysql.jdbc.Driver”改为“com.mysql.cj.jdbc.Driver
Docker环境下的前后端分离项目部署与运维
学习视频:https://coding.imooc.com/learn/list/219.html
简介
人人开源项目:https://www.renren.io/
项目部署图解:
开发环境要求
软件:宿主机-Vmware虚拟机(CentOS/Ubuntu)-Docker虚拟机
MySQL集群
单节点数据库无法满足性能上的要求及高可用冗余设计,大型互联网程序用户群体庞大,架构必须特殊设计,mysql常见集群方案:
PXC方案原理
PXC(Percona XtraDB Cluster):建议PXC使用PerconaServer(MySQL改进版,性能提升很大)
PXC数据强一致性:同步复制,事物在所有集群节点要么同时提交,要么不提交
PXC集群搭建
网络准备:
1 | docker network create --subnet=172.18.0.0/24 net1 |
准备数据卷:
1 | docker volume create --name v1 |
创建pxc容器:每个MySQL容器创建之后,因为要执行PXC的初始化和加入集群等工作,耐心等待1分钟左右再用客户 端连接MySQL。另外,必须第1个MySQL节点启动成功,用MySQL客户端能连接上之后,再去创建其他 MySQL节点。
1 | docker pull percona/percona-xtradb-cluster |
通过客户端测试数据库集群:
- 输入数据库ip为宿主机ip,端口为映射ip,如:3307、3308等连接不同节点
- 任意节点建库、建表测试是否同步
数据库集群的负载均衡
使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好
haproxy使用
- docker pull haproxy //获取haproxy系统镜像
- 创建haproxy配置文件: sudo vim /media/psf/LinuxShare/data/conf/haproxy.cfg,更多配置查看:https://zhang.ge/5125.html
1 | global |
- 创建haproxy容器
1 | #创建第1个Haproxy负载均衡服务器 |
- 创建数据库haproxy用户:create user ‘haproxy’@’%’ identified by ‘’;
- 启动haproxy
1 | docker exec -it h1 bash |
- 浏览器访问:
浏览器访问地址:http://宿主机ip:4001/dbs - 数据库访问:
ip为宿主机ip,端口4002,见第三步 - 测试节点宕机
- docker stop node1;查看浏览器,node1节点是否宕机
- 恢复node1节点:删除node1节点,重新以从节点方式创建node1即可
1 | docker rm node1 |
虚拟IP地址技术
keepalived实现双机热备
- Keepalived必须安装在haproxy容器内
1 | docker exec -it h1 bash |
配置文件内容为:
1 | vrrp_instance VI_1 { |
1 | virtual_server 192.168.99.150 8888 { |
暂停PXC集群的办法
- 在/etc/sysctl.conf文件末尾添加:net.ipv4.ip_forward=1;重启网络服务:systectl restart network
Replication方案原理
Replication采用异步复制,单向同步,无法保证数据的一致性
参考文章:
–sql
stop slave;
show slave status;
PXC集群安装
MySQL集群(PXC)入门:https://www.imooc.com/learn/993
Redis集群
高速缓存:利用内存保存数据,读写速度远超硬盘;减少I/O操作
Redis集群方案
- RedisCluster:官方推荐,没有中心节点,客户端与redis节点直连,不需要中间代理层;数据可被分片存储;管理方便,后续可自行增删节点
- Codis:中间件产品,存在中心节点,360公司产品
- Twemproxy:中间件产品,存在中心节点
- Redis集群中应该包含奇数个Master,至少应该有3个Master
- Redis集群中每个Master都应该有Slave
- redis集群不配置负载均衡是因为在前后端分离项目中Spring程序实现了负载均衡
RedisCluster架构
Redis主从同步
- Redis集群中的数据库复制是通过主从同步来实现的
- 主节点(Master)把数据分发给从节点(Slave)
- 主从同步的好处在于高可用,Redis节点有冗余设计
RedisCluster集群搭建
网络准备:
1 | docker network create --subnet=172.19.0.0/16 net2 |
镜像准备:
1 | docker pull grokzen/redis-cluster |
容器创建:
1 | docker run -it -d --name r1 -p 5001:6379 --net=net2 --ip 172.19.0.2 yyyyttttwwww/redis bash |
配置redis配置文件:(默认关闭了redis集群功能)
1 | //逐个进入容器,如: |
逐个启动redis服务
1 | /usr/redis/src/redis-server /usr/redis/redis.conf |
通过redis-trib.rb(redis自带,需要ruby环境)创建集群
1 | //进入任一容器,如: |
测试集群效果
1 | //逐个任一容器,如: |
Docker Compose
- Docker-Compose用于解决容器与容器之间如何管理编排的问题
- Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
Compose 中有两个重要的概念
- 服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
- 项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义
Docker Compose 安装
Docker Compose 是 Docker 的独立产品,需自行安装
1 | sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose |
基本使用
- 启动服务:docker-compose up -d //在后台启动服务
- 查看启动的服务:docker-compose ps
- 停止服务: docker-compose stop
常用命令
1 | #查看帮助 |
Docker Swarm
课后作业
源码解析
Java开发其他配置
maven配置
官网:http://maven.apache.org/
下载:http://maven.apache.org/download.cgi
- 下载解压安装包:tar zvxf apache-maven-3.5.0-bin.tar.gz
- 配置maven环境变量:sudo vim /etc/profile,编辑系统配置文件
1 | #set Maven environment |
source /etc/profile
3. 执行mvn -v查看是否安装完成
配置maven的镜像仓库
- 在conf目录中找到settings.xml 文件,配置mirrors的子节点,添加如下mirror
1 | //阿里云Maven镜像: |
MQTT入门
简介
- MQTT(英语全称,Message Queue Telemetry Transport),中文翻译过来就是遥测传输协议,是一个轻量级的消息总线协议,提供消息订阅与发布,属于物联网(Internet of Thing)的一个传输协议
- 主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN
- MQTT是一套标准,常用的服务端有Eclipse的Mosquitto。MQTT是IBM出品,Eclipse也是IBM出品,所以Mosquitto算是官方实现吧
- MQTT在通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
MQTT协议中文版: https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html
消息发布服务质量(QoS)
为了满足不同的场景,MQTT支持三种不同级别的服务质量(Quality of Service,QoS)为不同场景提供消息可靠性:
- 级别0:尽力而为,“至多一次”。消息发布完全依赖底层TCP/IP网络,遇到意外并不会重试,会发生消息丢失或重复,这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了
- 级别1:“至少一次”,确保消息到达,但消息重复可能会发生。
- 级别2:“只有一次”,确保消息到达一次
实现方式
- 实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)
- 消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
- Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
- payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
消息类型
MQTT拥有14种不同的消息类型:
1 | CONNECT:客户端连接到MQTT代理 |
mosquitto
一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单
1 | mosquitto – 代理器主程序 |
安装
1 | sudo apt-get install mosquitto |
测试
订阅主题
1 | mosquitto_sub -h 10.211.55.3 -t "mtopic" -v |
再打开一个终端,发布主题
1 | mosquitto_pub -h 10.211.55.3 -t "mtopic" -m "Hello mqtt" |
更多配置
- 更多配置参数讲解,参考:https://www.cnblogs.com/saryli/p/9812452.html
- mosquitto默认可匿名访问,password-file密码文件,acl_file访问控制列表,通过mosquitto.conf启用,编辑文末添加如下:
1 | allow_anonymous false |
- 准备配置的相关配置文件
1 | cd /usr/share/doc/mosquitto/examples/ |
- 添加用户
添加用户admin、mosquitto,密码同用户名
1 | sudo mosquitto_passwd -b /etc/mosquitto/pwfile.conf mosquitto mosquitto |
- 关联Topic和用户
admin设置为订阅权限,并且只能访问的主题为"root/topic/#",mosquitto 设置为发布权限,并且只能访问的主题为"root/topic/#",编辑aclfile.conf:
1 | user admin |
read 订阅权限 、write 发布权限、# 通配符表示所有的
- 重启服务,测试配置
1 | ps -aux|grep mosquitto |
- 启动订阅端
1 | mosquitto_sub -h localhost -t "mtopic" -u mosquitto -P mosquitto -v |
- 启动发布端
再打开一个终端
1 | mosquitto_pub -h localhost -t "mtopic" -u admin -P admin -m "Hello mqtt user" |
Java实现
Maven依赖 MQTT的Java客户端的使用
1 | <dependency> |
zookeeper入门
简介
- 中间件,提供协调服务
- 作用于分布式系统,发挥其优势,可以为大数据服务
- 支持java,提供java和c语言对客户端api
zookeeper=文件系统+监听通知机制
分布式系统
- 很多台计算机组成一个整体,一个整体一致对外并且处理同一请求
- 内部的每台计算机都可以相互通信(rest/rpc)
- 客户端到服务端的一次请求到响应结束会历经多台计算机
自行搜索图解
zookeeper的特性
- 一致性:数据一致性,数据按顺序分批入库
- 原子性:事物要么成功要么失败,不会局部化
- 单一视图:客户端连接集群中任一zk节点,数据都是一致的
- 可靠性:每次对zk的操作状态都会保存在服务端
- 实时性:客户端可以读取到zk服务端的最新数据
安装配置
官网: http://zookeeper.apache.org/
Linux安装
下载: https://archive.apache.org/dist/zookeeper/
解压文件到/usr/local/后配置环境:vim /etc/profile,添加:
1 | export ZOOKEEPER_HOME=/usr/local/zookeeper |
macOS安装
brew install zookeeper //安装位置/usr/local/etc/zookeeper
https://blog.csdn.net/whereismatrix/article/details/50420099
安装启动遇到问题及解决:
zookeeper主要目录结构
zookeeper配置文件介绍
- cp conf/zoo_sample.cfg conf/zoo.cfg
- tickTime
- dataDir必须配置
- dataLogDir建议配置,否则和dataDir公用
- clientPort
zookeeper数据模型
- 是一个树形结构,类似于前端开发中的tree.js组件
- zk的数据模型也可以理解为unix/linux的文件目录
- 每一个节点都成为znode,他可以有自节点,也可以有数据
- 每个节点分为临时节点和永久节点,临时节点在客户端断开后消失
- 每个zk节点都有各自的版本号,可以通过命令行来显示节点信息
- 每当节点数据发生变化,那么该节点的版本号会累加(乐观锁)
- 删除/修改过时的节点,版本号不匹配则会报错
- 每个zk节点存储的数据不宜过大,几k即可
- 节点可以设置权限acl,可以通过权限来限制用户的访问
基本操作:
- 客户端连接:bin/zkCli.sh 可以输入help回车查看支持的命令
- 查看znode结构: ls命令,一层层查看
- 关闭客户端连接: ctrl+c
zookeeper作用体现
- master节点选举,主节点挂了之后,从节点就会接手工作,并且保证这个节点是唯一的,这也是所谓的首脑模式,从而保证我们集群是高可用的
- 统一配置文件管理,即只需部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用的特别多(假设修改了redis统一配置)
- 发布与订阅,类似于消息队列MQ(amq,rmq…),dubbo发布者把数据存在znode上,订阅者会读取这个数据
- 提供分布式锁,分布式环境中不通进程之间争夺资源,类似于多线程中的锁
- 集群管理,集群中保证数据的强一致性
四种类型的znode
- PERSISTENT-持久化目录节点:客户端与zookeeper断开连接后,该节点依旧存在
- PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点:客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
- EPHEMERAL-临时目录节点:客户端与zookeeper断开连接后,该节点被删除
- EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点:客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
监听通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
Zookeeper客户端的使用
- zkCli.sh:可使用./zkCli.sh -server localhost来连接到Zookeeper服务上
- Java客户端:可创建org.apache.zookeeper.ZooKeeper对象来作为zk的客户端,注意,java api里创建zk客户端是异步的,为防止在客户端还未完成创建就被使用的情况,这里可以使用同步计时器,确保zk对象创建完成再被使用
- C客户端
zookeeper常用命令行操作
启动服务:./zkServer.sh,连接客户端进入命令行后台:./zkCli.sh
- ls与ls2
- get与stat
zk特性-session的基本原理:客户端与服务端之间的连接存在会话;每个会话都可以设置一个超时时间;心跳结束,session则过期;session过期则临时节点znode会被抛弃
心跳机制:客户端向服务端的ping包请求
zk特性-watcher机制:针对每个节点的操作,都会有一个监督者watcher;当监控的某个znode发生了变化则出发watcher事件;zk中的watcher是一次性的,触发后立即销毁;父节点、子节点增删改都能触发其watcher
事件触发的类型及分类
ACL(access control lists)权限控制
- 针对节点可以设置相关读写等权限,目的为了保障数据安全性
- 权限permissions可以指定不同的权限范围以及角色
登录: addauth digest imooc:imooc
acl命令行
- getAcl:获取某个节点的acl权限信息
- setAcl:设置某个节点的acl权限信息
- addauth:输入认证授权信息,注册时输入明文密码(登录),但在zk的系统里,密码是以加密的形式存在的
zk的acl通过[scheme🆔permissions]来构成权限列表:
- scheme:代表采用的某种权限机制
- world:它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的
- auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)
- digest:它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
- ip:: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段
- super:代表超级管理员,拥有所有的权限
1 | //修改zkServer.sh增加super管理员 |
- id:代表允许访问的用户
- permissions:权限组合字符串(crdwa)
- create:创建子节点
- read:获取节点/子节点
- write:设置节点数据
- delete:删除子节点
- admin:设置权限
acl常用使用场景
- 开发/测试环境分离,开发者无权限操作测试库的节点,只能看
- 生产环境上控制指定ip的服务可以访问相关节点,防止混乱
zookeeper四字命令
- zk可以通过他自身提供的简写命令来和服务器进行交互
- 需要使用到nc命令,安装:yum install nc
- echo [command] | nc [ip] [port],如:echo ruok | nc localhost 2181
- stat:查看zk的状态信息,以及是否mode
- ruok:查看当前zkServer是否启动,返回imok
- dump: 列出未经处理的会话和临时节点
- conf:查看服务器配置
- cons:展示连接到服务器的客户端信息
- envi:展示环境变量
- mntr:监控zk健康信息
- wchs:展示watcher信息
白名单设置
zookeeper集群搭建
- zk集群,主从节点,心跳机制(选举模式),服务器数:2n+1
注意事项:
- 配置数据文件 myid 1/2/3 对应server.1/2/3
- 通过./zkCli.sh -server [ip]:[port]检测集群是否配置成功
- 通过./zkServer.sh status查看zk节点在集群中的状态
集群搭建前置
在本地单机配置zk启动及一般操作正常,假设本地zk目录为:/usr/zookeeper
单机伪分布式zk集群搭建
- 准备zk单个节点
1 | sudo mkdir /usr/zookerperGroup |
- 修改相关配置
依次进入zk1、zk2、zk3的conf目录,编辑zoo.cfg文件:
- 修改clientPort依次为:2191,2192,2193
- 修改dataDir、dataLogDir路径为:usr/zookerperGroup/zk{X}/data和usr/zookerperGroup/zk{X}/dataLog
- 在文件末添加如下内容:(此处IP地址也可改为实际地址)
1 | server.1=127.0.0.1:2888:3888 |
此配置需细心,切不可漏配、少配,我的配置如下图:
3. 创建myid文件
- 依次进入zk1、zk2、zk3的data目录,sudo vim myid,输入内容依次为:1,2,3保存
- 依次启动zk服务
- 依次进入zk1、zk2、zk3的bin目录,启动zk服务:sudo ./zkServer.sh start
- 测试集群
- 进入zk1的bin,连接zk服务器,如:sudo zkCli.sh -server 127.0.0.1:2191
- 在zk1中创建节点:create /test Hello
- 进入zk2的bin,连接zk服务器,如:sudo zkCli.sh -server 127.0.0.1:2192
- 获取test节点信息,如:ls /;get /test
- 通过sudo ./zkServer status查看集群节点信息
真实环境zk集群搭建
- 需注意:环境变量的配置,ip配置不同,端口号可以相同
- 真实环境就是在多台机器间搭建zk集群,个人的话可通过虚拟机虚拟多台机器的方式学习,此处记录和单机伪分布式部署的不同及简单步骤:
- 在需要搭建集群的节点机器按照本文【安装配置】中方式完成安装和系统环境变量设置;
- 配置各机器网络,保证各机器网络互通,假设有3台机器,其ip地址为:192.168.1.111/112/113
- 修改各台机器的zoo.cfg配置文件
- 配置各机器端口为统一端口,如默认:2181
- 配置dataDir和dataLogDir,尽量各机器保持一致
- 在各机器zoo.cfg文末添加集群配置,如:
1 | server.1=192.168.1.111:2888:3888 |
- 在各机器创建myid文件,sudo vim myid,输入内容依次为:1,2,3保存
- 进入各机器,启动zk服务:sudo ./zkServer.sh start
- 测试集群节点状态:sudo ./zkServer status,通过sudo ./zkCli.sh -server 192.168.1.111:2181,同时通过如上单机伪分布式方式测试数据同步;强制关闭主节点测试主节点选举等
API操作相关代码
ZooKeeper的api支持多种语言,在操作时可以选择使用同步api还是异步api。同步api一般是直接返回结果,异步api一般是通过回调来传送执行结果的,一般方法中有某参数是类AsyncCallback的内部接口,那么该方法应该就是异步调用,回调方法名为processResult。
具体操作代码详见:
缺点:
- 超时重连不支持自动,需手动重连
- watch注册一次后会失效
- 不支持递归创建节点
Apache Curator客户端使用
Curator的Maven依赖如下,一般直接使用curator-recipes就行了,如果需要自己封装一些底层些的功能的话,例如增加连接管理重试机制等,则可以引入curator-framework包。
1 | <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework --> |
- curator引入,版本要和zookeeper匹配,具体参考:http://curator.apache.org/zk-compatibility.html
- curator重试连接策略:ExponentialBackoffRetry、RetryNTimes、RetryOneTimes、RetryUntilElapsed
- Curator提供了三种Watcher(Cache)来监听结点的变化:
- Path Cache:监视一个路径下1)孩子结点的创建、2)删除,3)以及结点数据的更新。产生的事件会传递给注册的PathChildrenCacheListener。
- Node Cache:监视一个结点的创建、更新、删除,并将结点的数据缓存在本地。
- Tree Cache:Path Cache和Node Cache的“合体”,监视路径下的创建、更新、删除事件,并缓存路径下所有孩子结点的数据。
参考文章
JWT(JSON Web Tokens)入门
简介
- JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间作为JSON对象安全地传输信息
- JWT入门级别原理(推荐优先读):http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
基本使用
1 | <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --> |
实现参考:
Android中主题(Theme)和样式(Style)使用
Theme和Style说明
- Theme是全局的设计风格。style是局部的设计风格
- Theme是一套UI控件和Activity的样式。可以给Application 和 activity 设置主题。来设置显示界面的样式
- style是针对view来说的,比如 TextView,EditText这些,而Theme必须针对整个activity或者 整个application,你必须在AndroidManifest.xml中 的
或者 中定义 - Style的xml文件要求:
1 | 1. 他的根节点必须 是<resources> |
Theme设置
Theme设置
1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
Theme继承并重写
在value->style里定义主题。可以继承并重写属性
1 | <!-- 兼容主题 深色主题 activity背景默认黑色,字体默认白色--> |
代码中设置Activity主题
- Activity 是 ContextThemeWrapper的子类。而ContextThemeWrapper一个很重要的属性就是Theme
- 实例化一个View必须要 new View(Context context) 。因为View需要把Attributes交给Context的Theme来确定一堆属性(在一个叫TypedArray的容器里)
Theme设置注意事项
- 如果使用 android.support.v7.app.ActionBarActivity 就必须要用兼容主题Theme.AppCompat。
1 | ActionBarActivity 的存在就是为了兼容低API。让他们用上高API的东西。比如Toolbar |
- Holo主题是Android4.0开始谷歌极力推行的Android Design的主题
1 | <style name="AppTheme5" parent="android:Theme.Holo"> |
- Android5.0谷歌又推出了Material Design来取代Android Design
1 | <style name="AppTheme5" parent="android:Theme.Material"> |
Theme来源
在Android Studio中书写主题时都会有自动提示
- 来自Android系统自带的。自带的主题要加上“android:”,如:android:Theme.Black
- 来自兼容包的(比如v7兼容包)。使用v7兼容包中的主题不需要前缀,直接:Theme.AppCompat
- 自己写一个主题
Theme种类
- 所有能应用于应用程序主题都是以“Theme.”开头
- 在v7中有很多以“Base”开头的主题,是一些父主题,不建议直接使用
1 | 系统自带主题: |
Theme风格种类
1 | Black 黑色风格 |
每个主题中定义item分类
https://yq.aliyun.com/articles/72108
颜色、字体、按钮、list、window、Dialog、AlertDialog、Panel、滚动条、文字选中(Text Selection)、Widget样式、Preference样式、search控件样式、ActionBar样式、其他样式
SVN迁移
SVN_Root为所有SVN操作根目录,包括所有的软件、资源库等
- Soft:为搭建SVN环境相关的软件
- Subversion:为SVN服务端软件安装目录
- SVN_BAK:为SVN备份文件
- repos:SVN仓库的根目录
- ReadMe:当前目录说明文件
所有命令行操作需要管理员权限
服务启动:
svnserve.exe -d -r D:\SVN_Root\repos
SVN还原
svnadmin load D:\SVN_Root\repos\repos < D:\repos.dump
注册为系统服务
sc create svn binpath= ““D:\SVN_Root\Subversion\bin\svnserve.exe” --service -r D:\SVN_Root\repos” displayname= “Subversion Server” depend= Tcpip start= auto
项目更换服务器,需迁移SVN,现记录过程。
Subversion简介
- Subversion(简称SVN)是一款功能强大的开源版本控制工具,支持Linux和Windows平台。
- SVN可以有两个访问方式,一种是独立服务器直接访问,即利用svnserve命令启动服务,通过svn://yourdomain.com/project进行访问和操作。另一种结合apache,利用HTTP协议,通过http://yourdomain.com/svn/project进行访问及各类操作。如果服务器需要在互联网上共享,一般选择后一种方式。
- 通常情况下,如果选择SVN Server和Apache HTTP Server各自独立安装,配置起来会比较繁琐。
软件下载
服务器:Subversion v1.7 http://sourceforge.net/projects/win32svn/
客户端:Tortoisesvn V1.7 http://tortoisesvn.net/downloads.html
结构说明
D:/svnroot
├─project1
│ ├─conf
│ ├─dav
│ ├─db
│ │ ├─revprops
│ │ ├─revs
│ │ └─transactions
│ ├─hooks
│ └─locks
└─project2
├─conf
├─dav
├─db
│ ├─revprops
│ ├─revs
│ └─transactions
├─hooks
└─locks
其中:svnroot文件夹为存放所有仓库,也是服务启动的时候需指定的目录,下面的各项为项目目录
启动服务
启动独立服务方式
svnserve –d –r e:/svn_repository/
访问方法:svn://localhost/dev,或file:///3:/svn_repository/dev
启动apache方式
cd D:/Program Files/CollabNet Subversion Server/httpd/bin
httpd.exe
访问方法:http://localhost/svn/dev/
本项目所使用过程
所有命令行操作需要管理员权限
1.服务启动:
svnserve.exe -d -r D:\SVN_Root\repos
2.SVN备份(从源服务器备份,如:192.168.11.121):
A:svnadmin dump d:\svn\repos\project1> dump.dump >D:\repos.dump .dump后缀不能丢
B:备份d:\svn\repos\project1下conf目录
3.SVN还原(拷贝.dump文件到目的服务器,如:192.168.7.116):
A:svnadmin create D:\SVN_Root\repos\project1
B:svnadmin load D:\SVN_Root\repos\project1 < D:\repos.dump
C:拷贝2.B中备份的conf文件夹覆盖D:\SVN_Root\repos\project1下conf文件
4.注册为系统服务
sc create svn binpath= ““D:\SVN_Root\Subversion\bin\svnserve.exe” --service -r D:\SVN_Root\repos” displayname= “Subversion Server” depend= Tcpip start= auto
荐读:
svnadmin命令:
http://blog.csdn.net/wzq9706/article/details/7319728
http://www.ityen.com/archives/529
svn命令:http://blog.sina.com.cn/s/blog_963453200101eiuq.html,svn命令也可通过Tortoisesvn客户端操作代替
MongoDB集群搭建
##集群环境:三台服务器
server1:10.62.0.128主;server2:10.62.0.135从;server3:10.62.0.159从
每一台分为6个片:shard1~shard6端口为47017,47018,47019,47020,47021,47022;每一片建三个副本集;配置服务器端口号:37017;路由服务器端口号:30000;
(1).解压安装文件
[gsunis@gsunis Desktop]$ tar zxvf mongodb-linux-x86_64-3.0.6.tgz
(2).将mongoDB文件移动到/home/gsunis/mongodb目录下
[root@gsunis Desktop]# mv mongodb-linux-x86_64-3.0.6 /home/gsunis/mongodb
(3).数据存储目录
[root@gsunis bin]# mkdir -p /home/gsunis/data/db
(4).启动mongod服务
[root@gsunis Desktop]# cd /home/gsunis/mongodb/bin
[root@gsunis bin]# ./mongod --port 27017 --dbpath=/home/gsunis/data/db
(5).启动mongo客户端
打开新的Terminal
[gsunis@gsunis Desktop]$ su
查看mongod服务启动情况
[root@gsunis Desktop]# netstat -ntpl | grep 27017
[root@gsunis Desktop]# cd /home/gsunis/mongodb/bin/
[root@gsunis bin]# ./mongo
###正常关闭mongoDB服务
./mongo
use admin
db.shutdownServer() 或者ps -ef|grep mongodb kill -2 pid
##以上是简单的安装mongodb,下面是开始建立集群,分片和建立副本集
###创建目录
mkdir -p /data/conf
mkdir -p /data/data1
mkdir -p /data/data2
mkdir -p /data/data3
mkdir -p /data/data4
mkdir -p /data/data5
mkdir -p /data/data6
(6).编辑mongo配置文件
sudo vi conf.cnf
//conf.cnf
port=37017
dbpath=/home/gsunis/data/conf
logappend = true
fork=true
logpath=/home/gsunis/data/conf/mongodb.log
nojournal=false
configsvr=true
profile=1
sudo vi db1.cnf
//db1.cnf
replSet=shard1
port=47017
dbpath=/home/gsunis/data/data1
logappend = true
fork=true
logpath=/home/gsunis/data/data1/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db2.cnf
//db2.cnf
replSet=shard2
port=47018
dbpath=/home/gsunis/data/data2
logappend = true
fork=true
logpath=/home/gsunis/data/data2/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db3.cnf
//db3.cnf
replSet=shard3
port=47019
dbpath=/home/gsunis/data/data3
logappend = true
fork=true
logpath=/home/gsunis/data/data3/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db4.cnf
//db4.cnf
replSet=shard4
port=47020
dbpath=/home/gsunis/data/data4
logappend = true
fork=true
logpath=/home/gsunis/data/data4/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db5.cnf
//db5.cnf
replSet=shard5
port=47021
dbpath=/home/gsunis/data/data5
logappend = true
fork=true
logpath=/home/gsunis/data/data5/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db6.cnf
//db6.cnf
replSet=shard6
port=47022
dbpath=/home/gsunis/data/data6
logappend = true
fork=true
logpath=/home/gsunis/data/data6/mongodb.log
nojournal=false
shardsvr=true
profile=1
(7).编写启动mongo服务的脚本
sudo vi mg.sh
#!/bin/bash
instance=$1
action=$2
case "$action" in
'start')
/home/gsunis/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf ;;
'stop')
/home/gsunis/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf --shutdown;;
'restart')
/home/gsunis/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf --shutdown
/home/gsunis/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf;;
esac
(8).启动mongo服务脚本
sudo vi start.sh
#!/bin/bash
rm /data/conf/*.lock
rm /data/data1/*.lock
rm /data/data2/*.lock
rm /data/data3/*.lock
rm /data/data4/*.lock
rm /data/data5/*.lock
rm /data/data6/*.lock
/home/gsunis/data/mg.sh db1 start
/home/gsunis/data/mg.sh db2 start
/home/gsunis/data/mg.sh db3 start
/home/gsunis/data/mg.sh db4 start
/home/gsunis/data/mg.sh db5 start
/home/gsunis/data/mg.sh db6 start
sudo vi stop.sh
#!/bin/bash
/home/gsunis/data/mg.sh conf stop
/home/gsunis/data/mg.sh db1 stop
/home/gsunis/data/mg.sh db2 stop
/home/gsunis/data/mg.sh db3 stop
/home/gsunis/data/mg.sh db4 stop
/home/gsunis/data/mg.sh db5 stop
/home/gsunis/data/mg.sh db6 stop
###准备工作做好,先启动配置服务器(先启动主,依次启动两从机)
/home/gsunis/data/mg.sh conf start
###再启动路由服务器(先启动主,依次启动两从机)
/home/gsunis/mongodb/bin/mongos --configdb 10.62.0.128:37017,10.62.0.135:37017,10.62.0.159:37017 --port 30000 --chunkSize 1 --logpath /home/gsunis/data/mongos1.log --logappend --fork
###最后启动mongod(先启动主,依次启动两从机)
/home/gsunis/mongodb/data/start.sh
(9).shard服务器副本集的建立(只需要在主机上做即可,两从机会自动复制)
./mongo --port 47017
config = {_id: 'shard1', members: [
{_id: 0, host: '10.62.0.128:47017'},
{_id: 1, host: '10.62.0.135:47017'},
{_id: 2, host: '10.62.0.159:47017'}]
}
rs.initiate(config)
Ctrl + C 退出
- rs.add({"_id":2,“host”:“10.62.0.135:47017”}) #在线增加复制集
./mongo --port 47018
config = {_id: 'shard2', members: [
{_id: 0, host: '10.62.0.128:47018'},
{_id: 1, host: '10.62.0.135:47018'},
{_id: 2, host: '10.62.0.159:47018'}]
}
rs.initiate(config)
./mongo --port 47019
config = {_id: 'shard3', members: [
{_id: 0, host: '10.62.0.128:47019'},
{_id: 1, host: '10.62.0.135:47019'},
{_id: 2, host: '10.62.0.159:47019'}]
}
rs.initiate(config)
./mongo --port 47020
config = {_id: 'shard4', members: [
{_id: 0, host: '10.62.0.128:47020'},
{_id: 1, host: '10.62.0.135:47020'},
{_id: 2, host: '10.62.0.159:47020'}]
}
rs.initiate(config)
./mongo --port 47021
config = {_id: 'shard5', members: [
{_id: 0, host: '10.62.0.128:47021'},
{_id: 1, host: '10.62.0.135:47021'},
{_id: 2, host: '10.62.0.159:47021'}]
}
rs.initiate(config)
./mongo --port 47022
config = {_id: 'shard6', members: [
{_id: 0, host: '10.62.0.128:47022'},
{_id: 1, host: '10.62.0.135:47022'},
{_id: 2, host: '10.62.0.159:47022'}]
}
rs.initiate(config)
配置sharding:登录到mongos,添加shard节点
./mongo --port 30000
use admin
db.runCommand({addshard:"shard1/10.62.0.128:47017,10.62.0.159:47017,10.62.0.135:47017"});
db.runCommand({addshard:"shard2/10.62.0.128:47018,10.62.0.159:47018,10.62.0.135:47018"});
db.runCommand({addshard:"shard3/10.62.0.128:47019,10.62.0.159:47019,10.62.0.135:47019"});
db.runCommand({addshard:"shard4/10.62.0.128:47020,10.62.0.159:47020,10.62.0.135:47020"});
db.runCommand({addshard:"shard5/10.62.0.128:47021,10.62.0.159:47021,10.62.0.135:47021"});
db.runCommand({addshard:"shard6/10.62.0.128:47022,10.62.0.159:47022,10.62.0.135:47022"});
use config
db.shards.find()
启动路由服务出错
错误:
解决方法:
- (1).关闭所有mongo相关服务
- (2).先启配置服务 Config Server
- (3).启动路由服务 mongos
- (4).最后启动所有mongod服务 mongod
###远程copy
scp /home/gsunis/Tools/mongodb-linux-x86_64-3.0.6.tgz gsunis@10.62.0.135:/home/gsunis/
MongoDB安装
(1).解压安装文件
[gsunis@gsunis Desktop]$ tar zxvf mongodb-linux-x86_64-3.0.6.tgz
(2).将mongoDB文件移动到/usr/local/mongodb目录下
[root@gsunis Desktop]# mv mongodb-linux-x86_64-3.0.6 /usr/local/mongodb
export PATH=/usr/local/mongodb/bin:$PATH
(3).数据存储目录
[root@gsunis bin]# mkdir -p /home/gsunis/data/db
mkdir -p /data/conf
mkdir -p /data/data1
mkdir -p /data/data2
mkdir -p /data/data3
mkdir -p /data/data4
mkdir -p /data/data5
mkdir -p /data/data6
(4).启动mongod服务
[root@gsunis Desktop]# cd /usr/local/mongodb/bin
[root@gsunis bin]# ./mongod --port 27017 --dbpath=/home/gsunis/data/db
(5).启动mongo客户端
打开新的Terminal
[gsunis@gsunis Desktop]$ su
查看mongod服务启动情况
[root@gsunis Desktop]# netstat -ntpl | grep 27017
[root@gsunis Desktop]# cd /usr/local/mongodb/bin/
[root@gsunis bin]# ./mongo
(6).编辑mongo配置文件
sudo vi conf.cnf
//conf.cnf
rest=true
port=37017
dbpath=/home/gsunis/data/conf
logappend = true
fork=true
logpath=/home/gsunis/data/conf/mongodb.log
nojournal=false
configsvr=true
profile=1
sudo vi db1.cnf
//db1.cnf
replSet=shard1
rest=true
port=47017
dbpath=/home/gsunis/data/data1
logappend = true
fork=true
logpath=/home/gsunis/data/data1/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db2.cnf
//db2.cnf
replSet=shard2
rest=true
port=47018
dbpath=/home/gsunis/data/data2
logappend = true
fork=true
logpath=/home/gsunis/data/data2/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db3.cnf
//db3.cnf
replSet=shard3
rest=true
port=47019
dbpath=/home/gsunis/data/data3
logappend = true
fork=true
logpath=/home/gsunis/data/data3/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db4.cnf
//db4.cnf
replSet=shard4
rest=true
port=47020
dbpath=/home/gsunis/data/data4
logappend = true
fork=true
logpath=/home/gsunis/data/data4/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db5.cnf
//db5.cnf
replSet=shard5
rest=true
port=47021
dbpath=/home/gsunis/data/data5
logappend = true
fork=true
logpath=/home/gsunis/data/data5/mongodb.log
nojournal=false
shardsvr=true
profile=1
sudo vi db6.cnf
//db6.cnf
replSet=shard6
rest=true
port=47022
dbpath=/home/gsunis/data/data6
logappend = true
fork=true
logpath=/home/gsunis/data/data6/mongodb.log
nojournal=false
shardsvr=true
profile=1
(7).编写启动mongo服务的脚本
sudo vi mg.sh
#!/bin/bash
instance=$1
action=$2
case "$action" in
'start')
/usr/local/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf ;;
'stop')
/usr/local/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf --shutdown;;
'restart')
/usr/local/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf --shutdown
/usr/local/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf;;
esac
(8).启动docker实例的mongo服务脚本
sudo vi start.sh
#!/bin/bash
rm /data/conf/*.lock
rm /data/data1/*.lock
rm /data/data2/*.lock
rm /data/data3/*.lock
rm /data/data4/*.lock
rm /data/data5/*.lock
rm /data/data6/*.lock
/home/gsunis/data/mg.sh conf start
/home/gsunis/data/mg.sh db1 start
/home/gsunis/data/mg.sh db2 start
/home/gsunis/data/mg.sh db3 start
/home/gsunis/data/mg.sh db4 start
/home/gsunis/data/mg.sh db5 start
/home/gsunis/data/mg.sh db6 start
sudo vi start.sh
#!/bin/bash
rm /data/conf/*.lock
rm /data/data1/*.lock
rm /data/data2/*.lock
rm /data/data3/*.lock
rm /data/data4/*.lock
rm /data/data5/*.lock
rm /data/data6/*.lock
/home/gsunis/data/mg.sh conf stop
/home/gsunis/data/mg.sh db1 stop
/home/gsunis/data/mg.sh db2 stop
/home/gsunis/data/mg.sh db3 stop
/home/gsunis/data/mg.sh db4 stop
/home/gsunis/data/mg.sh db5 stop
/home/gsunis/data/mg.sh db6 stop
正常关闭mongoDB服务
./mongo
use admin
db.shutdownServer()
(9).shard服务器副本集的建立
./mongo --port 47017
config = {_id: 'shard1', members: [
{_id: 0, host: '10.62.0.128:47017'},
{_id: 1, host: '10.62.0.159:47017'}]
}
rs.initiate(config)
Ctrl + C 退出
./mongo --port 47018
config = {_id: 'shard2', members: [
{_id: 0, host: '10.62.0.128:47018'},
{_id: 1, host: '10.62.0.159:47018'}]
}
rs.initiate(config)
./mongo --port 47019
config = {_id: 'shard3', members: [
{_id: 0, host: '10.62.0.128:47019'},
{_id: 1, host: '10.62.0.159:47019'}]
}
rs.initiate(config)
./mongo --port 47020
config = {_id: 'shard4', members: [
{_id: 0, host: '10.62.0.128:47020'},
{_id: 1, host: '10.62.0.159:47020'}]
}
rs.initiate(config)
./mongo --port 47021
config = {_id: 'shard5', members: [
{_id: 0, host: '10.62.0.128:47021'},
{_id: 1, host: '10.62.0.159:47021'}]
}
rs.initiate(config)
./mongo --port 47022
config = {_id: 'shard6', members: [
{_id: 0, host: '10.62.0.128:47022'},
{_id: 1, host: '10.62.0.159:47022'}]
}
rs.initiate(config)