最新文章

文章排行

  • centos安装mariadb

    由于数据库有一下比较新的东西,所以要安装一下新版本的数据库 原计划是安装mysql的,由于各种原因就决定安装mysql的另一个分支mariadb了首先新增/修改这个文件""  '' /etc/yum.repos.d/MariaDB.repo往里面写入内容[mariadb]name = MariaDBbaseurl = http://mirrors.aliyun.com/mariadb/yum/10.3/centos7-amd64/gpgkey = http://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDBgpgcheck = 1由于我比较想省事吧,就用工具直接打开这个文件,复制保存就行了然后运行安装命令yum -y install MariaDB-server MariaDB-client等一会安装完后再启动systemctl start mariadb开机启动systemctl enable mariadb然后是初始化设置mysql_secure_installation接下来是初始化设置了,复制粘贴一下网上的首先是设置密码,会提示先输入密码Enter current password for root (enter for none):<–初次运行直接回车设置密码Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车New password: <– 设置root用户的密码Re-enter new password: <– 再输入一次你设置的密码其他配置Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车,Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车初始化MariaDB完成,接下来测试登录mysql -uroot -ppassword完成。附上一些用户配置创建用户命令mysql>create user username@localhost identified by 'password';直接创建用户并授权的命令mysql>grant all on *.* to username@localhost indentified by 'password';授予外网登陆权限 mysql>grant all privileges on *.* to username@'%' identified by 'password';授予权限并且可以授权mysql>grant all privileges on *.* to username@'hostname' identified by 'password' with grant option;后记:其实大部分设置都可以用Navicat去完成。

  • 基于Linux的zookeeper客户端命令

    前言       之前我们已经通过“初探zookeeper“一文,对它有了初步的了解,这一节让我们更深入了解一下。      注:作者运行环境是centos,其实跟linux命令差别也没多大。基本操作首先我们进入zookeeper目录 cd /usr/local/zookeeper进入bin目录 cd bin重新启动zookeeper zkServer.sh restart打开zookeeper客户端 zkCli.shls+节点,可以看到该节点下有哪些节点stat+节点,可以看到节点的基本信息ls2+节点,就可以看到该节点下的节点和节点的一些基本信息,可以说ls2是ls和stat的合成体get+节点,可以看到该节点下存储的数据(当前为空)接下来我们解释一下这些基本信息的含义:cZxid 是创建之后分配的idctime 节点创建时间mZxid 修改时分配的idmtime 修改时的时间pZxid 子节点的idcversion 节点的版本号dataversion 当前节点数据的版本号aclVersion 权限版本号ephemeralOwner 判断是节点类型 0x0是永久节点dataLength 数据长度numChildren 下面子节点数量create创建临时节点只需要加参数 -e重启后发现temp消失了创建有序节点 -sset命令用来设置值通过get命令可以看到/lin下的数据参数如果我们执行就会报版本不一致的错误,这时我们只要输入正确的version才会执行成功,相应的version也会累加一通过get就可以看到设置值已经成功delete命令,不用说大家也都知道了,就是删除节点需要注意的是,如果节点有子节点会删除失败watcher机制针对每一个节点的操作都会有一个监督者->watcher当监控的某个对象(znode)发生变化时,则触发watcher事件zk中的watcher是一次性的,触发后就销毁父节点子节点增删改都能触发其watcher事件不同类型的操作,触发watcher事件也不同通过help命令,我们看到部分命令都有watch命令watch事件类型创建父节点触发:nodeCreated  修改父节点数据触发:nodeDataChanged删除父节点触发:nodeDeletedls为父节点设置watcher,创建删除子节点都触发nodeChildrenChanded事件,修改子节点不会触发事件说明:因为触发后就会销毁,所以每次触发完后都必须再设置watch事件watcher使用场景:统一资源配置(不同服务器统一配置)

  • 初探zookeeper

    前言         由于公司项目每次运行前都要启动zookeeper,之前并不太深入了解这个东西,所以就学习了一下,并记录下来。zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。来源于百度介绍,想了解更多可以自行搜索。下面进入正题。安装配置首先登陆官网 http://zookeeper.apache.org/点击调到下载页面我是下载历史版本-3.4.11版本然后把zookeeper-3.4.11.tar.gz上传至/home目录下进入该路径 cd /home解压  tar -zxvf  zookeeper-3.4.11.tar.gz重命名 mv zookeeper-3.4.11 zookeeper移动到/usr/local目录 mv zookeeper /usr/local配置zookeeper环境,修改/etc/profile文件添加内容备注:需要安装配置jdk目录介绍首先我们进入zookeeper目录cd /usr/local/zookeeper查看目录ll1.bin目录主要是一些运行命令进入bin目录cd bin.cmd主要是windows下的可执行命令,.sh是Linux下的命令2.conf存放配置文件具体设置内容tickTime 用于计算时间的单元,比如session超时:H*tickTimeinitLimit 用于集群,允许从节点链接并同步到master节点的初始化链接时间,以tickTime的倍数来表示syncLimit 用于集群,master主节点与从节点之间发送消息,请求和应答时间长度(心跳机制)dataDir 存放数据目录(必须配置);dataLogDri 日志目录。如果不配置就会与dataDir共用clientPort 链接服务器的端口3.contrib附加的一些功能4.dist-maven mvn编译后的目录5.doc 文档打开index文件就可以看到详细文档6.lib需要依赖的jar包7.recipes案例demo代码8.src源码zoo.cfg配置详细tickTime 用于计算时间的单元,比如session超时:H*tickTimeinitLimit 用于集群,允许从节点链接并同步到master节点的初始化链接时间,以tickTime的倍数来表示syncLimit 用于集群,master主节点与从节点之间发送消息,请求和应答时间长度(心跳机制)dataDir 存放数据目录(必须配置);dataLogDri 日志目录。如果不配置就会与dataDir共用clientPort 链接服务器的端口zookeeper基本数据模型1.树形结构2.每一个节点都成为znode,可以有子节点,也可以有数据3.每个节点分为临时节点和永久节点,临时节点在客户端断开后消失4.每一个zk节点都有各自的版本号,可以通过命令行来显示节点信息5.每当节点数据发生变化,那么该节点的版本号会累加(乐观锁)6.删除/修改过时节点,版本号不匹配会报错7.每个zk节点存储的数据不宜过大,几k即可8.节点可以设置权限ACL,可以通过权限来限制用户的访问zookeeper作用体现1.master节点选举,主节点挂了以后,从节点就会接受工作,并且保证这个节点是唯一的,这就是所谓的首脑模式,从而保证我们的集群是搞可用的2.统一的配置文件管理,即只需要部署一台服务器,则可以把相同配置文件同步到其他的服务器,此操作在云计算中用的比较多(比如统一修改redis配置)3.发布与订阅,类似消息队列MQ,dubbo发布者把数据存在node上,订阅者会读取这些信息4.提供分布式锁,分布式环境中不同进程之间争夺资源,类似多线程的锁5.集群管理,集群中保证数据的强一致性zookeeper特性-session基本原理客户端与服务端之间存在会话每个回话都可以设置超时时间心跳介绍,session过期session过期,临时节点node会被抛弃心跳机制,客户端会向服务端发送ping包请求单机版进入配置文件cd /usr/local/zookeeper/conf复制一份配置文件cp zoo_samle.cfg zoo.cfg修改zoo.cfgdataDir=/usr/local/zookeeper/dataDirdataLogDir=/usr/local/zookeeper/dataDirLog在该目录下创建这两个目录mkdir dataDirmkdir dataLogDir进入bin目录执行./zkServer.sh start启动其他命令:status可查看状态restart重启stop停止这个时候我们已经启动了让我们来连接客户端,看看里面的内容输入help,我们就可以看到相关的指令我们可以输入ls+节点名就可以看到相关节点下的内容如果我们需要退出客户端,只需要按ctrl+c就可以退出,输入pwd就可以看到当前所在的文件下(持续优化更新)

  • 多选框全选实现

    页面代码,列表多选框  <c:forEach items="${list}" var="obj"> <tr id="tr${obj.id}"> <td><input name="searchId" type="checkbox" value="${obj.id}"></td> <td>${obj.product_code}</td> <td style=" word-wrap:break-word;word-break:break-all;white-space: normal">${obj.product_name}</td> <td style=" word-wrap:break-word;word-break:break-all;white-space: normal">${obj.category_name}</td> <td >${obj.old_cost_price}</td> <td >${obj.cost_price}</td> <td >${obj.old_price}</td> <td >${obj.price}</td> <td>${obj.nowPrice}</td> <td >${obj.rebate}</td> <td>${obj.num}</td> </tr> </c:forEach>多选按钮<input type="checkbox" name="checkAll">全选js代码$(function () { //全选按钮实现 $("input[name=checkAll]").click(function () { if (this.checked) { $("input[name=searchId]").prop("checked", true); } else { $("input[name=searchId]").prop("checked", false); } }); //反选实现 $("input[name=searchId]").click(function () { var allCheckBox=$("input[name=searchId]"); var same=true; var temp=allCheckBox[0].checked; for (var i=0;i<allCheckBox.length;i++){ if (allCheckBox[i].checked!==temp){ same=false; break; } } if (same){ $("input[name=checkAll]").prop("checked", temp); } else { $("input[name=checkAll]").prop("checked", false); } });});

  • zookeeper acl命令

    前言 acl(access control lists)权限控制针对节点可以设置相关读写等权限,从而保障数据的安全性权限permission可以指定不同的权限范围以及角色acl命令行通过客户端help命令,我们可以看到关于acl的一些命令getAcl获取某个节点的acl权限信息setAcl设置某个节点的acl权限信息addauth:输入认证授权信息,注册时输入明文账号密码,但是在zookeeper系统里,密码都是以加密形式存在的acl的构成zookeeper的acl通过[scheme:id:permissions]来构成权限列表(scheme:代表某种权限机制,id:代表允许访问的用户,permissions:权限组合字符串)world:world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是world:anyone[permissions]auth:代表认证登录,需要注册用户有权限即可,形式为auth:user:password:[permissions]digest:需要对密码加密才能访问,形式为:digest:username:BASE64(SHA1(password)):[permissions]简而言之,auth和digest的区别就在于,前者明文,后者密文 setAcl /path auth:lee:lee:cdrwa与setAcl /path digest:lee:BASE64(SHA1(password))cdrwa是等价的,在通过addauth digest lee:lee 后都能操作指定节点的权限ip:当设置为ip指定的ip地址,此时显示ip进行访问,比如ip:192.169.1.1[permissions]super:代表超级管理员,拥有所有权限权限字符串缩写crdwacreate 创建子节点read 获取节点/子节点write设置节点数据delete删除子节点admin设置权限命令world:anyone:cdrwa图中我们把/lin的delete权限去掉,创建子节点,尝试删除它,可以看到删除失败,值得注意的是,但是我们是可以删除/lin的,只能控制子节点auth:user:pwd:cdrwa第一次添加失败是因为我们没有加上用户,所以我们要把用户添加才能进行该设置权限的操作(备注合理)虽然我们再次进行设置,但是我们发现用户密码还是没有变,还是按照第一个来digest:user:BASE64(SHA1(pwa)):cdrwa我们通过设置密文的权限我们发现退出后无法访问,通过明文密码登录才能进行操作addauth digest user:pwaip:192.168.1.1:cdrwa接下来我们讲最后一种:super,步骤如下1.修改zkServer.sh增加super管理员2.重启zkServer.sh通过操作我们可以发现,/lin是没有访问权限的,但是用管理员账号登录后就可以操作了ACL的常用使用场景开发/测试环境分离,开发者无权操作测试库的节点,只能查看生产环境上控制指定ip的服务可以访问相关节点,防止混乱

文章推荐

  • docker启动镜像常用参数示例

    一些常用Docker启动镜像参数的实际用法示例:-i: 保持STDIN打开,即使没有附加到容器上也可以使用。例如:docker run -i ubuntu /bin/bash-t: 为容器分配一个伪TTY终端。例如:docker run -t -i ubuntu /bin/bash-d: 在后台运行容器,并返回容器ID。例如:docker run -d ubuntu /bin/bash--name: 为容器指定一个名称。例如:docker run --name my_container_name ubuntu /bin/bash-p: 将容器内部的端口映射到主机上的某个端口。例如:docker run -p 8080:80 nginx-v: 将主机上的目录挂载到容器内部的某个目录。例如:docker run -v /host/path:/container/path nginx--link: 连接另一个容器。例如:docker run --link my_mysql_container:mysql_container nginx-e: 设置环境变量。例如:docker run -e ENV_VAR_NAME=env_var_value nginx-u: 设置容器的UID(用户标识符)。例如:docker run -u 1000 nginx--restart: 设置容器在退出时的重启策略。例如:docker run --restart always nginx--memory: 设置容器可以使用的内存大小。例如:docker run --memory=1g nginx--cpus: 设置容器可以使用的CPU数量。例如:docker run --cpus=2 nginx--network: 指定容器所在的网络。例如:docker run --network=my_network nginx-h: 设置容器的主机名。例如:docker run -h myhost nginx

  • spring cloud eureka高可用

    idea创建eureka server应用 application类添加注解新建三个application.yml,在原配置文件上spring: profiles: active: ${active}另外三个配置如下,对应修改一下defaultZone,hostname,nameeureka: client: # 应用为注册中心,不注册自己 register-with-eureka: false # 注册中心职责是维护服务实例,不需要检索服务 fetch-registry: false service-url: defaultZone: http://localhost:8762/eureka,http://localhost:8763/eureka instance: hostname: localhost1spring: application: name: eureka-service1在idea上对这个eureka server应用复制成三个,并分别设置每个eureka server的启动参数这样就可以一份代码,启动三个eureka server应用了idea创建eureka client应用需要注意的是一定要添加web的依赖,不然会报错 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>application类添加注解在配置文件添加配置, defaultZone是eureka server地址eureka: client: service-url: defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka instance: hostname: eurekaClientspring: application: name: eureka-client启动即可在eureka server看到对应的client信息

  • kotlin学习笔记(二)

    集合 fun main(args: Array<String>) { val list1 = listOf("asd", "as", "ujkl") //安全操作符 list1.getOrElse(100){"asd"} println(list1.getOrNull(100) ?: "121") //可变的集合 val list2 = mutableListOf("asd", "as", "ujkl") //常见操作 list2.add("asdasd") list2 += "sas" list2.remove("asd") list2 += "uij" list2.removeIf { it.contains("a") } //list跟mutable相互转换 listOf("asd", "as", "ujkl").toMutableList() mutableListOf("asd", "as", "ujkl").toList() //遍历 for (s in list2) { println(s) } list2.forEach { println(it) } list2.forEachIndexed{ index, item -> println("$index, $item") } //set val set1 = setOf("asd", "as", "ujkl") //取出元素 println(set1.elementAt(1)) val set2 = mutableSetOf("asd", "as", "ujkl") //list转set list1.toSet() //直接去重,不需要转set list1.distinct() //kotlin提供现成的数字list var a = intArrayOf(1,2,33) var b = longArrayOf(1L) doubleArrayOf() shortArrayOf() byteArrayOf() floatArrayOf() booleanArrayOf() arrayOf<String>() listOf(1,2,3).toIntArray() //map var map = mapOf("a" to 1, "b" to 2, "c" to 4) //map获取值的方式 println(map["a"]) println(map.getValue("a")) //默认值方式 println(map.getOrElse("asd"){2323}) println(map.getOrDefault("asd", 0)) //map遍历 map.forEach{ println("$it.key,$it.value") } map.forEach{(key : String, value : Int) -> println("$key,$value") } val map2 = mutableMapOf("a" to 1, "b" to 2, "c" to 4) map2 += "o" to 1 map2.put("d", 1) //如果没有就新增 map2.getOrPut("sdasd"){111}}类基本定义class TextByClass{ //属性除非可空,不然必须要给值 //自动生成get/set //可生成get/set时进行操作,必须紧跟属性后面,如果只读可加private var a = "" get() = field.capitalize() private set(value) { field = value.trim() } var b = 1 get() = field.plus(1) set(value) { field = value.div(2) } //不校验空 var c : String ?= "asd" //延迟初始化,用到的时候才会初始化 lateinit var d: String //惰性初始化,首次用的时候才初始化 val config by lazy { lazyText() } private fun lazyText() { println("asd") }}/** * 执行顺序,主构造函数,类定义,init构造函数,次构造函数 */class Payer ( //主构造函数,临时变量用下划线 _id : Int = 1, _name : String, var text : String?){ //次构造函数 constructor(name : String) : this(text = "1", _name = name, _id =1) constructor(name : String, id : Int) : this(text = "1", _name = name, _id = id) { this.name = name.plus(1) } var id = _id var name = _name //初始化块 init { if (id == 1) id = 2 //如果不满足条件,抛出异常 require(id > 0) { "id必须大于0" } }}fun main(args: Array<String>) { var text = TextByClass() println(text.a) //主构造函数创建 var text1 = Payer(1,"2", "w") //次构造函数创建 var text2 = Payer("asd") //默认值方式 var text3 = Payer(_name = "asd", text = "asd")}类的类型知识//类默认都是封闭的,开放继承,必须用open修饰open class ExentText( id :Int? = null){ val id: Int = 1 //可重写方法也用open修饰 open fun load() = "asd"}class ChText : ExentText(1) { override fun load() = "asd" fun abc() = "asd"}//单例对象,使用object声明object ApplicationConfig { fun doSomething() = "asd"}//伴生对象companion,不管实例多少次,只有一个伴生对象(单例)open class ConfigMap { companion object{ private const val PATH ="d:\\1.txt" fun load() = java.io.File(PATH).readText() }}//嵌套类,如果一个类针对一个类有用,可以嵌入到该类中class Text2() { class Text3() { fun show() = "asd" }}//数据类data修饰data class DataText( var a : String, var b : String) { var ab = a+b //运算符重载 operator fun plus(other:DataText) = DataText(a + other.a, b+other.b)}//解构函数class Text5(val a:Int, val b: Int) { operator fun component1() = a operator fun component2() = b}//枚举类,可定义方法enum class EnumText(private val coordinate : ExentText){ WEST(ExentText(1)), EAST(ExentText(2)); fun updateData(playData : ExentText) = ExentText(playData.id.plus( coordinate.id))}fun main(args: Array<String>) { val a = ChText() //is关键字,检查是否是该类型 println(a is ChText) println(a is ExentText) //as进行类型转换 if (a is ChText) { println((a as ChText).abc()) } //Any是所有类的超类 println(a is Any) println(ApplicationConfig.doSomething()) //只用一次的类,可以用object声明;p val p = object : ExentText() { override fun load(): kotlin.String { return "asd" } } println(p.load()) ConfigMap.load() Text2.Text3().show() val dataText = DataText("a", "b") //copy函数。复制一个对象 val copy = dataText.copy(a = "c", b = "b") var (x, y) = Text5(1,2) println("$x, $y") //数据类型直接支持 var (x1, y1) = DataText("1","2") println(EnumText.EAST) println(EnumText.EAST.updateData(ExentText(1)))}类补充enum class Dir{ APPLE, CAR, BUTTON;}class DefaultClass(var dir : Dir){ fun getDir() : String { return when(dir) { Dir.APPLE -> "aaa" Dir.CAR -> "ccc" else -> "ddd" } }}//密封类sealed class License { object apple : License() object car : License() class button(var id : Int) : License()}//比enum多返回数据class DefaultClass2(var dir : License){ fun getDir() : String { return when(dir) { is License.apple -> "aaa" is License.button -> "ccc ${(this.dir as License.button).id}" else -> "ddd" } }}fun main(args: Array<String>) { println(DefaultClass(Dir.CAR).getDir())}