回顾
1,zookeeper概述
zookeeper是分布式小文件系统。
节点: 同时具备文件夹的特性和文件的特点。
2,zookeeper常用命令
2.1 服务端命令
进入到zookeeper的安装目录,进入到bin目录
./zkServer.sh start|stop|restart|status
2.2 客户端命令
连接服务端命令
./zkCli.sh
-
创建节点
create 【-e】 【-s】 /节点 数据
-
获取节点的数据
get /节点
-
设置节点的数据
set /节点 数据
-
删除节点
rmr /节点
-
查看节点下子节点命令
ls /节点
2.3 JAVAAPI操作zookeeper
curator 是zookeeper客户端软件。
使用:
-
建立连接
目的: CuratorFramework
//重试策略 RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10); //2.第二种方式 //CuratorFrameworkFactory.builder(); client = CuratorFrameworkFactory.builder() .connectString("127.0.0.1:2181") .sessionTimeoutMs(60 * 1000) .connectionTimeoutMs(15 * 1000) .retryPolicy(retryPolicy) .namespace("itheima") .build(); //开启连接 client.start();
-
增删改查操作
client.create().forPath("/节点",数据); client.create().withMode(CreateMode.EPHEMERAL).forPath("/节点",数据);
今日内容
- 增删改查操作
- 监听机制
- 作为分布式锁
- 集群
- 项目管理(ones)
1. 增删改查操作
1.1 查询
-
查询数据
@Test public void testGet1() throws Exception { //1. 查询数据:get byte[] data = client.getData().forPath("/app1"); System.out.println(new String(data)); }
-
查询子节点
@Test public void testGet2() throws Exception { // 2. 查询子节点: ls List<String> path = client.getChildren().forPath("/"); System.out.println(path); }
-
查询节点状态
@Test public void testGet3() throws Exception { Stat status = new Stat(); System.out.println(status); //3. 查询节点状态信息:ls -s client.getData().storingStatIn(status).forPath("/app1"); System.out.println(status); }
1.2 修改
@Test
public void testSet() throws Exception {
client.setData().forPath("/app1", "itcast".getBytes());
}
@Test
public void testSetForVersion() throws Exception {
Stat status = new Stat();
//3. 查询节点状态信息:ls -s
client.getData().storingStatIn(status).forPath("/app1");
int version = status.getVersion();//查询出来的 3
System.out.println(version);
client.setData().withVersion(version).forPath("/app1", "hehe".getBytes());
}
2,watch机制
监听:
- 事件
- 事件源
- 监听器
- 绑定监听器
zookeeper中watch : zookeeper中的特定事件触发后,通知指定的客户端。
zookeeper管理其他的集群的应用原理:
curator对zookeeper原生的watch机制进行了封装:
- NodeCache : 监听的是特定的节点
- PathChildrenCache : 监听的是特定节点的子节点
- TreeCache : 监听的是特定节点及其子节点
2.1 NodeCache
@Test
public void testNodeCache() throws Exception {
//1. 创建NodeCache对象
final NodeCache nodeCache = new NodeCache(client,"/app1");
//2. 注册监听
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("节点变化了~");
//获取修改节点后的数据
byte[] data = nodeCache.getCurrentData().getData();
System.out.println(new String(data));
}
});
//3. 开启监听.如果设置为true,则开启监听是,加载缓冲数据
nodeCache.start(true);
while (true){
}
}
2.2 PathChildrenCache
/**
* 演示 PathChildrenCache:监听某个节点的所有子节点们
*/
@Test
public void testPathChildrenCache() throws Exception {
//1.创建监听对象
PathChildrenCache pathChildrenCache = new PathChildrenCache(client,"/app2",true);
//2. 绑定监听器
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
System.out.println("子节点变化了~");
System.out.println(event);
//监听子节点的数据变更,并且拿到变更后的数据
//1.获取类型
PathChildrenCacheEvent.Type type = event.getType();
//2.判断类型是否是update
if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
System.out.println("数据变了!!!");
byte[] data = event.getData().getData();
System.out.println(new String(data));
}
}
});
//3. 开启
pathChildrenCache.start();
while (true){
}
}
2.3 TreeCache
/**
* 演示 TreeCache:监听某个节点自己和所有子节点们
*/
@Test
public void testTreeCache() throws Exception {
//1. 创建监听器
TreeCache treeCache = new TreeCache(client,"/app2");
//2. 注册监听
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println("节点变化了");
System.out.println(event);
}
});
//3. 开启
treeCache.start();
while (true){
}
}
3,分布式锁
锁: 多线程间共享数据安全的保障。
分布式锁:
- 应用是分布式集群工作的情况下,属于多JVM下的工作环境,跨JVM之间已经无法通过多线
程的锁解决同步问题。 - 那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题——这就是分布式锁。
4,集群
角色:
- leader : 老大
- 处理事务型操作。
- 集群的调度者
- follower : 跟随者
- 处理非事务操作,将事务型操作转发给leader
- observer : 观察者
- 处理非事务操作,将事务型操作转发给leader
跟随者和观察者的区别:
- 跟随者有参与选举的权利,观察者没有。
集群特点:
- 建议安装奇数台
- 一般以下的服务器宕机不影响正常的运行
- 选举机制: 票数过半者则为leader
5,项目管理
6,gitlab
配置ssh免密登陆:
git操作命令:
git init 创建本地仓库
git add . 添加到暂存区
git commit -m "" 提交到本地仓库
git remote add origin 远程仓库地址
git push origin master
git clone 远程仓库地址
创建本地仓库:
项目的克隆:
代码冲突解决方式:
jenkins目录:
/usr/lib/jenkins/jenkins.war WAR包
/etc/sysconfig/jenkins 配置文件
/var/lib/jenkins/ 默认的JENKINS_HOME目录
/var/log/jenkins/jenkins.log Jenkins日志文件
sh /opt/scripts/tomcat.sh ssm
#!/bin/bash
set -x
PROJECT_NAME=$1 # 获取传递的第一个参数,也就是上面命令的 ssm
# 获取tomcat的安装目录路径
TOMCAT_HOME=/usr/local/tomcat/tomcat_$PROJECT_NAME/bin
# 获取tomcat相关进程的个数
PROCESS=`ps -ef |grep tomcat_$PROJECT_NAME|grep -v grep|wc -l`
# 判断进程数是否为0,如果是0表示tomcat未启动,如果是1,表示已经启动
if [ $PROCESS -eq 0 ];then
echo "run starting tomcat"
# 启动tomcat
sh $TOMCAT_HOME/startup.sh
# 将war包解压缩的内容拷贝到tomcat的暗转目录下webapps下的ROOT下
`unzip -oq /opt/war/target/*.war -d /usr/local/tomcat/tomcat_$PROJECT_NAME/webapps/ROOT`
else
# 说明tomcat已经启动了
# 关闭tomcat
sh $TOMCAT_HOME/shutdown.sh
# $? 获取上一个命令执行的结果,0表示执行成功, 1表示执行失败
if [ $? -eq 0 ]; then
# 启动tomcat
sh $TOMCAT_HOME/startup.sh
# 将war包解压缩的内容拷贝到tomcat的暗转目录下webapps下的ROOT下
`unzip -oq /opt/war/target/*.war -d /usr/local/tomcat/tomcat_$PROJECT_NAME/webapps/ROOT`
else
# 说明关闭tomcat失败。杀进程
for pid in `ps -ef |grep $tomcat_$PROJECT_NAME|grep -v grep |awk '{print $2}'`;do
# 杀进程
kill -9 $pid;done
# 启动tomcat
sh $TOMCAT_HOME/startup.sh
# 将war包解压缩的内容拷贝到tomcat的暗转目录下webapps下的ROOT下
`unzip -oq /opt/war/target/*.war -d /usr/local/tomcat/tomcat_$PROJECT_NAME/webapps/ROOT`
fi
fi
echo "Sucessfull ...."
tomcat_$PROJECT_NAME/webapps/ROOTelse # 说明关闭tomcat失败。杀进程 for pid in
ps -ef |grep KaTeX parse error: Expected group after '_' at position 7: tomcat_̲PROJECT_NAME|grep -v grep |awk '{print $2}';do # 杀进程 kill -9 $pid;done # 启动tomcat sh $TOMCAT_HOME/startup.sh # 将war包解压缩的内容拷贝到tomcat的暗转目录下webapps下的ROOT下
unzip -oq /opt/war/target/*.war -d /usr/local/tomcat/tomcat_$PROJECT_NAME/webapps/ROOT`
fi
fi
echo “Sucessfull …”