mysql prompt一个特别好用的命令

想必大家在命令行操作mysql的时候会十分发愁现在的操作的是那个数据库吧,至少我就纠结过,可能您会说我打一条命令不就知道了,是的这样做确实可以的。

可是今儿给大家介绍个好用的命令–prompt

[root@fsailing1 ~]# mysql -uroot -p --prompt="\u@\h:\d \r:\m:\s>"
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 378
Server version: 5.0.95 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
root@localhost:(none) 08:23:32>use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
root@localhost:test 08:23:44>exit;

这样做的好处就是让我们大家在操作数据库时更加方便快捷。

您也可以在在my.cnf配置文件里进行配置:

[mysql]
prompt=mysql(\u@\h:\d)>

default-character-set=utf8
[root@fsailing1 ~]# vim /etc/my.cnf
[root@fsailing1 ~]# service mysqld restart
停止 MySQL:                                               [确定]
启动 MySQL:                                               [确定]
[root@fsailing1 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 2
Server version: 5.0.95 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql(root@localhost:(none))>use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql(root@localhost:test)>

这里也给出需要的一些个选项供大家参考。

未分类

MySQL查询优化–调整内部变量的详解

MySQL是如此的开放,所以可轻松地进一步调整其缺省设置以获得更优的性能及稳定性。需要优化的一些关键变量如下:

改变索引缓冲区长度(key_buffer)

一般,该变量控制缓冲区的长度在处理索引表(读/写操作)时使用。MySQL使用手册指出该变量可以不断增加以确保索引表的最佳性能,并推荐使用与系统内存25%的大小作为该变量的值。这是MySQL十分重要的配置变量之一,如果你对优化和提高系统性能有兴趣,可以从改变 key_buffer_size变量的值开始。

改变表长(read_buffer_size)

当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果你认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

设定打开表的数目的最大值(table_cache)

该变量控制MySQL在任何时候打开表的最大数目,由此能控制服务器响应输入请求的能力。它跟max_connections变量密切相关,增加 table_cache值可使MySQL打开更多的表,就如增加max_connections值可增加连接数一样。当收到大量不同数据库及表的请求时,可以考虑改变这一值的大小。

对缓长查询设定一个时间限制(long_query_time)

MySQL带有“慢查询日志”,它会自动地记录所有的在一个特定的时间范围内尚未结束的查询。这个日志对于跟踪那些低效率或者行为不端的查询以及寻找优化对象都非常有用。long_query_time变量控制这一最大时间限定,以秒为单位。

以上讨论并给出用于分析和优化SQL查询的三种工具的使用方法,以此提高你的应用程序性能。使用它们快乐地优化吧!

MySQL查询优化之explain的深入解析

在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作。

一、MySQL 查询优化器是如何工作的

MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行。最终目标是提交 SELECT 语句查找数据行,而不是排除数据行。优化器试图排除数据行的原因在于它排除数据行的速度越快,那么找到与条件匹配的数据行也就越快。如果能够首先进行最严格的测试,查询就可以执行地更快。

EXPLAIN 的每个输出行提供一个表的相关信息,并且每个行包括下面的列:

未分类

未分类

未分类

未分类

未分类

未分类

未分类

未分类

未分类

未分类

extra 中出现以下 2 项意味着 MYSQL 根本不能使用索引,效率会受到重大影响。应尽可能对此进行优化。

未分类

下面来举一个例子来说明下 explain 的用法。

先来一张表:

CREATE TABLE IF NOT EXISTS `article` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`author_id` int(10) unsigned NOT NULL,
`category_id` int(10) unsigned NOT NULL,
`views` int(10) unsigned NOT NULL,
`comments` int(10) unsigned NOT NULL,
`title` varbinary(255) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`)
);

再插几条数据:

INSERT INTO `article`
(`author_id`, `category_id`, `views`, `comments`, `title`, `content`) VALUES
(1, 1, 1, 1, '1', '1'),
(2, 2, 2, 2, '2', '2'),
(1, 1, 3, 3, '3', '3');

需求:

查询 category_id 为 1 且 comments 大于 1 的情况下,views 最多的 article_id。

先查查试试看:

EXPLAIN
SELECT author_id
FROM `article`
WHERE category_id = 1 AND comments > 1
ORDER BY views DESC
LIMIT 1G

看看部分输出结果:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: article
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3
        Extra: Using where; Using filesort
1 row in set (0.00 sec)

很显然,type 是 ALL,即最坏的情况。Extra 里还出现了 Using filesort,也是最坏的情况。优化是必须的。

嗯,那么最简单的解决方案就是加索引了。好,我们来试一试。查询的条件里即 where 之后共使用了 category_id,comments,views 三个字段。那么来一个联合索引是最简单的了。

ALTER TABLE `article` ADD INDEX x ( `category_id` , `comments`, `views` );

结果有了一定好转,但仍然很糟糕:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: article
         type: range
possible_keys: x
          key: x
      key_len: 8
          ref: NULL
         rows: 1
        Extra: Using where; Using filesort
1 row in set (0.00 sec)

type 变成了 range,这是可以忍受的。但是 extra 里使用 Using filesort 仍是无法接受的。但是我们已经建立了索引,为啥没用呢?这是因为按照 BTree 索引的工作原理,先排序 category_id,如果遇到相同的 category_id 则再排序 comments,如果遇到相同的 comments 则再排序 views。当 comments 字段在联合索引里处于中间位置时,因comments > 1 条件是一个范围值(所谓 range),MySQL 无法利用索引再对后面的 views 部分进行检索,即 range 类型查询字段后面的索引无效。

那么我们需要抛弃 comments,删除旧索引:

DROP INDEX x ON article;

然后建立新索引:

ALTER TABLE `article` ADD INDEX y ( `category_id` , `views` ) ;

接着再运行查询:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: article
         type: ref
possible_keys: y
          key: y
      key_len: 4
          ref: const
         rows: 1
        Extra: Using where
1 row in set (0.00 sec)

可以看到,type 变为了 ref,Extra 中的 Using filesort 也消失了,结果非常理想。

再来看一个多表查询的例子。

首先定义 3个表 class 和 room。

CREATE TABLE IF NOT EXISTS `class` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`card` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `book` (
`bookid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`card` int(10) unsigned NOT NULL,
PRIMARY KEY (`bookid`)
);
CREATE TABLE IF NOT EXISTS `phone` (
`phoneid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`card` int(10) unsigned NOT NULL,
PRIMARY KEY (`phoneid`)
) engine = innodb;

然后再分别插入大量测试数据。插入数据的php脚本:

<?php
$link = mysql_connect("localhost","root","870516");
mysql_select_db("test",$link);
for($i=0;$i<10000;$i++)
{
    $j   = rand(1,20);
    $sql = " insert into class(card) values({$j})";
    mysql_query($sql);
}
for($i=0;$i<10000;$i++)
{
    $j   = rand(1,20);
    $sql = " insert into book(card) values({$j})";
    mysql_query($sql);
}
for($i=0;$i<10000;$i++)
{
    $j   = rand(1,20);
    $sql = " insert into phone(card) values({$j})";
    mysql_query($sql);
}
mysql_query("COMMIT");
?>

然后来看一个左连接查询:

explain select * from class left join book on class.card = book.cardG

分析结果是:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
2 rows in set (0.00 sec)

显然第二个 ALL 是需要我们进行优化的。

建立个索引试试看:

ALTER TABLE `book` ADD INDEX y ( `card`);
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ref
possible_keys: y
          key: y
      key_len: 4
          ref: test.class.card
         rows: 1000
        Extra: 
2 rows in set (0.00 sec)

可以看到第二行的 type 变为了 ref,rows 也变成了 1741*18,优化比较明显。这是由左连接特性决定的。LEFT JOIN 条件用于确定如何从右表搜索行,左边一定都有,所以右边是我们的关键点,一定需要建立索引。

删除旧索引:

DROP INDEX y ON book;

建立新索引。

ALTER TABLE `class` ADD INDEX x ( `card`);

结果

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
2 rows in set (0.00 sec)

基本无变化。

然后来看一个右连接查询:

explain select * from class right join book on class.card = book.card;

分析结果是:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ref
possible_keys: x
          key: x
      key_len: 4
          ref: test.book.card
         rows: 1000
        Extra: 
2 rows in set (0.00 sec)

优化较明显。这是因为 RIGHT JOIN 条件用于确定如何从左表搜索行,右边一定都有,所以左边是我们的关键点,一定需要建立索引。

删除旧索引:

DROP INDEX x ON class;

建立新索引。

ALTER TABLE `book` ADD INDEX y ( `card`);

结果

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
2 rows in set (0.00 sec)

基本无变化。

最后来看看 inner join 的情况:

explain select * from class inner join book on class.card = book.card;

结果:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ref
possible_keys: x
          key: x
      key_len: 4
          ref: test.book.card
         rows: 1000
        Extra: 
2 rows in set (0.00 sec)

删除旧索引:

DROP INDEX y ON book;

结果

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
2 rows in set (0.00 sec)

建立新索引。

ALTER TABLE `class` ADD INDEX x ( `card`);

结果

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
2 rows in set (0.00 sec)

综上所述,inner join 和 left join 差不多,都需要优化右表。而 right join 需要优化左表。

我们再来看看三表查询的例子

添加一个新索引:

ALTER TABLE `phone` ADD INDEX z ( `card`);
ALTER TABLE `book` ADD INDEX y ( `card`);
explain select * from class left join book on class.card=book.card left join phone on book.card = phone.card;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: class
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 20000
        Extra: 
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: book
         type: ref
possible_keys: y
          key: y
      key_len: 4
          ref: test.class.card
         rows: 1000
        Extra: 
*************************** 3. row ***************************
           id: 1
  select_type: SIMPLE
        table: phone
         type: ref
possible_keys: z
          key: z
      key_len: 4
          ref: test.book.card
         rows: 260
        Extra: Using index
3 rows in set (0.00 sec)

后 2 行的 type 都是 ref 且总 rows 优化很好,效果不错。

MySql 中的 explain 语法可以帮助我们改写查询,优化表的结构和索引的设置,从而最大地提高查询效率。当然,在大规模数据量时,索引的建立和维护的代价也是很高的,往往需要较长的时间和较大的空间,如果在不同的列组合上建立索引,空间的开销会更大。因此索引最好设置在需要经常查询的字段中。

用ceph-deploy安装ceph并部署集群

部署安装

关于安装ceph整个过程中遇到的问题,以及靠谱的解决办法,个人亲测有效,不代表广大同行的观点。

我用的是服务器,所以没搞什么用户的问题。机器是centOS7.3。我安装的ceph版本是jewel,目前只用了3个节点。

节点IP      命名    角色

10.0.1.92   e1092   mon 
10.0.1.93   e1093   mon,osd 
10.0.1.94   e1094   mon,osd 

第一步:准备工作(以下工作在所有节点上都要执行)

首先是配置yum源:

需要特别注意的是,Ceph的安装过程还需要第三方组件依赖,其中一些第三方组件在CentOS yum.repo Base等官方源中是没有的(例如LevelDB),所以读者在安装过程中会有一定的几率遇到各种依赖关系异常,并要求先行安装XXX第三方组件的提示(例如提示先安装liblevel.so)。虽然我们后文将会介绍的Ceph辅助部署工具,Ceph-deploy的工作本质还是通过yum命令去安装管理组件,但是既然CentOS yum.repo Base官方源中并没有某些需要依赖的第三方组件,所以一旦遇到类似的组件依赖问题安装过程就没法自动继续了。解决这个问题,本示例中建议引入CentOS的第三方扩展源epel。(我在这上面坑了很久才走出来)。

首先引入第三方扩展源:

# wget  -O  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

配置ceph源:

# vim  /etc/yum.repos.d/ceph.repo   # 增加ceph源,将下面内容输进去
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
priority=1

[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0
priority=1

[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.163.com/ceph/rpm-jewel/el7/SRPMS
enabled=0
gpgcheck=1
type=rpm-md
gpgkey=http://mirrors.163.com/ceph/keys/release.asc
priority=1

更新源:

# yum makecache
# yum update

安装ceph(我是在各节点分别安装的,而没有用ceph-deploy一键安装,个人感觉分别安装更不容易犯错):

# yum install  -y  ceph

查看ceph版本:

# ceph -v
ceph version 10.2.9 (2ee413f77150c0f375ff6f10edd6c8f9c7d060d0)

关闭selinux:

# sed  -i  's/SELINUX=.*/SELINUX=disabled/'  /etc/selinux/config
# setenforce  0
setenforce: SELinux is disabled

关闭防火墙firewalld:

# systemctl stop firewalld
# systemctl disable firewalld

安装ntp服务器

为保证各个服务器的时间一致,安装ntp服务器

# yum install -y ntp ntpdate ntp-doc

访问:http://www.pool.ntp.org/zone/cn,获取中国区公用时间同步服务器。如:

server 0.cn.pool.ntp.org 
server 1.asia.pool.ntp.org 
server 2.asia.pool.ntp.org

将这三个服务器添加到/etc/ntp.conf,用#注释掉文件中原有的:

server 0.centos.pool.ntp.org iburst 
server 1.centos.pool.ntp.org iburst 
server 2.centos.pool.ntp.org iburst 
server 3.centos.pool.ntp.org iburst 

再执行下面的命令手工从服务器同步并启动ntp服务:

# ntpdate 0.cn.pool.ntp.org
# hwclock -w
# systemctl enable ntpd.service
# systemctl start ntpd.service

安装ssh服务:

# yum install openssh-server

第二步、准备工作做好了,现在开始部署ceph集群。

备注:以下操作均在admin-node节点执行,在本文中,由于admin-node与e1093共享,所以在e1093上执行就可以了

修改/etc/hosts

# vim /etc/hosts
10.0.1.92 e1092 
10.0.1.93 e1093 
10.0.1.94 e1094 

生成ssh密钥对并复制到各节点

# ssh-keygen
# scp-copy-id e1092
# scp-copy-id e1093
# scp-copy-id e1094

安装部署工具ceph-deploy

# yum install ceph-deploy
# ceph-deploy  --version

创建集群,
这里先要创建一个目录,因为在执行ceph-deploy的过程中会产生一些配置文件。以后只要是执行ceph-deploy的命令所产生的文件都在这个目录下。

# mkdir /home/my-cluster
# cd my-cluster

部署新的monitor节点(我的是把e1093、e1093、e1094都作为mon 节点):

# ceph-deploy new e1092 e1093 e1094

查看my-cluster目录下生成的文件:

# ls 
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

修改配置文件:

# vim ceph.conf
mon_initial_members = e1092, e1093, e1094
mon_host = 10.0.1.92,10.0.1.93,10.0.1.94
auth_cluster_required = none
auth_service_required = none
auth_client_required = none
osd pool default size = 2
public network = 10.0.1.0/24

对其中的参数做一下说明:

前面5项是自动生成的,不过我修改了auth_cluster_required,auth_service_required,auth_client_required为none,原始默认是cephx,表示要通过认证,这里我不需要认证,所以设为none。

osd pool default size是副本的个数,我只配置两个副本,所以设为2.
public network是公共网络,是osd之间通信的网络,该项建议设置,如果不设置,后面可能执行命令的时候有警告信息,该参数其实就是你的mon节点IP最后一项改为0,然后加上/24。例如我的节点ip是10.0.1.8*系列的,所以我的public network就是10.0.1.0/24。
部署monitors,并获取密钥key,此命令会在my-cluster目录下生成几个key。

# ceph-deploy  --overwrite-conf mon  create-initial

未分类

未分类

未分类

这里我贴出了一部分输出信息作为参考,看到最后一部分信息表示成功。

查看my-cluster目录下生成的文件:

# ls
ceph.bootstrap-mds.keyring 
ceph.bootstrap-rgw.keyring  
ceph.conf             
ceph.mon.keyring
ceph.bootstrap-osd.keyring  
ceph.client.admin.keyring   
ceph-deploy-ceph.log

查看集群状态:

# ceph -s

未分类

接下来部署osd:

由于没有足够多的磁盘,就用文件夹,我用的就是文件夹,如果用磁盘的话,网上教程更多:

在e1092 e1093 e1094上执行:

# mkdir  /var/local/osd1  
# chmod  777  -R  /var/local/osd1

以下在有ceph-deploy的节点上执行:

准备osd:

# ceph-deploy osd prepare e1092:/var/local/osd1 e1093:/var/local/osd1 e1094:/var/local/osd1

激活osd:

# ceph-deploy osd activate e1092:/var/local/osd1 e1093:/var/local/osd1 e1094:/var/local/osd1

再次查看集群状态,应该没什么问题了。

安装过程中出现的问题以及解决办法:

1、关于yum 源的问题

建议使用国内源,比如:

网易镜像源http://mirrors.163.com/ceph
阿里镜像源http://mirrors.aliyun.com/ceph
中科大镜像源http://mirrors.ustc.edu.cn/ceph
宝德镜像源 http://mirrors.plcloud.com/ceph

以jewel为例:

http://mirrors.163.com/ceph/rpm-jewel/el7
http://mirrors.163.com/ceph/keys/release.asc

2、关于执行ceph-deploy –overwrite-conf mon create-initial出现的问题(最容易出问题的感觉也就是这一条命令)

(1)出现admin-socket问题

当主机名/etc/hostname 和/etc/hosts中给该主机命的名字不一样,例如我之前安装ceph-deploy用的主机是10.0.1.90,我把主机10.0.1.90命名为e1090,即/etc/hostname设为e1090,然而我在/etc/hosts中给该主机取的名字为mon。然后就会出现这个问题,如下所示:

未分类

排查这个问题要注意看ERROR上面的INFO信息:Running command: ceph –cluster=ceph –admin-daemon /var/run/ceph-mon.mon.asok mon_status
这条信息之后就出现了error,说明很有可能它所执行的那条命令没成功,首先进入这个目录查看有没有这个文件:

# ls  /var/run/
ceph-mon.e1090.asok

发现我的这个目录下的文件名为ceph-mon.e1090.asok,而不是INFO中的ceph-mon.mon.asok,所以立马修改/etc/hosts,将名字重新命名为与hostname 一致的名字,然后这个问题就解决了。另外,如果ceph.conf配置文件中没有设置public netmork这一项,也有可能会出现这个问题,所以最好设置。

(2)[WARNIN] monitor e1090 does not exist in monmap

未分类

如果上面(1)那个问题解决之后还出现这个问题,就说明你的这台mon机器down掉了,我刚开始的时候也不敢相信,(纳尼?我刚部署它就down掉了?),其实可以看上面的信息,发现mons这一项中的addr信息是0.0.0.0:0/1,这里就知道了应该就是down掉了,而且注意看name这一项还是之前取的名字mon ,虽然第一个问题解决了,但还是没成功,所以索性换了节点,不用这个节点。

这一条可以自己通过将其他节点也作为mon节点试一下,如果其他节点成功了就该节点不成功,那一定是down掉了,用ceph -s查看集群状态的时候也能够看出来它down了。

(3)failed to connect to host:e1092,e1093, e1094

未分类

看WARNIN信息,发现说:no mon key found in host: e1092,后面的WARNIN也是一样的。这时候可以看下my-cluster目录下有没有生成key,出现这个错误应该是没有生成,解决办法就是将my-cluster目录下的ceph-mon.keying 文件拷贝到所有节点的/var/lib/ceph/mon/ceph-$hostname目录下。即

# cp /root/cluster/ceph.mon.keyring /var/lib/ceph/mon/ceph-1093/keyring
# scp /home/chenjuan/my-cluster/ceph.mon.keyring e1092:/var/lib/ceph/mon/ceph-e1092/keyring
# scp /home/chenjuan/my-cluster/ceph.mon.keyring e1094:/var/lib/ceph/mon/ceph-e1094/keyring

再次执行ceph-deploy –overwrite-conf create-initial,应该就成功了。

Ceph 快速部署 ( Centos7 + Jewel )

这篇文章主要介绍了如何用三台虚拟机搭建一套Ceph分布式系统,步骤简洁但不失准确性。环境清理一小节可以解决绝大多数部署不成功的问题,最后一节介绍了常用的Ceph操作,希望能给刚搭建环境的同学一些帮助。

环境

三台装有CentOS 7的主机,每台主机有三个磁盘(虚拟机磁盘要大于100G),详细信息如下:

[root@ceph-1~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@ceph-1 ~]# lsblk 
NAME            MAJ:MINRM   SIZE RO TYPE MOUNTPOINT
sda              8:0    0   128G  0 disk 
├─sda1           8:1    0   500M  0 part /boot
└─sda2           8:2    0 127.5G  0 part 
 ├─centos-root 253:0    0    50G 0 lvm  /
 ├─centos-swap 253:1    0     2G 0 lvm  [SWAP]
  └─centos-home 253:2    0  75.5G  0 lvm /home
sdb              8:16   0     2T  0 disk 
sdc              8:32   0     2T  0 disk 
sdd              8:48   0     2T  0 disk 
sr0             11:0    1  1024M  0 rom  
[root@ceph-1 ~]# cat /etc/hosts
..
192.168.57.222ceph-1                                                                                                                                      
192.168.57.223ceph-2                                                                                                                                      
192.168.57.224 ceph-3

集群配置如下:

未分类

环境清理

如果之前部署失败了,不必删除ceph客户端,或者重新搭建虚拟机,只需要在每个节点上执行如下指令即可将环境清理至刚安装完ceph客户端时的状态!强烈建议在旧集群上搭建之前清理干净环境,否则会发生各种异常情况。

psaux|grep ceph |awk '{print $2}'|xargs kill -9
ps -ef|grep ceph
#确保此时所有ceph进程都已经关闭!!!如果没有关闭,多执行几次。
umount /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/mon/*
rm -rf /var/lib/ceph/mds/*
rm -rf /var/lib/ceph/bootstrap-mds/*
rm -rf /var/lib/ceph/bootstrap-osd/*
rm -rf /var/lib/ceph/bootstrap-rgw/*
rm -rf /var/lib/ceph/tmp/*
rm -rf /etc/ceph/*
rm -rf /var/run/ceph/*

yum源及ceph的安装

需要在每个主机上执行以下指令:

yumclean all
rm -rf /etc/yum.repos.d/*.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo
sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo

增加ceph的源:

vim/etc/yum.repos.d/ceph.repo

添加以下内容:

[ceph]
name=ceph
baseurl=http://mirrors.163.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.163.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0

安装ceph客户端:

yummakecache
yum install ceph ceph-radosgw rdate -y
关闭selinux&firewalld
sed-i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl stop firewalld 
systemctl disable firewalld

同步各个节点时间:

yum-y install rdate
rdate -s time-a.nist.gov
echo rdate -s time-a.nist.gov >> /etc/rc.d/rc.local 
chmod +x /etc/rc.d/rc.local

开始部署

在部署节点(ceph-1)安装ceph-deploy,下文的部署节点统一指ceph-1:

[root@ceph-1~]# yum -y install ceph-deploy
[root@ceph-1 ~]# ceph-deploy --version
1.5.34
[root@ceph-1 ~]# ceph -v
ceph version 10.2.2 (45107e21c568dd033c2f0a3107dec8f0b0e58374)

在部署节点创建部署目录并开始部署:

[root@ceph-1~]# cd
[root@ceph-1 ~]# mkdir cluster
[root@ceph-1 ~]# cd cluster/
[root@ceph-1 cluster]# ceph-deploy new ceph-1 ceph-2 ceph-3

如果之前没有ssh-copy-id到各个节点,则需要输入一下密码,过程log如下:

[ceph_deploy.conf][DEBUG] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.34): /usr/bin/ceph-deploy newceph-1 ceph-2 ceph-3
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ] username                     : None
[ceph_deploy.cli][INFO  ] func                         : <function new at 0x7f91781f96e0>
[ceph_deploy.cli][INFO  ] verbose                      : False
[ceph_deploy.cli][INFO  ] overwrite_conf               : False
[ceph_deploy.cli][INFO  ] quiet                        : False
[ceph_deploy.cli][INFO  ] cd_conf                      : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f917755ca28>
[ceph_deploy.cli][INFO  ] cluster                      : ceph
[ceph_deploy.cli][INFO  ] ssh_copykey                  : True
[ceph_deploy.cli][INFO  ]  mon                          :['ceph-1', 'ceph-2', 'ceph-3']
..
..
ceph_deploy.new][WARNIN] could not connect via SSH
[ceph_deploy.new][INFO  ] will connect again with password prompt
The authenticity of host 'ceph-2 (192.168.57.223)' can't be established.
ECDSA key fingerprint is ef:e2:3e:38:fa:47:f4:61:b7:4d:d3:24:de:d4:7a:54.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ceph-2,192.168.57.223' (ECDSA) to the list of knownhosts.
root
root@ceph-2's password: 
[ceph-2][DEBUG ] connected to host: ceph-2 
..
..
[ceph_deploy.new][DEBUG ] Resolving host ceph-3
[ceph_deploy.new][DEBUG ] Monitor ceph-3 at 192.168.57.224
[ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-1', 'ceph-2','ceph-3']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.57.222','192.168.57.223', '192.168.57.224']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...

此时,目录内容如下:

[root@ceph-1cluster]# ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

根据自己的IP配置向ceph.conf中添加public_network,并稍微增大mon之间时差允许范围(默认为0.05s,现改为2s):

[root@ceph-1cluster]# echo public_network=192.168.57.0/24 >> ceph.conf 
[root@ceph-1 cluster]# echo mon_clock_drift_allowed = 2 >> ceph.conf 
[root@ceph-1 cluster]# cat ceph.conf 
[global]
fsid = 0248817a-b758-4d6b-a217-11248b098e10
mon_initial_members = ceph-1, ceph-2, ceph-3
mon_host = 192.168.57.222,192.168.57.223,192.168.57.224
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

public_network=192.168.57.0/24
mon_clock_drift_allowed = 2

开始部署monitor:

[root@ceph-1cluster]# ceph-deploy mon create-initial
..
..若干log
[root@ceph-1 cluster]# ls
ceph.bootstrap-mds.keyring  ceph.bootstrap-rgw.keyring ceph.conf            ceph.mon.keyring
ceph.bootstrap-osd.keyring  ceph.client.admin.keyring  ceph-deploy-ceph.log

查看集群状态:

[root@ceph-1cluster]# ceph -s
    cluster 0248817a-b758-4d6b-a217-11248b098e10
     health HEALTH_ERR
            no osds
            Monitorclock skew detected 
     monmap e1: 3 mons at{ceph-1=192.168.57.222:6789/0,ceph-2=192.168.57.223:6789/0,ceph-3=192.168.57.224:6789/0}
            electionepoch 6, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e1: 0 osds: 0 up, 0 in
            flagssortbitwise
      pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0objects
            0 kB used, 0kB / 0 kB avail
                 64 creating

开始部署OSD:

ceph-deploy--overwrite-conf osd prepare ceph-1:/dev/sdb ceph-1:/dev/sdc ceph-1:/dev/sddceph-2:/dev/sdb ceph-2:/dev/sdc ceph-2:/dev/sdd ceph-3:/dev/sdb ceph-3:/dev/sdcceph-3:/dev/sdd  --zap-disk
ceph-deploy --overwrite-conf osd activate ceph-1:/dev/sdb1 ceph-1:/dev/sdc1ceph-1:/dev/sdd1 ceph-2:/dev/sdb1 ceph-2:/dev/sdc1 ceph-2:/dev/sdd1ceph-3:/dev/sdb1 ceph-3:/dev/sdc1 ceph-3:/dev/sdd1

我在部署的时候出了个小问题,有一个OSD没成功(待所有OSD部署完毕后,再重新部署问题OSD即可解决),如果不出意外的话,集群状态应该如下:

[root@ceph-1cluster]# ceph -s
    cluster 0248817a-b758-4d6b-a217-11248b098e10
     health HEALTH_WARN
            too few PGsper OSD (21 < min 30)
     monmap e1: 3 mons at{ceph-1=192.168.57.222:6789/0,ceph-2=192.168.57.223:6789/0,ceph-3=192.168.57.224:6789/0}
            electionepoch 22, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e45: 9 osds: 9 up, 9 in
            flagssortbitwise
      pgmap v82: 64 pgs, 1 pools, 0 bytes data, 0objects
            273 MB used,16335 GB / 16336 GB avail
                 64 active+clean

去除这个WARN,只需要增加rbd池的PG就好:

[root@ceph-1cluster]# ceph osd pool set rbd pg_num 128
set pool 0 pg_num to 128
[root@ceph-1 cluster]# ceph osd pool set rbd pgp_num 128
set pool 0 pgp_num to 128
[root@ceph-1 cluster]# ceph -s
    cluster 0248817a-b758-4d6b-a217-11248b098e10
     health HEALTH_ERR
            19 pgs arestuck inactive for more than 300 seconds
            12 pgspeering
            19 pgs stuckinactive
     monmap e1: 3 mons at{ceph-1=192.168.57.222:6789/0,ceph-2=192.168.57.223:6789/0,ceph-3=192.168.57.224:6789/0}
            electionepoch 22, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e49: 9 osds: 9 up, 9 in
            flagssortbitwise
      pgmap v96: 128 pgs, 1 pools, 0 bytes data, 0objects
            308 MB used,18377 GB / 18378 GB avail
                103 active+clean
                 12 peering
                  9 creating
                  4 activating
[root@ceph-1 cluster]# ceph -s
    cluster 0248817a-b758-4d6b-a217-11248b098e10
     health HEALTH_OK
     monmap e1: 3 mons at {ceph-1=192.168.57.222:6789/0,ceph-2=192.168.57.223:6789/0,ceph-3=192.168.57.224:6789/0}
            electionepoch 22, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e49: 9 osds: 9 up, 9 in
            flagssortbitwise
      pgmap v99: 128 pgs, 1 pools, 0 bytes data, 0objects
            310 MB used,18377 GB / 18378 GB avail
                128 active+clean

至此,集群部署完毕。

config推送

请不要使用直接修改某个节点的/etc/ceph/ceph.conf文件的方式,而是去部署节点(此处为ceph-1:/root/cluster/ceph.conf)目录下修改。因为节点到几十个的时候,不可能一个个去修改的,采用推送的方式快捷安全!修改完毕后,执行如下指令,将conf文件推送至各个节点:

[root@ceph-1cluster]# ceph-deploy --overwrite-conf config push ceph-1 ceph-2 ceph-3

此时,需要重启各个节点的monitor服务,见下一节。

mon&osd启动方式

#monitor start/stop/restart
#ceph-1为各个monitor所在节点的主机名。
systemctl start [email protected]
systemctl restart [email protected]
systemctl stop [email protected]

#OSD start/stop/restart 
#0为该节点的OSD的id,可以通过`ceph osd tree`查看
systemctl start/stop/restart [email protected]

[root@ceph-1 cluster]# ceph osd tree
ID WEIGHT   TYPE NAME       UP/DOWNREWEIGHT PRIMARY-AFFINITY 
-1 17.94685 rootdefault                                     
-2  5.98228     hostceph-1                                  
 0  1.99409        osd.0        up 1.00000          1.00000 
 1  1.99409        osd.1        up 1.00000          1.00000 
 8  1.99409        osd.2        up 1.00000          1.00000 
-3  5.98228     hostceph-2                                  
 2  1.99409        osd.3        up 1.00000          1.00000 
 3  1.99409        osd.4        up 1.00000          1.00000 
 4  1.99409        osd.5        up 1.00000          1.00000 
-4  5.98228     hostceph-3                                  
 5  1.99409        osd.6        up 1.00000          1.00000 
 6  1.99409        osd.7        up  1.00000         1.00000 
 7  1.99409        osd.8        up 1.00000          1.00000

Percona XtraDB Cluster 集群环境建立与验证指南

Percona XtraDB Cluster 是MySQL数据库的一种集群方案。并且与 MySQL Server 社区版本、Percona Server 和 MariaDB 兼容。

一、在Ubuntu上安装Percona XtraDB Cluster

实验环境:

假设有3台计算机设备安装了ubuntu系统,将被用作3个节点:

Node       Host        IP

Node1      pxc1        172.16.24.209
Node2      pxc2        172.16.24.208
Node3      pxc3        172.16.24.207

前置条件:

(1) 确保以下端口没被防火墙屏蔽或被其他进程占用:

  • 3306
  • 4444
  • 4567
  • 4568

(2) 卸载 apparmor

sudo apt-get remove apparmor

安装步骤:

在每一台设备上执行下列命令:

wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo apt update
sudo apt install percona-xtradb-cluster-full-57
passord:frank

至此,percona-xtradb-cluster已经安装,登录 MySQL.

mysql -u root -p

(输入密码 “frank”)。

添加用户

mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'passw0rd';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit
sudo service mysql stop   

二、配置节点

1. 初始化集群

以第1台设备作为第1个集群节点。在 /etc/mysql/my.cnf 添加如下配置:

[mysqld]
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://
wsrep_node_name=pxc1
wsrep_node_address=172.16.24.209
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

完成修改之后,执行:

sudo /etc/init.d/mysql bootstrap-pxc

数据库将以自举模式启动。至此,集群初始化工作已经完成。登录MySQL,执行如下命令,查看初始化结果:

mysql> show status like 'wsrep%';
+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| wsrep_local_state_uuid          | 0d718de1-a19c-11e7-81e3-127c64915155 |
| wsrep_protocol_version          | 7                                    |
| wsrep_last_committed            | 4                                    |
...
| wsrep_local_state_comment        | Synced                              |
...
| wsrep_cluster_conf_id            | 1                                    |
| wsrep_cluster_size              | 1                                    |
| wsrep_cluster_state_uuid        | 0d718de1-a19c-11e7-81e3-127c64915155 |
| wsrep_cluster_status            | Primary                              |
| wsrep_connected                  | ON                                  |
| wsrep_local_bf_aborts            | 0                                    |
| wsrep_local_index                | 0                                    |
| wsrep_provider_name              | Galera                              |
| wsrep_provider_vendor            | Codership Oy <[email protected]>    |
| wsrep_provider_version          | 3.22(r8678538)                      |
| wsrep_ready                      | ON                                  |
+----------------------------------+--------------------------------------+
67 rows in set (0.00 sec)

2. 添加节点

添加第2台设备,修改其配置文件 /etc/mysql/my.cnf ,添加如下语句:

[mysqld]
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://172.16.24.209,172.16.24.208,172.16.24.207
wsrep_node_name=pxc2
wsrep_node_address=172.16.24.208
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

退出重启即可。重启后也登录MySQL,执行“show status like ‘wsrep%’;”,查看添加结果。

添加第3台设备,修改其配置文件 /etc/mysql/my.cnf ,添加如下语句:

[mysqld]
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://172.16.24.209,172.16.24.208,172.16.24.207
wsrep_node_name=pxc3
wsrep_node_address=172.16.24.207
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

退出重启即可。重启后也登录MySQL,执行“show status like ‘wsrep%’;”,查看添加结果。

使第一台设备工作在正常模式。修改其配置文件 /etc/mysql/my.cnf ,添加如下语句:

[mysqld]
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://172.16.24.209,172.16.24.208,172.16.24.207
wsrep_node_name=pxc1
wsrep_node_address=172.16.24.209
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

重启。

三、验证写集复制功能(Write-Set Replication)

1. Create a new database on the second node:

mysql> CREATE DATABASE testDB1;
Query OK, 1 row affected (0.00 sec)

2. Create a table on the third node:

mysql> USE testDB1
Database changed
mysql> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
Query OK, 0 rows affected (0.01 sec)

3. Insert records on the first node:

mysql> INSERT INTO testDB1.example VALUES (1, 'percona1');
Query OK, 1 row affected (0.01 sec)

4. Retrieve rows from that table on the second node:

mysql> SELECT * FROM testDB1.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
|      1 | percona1  |
+---------+-----------+
1 row in set (0.00 sec)

Ubuntu 12.04 安装 GitLab

打开官网,下载安装包

gitlab本身依赖了很多第三方软件,所以我们直接下载官方提供的已经打包好的套件,里面包含了全部的软件。就不需要自己一个个安装了。

https://about.gitlab.com/downloads/#ubuntu1204

前往下载安装包页面

未分类

未分类

选择一个版本下载,建议不要选择太新的,此处选择:gitlab-ce7.10.5~omnibus-1amd64.deb

未分类

安装

参考官方文档,第一步执行如下命令,安装一些依赖的软件:

sudo apt-get install curl openssh-server ca-certificates postfix

其中postfix是用来发送邮件的,当用户注册我们自己搭建的GitLab时,用来给用户发送验证邮件。

postfix设置:

未分类

未分类

接着安装gitlab:

sudo dpkg -i gitlab-ce_7.10.5-omnibus-1_amd64.deb

配置GitLab

当用户注册我们自己搭建的GitLab时,需要给用户发送一封验证邮件,用户点击验证邮件才能完成注册。
我们是通过第三方邮件厂商(比如:腾讯,网易)给用户发送邮件的,这就需要我们配置用来给用户发送邮件的账号密码。

sudo vim /etc/gitlab/gitlab.rb

!!!!!!!!!!!记得去掉配置文件前面的# 注释

腾讯企业邮箱配置

gitlabrails['smtpenable'] = true
gitlabrails['smtpaddress'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 25 ##注意这里是25,腾讯企业邮箱官网说明的 smtp 发件端口号是 465,根本不对。
gitlabrails['smtpuser_name'] = "[email protected]"
gitlabrails['smtppassword'] = "xxx"
gitlabrails['smtpdomain'] = "xxx.com"
gitlabrails['smtpauthentication'] = "login"
gitlabrails['smtpenablestarttlsauto'] = true
gitlabrails['smtptls'] = true
gitlabrails['gitlabemail_from'] = "[email protected]"
user["gituseremail"] = "[email protected]"

163邮箱配置

gitlabrails['smtpenable'] = true
gitlabrails['smtpaddress'] = "smtp.163.com"
gitlabrails['smtpport'] = 25 
gitlabrails['smtpuser_name'] = "[email protected]"
gitlabrails['smtppassword'] = "xxpassword"
gitlabrails['smtpdomain'] = "163.com"
gitlabrails['smtpauthentication'] = :login
gitlabrails['smtpenablestarttlsauto'] = true

gitlabrails['gitlabemail_from'] = "[email protected]"  
user["gituseremail"] = "[email protected]"  

未分类

未分类

启动GitLab

sudo gitlab-ctl reconfigure

有时候你还需要重启postfix。(可选)

sudo /etc/init.d/postfix restart

访问GitLab

打开浏览器,输入上面配置的外网访问地址

默认管理员的账户密码:

Username: root
Password: 5iveL!fe

注意

1、腾讯企业邮箱配置

gitlab_rails['smtp_port'] = 25 ##注意这里是25,腾讯企业邮箱官网说明的 smtp 发件端口号是 465,根本不对。

2、GitLab 502问题

有可能是当前服务器上开启了tomcat,占用了8080端口,使GitLab的unicorn服务不能开启。

解决方法:修改/etc/gitlab/gitlab.rb

!!!!!!!!!!!记得去掉配置文件前面的# 注释

unicorn['port'] = 9090

然后重启GitLab服务

sudo gitlab-ctl reconfigure

其他命令

查看GitLab日志

sudo gitlab-ctl tail

ubuntu 16.04配置nginx服务器实现一个IP一个端口多个站点

未分类

特点:

  • Nginx 可以部署在网络上使用 FastCGI,脚本,SCGI 处理程序,WSGI 应用服务器或 Phusion 乘客模块的动态 HTTP 内容,并可作为软件负载均衡器。

  • Nginx 使用异步事件驱动的方法来处理请求。 Nginx的模块化事件驱动架构可以在高负载下提供更可预测的性能。

  • Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。 在Linux作业系统下,nginx使用epoll事件模型,得益于此,nginx在Linux作业系统下效率相当高。同时Nginx在OpenBSD或FreeBSD作业系统上采用类似于epoll的高效事件模型kqueue。

实现两个域名,打开两个不同的站点

  • 把0522.com和0o0.live解析到同一个IP

  • 检查nginx配置文件

vim /etc/nginx/nginx.conf

确保,配置文件的http{}大括号里有:

include /etc/nginx/conf.d/*.conf

例如:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;    #就是这里,如果前面有#号,请把#号去掉
        include /etc/nginx/sites-enabled/*;
}
  • 在目录/etc/nginx/conf.d/下面新建两个文件:
0522.conf
0o0.conf #.conf前的名字随你

写入以下内容:

server
{
listen       80;
server_name 0522.us www.0522.us;   #这里填写你的域名,包括无www301转向有www
index index.html index.htm index.php default.html default.htm default.php;
root  /var/www/0522.us;     #这里填写域名对应的站点根目录


location / {
try_files $uri $uri/ /index.php;

}

location ~ .php$ {
try_files $uri =404;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}



location ~ .*.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires      30d;
}

location ~ .*.(js|css)?$
{
expires      30d;
}


}
  • 以上是0522.conf的内容
server
{
listen       80;
server_name 0o0.live www.0o0.live;
index index.html index.htm index.php default.html default.htm default.php;
root  /var/www/0o0.live;     


location / {
try_files $uri $uri/ /index.php;

}

location ~ .php$ {
try_files $uri =404;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}



location ~ .*.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires      30d;
}

location ~ .*.(js|css)?$
{
expires      30d;
}


}

以上是0o0.conf的内容

  • 重启nginx
sudo service nginx restart  #所有nginx的设置要重启后才先效
  • 分别上传两个域名的不同网站文件到相应的网站根目录

例如:

0522.us域名上传网站文件到/var/www/0522.us目录下
0o0.live域名上传网站文件到/var/www/0o0.live目录下
#你的域名上传到你自己设置的根目录

完美

Ubuntu 批量修改文本内容

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。

用sed命令可以批量替换多个文件中的 字符串。

sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`

例如:我要把nixonli替换 为nixon,执行命令:

sed -i "s/nixonli/nixon/g" 'grep nixonli -rl /www'

这是目前linux最简单的批量替换字符串命令了!

具体格式如下:

sed -i "s/oldString/newString/g"  `grep oldString -rl /path`
实例代码:sed -i "s/12345/一二三四五/g" `grep '12345' -rl /usr/aa`
<strong>sed -i "s/12345/一二三四五/g" `grep '1234' -rl ./`</strong>

补充说明:

sed -i "s/oldString/newString/g"  `grep oldString -rl /path`

对多个文件的处理可能不支持,需要用 xargs, 搞定。

变种如下:

grepoldString -rl /path | xargssed -i "s/oldString/newString/g"

注意:

在 `grep oldString -rl /path` 中 ` 为1前边的翻引号`,而不是enter 前的 ‘

CentOS 7 搭建ngrok服务器

IE8和IE9在实现跨域请求的时候使用XDomainRequest自己实现了一套,所以即使是使用jquery1.9.1版本也无法直接兼容IE8,IE9的跨域请求。

一、前提条件

需要一台云服务器和一个域名解析到该IP

二、环境安装

1、安装 gcc

yum install gcc

2、安装 git

yum install git

3、安装 go 语言环境

到网站https://golang.org/dl/查找最新的版本链接

下载

wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz

解压安装:

tar -C /usr/local/ -zxvf go1.8.linux-amd64.tar.gz

添加环境变量,编辑:vi /etc/profile,在最后添加:

#go lang
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin

使环境变量生效

source /etc/profile

检查是否安装成功:

go version

输出:go version go1.8 linux/amd64表示安装成功

三、在服务器搭建 ngrok 服务

1、下载 ngrok 源码

cd /usr/local/src
git clone https://github.com/inconshreveable/ngrok.git

2、生成证书

在自生成证书时需要一个解析到服务器上的主域名,现在以”dogjun.com”为例:

cd ngrok
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=dogjun.com" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=dogjun.com" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

将新生成的证书,替换掉assets/client/tls下的证书

yes|cp rootCA.pem assets/client/tls/ngrokroot.crt
yes|cp device.crt assets/server/tls/snakeoil.crt
yes|cp device.key assets/server/tls/snakeoil.key

3、编译生成ngrokd(服务端)

#这里是交叉编译,linux系统GOOS=linux,64位系统GOARCH=amd64,32位系统GOARCH=386
#当前系统可用go env查看
GOOS=linux GOARCH=amd64 make release-server

编译成功后在当前目录的bin目录下可找到ngrokd文件

启动服务端(/usr/local/src/ngrok目录下)

./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="uboff.com"  -httpAddr=":80" -httpsAddr=":8081" -tunnelAddr=":4443"

后台运行

nohup ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="ngrok.dogjun.com"  -httpAddr=":80" -httpsAddr=":8082" -tunnelAddr=":4443" &

出现下面信息,启动成功

[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:8081
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[14:52:23 CST 2017/03/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds

4、编译生成ngrok(客户端)

这里生成windows下的客户端:

GOOS=windows GOARCH=amd64 make release-client

成功会在bin目录下看到windows_amd64文件夹,复制到windows电脑上即可启动

在windows_amd64目录下新建一个ngrok.cfg文件,内容如下:

server_addr: "ngrok.dogjun.com:4443"
trust_host_root_certs: false

然后就可以启动客户端,我已经把windows_amd64文件夹下载到E盘下,打开CMD输入:

ngrok -subdomain hwj -config=ngrok.cfg 80

看到下面信息则启动成功:

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://hwj.ngrok.dogjun.com -> 127.0.0.1:80
Forwarding                    https://hwj.ngrok.dogjun.com -> 127.0.0.1:80
Web Interface                 127.0.0.1:4040
# Conn                        1
Avg Conn Time                 0.00ms