mysql

中间件技术栈

浅谈分布式锁

为什么要有分布式锁

随着架构系统的演进,由纯真的单机架构到容器化编排的分布式架构,可以说是一个大型互联网企业发展的必然走向。在网站初创时,应用数量和用户较少,可以把 Tomcat 和Mysql 部署在同一台机器上。随着用户数量增多,访问量增大,并发升高,Tomcat 和 MySQL 竞争资源,此时,单机已经扛不住了,需要把 Tomcat 和 MySQL 分离在不同的机器上,用于提升单台机器的处理能力。业务从来没有减少,产品越做越大。应用也越来越复杂,原来的大应用,拆分成多个小应用,加入各级缓存,做了反向代理负责均衡,最后坠入分库分表的深渊。

微服务渐渐代替了庞大冗杂的服务,每个小服务,各司其职。这时候是不是就不存在资源竞争的问题了呢?答案毋庸置疑,在架构的演进过程中,无时无刻都存在着资源竞争的问题。

说起资源竞争的问题,是不是想起了在计算机科学中的一个经典问题——哲学家就餐,也就是在并行计算中多线程同步( Synchronization )时产生的问题?哲学家就餐问题用来解释死锁和资源耗尽的问题,我们不做详细的讨论,感兴趣的同学可以搜索资料了解。既然存在资源竞争的问题,解决的方案必然是对资源加锁,对于锁大家肯定不陌生,在 Java 中synchronized 关键字和 ReentrantLock 可重入锁在我们的代码或者一些开源代码中随处可见的,一般用于在本地多线程环境中控制对资源的并发访问。但是随着微服务架构的蓬勃兴起,分布式的快速发展,本地加锁已经不能满足我们的业务需求,如果还通过本地加锁的方式锁定资源,在分布式环境中是无用的。于是人们为了在分布式环境中也能实现本地锁的效果,也是纷纷各出其招。

阅读剩下更多

默认配图
知尽Java第几重

mysql+mybatis+druid批量更新数据时的配置

批量更新SQL

为什么要批量更新

很多时候,我们都是单条更新数据,或者是批量更新统一字段相同值。

但有些情况下,为了某些场景,我们通常需要批量更新某一段时间的或者全量的数据。比如,某个业务线需要增加一个字段,但是这个字段需要根据已存在的数据计算得出,并不是保持一致的时候,需要批量更新。再比如,某些傻叉设计的用户密码是明文入库,当你发现的时候,有必要加密处理。

批量更新逻辑

先看看一段批量更新mybatis表达式:

1
2
3
4
5
6
7
8
<update id="updateUserPassword" parameterType="com.zhoujunwen.gaea.dal.po.User">
<foreach collection="list" separator=";" item="user">
<if test="user.pass != null and user.pass !=''">
update box_user set pass = #{user.pass}
where id = #{user.id}
</if>
</foreach>
</update>

阅读剩下更多

默认配图
中间件技术栈

MySQL开发规范.md

一. 命名规范

库名、表名、字段名必须使用小写字母,并采用下划线分割
为了统一规范, 库名、表名、字段名使用小写字母,禁用关键字(index,order等)。

前缀命令规范
视图以view_开头,事件以event_开头,触发器以trig_开头,存储过程以proc_开头,函数以func_开头,应用上面禁用

普通索引以idx_各个列名简称,唯一索引以uk_各个列名简称命名,中间用_隔开。如 idx_col1_col2_col3(col1,col2,col3),如果列过长,用简写

临时表以tmp_实体表名,线上禁用,备份表以bak_日期_实体表名,尽可能备份至HDFS

库名、表名、字段名禁止超过32个字符,需见名知意
库名、表名、字段名支持最多32个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符,例:业务名称/实体_表作用

按日期时间分表须符合_YYYYMMDD格式
按月或日生成的表,以_YYYYMM[DD]方式命名。

阅读剩下更多

默认配图
中间件技术栈

mysql事务排查

当我们跑MySQL服务器查看日志的时候,如果发现如下类似日志:

171013 2:04:25 [ERROR] /usr/local/mysql/bin/mysqld: Sort aborted: Lock wait timeout exceeded; try restarting transaction
171013 2:06:26 [ERROR] /usr/local/mysql/bin/mysqld: Lock wait timeout exceeded; try restarting transaction
171013 2:06:26 [ERROR] /usr/local/mysql/bin/mysqld: Sort aborted: Lock wait timeout exceeded; try restarting transaction
171013 2:07:33 [ERROR] /usr/local/mysql/bin/mysqld: Lock wait timeout exceeded; try restarting transaction
…..

出现这些日志主要原因往往是,有些事务执行过dml操作,然后一直没commit/rollback,新事务一直等待旧事务释放锁资源,出现锁等待超时,即新事务等待时间超过了mysql设置的lock_wait_timeout(指的是事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败,参数的时间单位是秒,最小可设置为1s)该参数设定的值后,mysql又尝试重新执行此事务。

阅读剩下更多

默认配图
运维必知二三事

Ubuntu 16.04 安装MySQL + nginx + PHP7

1. 安装MYSQL

note: 如果是新购买的服务器,可能需要升级软件安装源。
否则会出现如下错误:
Reading package lists… Done
Building dependency tree
Reading state information… Done
E: Unable to locate package mysql-server
E: Unable to locate package mysql-client

升级命令:
apt-get update

1.1 安装命令

1
apt-get -y install mysql-server mysql-client

你会被要求提供MySQL的root用户密码,总共输入两次,一次输入,一次确认。我们从安装信息我们可以知道3件事:

  • 安装的MySQL的版本,此处安装的是5.7
  • 依赖包:libcgi-fast-perl libcgi-pm-perl libencode-locale-perl libevent-core-2.0-5 libfcgi-perl libhtml-parser-perl libhtml-tagset-perl libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl liblwp-mediatypes-perl liburi-perl mysql-client mysql-client-5.7 mysql-client-core-5.7 mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7
  • MySQL配置文件的位置:/etc/mysql/my.cnf, update-alternatives: using /etc/mysql/my.cnf.fallback to provide /etc/mysql/my.cnf (my.cnf) in auto mode,如果没有my.cnf.fallback这个文件,可能引发错误,解决办法:《ubuntu16.04安装mysql报错解决》

阅读剩下更多

默认配图
PHP是最好的语言

Mac 下 Nginx、PHP、MySQL 和 PHP-fpm 的安装和配置

杂七杂八的杂

Mac下搭建MNPM环境是每个使用者mac的phper必备的技能。一般都是找到新工作入职的第一天做的事情--配置环境。

如上,今天入职的,配置开发环境。公司配备的硬件设备很屌,15年产macbook pro笔记本一台(13寸),配置了8GB DDR3内存,2.7GHz core i5处理器,120GB的闪存。当然了,没我自己买的配置高,哈哈~~

安装 Mac 的包管理器 - homebrew

home-brew是什么?先这样说吧,home-brew与OS X就像nodes与npm,java与maven(或者gradle),php与composer,apt-get与Ubutun,yum与centos,还有其他等等吧,都是宿主的开发工具或包的依赖管理。

安装Homebrew之前,先安装xcode命令行工具,安装成功后,打开xcode的应用,查看Xcode是否为最新,如果不是最新的请在App Store中升级Xcode。

阅读剩下更多

默认配图
返回顶部