最新文章

文章排行

  • 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的服务可以访问相关节点,防止混乱

文章推荐

  • redis笔记(一)

    前言 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。redis特性1.速度快,每秒十万次读写,数据存在内存,用C语言写的,单线程2.持久化,redis所有的数据保存在内存中,对数据的更新将异步保存到磁盘上3.多种数据结构,字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets),位图(bitmaps),超小内存唯一值计数(HyperLogLog),地理信息定位(GEO)4.支持多种编辑语言,java,php,python,ruby,lua,node.js……5.功能丰富,发布订阅、lua脚本,支持事物,pipeline6.简单,代码量少,不依赖外部库,单线程模型7.主从复制8.高可用、分布式,redis-sentinel(v2.8)支持高可用,redis-cluster(v3.0)支持分布式redis典型应用场景1.缓存系统2.计数器3.消息队列系统4.排行榜5.社交网络6.实时系统redis(linux)安装和可执行文件说明(下载redis)wget http://download.redis.io/releases/redis-3.0.7.tar.gz(解压)tar -xzf redis-3.0.7.tar.gz(建立软连接)ln -s redis-3.0.7 redis(进入目录)cd redis(编译安装)make && make install(注)如果在make过程中出现以下错误说明是未安装gcc,运行 yum install gcc解决办法:make MALLOC=libcredis-server redis服务器redis-cli redis命令行客户端redis-benchmark redis性能测试工具redis-check-aof aof文件修复工具redis-check-dump rdb文件修复工具redis-sentinel sentinel服务器启动方式redis-server 默认设置启动redis-server --port 6380 动态参数启动redis-server configPath 配置文件启动(建议使用)验证方式1.ps -ef|grep redis2.netstat -antpl|grep redis3.redis-cli -h ip -p port ping常用配置daemonize 是否是守护进程(no|yes),推荐yesport redis 对外端口号logfile redis 系统日志dir redis 工作目录安装成功后校验1.进入redis的src目录,启动默认配置redis-server2.启动redis-cli3.简单验证通用命令keys  #遍历所有的key dbsize #计算key的总数exists key  #检查key是否存在del key[key...] #删除指定key-valueexpire key seconds #设置key的过期时间ttl key #查看key剩余的过期时间(-2 不存在/-1 key存在,且没有过期时间)persist key #去掉key的过期时间type key #返回key的类型(string/hasg/list/set/zset/none)数据结构和内部编码redis是单线程执行命令,尽量避免长(慢)命令(keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection))字符类型常用命令get key #获取key对应的valueset key value #设置key-valuedel key #删除key-valueincr key #key自增1,如果key不存在,自增后get(key)=1decr key #key自增1,如果key不存在,自减后get(key)=-1incrby key k #key自增k,如果key不存在,自增后get(key)=kdecr key k #key自减k,如果key不存在,自增后get(key)=-kset kek value #不管key是否存在都设置setnx key value #key不存在,才设置set key value xx #key存在,才设置mget key1 key2 key3 #批量获取key,原子操作mset key1 value1 key2 value2 #批量设置key-valuegetset key newvalue #set keynewvalue并返回旧的valueappend key value #将value追加到旧的valuestrlen key #返回字符串的长度incrbyfloat key 3.5 #增加key对应的值3.5getrange key start end #获取字符串指定下标所有的值setrange key index value #设置指定下标所有对应的值哈希常用命令hget key field #获取hash key对应的field的valuehset key field value #设置hash key对应的field的valuehdel key field #删除hash key对应的field的valuehexists key field #判断hash key是否有fieldhlen key #获取hash key field的数量hmget key field1 field2... #批量获取hash key的一批field对应的值hmset key field1 value1 field2 value2... #批量设置hash key的一批field hgetall key #返回hash key对应所有的field和valuehvals key #返回hash key对应所有的field的valuehkeys key #返回hash key对应所有的fieldhsetnx key field value #设置hash key对应的field的value(如果field已经存在,则失败)hincrby key field intConter #hashkey对应的field的value自增intCounterhincrbyfloat key field floatCounter #hincrby浮点数版本list的特点:有序,可以重复,左右两边插入弹出常用命令rpush key value1 value2...  #从列表右端插入值(1-n个)lpush key value1 value2... #从列表左端插入值(1-n个)linsert key before|after value newValue #在list指定的值前|后插入newValuelpop #从列表左侧弹出一个itemrpop #从列表右侧弹出一个itemlrem #根据count值,从列表中删除所有value相等的项(1)count>0 从左到右,删除最多count个value个相等的项(2)count<0 从右到左,删除最多Math.abs(count)个value个相等的项 (3)count=0删除所有value相等的项 ltrim key start end #根据索引范围修剪列表lrange key start end #获取列表指定范围所有的itemlindex key index #获取列表指定索引的itemllen key #获取列表的长度lset key index newValue #设置列表指定索引值为newValuebloop key timeout #lpop阻塞版本,timeou是阻塞超时时间,timeout=0为永不阻塞brpop key timeout #rpop阻塞版本,timeou是阻塞超时时间,timeout=0为永不阻塞集合:无序,无重复,集合间操作sadd key element #向集合key添加element(如果element已经存在,添加失败)srem key element #将集合key中的element移除掉scard key #计算集合大小sismember key value #判断it是否在集合中srandmember key count #从集合中随机挑count个元素,(不会破坏集合)spop key #从集合中随机弹出一个元素smembers key #获取集合所有的元素(集合间的操作)sdiff key1 key2 #差集sinter key1 key2 #交集sunion key1 key2 #并集sdiff|sinter|suion +store destkey .. #将差集/交集/并集结果保存在destkey中有序集合,按照score排序,score可以重复,element不可重复zadd key score element #添加score和elementzrem key element #删除元素zscore key element #返回元素分数zincrby key increScore element #增加或减少元素的分数zcard key 返回元素的总个数zrange key start end[WITHSCORES] #返回指定索引范围内的升序元素[分值]zrangebyscore key minScore maxScore[WITHSCORES] #返回指定分数范围内的升序元素[分值]zcount key minScore maxScore #返回有序集合内在指定分数范围内的个数zremrangebyrank key start end #删除指定排名内的升序元素zremrangebyscore key minScore maxScore #删除指定分数内的升序元素

  • 多选框全选实现

    页面代码,列表多选框  <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); } });});

  • 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