centos7 里面修改hostname的方式

星期三, 2018-03-21 | Author: Lee | linux, 大数据 | 没有评论

在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty)。

“静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名。
“瞬态”主机名是在系统运行时临时分配的主机名,例如,通过DHCP或mDNS服务器分配。
静态主机名和瞬态主机名都遵从作为互联网域名同样的字符限制规则。

centos7 里面修改hostname的方式有所改变,修改/etc/hosts和/etc/sysconfig/network两个文件已经不能生效。使用的新命令是:
默认 set-hostname 同时修改三个值,想只修改一个加 -static 对应的参数

shell> hostnamectl set-hostname centos7
shell> su
shell> hostname
centos7

centos7之前的版本请用此方法:

shell> vi /etc/sysconfig/network
# Created by anaconda
NETWORKING=yes
HOSTNAME=centos6
:wq #保存并退出

局域网A/B主机直接通过hostname访问主机B:

#A主机设置
shell> vi /etc/sysconfig/network
GATEWAY=192.168.1.100 #当前主机内网ip
:wq #保存并退出
#A/B主机设置
shell> vi /etc/hosts
192.168.1.100 hostname
:wq #保存并退出

Tags:

Elasticsearch 启动报错参数配置处理 参数配置

星期五, 2018-01-26 | Author: Lee | 大数据 | 3 Comments

1.elasticsearch-6.1.2的具体就不介绍了,详情可以去看Elasticsearch guide

2.为了主机可以访问虚拟机里的ES 开启外部访问

vi config/elasticsearch.yml
 
network.host: 0.0.0.0  #打开此注释,正式环境根据情况指定IP

3.启动elasticsearch报如下错误

./bin/elasticsearch -d

[2018-01-26T03:06:12,987][ERROR][o.e.b.Bootstrap ] [sA_Y-N7] node validation exception
[3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max number of threads [3884] for user [hadoop] is too low, increase to at least [4096]
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

针对上述错误修改如下:

vi /etc/security/limits.conf
 
* soft nofile 65536
* hard nofile 65536
* soft nproc  4096
* hard nproc  4096
vi /etc/security/limits.d/20-nproc.conf
 
*          soft    nproc     4096
root       soft    nproc     unlimited
vi /etc/sysctl.conf
 
vm.max_map_count=655360

使其生效

sysctl -p

退出shell,重进生效,然后启动ok了

可以访问 http://192.168.1.188:9200/ 查看

Tags: ,

几种常见的分布式锁的策略优缺点及对应处理

星期二, 2017-12-19 | Author: Lee | JAVA-and-J2EE | 没有评论

在微信朋友圈看到的文章总结的很好,记录下以便翻阅.自己主要是以redis做分布式锁实现.

前言

随着互联网的发展,各种高并发、海量处理的场景越来越多。为了实现高可用、可扩展的系统,常常使用分布式,这样避免了单点故障和普通计算机cpu、内存等瓶颈。

但是分布式系统也带来了数据一致性的问题,比如用户抢购秒杀商品多台机器共同执行出现超卖等。有些同学容易将分布式锁与线程安全混淆,线程安全是指的线程间的协同。如果是多个进程间的协同需要用到分布式锁,本文总结了几种常见的分布式锁。

基于数据库

悲观锁—事务

比如用户抢购秒杀商品的场景,多台机器都接收到了抢购的请求,可以将获取库存、判断有货、用户付款、扣减库存等多个数据库操作放到一个事务,这样当一台机器与数据库建立链接请求了抢购商品这个事务,另外的机器只能等这个机器将请求完成才能操作数据库。在实际应用场景中,常常库存与交易是两个独立的系统,这时的事务是一个分布式事务,需要用到两段式、三段式提交。

优点:是比较安全的一种实现方法。

缺点:在高并发的场景下开销是不能容忍的。容易出现数据库死锁等情况。

乐观锁—基于版本号

乐观锁常常用于分布式系统对数据库某张特定表执行update操作。考虑线上选座的场景,用户A和B同时选择了某场次电影的一个座位,都去将座位的状态设置为已售。

设想这样的执行序列:
1、用户A判断该座位为未售状态;
2、用户B判断该座位为未售状态;
3、用户A执行update座位为已售;
4、用户B执行update座位为已售。

这样会出现同一个座位售出两次的情况,解决方案是在这张数据库表中增加一个版本号的字段。执行操作前读取当前数据库表中的版本号,在执行update语句时将版本号放在where语句中,如果更新了记录则说明成功,如果没有更新记录,则说明此次update失败。

加了乐观锁的执行序列:
1、用户A查询该座位,得到该座位是未售状态,版本号是5;
2、用户B查询该座位,得到该座位是未售状态,版本号是5;
3、用户A执行update语句将座位状态更新为已售,版本号更新为6;
4、用户B执行update语句时此时这个座位的记录版本号为6,没有版本号为5的这个座位的记录,执行失败。

优点:乐观锁的性能高于悲观锁,并不容易出现死锁。

缺点:乐观锁只能对一张表的数据进行加锁,如果是需要对多张表的数据操作加分布式锁,基于版本号的乐观锁是办不到的。

› Continue reading

Tags: ,

git忽略整个文件夹及移除已经提交的文件

星期五, 2017-12-08 | Author: Lee | JAVA-and-J2EE, linux | 没有评论

一些自动编译的class文件也会提交到git上,每次都有文件去提交很影响代码回查.

如下操作使其不再提交,只要把其列入ingore中.

1.在项目的根目录(跟.git文件夹所在目录同层)建立.gitignore文件,在里面声明即可.

内容如下:

#ignore these files
*.class
classes/
target/
build/

2.如果之前文件已提交过,则需要先清除原文件(文件夹加-r即可),针对特定文件做清理如下

$ git rm *.class
$ git rm -r classes/

3.最后git add .gitignore 再git commit -m “ignore” 即可

Tags:

JAVA中正确使用的单例模式常用写法(6种写法)

星期六, 2017-11-04 | Author: Lee | JAVA-and-J2EE | 没有评论

单例模式 老生常谈的一种模式,也是实际项目代码中比较常用的一种模式了.

文中做了6种方法,实际用的最多的也就 4.5两种,其实6是最完美的但是感觉别捏呢,不像个类,用的也并不多.

1.懒汉式,线程不安全

public class Singleton {
    private static Singleton instance;
    private Singleton (){}
    public static Singleton getInstance() {
     if (instance == null) {
         instance = new Singleton();
     }
     return instance;
    }
}

2.懒汉式,线程安全 (BUT.效率差)

public static synchronized Singleton getInstance() {
    if (instance == null) {
        instance = new Singleton();
    }
    return instance;
}

3.双重检验锁

public static Singleton getSingleton() {
    if (instance == null) {                         //Single Checked
        synchronized (Singleton.class) {
            if (instance == null) {                 //Double Checked
                instance = new Singleton();       //非原子操作
            }
        }
    }
    return instance ;
}

问题:new Singleton非原子操作
1.给 instance 分配内存
2.调用Singleton 的构造函数来初始化成员变量
3.将instance对象指向分配的内存空间(执行完这步 instance 就为非 null 了)

解决办法 JDK1.5以前的版本会有问题, JDK1.5后用volatile关键字(立即可见及禁止指令重排序优化)来修饰变量.通过DCL(double checked locking)实现同步

public class Singleton {
    private volatile static Singleton instance; //这里为 volatile
    private Singleton (){}
    public static Singleton getSingleton() {
        if (instance == null) {                         
            synchronized (Singleton.class) {
                if (instance == null) {       
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }  
}

上面三种的写法基本上在项目中没有什么实用价值,下面的三种才是比较常用的

› Continue reading

Tags: ,

Nginx配置静态文件404问题解决

星期一, 2017-10-23 | Author: Lee | computer, linux | 没有评论

Nginx提供了另外一个静态路径配置 : alias

alias与root区别

官方root

Sets the root directory for requests. For example, with the following configuration
location /i/ {
    root /data/w3;
}
The /data/w3/i/top.gif file will be sent in response to the “/i/top.gif” request

官方alias

Defines a replacement for the specified location. For example, with the following configuration
location /i/ {
    alias /data/w3/images/;
}
on request of “/i/top.gif, the file /data/w3/images/top.gif will be sent.

当访问/i/top.gif时,

root是去/data/w3/i/top.gif请求文件,

alias是去/data/w3/images/top.gif请求

root响应的路径:配置的路径+完整访问路径(完整的location配置路径+静态文件)

alias响应的路径:配置路径+静态文件(去除location中配置的路径)

修改配置为

location /api/v1/upload {  
     alias /home/v1/upload/;  
}

注意

使用alias时目录名后面一定要加“/”

一般情况下,在location /中配置root,在location /other中配置alias

Tags:

支持emoji图标直接存储到数据库,更改MySQL数据库的编码为utf8mb4

星期一, 2017-10-23 | Author: Lee | Database, JAVA-and-J2EE | 一条评论

随着emoji的频繁使用,对接微信后会带名字的emoji的很多,现在都需要支持.

utf-8编码可能2个字节、3个字节、4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。

如果直接往采用utf-8编码的数据库中插入表情数据,java程序中将报SQL异常:

1
2
3
4
5
6
7
8
9
java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘name’ at row 1 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) 
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662) 
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)

可以对4字节的字符进行编码存储,然后取出来的时候,再进行解码。但是这样做会使得任何使用该字符的地方都要进行编码与解码。

utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。

采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。

更改数据库的编码为utf8mb4:

1. MySQL的版本

utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。

2. MySQL驱动

5.1.34可用,最低不能低于5.1.13

3.修改MySQL配置文件
my.cnf一般在/etc/my.cnf位置。找到后请在以下三部分里添加如下内容:

1
2
3
4
5
6
7
8
9
10
[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 
init_connect='SET NAMES utf8mb4'
 
[client] 
default-character-set = utf8mb4 
[mysql] 
default-character-set = utf8mb4

4. 重启数据库,检查变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
 
Variable_name	Value
character_set_client	utf8mb4
character_set_connection	utf8mb4
character_set_database	utf8mb4
character_set_filesystem	binary
character_set_results	utf8mb4
character_set_server	utf8mb4
character_set_system	utf8
collation_connection	utf8mb4_unicode_ci
collation_database	utf8mb4_unicode_ci
collation_server	utf8mb4_unicode_ci
collation_connection 、collation_database 、collation_server是什么没关系。
 
但必须保证
 
系统变量	描述
character_set_client	(客户端来源数据使用的字符集)
character_set_connection	(连接层字符集)
character_set_database	(当前选中数据库的默认字符集)
character_set_results	(查询结果字符集)
character_set_server	(默认的内部操作字符集)
这几个变量必须是utf8mb4。

5. 数据库连接的配置

数据库连接参数中:
characterEncoding=utf8会被自动识别为utf8mb4,也可以不加这个参数,会自动检测。
而autoReconnect=true是必须加上的。

6. 将数据库和已经建好的表也转换成utf8mb4

更改数据库编码:ALTER DATABASE xxdb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

更改表编码:ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
如有必要,还可以更改列的编码

› Continue reading

Tags: , ,

wordpress的自动登录及授权QQ等登录的处理

星期四, 2017-10-12 | Author: Lee | wordpress | 没有评论

以前处理了qq的自动登录,wordpress升级到4.8.2的版本,同时使用https,不知道什么原因就无法使用了.

需要新增 do_action( ‘wp_login’); 即可,以前版本只需要设置cookie 和current.

处理代码如下:

1
2
3
4
 require_once("../../../wp-config.php");
 wp_set_auth_cookie($wpuid);
 wp_set_current_user($wpuid);
 do_action('wp_login');

Tags:

启用新域名且同时迁移到https下

星期一, 2017-10-09 | Author: Lee | computer | 没有评论

https://www.pomelolee.com/ 新域名为 pomelo lee 的拼写(柚子李)

历史包袱多,要显示绿色的小锁(https),破费周折,改对应的 css中的图片引用等,数据库中的 文章的替换.

记忆下时间 2017-10-08 启用搭建,申请对应的CA证书(阿里云提供的免费一年的DV证书),到发稿才算真的完成.

Tags:

并发处理之幂等性(分布式锁机制)

星期五, 2017-08-18 | Author: Lee | JAVA-and-J2EE | 没有评论

什么是幂等性
幂等性就是指:一个幂等操作任其执行多次所产生的影响均与一次执行的影响相同。
用数学的概念表达是这样的: f(f(x)) = f(x).
就像 nx1 = n 一样, x1 就是一个幂等操作。无论是乘以多少次结果都一样。

常见的幂等性问题
幂等性问题经常会是由网络问题引起的,还有重复操作引起的。
› Continue reading

Tags: ,

Search

文章分类

Meta